Google Plus & Bing Plus

Add Gemini response, improve speed to search results(Bing), add Google/Bing search buttons, Gemini On/Off toggle

// ==UserScript==
// @name         Google Plus & Bing Plus
// @version      7.4
// @description  Add Gemini response, improve speed to search results(Bing), add Google/Bing search buttons, Gemini On/Off toggle
// @author       monit8280
// @match        https://www.bing.com/search*
// @match        https://www.google.com/search*
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @connect      generativelanguage.googleapis.com
// @connect      api.cdnjs.com
// @require      https://cdnjs.cloudflare.com/ajax/libs/marked/16.3.0/lib/marked.umd.js
// @license      MIT
// @namespace http://tampermonkey.net/
// ==/UserScript==

(function () {
    'use strict';

    // ---------------------- Config ----------------------
    const Config = {
        API: {
            GEMINI_MODEL: 'gemini-2.5-flash',
            GEMINI_URL: 'https://generativelanguage.googleapis.com/v1beta/models/',
            MARKED_CDN_URL: 'https://api.cdnjs.com/libraries/marked'
        },
        VERSIONS: {
            MARKED_VERSION: '16.3.0'
        },
        CACHE: {
            PREFIX: 'gemini_cache_'
        },
        STORAGE_KEYS: {
            CURRENT_VERSION: 'markedCurrentVersion',
            LATEST_VERSION: 'markedLatestVersion',
            LAST_NOTIFIED: 'markedLastNotifiedVersion',
            THEME_MODE: 'themeMode', // 테마 모드 저장
            GEMINI_ENABLED: 'geminiEnabled' // Gemini On/Off 상태 저장
        },
        UI: {
            DEFAULT_MARGIN: 8,
            DEFAULT_PADDING: 16,
            Z_INDEX: 9999
        },
        STYLES: {
            COLORS: {
                BACKGROUND_LIGHT: '#fff',
                BACKGROUND_DARK: '#282c34',
                BORDER_LIGHT: '#e0e0e0',
                BORDER_DARK: '#444',
                TEXT_LIGHT: '#000',
                TEXT_DARK: '#e0e0e0',
                TITLE_LIGHT: '#000',
                TITLE_DARK: '#ffffff',
                BUTTON_BG_LIGHT: '#f0f3ff',
                BUTTON_BG_DARK: '#3a3f4b',
                BUTTON_BORDER_LIGHT: '#ccc',
                BUTTON_BORDER_DARK: '#555',
                CODE_BLOCK_BG_LIGHT: '#f0f0f0',
                CODE_BLOCK_BG_DARK: '#3b3b3b',
            },
            BORDER_RADIUS: '4px',
            FONT_SIZE: {
                TEXT: '14px',
                TITLE: '18px'
            },
            ICON_SIZE: '20px',
            LOGO_SIZE: '24px',
            SMALL_ICON_SIZE: '16px'
        },
        ASSETS: {
            GOOGLE_LOGO: 'https://www.google.com/favicon.ico',
            BING_LOGO: 'https://account.microsoft.com/favicon.ico',
            GEMINI_LOGO: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iTGF5ZXJfMSIgdmlld0JveD0iMCAwIDE5MiAxOTIiPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcHBhdGgiPjxwYXRoIGQ9Ik0xNjQuOTMgODYuNjhjLTEzLjU2LTUuODQtMjUuNDItMTMuODQtMzUuNi0yNC4wMS0xMC4xNy0xMC4xNy0xOC4xOC0yMi4wNC0yNC4wMS0zNS42LTIuMjMtNS4xOS00LjA0LTEwLjU0LTUuNDItMTYuMDJDOTkuNDUgOS4yNiA5Ny44NSA4IDk2IDhzLTMuNDUgMS4yNi0zLjkgMy4wNWMtMS4zOCA1LjQ4LTMuMTggMTAuODEtNS40MiAxNi4wMi01Ljg0IDEzLjU2LTEzLjg0IDI1LjQzLTI0LjAxIDM1LjYtMTAuMTcgMTAuMTYtMjIuMDQgMTguMTctMzUuNiAyNC4wMS01LjE5IDIuMjMtMTAuNTQgNC4wNC0xNi4wMiA1LjQyQzkuMjYgOTIuNTUgOCA5NC4xNSA4IDk2czEuMjYgMy40NSAzLjA1IDMuOWM1LjQ4IDEuMzggMTAuODEgMy4xOCAxNi4wMiA1LjQyIDEzLjU2IDUuODQgMjUuNDIgMTMuODQgMzUuNiAyNC4wMSAxMC4xNyAxMC4xNyAxOC4xOCAyMi4wNCAyNC4wMSAzNS42IDIuMjQgNS4yIDQuMDQgMTAuNTQgNS40MiAxNi4wMkE0LjAzIDQuMDMgMCAwIDAgOTYgMTg0YzEuODUgMCAzLjQ1LTEuMjYgMy45LTMuMDUgMS4zOC01LjQ4IDMuMTgtMTAuODEgNS40Mi0xNi4wMiA1Ljg0LTEzLjU2IDEzLjg0LTI1LjQyIDI0LjAxLTM1LjYgMTAuMTctMTAuMTcgMjIuMDQtMTguMTggMzUuNi0yNC4wMSA1LjItMi4yNCAxMC41NC00LjA0IDE2LjAyLTUuNDJBNC4wMyA0LjAzIDAgMCAwIDE4NCA5NmMwLTEuODUtMS4yNi0zLjQ1LTMuMDUtMy45LTUuNDgtMS4zOC0xMC44MS0zLjE4LTE2LjAyLTUuNDIiIGNsYXNzPSJzdDAiLz48L2NsaXBQYXRoPjxjbGlwUGF0aCBpZD0iY2xpcHBhdGgtMSI+PHBhdGggZD0iTTE2NC45MyA4Ni42OGMtMTMuNTYtNS44NC0yNS40Mi0xMy44NC0zNS42LTI0LjAxLTEwLjE3LTEwLjE3LTE4LjE4LTIyLjA0LTI0LjAxLTM1LjYtMi4yMy01LjE5LTQuMDQtMTAuNTQtNS40Mi0xNi4wMkM5OS40NSA5LjI2IDk3Ljg1IDggOTYgOHMtMy40NSAxLjI2LTMuOSAzLjA1Yy0xLjM4IDUuNDgtMy4xOCAxMC44MS01LjQyIDE2LjAyLTUuODQgMTMuNTYtMTMuODQgMjUuNDMtMjQuMDEgMzUuNi0xMC4xNyAxMC4xNi0yMi4wNCAxOC4xNy0zNS42IDI0LjAxLTUuMTkgMi4yMy0xMC41NCA0LjA0LTE2LjAyIDUuNDJDOS4yNiA5Mi41NSA4IDk0LjE1IDggOTZzMS4yNiAzLjQ1IDMuMDUgMy45YzUuNDggMS4zOCAxMC44MSAzLjE4IDE2LjAyIDUuNDIgMTMuNTYgNS44NCAyNS40MiAxMy44NCAzNS42IDI0LjAxIDEwLjE3IDEwLjE3IDE4LjE4IDIyLjA0IDI0LjAxIDM1LjYgMi4yNCA1LjIgNC4wNCAxMC41NCA1LjQyIDE2LjAyQTQuMDMgNC4wMyAwIDAgMCA5NiAxODRjMS44NSAwIDMuNDUtMS4yNiAzLjktMy4wNSAxLjM4LTUuNDggMy4xOC0xMC44MSA1LjQyLTE2LjAyIDUuODQtMTMuNTYgMTMuODQtMjUuNDIgMjQuMDEtMzUuNiAxMC4xNy0xMC4xNyAyMi4wNC0xOC4xOCAzNS42LTI0LjAxIDUuMi0yLjI0IDEwLjU0LTQuMDQgMTYuMDItNS40MkE0LjAzIDQuMDMgMCAwIDAgMTg0IDk2YzAtMS44NS0xLjI2LTMuNDUtMy4wNS0zLjktNS40OC0xLjM4LTEwLjgxLTMuMTgtMTYuMDItNS40MiIgY2xhc3M9InN0MCIvPjwvY2xpcFBhdGg+PHJhZGlhbEdyYWRpZW50IGlkPSJyYWRpYWwtZ3JhZGllbnQiIGN4PSItMTIyLjQ5IiBjeT0iLTIyMy41MyIgcj0iMTEwLjk4IiBmeD0iLTEyMi40OSIgZnk9Ii0yMjMuNTMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLS41NCAwIC0uOTMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIuMzEiIHN0b3AtY29sb3I9IiMzMTg2ZmYiLz48c3RvcCBvZmZzZXQ9Ii40MiIgc3RvcC1jb2xvcj0iIzQ0OTFmZiIvPjxzdG9wIG9mZnNldD0iLjQ1IiBzdG9wLWNvbG9yPSIjNGM5NmZmIi8+PHN0b3Agb2Zmc2V0PSIuODEiIHN0b3AtY29sb3I9IiNlN2YxZmYiLz48c3RvcCBvZmZzZXQ9Ii44OSIgc3RvcC1jb2xvcj0iI2ZmZiIvPjwvcmFkaWFsR3JhZGllbnQ+PHN0eWxlPi5zdDB7ZmlsbDpub25lfTwvc3R5bGU+PC9kZWZzPjxnIHN0eWxlPSJjbGlwLXBhdGg6dXJsKCNjbGlwcGF0aCkiPjxpbWFnZSB4bGluazpocmVmPSJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80UzUrYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3THdBOFAzaHdZV05yWlhRZ1ltVm5hVzQ5SXUrN3Z5SWdhV1E5SWxjMVRUQk5jRU5sYUdsSWVuSmxVM3BPVkdONmEyTTVaQ0kvUGdvOGVEcDRiWEJ0WlhSaElIaHRiRzV6T25nOUltRmtiMkpsT201ek9tMWxkR0V2SWlCNE9uaHRjSFJyUFNKQlpHOWlaU0JZVFZBZ1EyOXlaU0E1TGpFdFl6QXdNeUF4TGpBd01EQXdNQ3dnTURBd01DOHdNQzh3TUMwd01Eb3dNRG93TUNBZ0lDQWdJQ0FnSWo0S0lDQWdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRLSUNBZ0lDQWdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlLSUNBZ0lDQWdJQ0FnSUNBZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJZ29nSUNBZ0lDQWdJQ0FnSUNCNGJXeHVjenA0YlhCSFNXMW5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2Wnk5cGJXY3ZJZ29nSUNBZ0lDQWdJQ0FnSUNCNGJXeHVjenBwYkd4MWMzUnlZWFJ2Y2owaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOXBiR3gxYzNSeVlYUnZjaTh4TGpBdklnb2dJQ0FnSUNBZ0lDQWdJQ0I0Yld4dWN6cGtZejBpYUhSMGNEb3ZMM0IxY213dWIzSm5MMlJqTDJWc1pXMWxiblJ6THpFdU1TOGlDaUFnSUNBZ0lDQWdJQ0FnSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWdvZ0lDQWdJQ0FnSUNBZ0lDQjRiV3h1Y3pwemRFVjJkRDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxSWFpsYm5RaklqNEtJQ0FnSUNBZ0lDQWdQSGh0Y0RwRGNtVmhkRzl5Vkc5dmJENUJaRzlpWlNCSmJHeDFjM1J5WVhSdmNpQXlPUzQySUNoTllXTnBiblJ2YzJncFBDOTRiWEE2UTNKbFlYUnZjbFJ2YjJ3K0NpQWdJQ0FnSUNBZ0lEeDRiWEE2UTNKbFlYUmxSR0YwWlQ0eU1ESTFMVEEyTFRJMVZERXhPakU0T2pJeExUQTNPakF3UEM5NGJYQTZRM0psWVhSbFJHRjBaVDRLSUNBZ0lDQWdJQ0FnUEhodGNEcFVhSFZ0WW01aGFXeHpQZ29nSUNBZ0lDQWdJQ0FnSUNBOGNtUm1Pa0ZzZEQ0S0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnUEhKa1pqcHNhU0J5WkdZNmNHRnljMlZVZVhCbFBTSlNaWE52ZFhKalpTSStDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRHg0YlhCSFNXMW5PbmRwWkhSb1BqSTFOand2ZUcxd1IwbHRaenAzYVdSMGFENEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdQSGh0Y0VkSmJXYzZhR1ZwWjJoMFBqSTFNand2ZUcxd1IwbHRaenBvWldsbmFIUStDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRHg0YlhCSFNXMW5PbVp2Y20xaGRENUtVRVZIUEM5NGJYQkhTVzFuT21admNtMWhkRDRLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnUEhodGNFZEpiV2M2YVcxaFoyVStMemxxTHpSQlFWRlRhMXBLVW1kQlFrRm5SVUZCUVVGQlFVRkVMemRSUVhOVlIyaDJaRWM1ZW1GSE9YZEpSRTExVFVGQk5GRnJiRTVCS3pCQlFVRkJRVUZDUVVGQlFVRkJRVUZGUVNZamVFRTdRVkZCUVVGQlFVRkJVVUZDTHlzMFFVUnJSbXRpTWtwc1FVZFVRVUZCUVVGQlppOWlRVWxSUVVKblVVVkNRVlZGUW1kVlJrSm5hMGRDVVZsS1EzZG5SMEpuWjB4RVFXOUxRM2R2U3lZamVFRTdSRUpCVFVSQmQwMUVRWGRSUkVFMFVFVkJPRTlFUWsxVVJrSlJWRVY0ZDJKSGVITmpTSGc0WmtoNE9HWkllRGhtU0hkRlNFSjNZMDVFUVRCWlJVSkJXVWRvVlZKR1VtOW1TSGc0WmlZamVFRTdTSGc0WmtoNE9HWkllRGhtU0hnNFpraDRPR1pJZURobVNIZzRaa2g0T0daSWVEaG1TSGc0WmtoNE9HWkllRGhtU0hnNFpraDRPR1pJZURobUx6aEJRVVZSWjBFdlFVVkJRWGRGVWlZamVFRTdRVUZKVWtGUlRWSkJaaTlGUVdGSlFVRkJRVWhCVVVWQ1FWRkZRVUZCUVVGQlFVRkJRVUZSUmtGM1NVZEJVVUZJUTBGclMwTjNSVUZCWjBsRVFWRkZRa0ZSUlVGQlFVRkJRVUZCUVNZamVFRTdRVkZCUTBGM1VVWkNaMk5KUTFGdlRFVkJRVU5CVVUxRVFXZFJRMEpuWTBSQ1FVbEhRVzVOUWtGblRWSkNRVUZHU1ZKSmVGRldSVWRGTWtWcFkxbEZWVTF3UjJoQ2VGZDRVV2xRUWlZamVFRTdWWFJJYUUxNFdtazRRMUo1WjNaRmJGRjZVbFJyY1V0NVdUTlFRMDVWVVc1ck5rOTZUbWhrVlZwSVZFUXdkVWxKU205TlNrTm9aMXBvU2xKR1VuRlRNRlowVGxaTFFuSjVOQzlRUlNZamVFRTdNVTlVTUZwWVYwWnNZVmN4ZUdSWWJEbFhXakpvY0dGdGRITmlWelYyV1ROU01XUnVaRFJsV0hBM1prZ3hLMll6VDBWb1dXRklhVWx0UzJrMGVVNXFieXREYXpWVFZteHdaVmx0V2lZamVFRTdjV0p1U2pKbGJqVkxhbkJMVjIxd05tbHdjWEYxYzNKaE5uWnZVa0ZCU1VOQlVVbEVRbEZWUlVKUldVVkRRVTFFWWxGRlFVRm9SVVJDUTBWVFRWVkZSbFZTVG1oSloxcDRaMXBGZVNZamVFRTdiMkpJZDBaTlNGSTBVMDVEUmxaS2FXTjJSWHBLUkZKRVoyaGhVMVY1VjJsWk4weERRak5RVTA1bFNrVm5lR1JWYTNkblNrTm9aMXBLYWxwR1IybGthMlJHVlRNNGNVOTZkM2xuY0NZamVFRTdNQ3RRZW1oS1UydDBUVlJWTlZCU2JHUlpWMVp3WWxoR01XVllNVkpzV20xa2IyRlhjSEppUnpGMVlqSlNNV1J1WkRSbFdIQTNaa2d4SzJZelQwVm9XV0ZJYVVsdFMyazBlVTVxYnlZamVFRTdLMFJzU2xkWGJEVnBXbTF3ZFdOdVdqWm1hM0ZQYTNCaFlXNXhTMjF4Y1RaNWRISnhLM1l2WVVGQmQwUkJVVUZEUlZGTlVrRkVPRUU1VlRSeE4wWllXWEUzUmxoWmNUZEdXRmx4TnlZamVFRTdSbGhaY1RkR1dGbHhOMFpZV1hFMmRVdDBWbmhUTVZoQmNsSmlSa3hZVEVaaFlUVTBjSEIyYkdscGJrSnpWbkJrV0VaRVpHTkxkWGhXZGtaRWMxWmthWEp6Vm1ScGNuTldaR2x5Y3lZamVFRTdWbVJwY25OV1pHbHljMVprYVhKelZtUnBjbk5XWkdseWMxWmthWEp6Vm1GNFV6UTBjWE5NV1VWeVIyWkJhMEpaTUhWRE1sRnBjSFJPYW1KSlVsY3JkVTFHY0RSWVEyTlpNblpEY1NZamVFRTdURTVvZEdsWmNXbDVXV0paYTB0bllrTjRXRUUwYjJKM2NUTnBhREpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVlBTM1JGTkNZamVFRTdjRmRHYzBOV1NqVkxXVXhhWjBsbFUyTkVkbXRUVjNsTlZVaE1aWEZQSzFGTmJUWlBUa0o1Tm10dk56VkZlbUp2TkZWUFpGWlllSGxRUnpKbFFYVlVWa1pLTmpRNFlVUm5VbU5QYnlZamVFRTdRVGs0YlVwT1RYTlRUMmgxVVRObVNtZDBSVzlKZFU5VGRWTjBjVWxXYkdKS1RVTkdORTlNUm5aRGNtVkxTRmx4TjBaWVdYRTNSbGhaY1RkR1dGbHhOMFpZV1hFM1JsaFpjVGRHV0NZamVFRTdXWEUzUmxoWmNUZEdWM05WY2xkUFFrdHBOemRaUTNwQlVWWjRUMFpDTTNsQ1RHUkRRMVpZWkN0eE1UTjVjVlZ1VEhnMGEydDFPVlZCU2l0TVMxcFVZek5JWjFOdE5ERmpZaTlHYkNZamVFRTdVbTAxWTA1UFp6SXhhbVkzVjFFNFVuWkhibGhTWVhoMk9YSkRTbk5hWVdST1RGQldVVk5RYVhsNVRUTkhlVmxGTDNOeU9FMUNkbTFTUjFSeU9HMUtUM0poTkVSQllqVmpRelJOTkNZamVFRTdielpPT0cxSFoyaFlWbk5NUW1WRWFGRXlUVlZQZUZZeVMzVjRWakpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0Vm5oNFZtODBjRlZhUjI5TmFWZFpRME4xU2lZamVFRTdkMjlQSzFGS1ltOVNVMHhWVGxGRFp6YzFWRXRVYmpSelZFZGtVakZYYkdacGVrZHVUakpsU0VGNE1qZ3hVV3R1Wmt0S1ZHUnFhbmRLVms1eFJFVTVZM0ZOYmt4cWFWRjRkbGR5TVNZamVFRTdlVkJGTWtSSGRtcDJiVUkyTkZKS1JYTlRXakpYYjA1NVJ5dFhlR3MwYlZoRmVXcFVUbEV5Unl0YVZVTTJjbEJxV2xSWldHeFJUamg1TkU5d2VYaFViVWRqUjIxWVFVOUdTa2RLU3lZamVFRTdUVTVPVWxac1prUlVSbVZFYVdoa1dFRnljMVprYVhKelZtUnBjbk5XWkdseWMxWmthWEp6Vm1ScGNuTldaR2x5YzFaa2FYSlNlRk56WkhGYVJXeEpRMFYxU21kdlQxRk5iVFpGVlNZamVFRTdhVEZETDBOb2MzQnNUbnB6VjA1cFQzRTJjakY2UjI1T01pdEVRM2hoTHpGSmMxUnRUa3RVZEdOWFJrbzFjbTl6WTNCS1kzbE5SVTB3Y0U5U2RIUkZWbTVOTkVVd2RWWjZhRU5EUlNZamVFRTdXR0pVYTAxTmRHYzBLMUZOYWpCNU4wbHdiV1JwYVRabVZVSnNaVzB6ZFhkNldWazBUMnA2YkZBM1lUbEhNaXRhUVhoMWRXNUtUVWx5YzJWUFNHZGhWRXBHZUROSmQwZE1SekJUYXlZamVFRTdiMDlTVFZaMFYwUm5OVWRyY21kalExYzRRM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll4WTBOeVIyRnRVa3BhUVVsWFlXRnNaRGh3YkU1emFrWktkRkYyVHlZamVFRTdTMjVtVFZkbFducE5WMDVwVjNFMloyWnBNM3BJYkd4a2RHZDRUVkF4U3psWmF6YzFWVnAxTlhjME1HdHViVXBQVm10MVpFTkxSMXB4TlVaMVFWYzBjR1JuVm5OYVNVMVRjbmR1TkNZamVFRTdjM2xOWTFoR2VYbFViWGhyU1hCdE1YZFpNMUkyY2tsNVEzaDFhVUZPT0RKMVRFVTRMM0ZOYVdOUldEVklaazF2V1ZoWVUzbEtha1J4VUhacFkweFRXbThyUkZWUVprdDZhVko0Y0NZamVFRTdha0psVmpjMVZFeEhlVVZyWmtaalZuQjJiRXBwTWtOVFMxTlRkVlpyVFdkV1VVaEpjRmhaUlhWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa0pXYWs1VVNWTk1TVUpEZWlZamVFRTdWRlZIV1N0VVNsUmlSMHRXV0d3MVVVaG1UbVpzZW5WV2FuaHpXakZVVlU1cWRtMTJiSEZJV2xsTlZFVk9VM1pUVXpJclFWcE1aSFpvZUUxa2RYQnBla2hNUVZoYU5EUnZTakp5YXlZamVFRTdiVGhDV21sNVpHbHljMHRHZDNsNVNXRTFlVlp2YUhadGQzZFpjbVJpY1UxMFFrMXlXbkZFVGpkd2MwUjZaWEo2Y0d4Q1l6aGhZalYxVFZkQ01FZG1UV2xyZG1sUEsxcEpkM1ZFVENZamVFRTdTMmx2ZEZOUWFtbGpURlZqYVU5ME9WVTVPSEpzYUZWYVJUTjBUbFJ5VkdaTllXVkdjMnByVkcweGRuZGhZalZwVkhoT09GcHdjbUl6VVVrMk5XbDVaek5EVTA5cWJFSjVhMmh6UWlZamVFRTdWbWRqWjJ4a1oxTTNSbGhaY1RkR1dGbHhOMFpZV1hFM1JsaFpjWFJaTlVWc1NWRXdNR3hDYlU1cmJUSjRRMVl6WkhoVGRTdGhlazVzWTIxRlJXaDJOM0p5ZG0xd2VscHVVSGhSV1NZamVFRTdkbkZrZVZSWVRVdFBVek5oV1ZsTldYWmFVMU5qZVRoYVpIQnBhV3hOY2xaUFdtdFlUV2xHUVRWT2JUZEdUSE5MUjNkTmEwRjRTbGhMVGpoNU9FOVBNMFI2V2t0U1JWTTFkVGxNWnlZamVFRTdaRUp4T1ZGcE5IcFJXakJQYm5kMlRXRnlUM0pEVjIxaVUwZE9NVWRVU1RjMmVEYzFZMDFpYVhsdE1uUXhWSFpyZGtSaGVrNUZkek14VHl0V2VYaHllSEJ1WVdGb01ETjZTRzVwWWlZamVFRTdTWHBVSzNreFJHTmlOV2hhVFZScmVHMTVRM2wyVVZGT09IZE5iVTU1V1ZSVWNURjFRVkZPT0hjMWVHSTBiRTFKTTNKc1FrUmhRM0pCTlVKTVpVSk1jMVprYVhKelZtUnBjbk5XWkNZamVFRTdhWEpxWjFaVGEySmlTelZzYlVWMWRUVmhRVFZ5Y3pnelNXaEdTVGN5WXpjMWNFNVNiR016U0VaSmNqSlZiWFZoY2twcll5OUlSbXAxYjBWdGRWRjRiREpQU21veE0xZHdlbGswYVNZamVFRTdOMGhIYkRCbk0zcE9hVmhMYVhCVmVXSktNMGhEZEhKbmRWTkJXVWRUTkVsamVYTmxUek5HZVRWaFdIRnRZbXBVWVdRd2RYRXhWa3Q1YVcxa1JIQjBUemg2Y1RsVmNXTnpNMWRNUmlZamVFRTdWRzlqTW1FeGNHdDZUR3BDZDFwVVYwNUtiR2RwTVVkVE16RlVhM1ZHYUhoTWEyNXdaMDFXTkd0YVFtUnJSV0kxVkV4SGVVVnJOWE0zTkRGSEsxbHRWRWMxUlZwemF6QTJMM2REYlNZamVFRTdLMkV2VEdwamNVVXlVelptWkRGQk0zcFhOVmxQV0VOVFpUSTRkR0ZhYUZOcE5VVlRhbFZoYjNscmRHZFdUV2xzTWt0MWVGWXlTM1Y0VmpKTGRYaFdielJEYkVSNlNGazFhalZEZWlZamVFRTdhV3hHTmk5WVRsSnhXazlhYWtOU1dHdG9NM3BTV2pWUFpHcERWRE5LU25KdGRHeEtla2xLVUdWU2F6RjVWVU0xYlUxd1JtUlJiWEI2VDNoNll5OUlTa3hhV1ZSWVRUSk5NMHRxU2lZamVFRTdVemxKTldGS2MzVktjMUZ1U21sVVExZFNaVWxVYlZacGFtSnBOV00wUXpjd2NWcDFUazVuZERGSGNERlJaRk50WkVod1pFMDRNM0U1VnpCWGNHMDNkelJoWkVSdWVqSjBURFZ1VWlZamVFRTdaellyWXpGb1preFJSMnQ1VjBaemJsUkJiR0o1ZUZKaVp6SkxSbEphUTAxQ1EySlVUekoxUTBOT09IaHdkMkp2ZVZwQ2NERXlaSFE0ZDJOelNFcG9TbXhYYkROV1lXSTFjVGd3U0NZamVFRTdUWGg1V2xCYVZGWndiWFI1VW1OMVNsUmhSbkZxVFZkUlluZHBUWEphVDNoV01rdDFlRll5UzNWNFZqSkxkRWh3WjB0VlRsQXdUMWt5VW5OcGEzUTVNM3BUTm14NlkxTlJNMlZoVENZamVFRTdUelV5VGt4YVVsaE9aRXA1YjI5SFpVdHZkMUpNWmtkVFYxUXliR0UzV210M2JUVk5UV2xCYkhOMEsyMWFUV055WlUxeGFXSklNbmt3V2xWdVRURTVWWEJ0Vm1sc1ltcGFUbEpVYWlZamVFRTdRVUp0T1RCdFR6TlZZVzVYUzAxcFFWb3hSMnQzVDJjeFQzTjBSRTlSVFRaTVFtbGtTRzE2TW05Tk1tSkRSVWhCYms4eGFHSk1aMGR2YkdGVWFGa3lNVmhEYUhKR1dGbHZZbkpwY1NZamVFRTdUR2hsYUVkV1UwUlpRMjVXYUV0a2MzYzRjMWNyUWxwV2NGVXpWR1pPV201cE5XMU5jM1F3SzFOMFRURlhWVTlrUVhBNVluUnpUWGRhVDFKR1J6VlRNazk0VmpKTGRYaFdNa3QxZUNZamVFRTdWakpMZEVoQlZXOWxXV0pJVFdaSlIyTlZiM1pWTmpWeFRsUkdlazFhVTBjM2FqWTFiM000V0U5NGJFeEtWak42VjFSRWJGSkxTRnBMTlZSaVdVTndUbUpuTlUxVFdrTmhhVEZyUkNZamVFRTdNbmxaYlc1NFZrWTNTVVIwYkRCS2RHTTROa1Z0WjBNeE1ucGFObGwxZEhvMmJFRlVRMjFrV205Qk5raFZObTl2UzFrMU1USnJhVWhVTldONFMwTnNZbVpPTjJsRWFIbHVZV2Q0ZWlZamVFRTdURUZoVTFad1QxTlJNV2x5YzFWUGVGWXlTM1Y0VmtWU1NHTmFRWE4zYlRGcFpIaHRUR3RpYjAxeE1HdHRiM3BYV2pOTmVITjNNREE1VFRGSFZucHZUV2gwWldkNlFXMDFWVlZtYkNZamVFRTdSRmszUmxoWmNUZEdXRmx4TjBaWVdYRTBORVpWY0VZeWVYRlpXbWR3WW1SNFZrSjZXRm8wVDFKRFUxTXphMEo2VXpacVJUVjFUMU5WZW5kRlNFNVViSGgxV0VkVFJrMWxXVXBFV2lZamVFRTdlRTlEUkVKVVJYcGlUV1ZUUVdGd1drWkhWMHhpY0d3d1FUUjFWRXRzYkRGRlpEZ3lkVzFNY1RnclVrcHliRk5EWXpaeVVUVkxaRXh0YTJ3d01XUTROamRTTlVoWWVrdEZhMGRpTHlZamVFRTdRVUY1WVdsdlRtMWFSWE5HZFZSUk1XbHljMVprYVhKelZtUnBjVWxwUnpSNVJXMVpWR1Y0V0dOYWFWcERNMUZhVm5CTE9VMHhiV04xWW1wYWFuQjVPVTB4VDFWMVpFSnJSbk5PYUNZamVFRTdiVUpPZVZsdk4wdEhlREpMZFhoV01rdDFlRll5UzNWNFZqSkxjbGRIVWtsVFJVNU9TRlZhYWxwSlRuTlRiSFI2WWtFMWNtTXlSbmxKVkZOeE5IUmxkV0Z1VUdkamNVOVNURnBaU3lZamVFRTdXbkZhTkZjemVFWkJjbFJMYW1waGNGcElSRVZTWVVwYVNGQkhRMDF6YVVkcFkydENaRkZpU0UxNlJFdHVRbmx3U21WWE9VTmpNekpyZVRBMmRreEdTamR0VDJoUFpGWnZjemRuZWlZamVFRTdRMEpyV0U5dE1DdFdjRXRuZVRWMFkyTXlRMjFTYkRSTFIzRlpWbVIyYVdoeVJsaFpjVGRHVlZwRGRuaEVTM0JHYzBGVWJsUTBPWGh0U0d4TVprRk5kREJ0VUhCdGNucHNlbU5aV2lZamVFRTdaSEEyWkUweFYxVjFZa0ZLTjJKcVdWcG5lV05yU1haTGJXSnpWbVJwY25OV1pHbHljMVprYVhKelZtUm5WbGw1TVhsRmIzTm5WVkJNUTBOTmIyNXFkRzFLU1VNMGRHUnFkRzFFYkNZamVFRTdkMDUzZVVwUVpWY3ZSM1V5WVhaS2NHdHVTMnM0TDNkck5XaFVkMVV3VTNwTFNXeEdZM2cxV1RKMmVGWmtXRUpIVmpoTVRHcDBWRzFXVTAxeloxZDFZVlF6YTFFemVscFpTakEyTHlZamVFRTdTMFZwZGtrMlJUVXdWMnA2VDNWNVFrczFWak42Y1dSTWJtTlpjVUpUY0hwbFdXTjZRbTkzYmsweVQxSmhZVTFDZVRCVVYyeHdhRTlUTkd0Vk1UWk1aVWRRUlhSUE9VWjJSRWhwVnlZamVFRTdia05GTkRoVE1HMU5SblZoYW1KTlpWVXlNRkpVZWxRM1l6ZGlXbWhhV25WU1EweExkRXRuY0ZSaVRscHRhelZ0VFUxeWMxazJRVnB4T0doak1rRlVhVVZpV21sVFluZHBUWEphVHlZamVFRTdlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1YzUzNSYVkwSkRZbEU0TUdVeVZsTm5ka1ZyZFc5dlFVUnRTR3Q0VGxVMWMxZDJiVFJyTldkYVkweG9lWGx3VlRGNVFUTllUVVJLYVNZamVFRTdXVVJOYVVseWMyVlBXV3R6WW1aSVRYRkhOVUpJV0VscFJFMDFWVVJrVTJjeGVrdDRRbmhqYXpCcmRrZENjbTAwTURCeFpHWnJTMVo1T1dNMlJGUmFia2RLVlRGWGNIcGxXV00zUmlZamVFRTdSWGgzVmtoVVRtaEVUM3BCVWtOWFVtSjBiVkZOZWsxU1dDOXZNRzUwYkdkNlNqUkhkakJaWmtSRU5Ia3JSekVyYVhvMFdTdE5kbWh5YkRCekswZEJOV3NyUjJvMFRsQmhieko1YlNZamVFRTdWMVp6UlVVMWMySkZhVzB5V1dWVVNUVkZTVTFxTURZeVNYQjBiWFo1ZW1OeFJWZFJNbk5rUzFwblZFeHJlRU5hVW1waVRXTjBiMVpqWjNsa2FYSnpWbVJwY25OV1pHbHljMVprYVNZamVFRTdjbk5XWkdseWMxWlZjRkowYTFORlJrcGtWRWgzYmt0d1VtTllTMWRIWVc5VFF6SlpiVk5FY21OcmJVOVlSWGhFU0daTlJFcHFZMk0xUm5GWWFFaG1UVmRYU201SVRYRnBLekkyTlNZamVFRTdXRFJVV2pSNWFreGtNVGMxV2tkRVExZFdRVlI1TVhwTmVHSlBVRXRUUTJNeFQySk1SbXR3Y0VwaWFWaG1UbTVwZW05VVYzcG5OVlY2V1ZrNVVUTlJWSFV4YzA5UlJ6SmFWV00zYkNZamVFRTdVV2xxYXpCeGJ6WmFXVTAzWTAxaEx6bEZaalZQVXpoa2JEUmlkakJTTjFrclQzWm9jbXd3YWpKM1NFOXVkekJXUm5CV1JEQjVkVmRhYlUxaFdUSXlibFUzV21wNmVYUnJXVXAwWVNZamVFRTdNblpIYlRKWmN6VjBPRmx3YmtSR1ZFMWhVbUpSUlZOdmVXOXpNU3RDVEhOV1pHbHljMVprYVhKelZtUnBjbk5XWkdseWMxWmthWEY1VkhCblVWVnVNVVpMY1dObldFWjVhR2hsY2lZamVFRTdlRzF5V21wNlJIRTRiMWxzWlRGRVNFMVRZMWhEYTFWRFdsTk5lSEJSVW5oUEszTkllSGxJUVc1cFYyMWpia05KYnpSc1NqTnliSE5YU2t0dFpEaDJha3BEZEVGMmVGcHNVWGxMYmlZamVFRTdLMjVSTVhCMGJXSkVTek0wZDNsMlZISk5SVVJpVFhGUFZqSkhTMHRrVVRabFMyUk5jMGRXZWtKQ1YwZHVSSGQzSzB0NU5FY3ZNR05RUkVRMGNUaEVXVEEwWlVkRWVGVTRRM0ZzWnlZamVFRTdRako1U25sd05FVlNTR0ZCWkhOeVRUSlphV2x2TkVGTmNrMXRVVU5KVm1GYVYxTjZXR2RaUlhRMFJtUnBjbk5XWkdseWMxWmthWEp6Vm1ScGNuTldaR2x5YzFaWGRVNXpWVXBrWmlZamVFRTdVakZWTlVWMFIxRk5VekZsTXlzeGJFMW5Oak5PUm1obGNGRXdXVFZxVkVSeVdtaEtjRlpKVDFrNFp6RnhTa3A1ZFd4WGF6UXdjbkUwVm1KVlZrOVVRMjk1TVdweGQzazJRMmhzUnlZamVFRTdhekk1WVZwc1VVeHNOR2Q2VUZNM1kyTldNbnBKYVZoYU5HOXdPVVJCUzJSTmN6UnVUV2xHWWpCR09FMVFSWHB3TTI5cVNHbFhiUzlTU0docWVFeFVXV2xIUkdsVVV6UlNha0poTUNZamVFRTdka00wVEZNeVFtZFRNMmx5YzFaa2FYSnpWbVJwY25OV1pHbHljMVprYVhKelZtUnBjbk5XWVVsNFZrUllSV1pKU0VGWGRWRlRSRlZ5U1hOSGVYRlVhRFZOVm5OUE1XSlVWek5QV1NZamVFRTdPRE5ZV2sxQ1dYcGtNbFJMWTNnMVQweE1SbE5ZVUVWUlkzSk1XSGR4V2tKM1NYQnpTMVJwZEVzNFRVSlpOVWxOYUVNd05EQXZWREphYUd3d1Z6WkhSV3hzSzJ4aFkzZEJObHByZUNZamVFRTdZemRHWjFwYVdWZDRWbEpzTkdSb2FtaFRZWGh3VVZwT2VVRkdVMjFMV0ZWM2NHUlVSbGhWZDBzelZFWllXWEUzUmxoWmNUZEdXRmx4TjBaWVdYRTNSbGhaY1RkR1dGbHhOMFpZV1NZamVFRTdjVGRHV0ZseGMyUmhha0ZuY0daa1VWWkNNbmxLUkZaSlRXSXhUM2x4UkhSc1JXOTFTbXRuZUZoVllrRTNOMXBxZVdrMFQxTkRVVE5HYjFGbGJWWkZUMDVMUzBWaE0yRjJWRWt3TVNZamVFRTdPRXMxVEZwcFpXMU9Ta1ZWZVhNM1NtbFNkR3huYVROUlozbFVWRXhCTVVjeVdGSnBOV1ZQUkVzNVVIUmhTMDV6ZVVsb2VtOVNWSGt6YW05Q2JHOUVhMUpEUzBGNVZFNTJSa3h6VmlZamVFRTdaR2x5YzFaa2FYSnpWbVJwY25OV1pHbHljMVprYVhKelZtUnBjbk5XWkdseWMxWmthWEp6Vm1ScGNuTldZVWw0VmxOcmFuRk5RbGxyU2xwbFYyZFpTR0pMZVVkdFZWVm5kamxPY2lZamVFRTdXR0pMY0ZKalYyVk9TVXgyVTNSNmRHeEtaelJ6YzFOWWRuQktjakI1U0VFeGJrVnhVVFpUWVdwaVEwbEtSMHBPTjB4VGNVVmlXbHBIUkdaRVIzbERlREF2YWxSaVRHOTRZM0ZGUlNZamVFRTdPSFJ5WTB0UGJWZG5UMVJIUzA1U1lVUktUbWRZTkZWMWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmlZamVFRTdiMnBHUTJwTVJVUm5jRUpEUVhWTVRVMVBiVkZKWVhCUlV6Sm1WRUZVTUhsQ2FUQnVSMmN5TUdkV05scElaMWxsUlhGU05sTkJaVzFKWjJ0WmEyWmlObU5HY0hScmVFWjBha0pOYnlZamVFRTdURmxNTW5sWlJHRkpiM1JGYjAxck1rRkxaMGRHVEhOV1pHbHljMVprYVhKelZtUnBjbk5XWkdseWMxWmthWEp6Vm1ScGNuTldaR2x5YzFaa2FYSnpWbVJwY25OV1pHbHljMVprYVNZamVFRTdjbk5XWVVsNFZsbDVRVFJGVlhCT1FVUXlkMVY0Y0ZST2NYWm9hbE5QUm5SaVdtWkVSMncwVmxaSlVVOHlSMjFXUzI5VlJFWkxObTFHVEhOV1pHbHljMVprYVhKelZtUnBjbk5XWkNZamVFRTdhWEp6Vm1ScGNuTldaR2x5YzFaa2FYSnpWbVJwY25OV1pHbHljMVprYVhKelZtUnBjbk5XWkdseWMxWmtWRVpYY1ZseE4ybE5WbVI0ZUZaMWJVdDFlRll5UzNWNFZqSkxkWGhXTWlZamVFRTdTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5U3lZamVFRTdkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFNZamVFRTdlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUNZamVFRTdWakpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmlZamVFRTdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWlZamVFRTdTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5UzNWNFZqSkxkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5U3lZamVFRTdkWGhXTWt0MWVGWXlTM1Y0VmpKTGRYaFdNa3QxZUZZeVMzVjRWakpMZFhoV01rdDFlRll5UzNZdkwxbzhMM2h0Y0VkSmJXYzZhVzFoWjJVK0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUR3dmNtUm1PbXhwUGdvZ0lDQWdJQ0FnSUNBZ0lDQThMM0prWmpwQmJIUStDaUFnSUNBZ0lDQWdJRHd2ZUcxd09sUm9kVzFpYm1GcGJITStDaUFnSUNBZ0lDQWdJRHg0YlhBNlRXVjBZV1JoZEdGRVlYUmxQakl3TWpVdE1EWXRNalZVTVRFNk1UZzZNakV0TURjNk1EQThMM2h0Y0RwTlpYUmhaR0YwWVVSaGRHVStDaUFnSUNBZ0lDQWdJRHg0YlhBNlRXOWthV1o1UkdGMFpUNHlNREkxTFRBMkxUSTFWREU0T2pFNE9qSXhXand2ZUcxd09rMXZaR2xtZVVSaGRHVStDaUFnSUNBZ0lDQWdJRHhwYkd4MWMzUnlZWFJ2Y2pwSmMwWnBiR1ZUWVhabFpGWnBZVWx1YzNSaGJuUlRZWFpsUGtaaGJITmxQQzlwYkd4MWMzUnlZWFJ2Y2pwSmMwWnBiR1ZUWVhabFpGWnBZVWx1YzNSaGJuUlRZWFpsUGdvZ0lDQWdJQ0FnSUNBOFpHTTZabTl5YldGMFBrcFFSVWNnWm1sc1pTQm1iM0p0WVhROEwyUmpPbVp2Y20xaGRENEtJQ0FnSUNBZ0lDQWdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSEprWmpwd1lYSnpaVlI1Y0dVOUlsSmxjMjkxY21ObElpOCtDaUFnSUNBZ0lDQWdJRHg0YlhCTlRUcEViMk4xYldWdWRFbEVQbmh0Y0M1a2FXUTZaR0l3T0dNNE1XRXRNMlExTXkwME0yVmlMVGczTnpVdFpEWTBOMkl4TWpVek1HTTFQQzk0YlhCTlRUcEViMk4xYldWdWRFbEVQZ29nSUNBZ0lDQWdJQ0E4ZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDU0YlhBdWFXbGtPbVJpTURoak9ERmhMVE5rTlRNdE5ETmxZaTA0TnpjMUxXUTJORGRpTVRJMU16QmpOVHd2ZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDRLSUNBZ0lDQWdJQ0FnUEhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDU0YlhBdVpHbGtPbVJpTURoak9ERmhMVE5rTlRNdE5ETmxZaTA0TnpjMUxXUTJORGRpTVRJMU16QmpOVHd2ZUcxd1RVMDZUM0pwWjJsdVlXeEViMk4xYldWdWRFbEVQZ29nSUNBZ0lDQWdJQ0E4ZUcxd1RVMDZTR2x6ZEc5eWVUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEhKa1pqcFRaWEUrQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJRHh5WkdZNmJHa2djbVJtT25CaGNuTmxWSGx3WlQwaVVtVnpiM1Z5WTJVaVBnb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQThjM1JGZG5RNllXTjBhVzl1UG5OaGRtVmtQQzl6ZEVWMmREcGhZM1JwYjI0K0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lEeHpkRVYyZERwcGJuTjBZVzVqWlVsRVBuaHRjQzVwYVdRNlpHSXdPR000TVdFdE0yUTFNeTAwTTJWaUxUZzNOelV0WkRZME4ySXhNalV6TUdNMVBDOXpkRVYyZERwcGJuTjBZVzVqWlVsRVBnb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQThjM1JGZG5RNmQyaGxiajR5TURJMUxUQTJMVEkxVkRFeE9qRTRPakl4TFRBM09qQXdQQzl6ZEVWMmREcDNhR1Z1UGdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBOGMzUkZkblE2YzI5bWRIZGhjbVZCWjJWdWRENUJaRzlpWlNCSmJHeDFjM1J5WVhSdmNpQXlPUzQySUNoTllXTnBiblJ2YzJncFBDOXpkRVYyZERwemIyWjBkMkZ5WlVGblpXNTBQZ29nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4YzNSRmRuUTZZMmhoYm1kbFpENHZQQzl6ZEVWMmREcGphR0Z1WjJWa1Bnb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBOEwzSmtaanBzYVQ0S0lDQWdJQ0FnSUNBZ0lDQWdQQzl5WkdZNlUyVnhQZ29nSUNBZ0lDQWdJQ0E4TDNodGNFMU5Pa2hwYzNSdmNuaytDaUFnSUNBZ0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBnb2dJQ0E4TDNKa1pqcFNSRVkrQ2p3dmVEcDRiWEJ0WlhSaFBnb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQ2p3L2VIQmhZMnRsZENCbGJtUTlJbmNpUHo3LzRBQVFTa1pKUmdBQkFnRUFTQUJJQUFELzdRQXNVR2h2ZEc5emFHOXdJRE11TUFBNFFrbE5BKzBBQUFBQUFCQUFTQUFBQUFFQUFRQklBQUFBQVFBQi85c0FoQUFLQndjSENBY0tDQWdLRHdvSUNnOFNEUW9LRFJJVUVCQVNFQkFVRkE4UkVSRVJEeFFVRnhnYUdCY1VIeDhoSVI4ZkxTd3NMQzB5TWpJeU1qSXlNakl5QVFzS0Nnc01DdzRNREE0U0RnNE9FaFFPRGc0T0ZCa1JFUklSRVJrZ0Z4UVVGQlFYSUJ3ZUdob2FIaHdqSXlBZ0l5TXJLeWtyS3pJeU1qSXlNakl5TWpMLzNRQUVBQjcvN2dBT1FXUnZZbVVBWk1BQUFBQUIvOEFBRVFnQnpRSFlBd0FpQUFFUkFRSVJBZi9FQWFJQUFRQUJCUUVBQXdFQUFBQUFBQUFBQUFBSEFRSURCQVlGQ0FrS0N3RUJBQUVGQVFBREFRQUFBQUFBQUFBQUFBVUJBZ1FHQndNSUNRb0xFQUVBQVFJQUFRSUNQbHNBQUFBQUFBQUFBZ0VERVJJeEJCTUZCZ2NJQ1FvVUZSWVhHQmthSVNJakpDVW1KeWdwS2pJek5EVTJOemc1T2tGQ1EwUkZSa2RJU1VwUlVsTlVWVlpYV0ZsYVlXSmpaR1ZtWjJocGFuRnljM1IxZG5kNGVYcUJnb09FaFlhSGlJbUtrWktUbEpXV2w1aVptcUdpbzZTbHBxZW9xYXF4c3JPMHRiYTN1TG02d2NMRHhNWEd4OGpKeXRIUzA5VFYxdGZZMmRyaDR1UGs1ZWJuNk9ucThQSHk4L1QxOXZmNCtmb1JBUUFBQXdBQkFRT0NGd0FBQUFBQUFBQUJBZ01SSVFReFlRVUdCd2dKQ2hJVEZCVVdGeGdaR2lJakpDVW1KeWdwS2pJek5EVTJOemc1T2tGQ1EwUkZSa2RJU1VwUlVsTlVWVlpYV0ZsYVltTmtaV1puYUdscWNYSnpkSFYyZDNoNWVvR0NnNFNGaG9lSWlZcVJrcE9VbFphWG1KbWFvYUtqcEtXbXA2aXBxckd5czdTMXRyZTR1YnJCd3NQRXhjYkh5TW5LMGRMVDFOWFcxOWpaMnVIaTQrVGw1dWZvNmVydzhmTHo5UFgyOS9qNSt2L2FBQXdEQUFBQkVRSVJBRDhBbVlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRkFBQUFVd2lxcW1GVENZUXNLNFZNS21Fd3FLMkZjSmhXNFRDRmhjWVZ1RXdoWVhZVmNLekNyaEN3dXdpbUVWVXNMaFRDQXFBS0tpZ0NvQUFBQUFBQUFBQUFBQVAvOUNaZ0FBQUFBQUFBQUFBQUFBQUFBQUFBVUFBQVVGQlZWVENwaFVyVlJXd3JoVXdyYTFXMWtMb1FYMWt0eFN5c2x0WnFXVjBKV1RGR0tZSzNGTW1LV1YxNEdmRks0cHJaTlZ5WVdTOERZeFM3Rk5hbHhmU2F0bFNNalBTcXRLc05KTDZTTEsyTXJKaFZXVXF1cFZWWkdDNVZhcXFvcUFBcW9xS0FBQUFBQUFBQUFBQVAvL1JtWUFBQUFBQUFBQUFBQUFBQUFBQUFCUUFGRlZLaXFpbGFsYXJhMVVWaEFyVmJXU2xaTWNwcVdYcENWZFdUSEtiSE80d3p1cll4ZXNzak5LNHhTdXRlZDVnbmY1RmJHWjd5MFc1VzhzcmZhTXNpT1JZNjVFY2l0dkU5WVVMZzlISjZ0TDd5ODFISXEweUk1RlM4YTY4aTRQVnBlWkkzWGxSeUk1Rm1oZjVGV0V6em1vdlVqY1pZemVkQzgySVhGOElzZWVuWWJ0Skw2VmEwSnMwWkw0UmVNMHJMU3E1anBWZlNxcnpqQmNxdFZWV3FnQ2lvQUFBQUFBQUFBQUFQLy9TbVlBQUFBQUFBQUFBQUFBQUFBQUFGQUFVRlNxbFNxMnRWRllLVnFzbFZXVldHY2xJeGVrc0NVMkNkeFM1Y2F0MjZzakZrU1U3SzY1ZGExeTh4WGJ6VHUzK1JlYzB6TXAwV2U1ZjVGcnp5STVGcTNML0FDTFduZmVVWjJiSlFia3NpT1JZNjVFY2kwWlgyT3Q1Wkdka1MwSG9acU9SVnBrUnlMek1uSzB2S1hpWFhrUFdoa1J5TFp0NUVQRmhlYkZ1OHZoTThaNkQzTFY3a1czYXU4aThTemViOW02OVpabURWcFdIcjI3alloSjV0cTQzTGMzckNMQXFTV0c1R3ErbFd2R1RMR1MrREhtZ3pVcXJSanBWZlNxNTV4WEtyYVZWRkZWVkFVVkFBQUFBQUFBQUIvL1RtWUFBQUFBQUFBQUFBQUFBQUFBQlJWUUJTcXEydFJWU3RWa3FycFZZcHlXeGl2bGd0bkpyWEpycmx4cDNycXlNekpweVdWTHQxbzNyeGZ2UFB2WDNqTk1rS05GZGV2dEs3ZjVGWmR2Tk81ZWVNMHlTcFVXVzVlYTg3ckZPNHgxbTg0ek11V215U3VMSzNHT3NsdUtXMlhyQ1JteFpTYkRpakNXVmJ3dHFOeHNXN3JRakptaE5kQ0x5bmtlclp1dCt4ZHhualdwdCt4Y2U4a1VmWGtlMVp1TjIxTjVGbTQzN1Z4a3l3Uk5hRDBvVFpveWFOdWJZak42d2d3WjIzU1Mra210R2JKU2E2dzhveFo2VlhZV0drbDFKRmhiWlpjS3JIU3E2bFZMQXVGTUtxZ3FLQUtnQUFBQUEvOVNaZ0FBQUFBQUFBQUFBQUFBQUFVQUNxbGFxV1ZUQ3NyVld0V09VbHNabDBJS1NrMTdrMTA1dFM3ZGVVMVI3MDVMS3k5ZGFGKzh2djNYblg3enhtcUpHalNXWDcyTzgrOWRYWHJ1TzBydHg1Um5TbEdrcGN1TmFjeWMyS1Vsa1lzNlNRbEpiV3FsYXFMWHJDQmhNS2dMbFJSVUYxS3NzS3NWRjhWMHJ5bnR6YnRTYjFtVHo3ZFczYXF5cWNxT3RvamIzcVdadDYxY2VWYW0yN2R4bTA1RUxYbXQ3MUxkeG5qY2ViQzZ6eHVzaUZOSFR6UFJqY1pJM0hueHVzc2JxdDVieGpNOUNOeGZHYlJqZFpZM1ZzWkZMeE4yazE5Sk5TTnhrak5aR1ZXeTJhVlhVcXcwa3VwSlpHQ3NJc2lxMmxWY0tpcXFxZ29xcUFBQUQvOVdaZ0FBQUFBQUFBQUFBQUFBVUFCU3RWSXhDdFZsYWtxc2NwUEthZXd2aEJXVW1HY3ljMnRjdU1hZXJZZTBraWwyNDBiMTNIWDNyclF2M2NkaXpWbWRScE1kKzY4Ni9kWkw5MW9YcmkyOHl5bEtOSmp1M0dwT2ErNU5yeXFyQ0tRcHlXRkpWV1ZxcldxMWM5NFFGQUZ3QUFxb3JRZ3BGZFJmRlpSa2pSNnlTMlhoVm1zUVo3Ylp0MWEwR3hDcVFvMDBSYlRWdDdidHliTUp0S01tV00wbFNwSUt2VnRXOUc0eTB1dENseGZTNnlZVW1CUFVlakc4eVJ2UE5wZFh4dkt4cFBLTlI2a2J6TkM4OHFON2tXYUY3a1ZrMUpTOGIxbzNXYU54NWNMelloZGVFMU5mQ2Q2VWJqTEdiUWhkWjRYSGpOSTlJVE55a2w5S3RhTTJXTW5sR1ZmQ0xOU3FxeWxWMUtyTEM1VlZRVVZWQUIvL1dtWUFBQUFBQUFBQUFBQUFCUUZCU3EydFZhMVk1VmVjODFoZENDa3BNRTVycHlhMDVzS3RWc1BlU1V1VGFsMjR1dVRhZDI0amF0ZGwwNUZsNjQ4KzljeDJhOU5vM3A0N3d2TnN4U0ZHUmd2VGFWMmJOZGsxTGxYdkpHeWtxVXJIT1RGV3E2VldPckpsWmNzRktxS3FMbDRBcUFxQUswS1VYVW91bGhaZWMwMWdwUmxqUmJHakpHak1vMDdLUHRvcTJJUlpJc3NXT0srbFV2UW8yNUEyMVY3ZXpVcXVwSmh3cTRwSlU2U0ZyVmJNV2ZGbVRHdldaaTJSQ214SnAyMVM2dXBkYWVURmFYRmJ5M2xHZHZ4dk0wTDNJdk1wZFpZWFZrMU12RzlhRjVzMjd6eDRYV3pidlBDZWt2bG5leGJ1OGkycmQxNDl1OXlMYnQzV05QVGU4czcxWVhHZUUzblc3amF0ellzOGoybG1ic1pNbEt0YUVtV05YaE5CNndpelVWV1VxdVdMbFZWQlJWLy9YbVlBQUFBQUFBQUFBQUFGQUZLcXJhcll4Vmd0bFZobkpmS3JCT1RGcXoySVBTV0RIY2sxYmsyVzVKcTNKSW0yaXJiMlhUbFlyazJwZGt5M0pOVzVWRjFLbHF6S2NyQmRrMHJ0VzFkcTA3cXRPYXpGbjBvTlM3VnJUcTJialZtejZVV2ZUWXBNZFdTU3lyTGxaRUZvcUxseWlwZ1Z3Q2xsVEFyU2l1QmRTaTZFTEt5YWF3cFNpNmxGYVVYVW95cVZPeXc2MWFFSUZLTWxLS1VvdW9sTFo2TnV0RUpiVmJSYjdWZFJkaFdHRkwwYVZoQlcwVjdNWXI4S21LV1lWS3lac3NpTm5xV1YxWktWa3NySmJpbnJDVjR4bVpNV1l0aXhSaWxid3ZPTXpQU2ErTnhxMGt1cE5TTXFsNG05QzQyTGQxNTBiak5DNDhwcEY4Sm5xMjdyYnRYWGtXN2pidFhXTlVwdmFTZDdOcTYzTFZ4NDltNjNyVnhoVktiSmttZXBibTJJU2VmYW0yN2NtSlBLeUpZdHVOVjlLc01hc2xLdkNNSHJDTElLVUZpNS8vOUNaZ0FBQUFBQUFBQUFBRkZWQVVxdGt1cXNrODU0cm9NVTZ0ZTVWbm5WcTNLc0N2TmFQZVNEQmNrMUxrbWU1VnEzS29TMmllM3N5bkJoblZyVFo1MVlKbzJhYTFaY2tHdGNhdHlqYm5ScjNJdlduTXk2Y1dqY28xcDBidHlMWG5CSVVwMmJUbWFzcUxLMFo1UldWaXk1WjN2Q1ppd0dCa3hCaVY5NGwxNGxtQldrV1NrRjFJTG9Sc3ZPYXBDREhTSzZrV1NrRmNTeXFVbGxpVmE4SVpPc3BGV2xGK0pNQ1Z0bm9XNUVXMDIxVysxVUNxMnRVeFFvMkVEYlJiUlpzMnF1RlRDdHJWU3RVaEpKWVJkU3JaWFZrdHJWYldxbGF2YUVySGpNdXJWYldxbUZUQ3VzTEl4VndxWVZNSXJZVzJWY0t0SkxNS3BZVXNzbEpNc0o2RzFzSytNdERvcEdWV0VXL2JtMnJWeDUwSk5pM05qenlQV1daNnRtNDM3TnpHZVBhdU42emN4bUhWa1pNa3oyTE0yN2FtOHF6TnZXWnNDcEt5cEpub3drelJxMWJjbXhDckVtZ3lKWXMxRlZ0S3F2SmUvL1JtWUFBQUFBQUFBQUFBQlJWUUZLc2NtU3JISjVUcm9NTTJyY2JNMnJjUnR0R1RzaW0xYmxXcmNiTnhxM0VIYlJrN05wc0UyR1ZHYVRIS2lPbWphc21WZ2xSZ25GdFNveFNpdWttc1BlV1pwVGd3VGczNVFZcFcyWFRxc2lTZG9TdHJLMjI5VzBzcmFaTXRaN1FxdFBKWmt0dDVLTWx2V0ZXeXBHczFxVzExSU0rU3pFTXVqR3pGaTFiYUxHVHNPSU1TeTFvc3JSTTJ5MDdOaEUyMFcxMisxWTYwV1ZYeVk1VlQxczlHM0lXMmkybXpadFZ0YXJLMVZsVlpXcVRweVdFWlVxMlN0Vk1LbGFxWVh2Q0RIak1yV3FtRlRDTHJDeXlZVkFWVXNnQW9BQUt4cm9haFRIQm5qVm50eWEwYXMwS3ZLYUQwaEZ2V3BONnpMR2ViYXEzYk1zWmkxSVBlU0wxYkVub1daUEtzU2VqWXFqNnNHWFRpOUsxVnN3cTA3VlczYnF3WjRNcVdMWWlxdGl1ZUVYby85S1pnQUFBQUFBQUFBQUFGRlZBVXFza3ZxdGs4NTRMb05lZEd0Y28yNTBhMXlpUHRvbHRIdkpGcFhLTlc1UnUzSXRXNUZDVzBTMjltVTR0U1ZHT3RHZWRHS3RFWlBMYXNtV0xGV2kyc1dXdEZ1QjVQU0VXR3NWbFlOakVtSWVrc3k2RTdWcmJXMXROdkVLVmc5Wlo0cTNtMkdwa3BiVzIyNndXU2d5S2M4Ykx4cVY3RUxlMWF3V1ZvMkpVWUpwZTJXMWpCR1cwVzAyKzFZcE1VcXNrNnNNcXRsdGpsaGFJYXZiUkdPVHJKVllwVlh5cXhTcW5xRUlXSU1DZXJHS3l0VmxhcnFyS3M2V0R3akVGQjZMYklBS0FBQUFBQUJUSENnTWxHV0RGUmtnc21YUWJWcXJkczF4bWpiYnRuYUdOVWU4ajBiRlhvMks0enpyRDBiRzBJK3F5NmIwTExjdHRPeTI3YVBxTXVSc1JYTFlybmhGNndmL1RtWUFBQUFBQUFBQUFBQlJVQlJiVmNwVmJOQldEREtqQk9MWmxSaW5GaVZaTEwxbGkwYmtXdGNpMzdrV3RjZ2liYUtWdlpWT1pvVGl4U2kzSndZSlFSVldreVpabXRXSmdaYXhXNGxpUmtlbDRsbUpNU3Z3R0JTOEsyTTYzRXFZbGt3R0JmTEs4cHFqREtMRktMWnJGaW5GazA0V3JGcTFXcE9qV3VVYmx5TFd1UlM5c3NiRVlJdTJpZU5xMUpzRW14Y28xNTBiSmJIVXR5S3FUUnNzVW1PVEpKanFucUU5cEI0UmlzcXNxdnF0cWtKSXFMUlZSNndVQUFBQUFBQUFDbU9GTWNHU2pMQmlpelFXVEw0TmkwM2JOTVpwMnFONnpUR1l0U0wya2I5aWowYkZNWm9XS1BSc1V4a2ZWaXpLYmRzMGJsdHEycU51M1JnVkdWSXpSWHJZcm1QRjZ3Zi9VbVlBQUFBQUFBQUFBQUFBRkNvS0N5dEdPVVdhdEZ0YVBPZVd5dWhGcXppd1RnM1pSWVpRWVZXbFplMHN6Um5iWUpXMi9PRERLMmphdHM5d1pFdFJveWd4MWkyNXdZWlJZTTlCZmVZd1Zvb3ZsUlpWNHhwV0huTlZWTUNtRmRSUzhGaDR4cVdWdGFNY29zMkJTdEhwTGFQR2VObHFUaTFia0cvT0xYdVFadEdleEZoVm9QT3VSYTA0dCs1QnEzSXB1Mld0YmtkVmxhY3FNVXFOaWRHR1ZHdzJ6VmJjeG9zVlZ0YU1sYUxhMFMxS2V6QmF4aTZ0Rk1ESmhGVmFLNERBdnNxS0N1QlRBQUdBd0FCZ01BQlRITUNzYWFIUUdTTkdhRkZrYU0xdWp5bWk5SVFiRnFqZXMwYWxxTGZzUnhtSlZpOTVJTjJ4UjZObWpSc1J4bm8yYUkrckZtVTROdTFSdHdvMXJWRzFDakJuaXlaV1dLNVNLcnhpOVgvL1ZtWUFBQUFBQUFBQUFBQUFCUlVCUlN0RlJTTUZWbGFNY29zMkJiV2p6bWtzcXdpMTVRWVp3YmxZc1Vvc2FlalpYd25hTTROYTVGdjNJdFM3UmlWTFoxSnFyVG13MXF6WFdyT1REbm9QQ2FzdXhTNmttdmkxMUpzYWFuWVd3ck5tbFJpak5kU1R6dkRZWDNqaEVsUmd1VVpxMVlwMWVzbHBGNVZJd2kxTGtXbmRpM3JqVXVwSzJlZU1MREFyUWFWeWpCS2padU5hYWR0bHEyNWd6eFk2cmNDNnFpYW8xYlI1MlZNQmlWOUtMcVJaMGxWZkJoeEttSmJPSU1sdmFGUmRZYTJKcXBpYXRySlNtU3FycnhsNFd0aVRFdGpKVlRKVlZieHdMd3RiRW1KYkdTcW1TcWw0NEY0V0RFMVhRam9xak5rcXErRnJSVkZJemtKVkl3WjdjRjBiYlBidHZHYWQ2eXlxMm9OK3pIR1liVnR1MllNU3BPOTVKV3pZaTM3TVd0WmczclVXQlZtWmNrR3hibzJJVVliZEd4R2pEbml5SllMNkxsS0t2SmUvLzFwbUFBQUFBQUFBQUFBQUFBQUFVVkFVVXdLaWd0clJqbFJscXNrdGpLUmkxYmxHbGVvMzdsR2pmZVUwandxVFBQdmJTMHJrbTVmMmw1MTZyRXFVMkZVcVdGdFpsTGpYblBRMXVUR0pQU2VVSzFxM28zRjlMalFqZFpLWFdOTlNlMHRkdVZ1TEpUWU1tclpYRklVMTBheXR5VFZ1Vlh6dU5lNU5sMG9XR0pWcU1WeXJYblZsbkpyeXFsS0UxaXd3cDUxdFNpbGFsRXJTcXZLRXpMR2pMR0xIQnNXNHMyU3M5cElxeGd2cGJaSVFiRWJUM2hXWk1zTExWcFo1QlhKRGRwWlgwc0w0VlhyQ1I1MlNESkhJUFJ5UVpJNUJXODVXOHQ1MlNPUU0wL0lQUnlSeUJrZ3ZPTHkzbjB5SDVCZEd3MzhrTHFXT1FValdJVTJuR3l6UXRObU5qa0dhRm5rSG5OVlh3a1lyZHB1V3JhdHUwMmJkdGp6MUh0TEl1dFFiZHVLeTNCc3dpeEo1bVJMQmZDak5HaXlOR1dsR1BORjZ3Z3VvQ3F4Yy8vOWVaZ0FBQUFBQUFBQUFBQUFBQUFBRkZRRktySkw2ckpDa1d2Y2FOL2FXL2NhVitpeU1HTlVlVmtSdEx6YjlYcVpFVXgzbDVFVXgzalBLamEwV2pja3hWbXV1dGFVbU5OSXdwcDdFV2VseGZTNjA4V3JTNDhacWFzS3pjeWFWdXRUSmhreGJlV3V2UFo1WEdHYzJPdHhaS2IwbGtzUEtlclpWbkpobFZXVW1PdFdWSmFNZWFkWEN1aXg0VjhXVkpQWVd3bVo3YmJ0VWExcWpkczBaTWxWbFVvdG0xQnQyN1RIWmhqTisxYmU4dFZJVW9XVmtiTEpTdzJZV21hTmw2UXFzdVdSbzVJNUJYSkhJTitsbFhKS3Q1cSs4dDUyU09RVnlROURKSmtrdk5MeTJoa2hXbGprRzlrbGRTeXBlYVhsdEtsbmtHU05sdDB0THFXbHNhcTZFakJDMHp3dHNrYmJMR0R5bW5Yd2xXd2d6UmlSaXlVaThacG5wQ0JHaStsQ2xGVmtZcjRLMEFXcXYvMEptQUFBQUFBQUFBQUFBQUFBQUFBQUJSYkpjdHFLUllMbEduZW8zcDBhdDZLMkx3cVFlVGtSSEhlVmtSRjdXUkVjZDVXUk1NZDV6UVJ0ZVY1RjZtTzA1dlF2eHgyaGRvOG93UmRXMFlLeVV4YWtsbGFySXlzZU16Sml6RnNPS01VdHZDWGpaS3pVckpqeFNtRldFcTJNNjZ0Vk1LM0NMNExieExxTWtHT2pOQ2owaEZkSzJMVkhvV0l0T3pGNk9ROGNaNlN6TXlqQnZXSVl6MGJNR3BrUERHZWxaZzlvVEpXakt5MjdiUEcycmJob1RZakJmQ2RueVNzTkxaa3RzVWdyaUZieHI3d3RmSlprdHNZZ3hCZU5XOExYeVdya3RueEN1Skx4bDRXQ2x0ZFNETGlWY1NwZUpXOExIU0M2a1YrSlhZRnNabGJDMmtWMUtLNEJiWlZGUVVWRlFCLzlHWmdBQUFBQUFBQUFBQUFBQUFBQUFBVVVxcVZCaWxScjNZdHFWR0c1UlNMeW5nOHkvREhlWmtSYngzdFhvWTd6c2lMYXlNR0RXa2VGa1JieDNuWG9QYXlJdDQ3emI5dkhlY1lJcXRJOHU1RmhrM0xzR3RPS3lNR0JQQ3d3MVV3cnEwV3FXSGxFVUFVRmFGS0xxVVZWZ3VqUm50eFk0UmJkcUdNckI3U1NzOWlEMDhoNE5TeGJlcGtQYmVrRWhRa2JtUThNWjZObURWc1F4bm9Xb3ZTQ1dveXMxdUxQR0t5RkdXbEYxbG1Td01DdUJYQXFyWlhyY0JnWEJaRnVBd0xnc2kzQXJnVkFVd0tnb3FBcUNpb0FBQS85S1pnQUFBQUFBQUFBQUFBQUFBQUFBQUZGVkFVclJpblJtcXNsUVd4ZzA3c0dsZnR2VG5GcTNZTFlzZXBKWmVKa1JheDNtWDdPTzkrL2FlZGZzckl3UnRhazhHOWFhZHkyOW0vWmFOMjBzakJHMWFielpRWTZ4Yms3YkRLMnRZczBqQmdNRExpQ2tGRnQ0VmxJc2tZTG8yMmVGcFZmTElwYnR0MnphVXRXbTlZczR5NkVHVlNwc21ROW5HZW5rUGFZYkZsNk5tMnZoQkowYWJOWnQ0emR0eFlyVUcxQ0srQ1JweTJGOGFMNlVVcFJjdVpFSUFxQ3FncUFvS2dBQUFBQUFBQUFBUC85T1pnQUFBQUFBQUFBQUFBQUFBQUFBQUFBVVVyUlVCaWxSZ3VRYlZhTWNvcVBPYUR6N3R0b1hyTDJMa0dwZHRMWXdZdFNuWmVIZXNOQzdZZS9kc3RLN1k1QmJHREFxMFhoWExEWGxaZXpjeUg1QnJ6eUg1QlpZWVU5RjVkYkpTeTlHdVEvSUZNaCtRTER6dkphVUxMWnQyR3pESWZrR3pieUg1QldFSHJKUlliTmprRy9aczR5KzFZNUJ1V3JQSUxvUVp0S2lXYlRldFcxdHEwMm9RWHdnejZkT3d1aEZtalJTTVY5S0tzcVdDdEZSVlZlQUFBQUFBQUFBQUFBQUFBQS8vMUptQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVVWQVVxdHJSY3BVVVlaUllaMjIzV2pIS0tpeWFXeTgrNWFhdHl3OVdVR0dkcFNNR1BQVHN2SG5rUHlEQkxJZmtIc1Nzc1VySElMYkRIbW9QSXJrTnlDdE1odVFlcFhJZmtDbGprQ3c4N3lHaERJZmtHZTNrUHlEY2pZNUJsalpMRDFsb3NGdXp5RFp0Mm1TRnBtakJkQ0RJa3AyRnNJTTBZcXhpdnBSVjd5eWxLTGdWWGlvQ29BQUFBQUFBQUFBQUFBQUFELy8xWm1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFVVkFVVzFvdUJSanJGWldETmdVclFVaksxcTIxbGJUYXJGVEVLV0ZrWkdya29wYWJXSU1RV0ZMd05lbHBmUzJ6WWxXa1N3ckNSWlNDK2tWYVVWd0tyNFFLVVZBWENvQUFBQUFBQUFBQUFBQUFBQUFBQS85YVpnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUZGUUZCVUJUQXBnVkFVd0dCVUZGTUN1QUJVRlFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSC8vWG1ZQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFILy8wSm1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUIvLzlHWmdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWYvL1NtWUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSC8vMDVtQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCLy85az0iIHdpZHRoPSI0NzIiIGhlaWdodD0iNDYxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTg3LjIgLTk1LjgxKSIvPjxnIHN0eWxlPSJjbGlwLXBhdGg6dXJsKCNjbGlwcGF0aC0xKSI+PHBhdGggZD0iTS0zMjEuOTggOGgyMjEuOTZ2MjIxLjk2aC0yMjEuOTZ6IiBzdHlsZT0iZmlsbDp1cmwoI3JhZGlhbC1ncmFkaWVudCkiLz48L2c+PHBhdGggZD0iTTE2NC45MyA4Ni42OGMtMTMuNTYtNS44NC0yNS40Mi0xMy44NC0zNS42LTI0LjAxLTEwLjE3LTEwLjE3LTE4LjE4LTIyLjA0LTI0LjAxLTM1LjYtMi4yMy01LjE5LTQuMDQtMTAuNTQtNS40Mi0xNi4wMkM5OS40NSA5LjI2IDk3Ljg1IDggOTYgOHMtMy40NSAxLjI2LTMuOSAzLjA1Yy0xLjM4IDUuNDgtMy4xOCAxMC44MS01LjQyIDE2LjAyLTUuODQgMTMuNTYtMTMuODQgMjUuNDMtMjQuMDEgMzUuNi0xMC4xNyAxMC4xNi0yMi4wNCAxOC4xNy0zNS42IDI0LjAxLTUuMTkgMi4yMy0xMC41NCA0LjA0LTE2LjAyIDUuNDJDOS4yNiA5Mi41NSA4IDk0LjE1IDggOTZzMS4yNiAzLjQ1IDMuMDUgMy45YzUuNDggMS4zOCAxMC44MSAzLjE4IDE2LjAyIDUuNDIgMTMuNTYgNS44NCAyNS40MiAxMy44NCAzNS42IDI0LjAxIDEwLjE3IDEwLjE3IDE4LjE4IDIyLjA0IDI0LjAxIDM1LjYgMi4yNCA1LjIgNC4wNCAxMC41NCA1LjQyIDE2LjAyQTQuMDMgNC4wMyAwIDAgMCA5NiAxODRjMS44NSAwIDMuNDUtMS4yNiAzLjktMy4wNSAxLjM4LTUuNDggMy4xOC0xMC44MSA1LjQyLTE2LjAyIDUuODQtMTMuNTYgMTMuODQtMjUuNDIgMjQuMDEtMzUuNiAxMC4xNy0xMC4xNyAyMi4wNC0xOC4xOCAzNS42LTI0LjAxIDUuMi0yLjI0IDEwLjU0LTQuMDQgMTYuMDItNS40MkE0LjAzIDQuMDMgMCAwIDAgMTg0IDk2YzAtMS44NS0xLjI2LTMuNDUtMy4wNS0zLjktNS40OC0xLjM4LTEwLjgxLTMuMTgtMTYuMDItNS40MiIgY2xhc3M9InN0MCIvPjwvZz48L3N2Zz4g',
            REFRESH_ICON: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik00LjA2MTg5IDEzQzQuMDIxMDQgMTIuNjcyNCA0IDEyLjMzODcgNCAxMkM0IDcuNTgxNzIgNy41ODE3MiA0IDEyIDRDMTQuNTAwNiA0IDE2LjczMzIgNS4xNDcyNyAxOC4yMDAyIDYuOTQ0MTZNMTkuOTM4MSAxMUMxOS45NzkgMTEuMzI3NiAyMCAxMS42NjEzIDIwIDEyQzIwIDE2LjQxODMgMTYuNDE4MyAyMCAxMiAyMEM5LjYxMDYxIDIwIDcuNDY1ODkgMTguOTUyNSA2IDE3LjI5MTZNOSAxN0g2VjE3LjI5MTZNMTguMjAwMiA0VjYuOTQ0MTZNMTguMjAwMiA2Ljk0NDE2VjYuOTk5OTNMMTUuMjAwMiA3TTYgMjBWMTcuMjkxNiIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPC9zdmc+',
            LIGHT_MODE_ICON: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIEdlbmVyYXRvcjogU1ZHIFJlcG8gTWl4ZXIgVG9vbHMgLS0+DQo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgY2xhc3M9Imljb24iICB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTg2MSA2NTYuN2wxNDQuNi0xNDQuNkw4NjEgMzY3LjZWMTYzLjFINjU2LjZMNTEyIDE4LjYgMzY3LjQgMTYzLjFIMTYzdjIwNC41TDE4LjQgNTEyLjEgMTYzIDY1Ni43djIwNC40aDIwNC40TDUxMiAxMDA1LjdsMTQ0LjYtMTQ0LjZIODYxeiIgZmlsbD0iI0ZDRDE3MCIgLz48cGF0aCBkPSJNNTEyIDEwMTUuN2MtMi42IDAtNS4xLTEtNy4xLTIuOUwzNjMuMyA4NzEuMUgxNjNjLTUuNSAwLTEwLTQuNS0xMC0xMFY2NjAuOEwxMS40IDUxOS4yYy0xLjktMS45LTIuOS00LjQtMi45LTcuMSAwLTIuNyAxLjEtNS4yIDIuOS03LjFMMTUzIDM2My40VjE2My4xYzAtNS41IDQuNS0xMCAxMC0xMGgyMDAuM0w1MDQuOSAxMS41YzEuOS0xLjkgNC40LTIuOSA3LjEtMi45czUuMiAxLjEgNy4xIDIuOWwxNDEuNiAxNDEuNkg4NjFjNS41IDAgMTAgNC41IDEwIDEwdjIwMC4zTDEwMTIuNiA1MDVjMS45IDEuOSAyLjkgNC40IDIuOSA3LjEgMCAyLjctMS4xIDUuMi0yLjkgNy4xTDg3MSA2NjAuOHYyMDAuM2MwIDUuNS00LjUgMTAtMTAgMTBINjYwLjdsLTE0MS42IDE0MS42Yy0yIDItNC41IDMtNy4xIDN6TTE3MyA4NTEuMWgxOTQuNGMyLjcgMCA1LjIgMS4xIDcuMSAyLjlMNTEyIDk5MS42bDEzNy41LTEzNy41YzEuOS0xLjkgNC40LTIuOSA3LjEtMi45SDg1MVY2NTYuN2MwLTIuNyAxLjEtNS4yIDIuOS03LjFsMTM3LjUtMTM3LjUtMTM3LjUtMTM3LjVjLTEuOS0xLjktMi45LTQuNC0yLjktNy4xVjE3My4xSDY1Ni42Yy0yLjcgMC01LjItMS4xLTcuMS0yLjlMNTEyIDMyLjcgMzc0LjUgMTcwLjJjLTEuOSAxLjktNC40IDIuOS03LjEgMi45SDE3M3YxOTQuNGMwIDIuNy0xLjEgNS4yLTIuOSA3LjFMMzIuNiA1MTIuMWwxMzcuNSAxMzcuNWMxLjkgMS45IDIuOSA0LjQgMi45IDcuMXYxOTQuNHoiIGZpbGw9IiIgLz48cGF0aCBkPSJNNTEyIDUxMi4xbS0yNTcuOCAwYTI1Ny44IDI1Ny44IDAgMSAwIDUxNS42IDAgMjU3LjggMjU3LjggMCAxIDAtNTE1LjYgMFoiIGZpbGw9IiNGN0REQUQiIC8+PHBhdGggZD0iTTUxMiA3NzkuOWMtNzEuNSAwLTEzOC44LTI3LjktMTg5LjQtNzguNC01MC42LTUwLjYtNzguNC0xMTcuOC03OC40LTE4OS40czI3LjktMTM4LjggNzguNC0xODkuNGM1MC42LTUwLjYgMTE3LjgtNzguNCAxODkuNC03OC40IDcxLjUgMCAxMzguOCAyNy45IDE4OS40IDc4LjQgNTAuNiA1MC42IDc4LjQgMTE3LjggNzguNCAxODkuNFM3NTIgNjUwLjkgNzAxLjQgNzAxLjUgNTgzLjUgNzc5LjkgNTEyIDc3OS45eiBtMC01MTUuNmMtNjYuMiAwLTEyOC40IDI1LjgtMTc1LjIgNzIuNi00Ni44IDQ2LjgtNzIuNiAxMDktNzIuNiAxNzUuMnMyNS44IDEyOC40IDcyLjYgMTc1LjJjNDYuOCA0Ni44IDEwOSA3Mi42IDE3NS4yIDcyLjYgNjYuMiAwIDEyOC40LTI1LjggMTc1LjItNzIuNiA0Ni44LTQ2LjggNzIuNi0xMDkgNzIuNi0xNzUuMlM3MzQgMzgzLjcgNjg3LjIgMzM2LjljLTQ2LjgtNDYuOC0xMDktNzIuNi0xNzUuMi03Mi42eiIgZmlsbD0iIiAvPjwvc3ZnPg==', // 라이트 모드 아이콘
            DARK_MODE_ICON: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik0xOS45MDAxIDIuMzA3MTlDMTkuNzM5MiAxLjg5NzYgMTkuMTYxNiAxLjg5NzYgMTkuMDAwNyAyLjMwNzE5TDE4LjU3MDMgMy40MDI0N0MxOC41MjEyIDMuNTI3NTIgMTguNDIyNiAzLjYyNjUxIDE4LjI5OCAzLjY3NTgzTDE3LjIwNjcgNC4xMDc4QzE2Ljc5ODYgNC4yNjkzNCAxNi43OTg2IDQuODQ5IDE3LjIwNjcgNS4wMTA1NEwxOC4yOTggNS40NDI1MkMxOC40MjI2IDUuNDkxODQgMTguNTIxMiA1LjU5MDgyIDE4LjU3MDMgNS43MTU4N0wxOS4wMDA3IDYuODExMTVDMTkuMTYxNiA3LjIyMDc0IDE5LjczOTIgNy4yMjA3NCAxOS45MDAxIDYuODExMTZMMjAuMzMwNSA1LjcxNTg3QzIwLjM3OTYgNS41OTA4MiAyMC40NzgyIDUuNDkxODQgMjAuNjAyOCA1LjQ0MjUyTDIxLjY5NDEgNS4wMTA1NEMyMi4xMDIyIDQuODQ5IDIyLjEwMjIgNC4yNjkzNCAyMS42OTQxIDQuMTA3OEwyMC42MDI4IDMuNjc1ODNDMjAuNDc4MiAzLjYyNjUxIDIwLjM3OTYgMy41Mjc1MiAyMC4zMzA1IDMuNDAyNDdMMTkuOTAwMSAyLjMwNzE5WiIgZmlsbD0iIzFDMjc0QyIvPg0KPHBhdGggZD0iTTE2LjAzMjggOC4xMjk2N0MxNS44NzE4IDcuNzIwMDkgMTUuMjk0MyA3LjcyMDA5IDE1LjEzMzMgOC4xMjk2N0wxNC45NzY0IDguNTI5MDJDMTQuOTI3MyA4LjY1NDA3IDE0LjgyODcgOC43NTMwNSAxNC43MDQxIDguODAyMzdMMTQuMzA2MiA4Ljk1OTg3QzEzLjg5ODEgOS4xMjE0MSAxMy44OTgxIDkuNzAxMDcgMTQuMzA2MiA5Ljg2MjYxTDE0LjcwNDEgMTAuMDIwMUMxNC44Mjg3IDEwLjA2OTQgMTQuOTI3MyAxMC4xNjg0IDE0Ljk3NjQgMTAuMjkzNUwxNS4xMzMzIDEwLjY5MjhDMTUuMjk0MyAxMS4xMDI0IDE1Ljg3MTggMTEuMTAyNCAxNi4wMzI4IDEwLjY5MjhMMTYuMTg5NyAxMC4yOTM1QzE2LjIzODggMTAuMTY4NCAxNi4zMzc0IDEwLjA2OTQgMTYuNDYyIDEwLjAyMDFMMTYuODU5OSA5Ljg2MjYxQzE3LjI2OCA5LjcwMTA3IDE3LjI2OCA5LjEyMTQxIDE2Ljg1OTkgOC45NTk4N0wxNi40NjIgOC44MDIzN0MxNi4zMzc0IDguNzUzMDUgMTYuMjM4OCA4LjY1NDA3IDE2LjE4OTcgOC41MjkwMkwxNi4wMzI4IDguMTI5NjdaIiBmaWxsPSIjMUMyNzRDIi8+DQo8cGF0aCBkPSJNMTIgMjJDMTcuNTIyOCAyMiAyMiAxNy41MjI4IDIyIDEyQzIyIDExLjUzNzMgMjEuMzA2NSAxMS40NjA4IDIxLjA2NzIgMTEuODU2OEMxOS45Mjg5IDEzLjc0MDYgMTcuODYxNSAxNSAxNS41IDE1QzExLjkxMDEgMTUgOSAxMi4wODk5IDkgOC41QzkgNi4xMzg0NSAxMC4yNTk0IDQuMDcxMDUgMTIuMTQzMiAyLjkzMjc2QzEyLjUzOTIgMi42OTM0NyAxMi40NjI3IDIgMTIgMkM2LjQ3NzE1IDIgMiA2LjQ3NzE1IDIgMTJDMiAxNy41MjI4IDYuNDc3MTUgMjIgMTIgMjJaIiBmaWxsPSIjMUMyNzRDIi8+DQo8L3N2Zz4=' // 다크 모드 아이콘
        },
        MESSAGE_KEYS: {
            PROMPT: 'prompt',
            ENTER_API_KEY: 'enterApiKey',
            GEMINI_EMPTY: 'geminiEmpty',
            PARSE_ERROR: 'parseError',
            NETWORK_ERROR: 'networkError',
            TIMEOUT: 'timeout',
            LOADING: 'loading',
            UPDATE_TITLE: 'updateTitle',
            UPDATE_NOW: 'updateNow',
            SEARCH_ON_GOOGLE: 'searchongoogle',
            SEARCH_ON_BING: 'searchonbing',
            GEMINI_OFF: 'geminiOff'
        }
    };

    // ---------------------- Localization ----------------------
    const Localization = {
        MESSAGES: {
            [Config.MESSAGE_KEYS.PROMPT]: {
                ko: `"${'${query}'}"에 대한 정보를 찾아줘`,
                zh: `请以标记格式填写有关\"${'${query}'}\"的信息。`,
                default: `Please write information about \"${'${query}'}\" in markdown format`
            },
            [Config.MESSAGE_KEYS.ENTER_API_KEY]: {
                ko: 'Gemini API 키를 입력하세요:',
                zh: '请输入 Gemini API 密钥:',
                default: 'Please enter your Gemini API key:'
            },
            [Config.MESSAGE_KEYS.GEMINI_EMPTY]: {
                ko: '⚠️ Gemini 응답이 비어있습니다.',
                zh: '⚠️ Gemini 返回为空。',
                default: '⚠️ Gemini response is empty.'
            },
            [Config.MESSAGE_KEYS.PARSE_ERROR]: {
                ko: '❌ 파싱 오류:',
                zh: '❌ 解析错误:',
                default: '❌ Parsing error:'
            },
            [Config.MESSAGE_KEYS.NETWORK_ERROR]: {
                ko: '❌ 네트워크 오류:',
                zh: '❌ 网络错误:',
                default: '❌ Network error:'
            },
            [Config.MESSAGE_KEYS.TIMEOUT]: {
                ko: '❌ 요청 시간이 초과되었습니다.',
                zh: '❌ 请求超时。',
                default: '❌ Request timeout'
            },
            [Config.MESSAGE_KEYS.LOADING]: {
                ko: '불러오는 중...',
                zh: '加载中...',
                default: 'Loading...'
            },
            [Config.MESSAGE_KEYS.UPDATE_TITLE]: {
                ko: 'marked.min.js 업데이트 필요',
                zh: '需要更新 marked.min.js',
                default: 'marked.min.js update required'
            },
            [Config.MESSAGE_KEYS.UPDATE_NOW]: {
                ko: '확인',
                zh: '确认',
                default: 'OK'
            },
            [Config.MESSAGE_KEYS.SEARCH_ON_GOOGLE]: {
                ko: 'Google 에서 검색하기',
                zh: '在 Google 上搜索',
                default: 'Search on Google'
            },
            [Config.MESSAGE_KEYS.SEARCH_ON_BING]: {
                ko: 'Bing 에서 검색하기',
                zh: '在 Bing 上搜索',
                default: 'Search on Bing'
            },
            [Config.MESSAGE_KEYS.GEMINI_OFF]: {
                ko: '현재 Gemini 옵션이 OFF 상태입니다.',
                zh: '当前 Gemini 选项为关闭状态。',
                default: 'Gemini option is currently OFF.'
            }
        },

        getMessage(key, vars = {}) {
            const lang = navigator.language;
            const langKey = lang.includes('ko') ? 'ko' : lang.includes('zh') ? 'zh' : 'default';
            const template = this.MESSAGES[key]?.[langKey] || this.MESSAGES[key]?.default || '';
            return template.replace(/\$\{(.*?)\}/g, (_, k) => vars[k] || '');
        }
    };

    // ---------------------- Device Detector ----------------------
    const DeviceDetector = {
        _cache: {
            deviceType: null,
            isGeminiAvailable: null
        },

        getDeviceType() {
            if (this._cache.deviceType !== null) return this._cache.deviceType;
            const userAgent = navigator.userAgent;
            const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
            const width = window.innerWidth;
            let deviceType;
            const isAndroid = /Android/i.test(userAgent);
            const isIPhone = /iPhone/i.test(userAgent);
            const hasMobileKeyword = /Mobile/i.test(userAgent);
            const isWindows = /Windows NT/i.test(userAgent);
            if (isWindows && !isTouchDevice && width > 1024) deviceType = 'desktop';
            else if ((isAndroid || isIPhone) && hasMobileKeyword) deviceType = 'mobile';
            else if (isAndroid && !hasMobileKeyword && width >= 768) deviceType = 'tablet';
            else if (isTouchDevice && width <= 1024) deviceType = 'mobile';
            else deviceType = 'desktop';
            this._cache.deviceType = deviceType;
            return deviceType;
        },
        isDesktop() { return this.getDeviceType() === 'desktop'; },
        isMobile() { return this.getDeviceType() === 'mobile'; },
        isTablet() { return this.getDeviceType() === 'tablet'; },
        isGeminiAvailable() {
            if (this._cache.isGeminiAvailable === null) {
                const hasRHS = !!document.getElementById('rhs') || !!document.getElementById('b_context') || !!document.querySelector('.b_right');
                this._cache.isGeminiAvailable = this.isDesktop() && hasRHS;
            }
            return this._cache.isGeminiAvailable;
        },
        resetCache() {
            this._cache = { deviceType: null, isGeminiAvailable: null };
        },
        isGoogle() { return window.location.hostname.includes('google.com'); },
        isBing() { return window.location.hostname.includes('bing.com'); }
    };

    // ---------------------- Styles ----------------------
    const StyleGenerator = {
        commonStyles: {
            '#b_results > li.b_ad a': { 'color': 'green !important' },
            '#b_context, .b_context, .b_right': {
                'color': 'initial !important',
                'border': 'none !important',
                'border-width': '0 !important',
                'border-style': 'none !important',
                'border-collapse': 'separate !important',
                'background': 'transparent !important'
            },
            '#rhs': {
                'float': 'right',
                'padding-left': '16px',
                'width': '432px',
                'margin-top': '20px'
            },
            '#rhs #gemini-wrapper': { 'margin-bottom': '20px' },
            '.mobile-useragent #gsr': { 'background-color': '#ffffff !important' }
        },
        geminiBoxStyles: {
            '#gemini-box': {
                'width': '100%',
                'max-width': '100%',
                'border-width': '1px',
                'border-style': 'solid',
                'border-radius': Config.STYLES.BORDER_RADIUS,
                'padding': `${Config.UI.DEFAULT_PADDING}px`,
                'margin-bottom': `${Config.UI.DEFAULT_MARGIN * 2.5}px`,
                'font-family': 'sans-serif',
                'overflow-x': 'auto',
                'position': 'relative',
                'box-sizing': 'border-box',
                'color': 'initial !important'
            }
        },
        themeStyles: {
            '#gemini-box': {
                'background': `var(--gemini-background-color) !important`,
                'border-color': `var(--gemini-border-color) !important`
            },
            '#gemini-box h3': { 'color': `var(--gemini-title-color) !important` },
            '#gemini-content, #gemini-content *': {
                'color': `var(--gemini-text-color) !important`,
                'background': 'transparent !important'
            },
            '#gemini-divider': { 'background': `var(--gemini-border-color) !important` },
            '#gemini-content pre': {
                'background': `var(--gemini-code-block-bg) !important`,
                'padding': `${Config.UI.DEFAULT_MARGIN + 2}px`,
                'border-radius': Config.STYLES.BORDER_RADIUS,
                'overflow-x': 'auto'
            },
            '#google-search-btn, #bing-search-btn': {
                'border-color': `var(--gemini-button-border)`,
                'background-color': `var(--gemini-button-bg)`,
                'color': `var(--gemini-title-color)`,
            },
            '#marked-update-popup': {
                'background': `var(--gemini-background-color)`,
                'border-color': `var(--gemini-button-border)`,
            },
            '#marked-update-popup button': {
                'border-color': `var(--gemini-button-border)`,
                'background-color': `var(--gemini-button-bg)`,
                'color': `var(--gemini-title-color)`,
            }
        },
        contentStyles: {
            '#gemini-content': {
                'font-size': Config.STYLES.FONT_SIZE.TEXT,
                'line-height': '1.6',
                'white-space': 'pre-wrap',
                'word-wrap': 'break-word',
                'overflow-wrap': 'break-word',
                'background': 'transparent !important'
            },
            '#gemini-content ul, #gemini-content ol': { 'list-style-type': 'none' }
        },
        headerStyles: {
            '#gemini-header': {
                'display': 'flex',
                'align-items': 'center',
                'justify-content': 'space-between',
                'margin-bottom': `${Config.UI.DEFAULT_MARGIN}px`
            },
            '#gemini-title-wrap': {
                'display': 'flex',
                'align-items': 'center'
            },
            '#gemini-logo': {
                'width': Config.STYLES.LOGO_SIZE,
                'height': Config.STYLES.LOGO_SIZE,
                'margin-right': `${Config.UI.DEFAULT_MARGIN}px`
            },
            '#gemini-box h3': {
                'margin': '0',
                'font-size': Config.STYLES.FONT_SIZE.TITLE,
                'font-weight': 'bold'
            },
            '#gemini-toggle-switch': {
                'margin-right': `${Config.UI.DEFAULT_MARGIN}px`,
                'display': 'flex',
                'align-items': 'center'
            },
            '#gemini-refresh-btn': {
                'width': Config.STYLES.ICON_SIZE,
                'height': Config.STYLES.ICON_SIZE,
                'cursor': 'pointer',
                'opacity': '0.6',
                'transition': 'transform 0.5s ease',
                'margin-left': `${Config.UI.DEFAULT_MARGIN}px`
            },
            '#gemini-theme-toggle-btn': {
                'width': Config.STYLES.ICON_SIZE,
                'height': Config.STYLES.ICON_SIZE,
                'cursor': 'pointer',
                'opacity': '0.6',
                'transition': 'transform 0.5s ease'
            },
            '#gemini-refresh-btn:hover, #gemini-theme-toggle-btn:hover': {
                'opacity': '1',
                'transform': 'rotate(360deg)'
            },
            '#gemini-divider': {
                'height': '1px',
                'margin': `${Config.UI.DEFAULT_MARGIN}px 0`
            }
        },
        searchButtonStyles: {
            '#google-search-btn, #bing-search-btn': {
                'width': '100%',
                'max-width': '100%',
                'font-size': Config.STYLES.FONT_SIZE.TEXT,
                'padding': `${Config.UI.DEFAULT_MARGIN}px`,
                'margin-bottom': `${Config.UI.DEFAULT_MARGIN * 1.25}px`,
                'cursor': 'pointer',
                'border-width': '1px',
                'border-style': 'solid',
                'border-radius': Config.STYLES.BORDER_RADIUS,
                'font-family': 'sans-serif',
                'display': 'flex',
                'align-items': 'center',
                'justify-content': 'center',
                'gap': `${Config.UI.DEFAULT_MARGIN}px`,
                'transition': 'transform 0.2s ease'
            },
            '#google-search-btn img, #bing-search-btn img': {
                'width': Config.STYLES.SMALL_ICON_SIZE,
                'height': Config.STYLES.SMALL_ICON_SIZE,
                'vertical-align': 'middle',
                'transition': 'transform 0.2s ease'
            },
            '.desktop-useragent #google-search-btn:hover, .desktop-useragent #bing-search-btn:hover': {
                'transform': 'scale(1.1)'
            },
            '.desktop-useragent #google-search-btn:hover img, .desktop-useragent #bing-search-btn:hover img': {
                'transform': 'scale(1.1)'
            }
        },
        popupStyles: {
            '#marked-update-popup': {
                'position': 'fixed',
                'top': '30%',
                'left': '50%',
                'transform': 'translate(-50%, -50%)',
                'padding': `${Config.UI.DEFAULT_PADDING * 1.25}px`,
                'z-index': Config.UI.Z_INDEX,
                'border-width': '1px',
                'border-style': 'solid',
                'box-shadow': '0 2px 10px rgba(0,0,0,0.1)',
                'text-align': 'center'
            },
            '#marked-update-popup button': {
                'margin-top': `${Config.UI.DEFAULT_MARGIN * 1.25}px`,
                'padding': `${Config.UI.DEFAULT_PADDING}px ${Config.UI.DEFAULT_PADDING}px`,
                'cursor': 'pointer',
                'border-width': '1px',
                'border-style': 'solid',
                'border-radius': Config.STYLES.BORDER_RADIUS,
                'font-family': 'sans-serif'
            }
        },
        mobileStyles: {
            '.mobile-useragent #google-search-btn, .mobile-useragent #bing-search-btn': {
                'max-width': '100%',
                'width': 'calc(100% - 16px)',
                'margin-left': `${Config.UI.DEFAULT_MARGIN}px !important`,
                'margin-right': `${Config.UI.DEFAULT_MARGIN}px !important`,
                'margin-top': `${Config.UI.DEFAULT_MARGIN}px`,
                'margin-bottom': `${Config.UI.DEFAULT_MARGIN}px`,
                'padding': `${Config.UI.DEFAULT_PADDING * 0.75}px`,
                'border-radius': '16px',
                'box-sizing': 'border-box'
            },
            '.mobile-useragent #gemini-box': {
                'padding': `${Config.UI.DEFAULT_PADDING * 0.75}px`,
                'border-radius': '16px'
            },
            '.mobile-useragent #b_content': {
                'overflow': 'visible !important',
                'position': 'relative'
            }
        },
        generateStyles() {
            const styles = [
                this.commonStyles,
                this.geminiBoxStyles,
                this.themeStyles,
                this.contentStyles,
                this.headerStyles,
                this.searchButtonStyles,
                this.popupStyles,
                this.mobileStyles
            ];
            const cssVariables = `
                :root {
                    --gemini-background-color: ${Config.STYLES.COLORS.BACKGROUND_LIGHT};
                    --gemini-border-color: ${Config.STYLES.COLORS.BORDER_LIGHT};
                    --gemini-text-color: ${Config.STYLES.COLORS.TEXT_LIGHT};
                    --gemini-title-color: ${Config.STYLES.COLORS.TITLE_LIGHT};
                    --gemini-button-bg: ${Config.STYLES.COLORS.BUTTON_BG_LIGHT};
                    --gemini-button-border: ${Config.STYLES.COLORS.BUTTON_BORDER_LIGHT};
                    --gemini-code-block-bg: ${Config.STYLES.CODE_BLOCK_BG_LIGHT};
                }
                .dark-mode {
                    --gemini-background-color: ${Config.STYLES.COLORS.BACKGROUND_DARK};
                    --gemini-border-color: ${Config.STYLES.COLORS.BORDER_DARK};
                    --gemini-text-color: ${Config.STYLES.COLORS.TEXT_DARK};
                    --gemini-title-color: ${Config.STYLES.COLORS.TITLE_DARK};
                    --gemini-button-bg: ${Config.STYLES.COLORS.BUTTON_BG_DARK};
                    --gemini-button-border: ${Config.STYLES.COLORS.BUTTON_BORDER_DARK};
                    --gemini-code-block-bg: ${Config.STYLES.CODE_BLOCK_BG_DARK};
                }
            `;
            return cssVariables + styles.reduce((css, styleObj) => {
                for (const [selector, props] of Object.entries(styleObj)) {
                    css += `${selector} {`;
                    for (const [prop, value] of Object.entries(props)) {
                        css += `${prop}: ${value};`;
                    }
                    css += '}';
                }
                return css;
            }, '');
        }
    };
    const Styles = {
        initStyles() {
            const styleElement = document.createElement('style');
            styleElement.id = 'bing-plus-styles';
            styleElement.textContent = StyleGenerator.generateStyles();
            document.head.appendChild(styleElement);
            this.applyMobileStyles();
        },
        applyMobileStyles() {
            if (DeviceDetector.isMobile()) document.documentElement.classList.add('mobile-useragent');
            else if (DeviceDetector.isDesktop()) document.documentElement.classList.add('desktop-useragent');
        }
    };

    // ---------------------- Theme Manager ----------------------
    const ThemeManager = {
        currentTheme: 'light',
        init() {
            const savedTheme = localStorage.getItem(Config.STORAGE_KEYS.THEME_MODE);
            if (savedTheme) this.currentTheme = savedTheme;
            else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) this.currentTheme = 'dark';
            this.applyTheme();
        },
        applyTheme() {
            if (this.currentTheme === 'dark') document.documentElement.classList.add('dark-mode');
            else document.documentElement.classList.remove('dark-mode');
        },
        toggleTheme() {
            this.currentTheme = this.currentTheme === 'light' ? 'dark' : 'light';
            localStorage.setItem(Config.STORAGE_KEYS.THEME_MODE, this.currentTheme);
            this.applyTheme();
            this.updateThemeToggleButtonIcon();
        },
        getThemeToggleButtonIcon() {
            return this.currentTheme === 'light' ? Config.ASSETS.DARK_MODE_ICON : Config.ASSETS.LIGHT_MODE_ICON;
        },
        updateThemeToggleButtonIcon() {
            const themeToggleButton = document.getElementById('gemini-theme-toggle-btn');
            if (themeToggleButton) {
                themeToggleButton.src = this.getThemeToggleButtonIcon();
                themeToggleButton.title = this.currentTheme === 'light' ? 'Dark Mode' : 'Light Mode';
            }
        },
        observeThemeChange() {
            window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
                const newTheme = e.matches ? 'dark' : 'light';
                if (this.currentTheme !== newTheme) {
                    this.currentTheme = newTheme;
                    localStorage.setItem(Config.STORAGE_KEYS.THEME_MODE, this.currentTheme);
                    this.applyTheme();
                    this.updateThemeToggleButtonIcon();
                }
            });
        }
    };

    // ---------------------- Utils ----------------------
    const Utils = {
        getQuery() {
            return new URLSearchParams(location.search).get('q');
        },
        getApiKey() {
            let key = localStorage.getItem('geminiApiKey');
            if (!key) {
                key = prompt(Localization.getMessage(Config.MESSAGE_KEYS.ENTER_API_KEY));
                if (key) localStorage.setItem('geminiApiKey', key);
            }
            return key;
        },
        getGeminiEnabled() {
            const val = localStorage.getItem(Config.STORAGE_KEYS.GEMINI_ENABLED);
            return val === null ? true : val === 'true';
        },
        setGeminiEnabled(enabled) {
            localStorage.setItem(Config.STORAGE_KEYS.GEMINI_ENABLED, enabled ? 'true' : 'false');
        }
    };

    // ---------------------- UI ----------------------
    const UI = {
        createSearchButton(query) {
            const btn = document.createElement('button');
            if (DeviceDetector.isGoogle()) {
                btn.id = 'bing-search-btn';
                btn.innerHTML = `
                    <img src="${Config.ASSETS.BING_LOGO}" alt="Bing Logo" style="width: ${Config.STYLES.SMALL_ICON_SIZE}; height: ${Config.STYLES.SMALL_ICON_SIZE}; vertical-align: middle;">
                    ${Localization.getMessage(Config.MESSAGE_KEYS.SEARCH_ON_BING)}
                `;
                btn.onclick = () => window.open(`https://www.bing.com/search?q=${encodeURIComponent(query)}`, '_blank');
            } else {
                btn.id = 'google-search-btn';
                btn.innerHTML = `
                    <img src="${Config.ASSETS.GOOGLE_LOGO}" alt="Google Logo">
                    ${Localization.getMessage(Config.MESSAGE_KEYS.SEARCH_ON_GOOGLE)}
                `;
                btn.onclick = () => window.open(`https://www.google.com/search?q=${encodeURIComponent(query)}`, '_blank');
            }
            return btn;
        },

        createGeminiToggleSwitch(enabled, onToggle) {
            // 첨부 이미지와 유사하게 구현
            const wrapper = document.createElement('div');
            wrapper.style.display = 'flex';
            wrapper.style.alignItems = 'center';
            wrapper.style.gap = '6px';
            wrapper.style.height = '28px';
            wrapper.style.marginRight = '10px';

            // Toggle bg
            const toggle = document.createElement('div');
            toggle.style.width = '44px';
            toggle.style.height = '24px';
            toggle.style.borderRadius = '12px';
            toggle.style.position = 'relative';
            toggle.style.cursor = 'pointer';
            toggle.style.background = enabled ? '#d1d5db' : '#353535';
            toggle.style.transition = 'background 0.2s';

            // Knob
            const knob = document.createElement('div');
            knob.style.width = '24px';
            knob.style.height = '24px';
            knob.style.borderRadius = '50%';
            knob.style.background = enabled ? '#fff' : '#777';
            knob.style.position = 'absolute';
            knob.style.top = '0';
            knob.style.left = enabled ? '20px' : '0';
            knob.style.boxShadow = '0 1px 3px rgba(0,0,0,0.10)';
            knob.style.transition = 'left 0.2s, background 0.2s';

            toggle.appendChild(knob);

            toggle.onclick = () => {
                const newState = !enabled;
                onToggle(newState);
            };

            // ON/OFF text
            const stateText = document.createElement('span');
            stateText.textContent = enabled ? 'ON' : 'OFF';
            stateText.style.color = enabled ? '#111' : '#bbb';
            stateText.style.fontWeight = 'bold';
            stateText.style.fontSize = '14px';
            stateText.style.width = '32px';

            wrapper.appendChild(toggle);
            wrapper.appendChild(stateText);

            wrapper.update = (en) => {
                toggle.style.background = en ? '#d1d5db' : '#353535';
                knob.style.left = en ? '20px' : '0';
                knob.style.background = en ? '#fff' : '#777';
                stateText.textContent = en ? 'ON' : 'OFF';
                stateText.style.color = en ? '#111' : '#bbb';
            };

            return wrapper;
        },

        createGeminiBox(query, apiKey) {
            const box = document.createElement('div');
            box.id = 'gemini-box';

            // Gemini On/Off 상태
            const enabled = Utils.getGeminiEnabled();

            box.innerHTML = `
                <div id="gemini-header">
                    <div id="gemini-title-wrap">
                        <img id="gemini-logo" src="${Config.ASSETS.GEMINI_LOGO}" alt="Gemini Logo">
                        <h3>Gemini Search Results</h3>
                    </div>
                    <div style="display: flex; align-items: center;">
                        <span id="gemini-toggle-switch"></span>
                        <img id="gemini-theme-toggle-btn" title="${ThemeManager.currentTheme === 'light' ? 'Dark Mode' : 'Light Mode'}" src="${ThemeManager.getThemeToggleButtonIcon()}" />
                        <img id="gemini-refresh-btn" title="Refresh" src="${Config.ASSETS.REFRESH_ICON}" />
                    </div>
                </div>
                <hr id="gemini-divider">
                <div id="gemini-content">${enabled ? Localization.getMessage(Config.MESSAGE_KEYS.LOADING) : Localization.getMessage(Config.MESSAGE_KEYS.GEMINI_OFF)}</div>
            `;

            // 토글 스위치 생성 및 삽입
            const toggleWrapper = this.createGeminiToggleSwitch(enabled, (newState) => {
                Utils.setGeminiEnabled(newState);
                // 상태 바뀌면 Gemini 전체 새로고침
                UIRenderer.render();
            });
            box.querySelector('#gemini-toggle-switch').appendChild(toggleWrapper);

            // 테마/새로고침 버튼 이벤트
            box.querySelector('#gemini-refresh-btn').onclick = () => UIRenderer.refreshGemini(query, apiKey);
            box.querySelector('#gemini-theme-toggle-btn').onclick = () => ThemeManager.toggleTheme();

            if (DeviceDetector.isDesktop()) VersionChecker.checkMarkedJsVersion();

            return box;
        },

        createGeminiUI(query, apiKey) {
            const wrapper = document.createElement('div');
            wrapper.id = 'gemini-wrapper';
            wrapper.appendChild(this.createSearchButton(query));
            wrapper.appendChild(this.createGeminiBox(query, apiKey));
            return wrapper;
        },

        removeExistingElements() {
            document.querySelectorAll('#gemini-wrapper, #google-search-btn, #bing-search-btn').forEach(el => el.remove());
        },

        createRHSIfNeeded() {
            if (DeviceDetector.isGoogle() && !document.getElementById('rhs')) {
                const mainContent = document.getElementById('rcnt');
                if (mainContent) {
                    const rhsDiv = document.createElement('div');
                    rhsDiv.id = 'rhs';
                    rhsDiv.setAttribute('jsname', 'Iclw3');
                    rhsDiv.style.cssText = `
                        float: right;
                        padding-left: 16px;
                        width: 432px;
                        margin-top: 20px;
                    `;
                    mainContent.appendChild(rhsDiv);
                }
            }
        }
    };

    // ---------------------- Gemini API ----------------------
    const GeminiAPI = {
        fetch(query, container, apiKey, force = false) {
            const enabled = Utils.getGeminiEnabled();
            if (!enabled) {
                container.innerHTML = Localization.getMessage(Config.MESSAGE_KEYS.GEMINI_OFF);
                return;
            }
            const cacheKey = `${Config.CACHE.PREFIX}${query}`;
            const cached = force ? null : sessionStorage.getItem(cacheKey);
            if (cached) {
                container.innerHTML = marked.parse(cached);
                return;
            }

            if (!apiKey) {
                container.textContent = Localization.getMessage(Config.MESSAGE_KEYS.ENTER_API_KEY);
                return;
            }
            container.textContent = Localization.getMessage(Config.MESSAGE_KEYS.LOADING);

            const promptText = Localization.getMessage(Config.MESSAGE_KEYS.PROMPT, { query });
            GM_xmlhttpRequest({
                method: 'POST',
                url: `${Config.API.GEMINI_URL}${Config.API.GEMINI_MODEL}:generateContent?key=${apiKey}`,
                headers: { 'Content-Type': 'application/json' },
                data: JSON.stringify({
                    contents: [{ parts: [{ text: promptText }] }],
                    tools: [{"google_search": {}}],
                    generationConfig: { thinkingConfig: { thinkingBudget: 0 } },
                }),
                onload({ status, responseText }) {
                    try {
                        const parsedResponse = JSON.parse(responseText);
                        const text = parsedResponse?.candidates?.[0]?.content?.parts?.[0]?.text;
                        if (text) {
                            sessionStorage.setItem(cacheKey, text);
                            if (container) container.innerHTML = marked.parse(text);
                        } else {
                            if (container) {
                                if (parsedResponse.error) {
                                    container.textContent = `❌ Gemini API 오류: ${parsedResponse.error.message ||
                                        JSON.stringify(parsedResponse.error)}`;
                                } else {
                                    container.textContent = Localization.getMessage(Config.MESSAGE_KEYS.GEMINI_EMPTY);
                                }
                            }
                        }
                    } catch (e) {
                        if (container) container.textContent = `${Localization.getMessage(Config.MESSAGE_KEYS.PARSE_ERROR)} ${e.message}`;
                    }
                },
                onerror(err) {
                    if (container) container.textContent = `${Localization.getMessage(Config.MESSAGE_KEYS.NETWORK_ERROR)} ${err.finalUrl || err.statusText || JSON.stringify(err)}`;
                },
                ontimeout() {
                    if (container) container.textContent = Localization.getMessage(Config.MESSAGE_KEYS.TIMEOUT);
                }
            });
        }
    };

    // ---------------------- Link Cleaner, Version Checker, RenderState, EventHandler 등 기타 ----------------------
    const LinkCleaner = {
        decodeRealUrl(url, key) {
            const param = new URL(url).searchParams.get(key)?.replace(/^a1/, '');
            if (!param) return null;
            try {
                const decoded = decodeURIComponent(atob(param.replace(/_/g, '/').replace(/-/g, '+')));
                return decoded.startsWith('/') ? location.origin + decoded : decoded;
            } catch {
                return null;
            }
        },
        resolveRealUrl(url) {
            const rules = [
                { pattern: /bing\.com\/(ck\/a|aclick)/, key: 'u' },
                { pattern: /so\.com\/search\/eclk/, key: 'aurl' },
                { pattern: /google\.com\/url/, key: 'url' }
            ];
            for (const { pattern, key } of rules) {
                if (pattern.test(url)) {
                    const real = this.decodeRealUrl(url, key);
                    if (real && real !== url) return real;
                }
            }
            return url;
        },
        convertLinksToReal(root) {
            root.querySelectorAll('a[href]').forEach(a => {
                const realUrl = this.resolveRealUrl(a.href);
                if (realUrl && realUrl !== a.href) a.href = realUrl;
            });
        }
    };

    const VersionChecker = {
        compareVersions(current, latest) {
            const currentParts = current.split('.').map(Number);
            const latestParts = latest.split('.').map(Number);
            for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {
                const c = currentParts[i] || 0;
                const l = latestParts[i] || 0;
                if (c < l) return -1;
                if (c > l) return 1;
            }
            return 0;
        },
        checkMarkedJsVersion() {
            localStorage.setItem(Config.STORAGE_KEYS.CURRENT_VERSION, Config.VERSIONS.MARKED_VERSION);
            GM_xmlhttpRequest({
                method: 'GET',
                url: Config.API.MARKED_CDN_URL,
                onload: ({ responseText }) => {
                    try {
                        const latest = JSON.parse(responseText).version;
                        localStorage.setItem(Config.STORAGE_KEYS.LATEST_VERSION, latest);

                        const lastNotified = localStorage.getItem(Config.STORAGE_KEYS.LAST_NOTIFIED);
                        if (this.compareVersions(Config.VERSIONS.MARKED_VERSION, latest) < 0 &&
                            (!lastNotified || this.compareVersions(lastNotified, latest) < 0)) {
                            const existingPopup = document.getElementById('marked-update-popup');
                            if (existingPopup) existingPopup.remove();

                            const popup = document.createElement('div');
                            popup.id = 'marked-update-popup';
                            popup.innerHTML = `
                                <p><b>${Localization.getMessage(Config.MESSAGE_KEYS.UPDATE_TITLE)}</b></p>
                                <p>Current: ${Config.VERSIONS.MARKED_VERSION}<br>Latest: ${latest}</p>
                                <button>${Localization.getMessage(Config.MESSAGE_KEYS.UPDATE_NOW)}</button>
                            `;
                            popup.querySelector('button').onclick = () => {
                                localStorage.setItem(Config.STORAGE_KEYS.LAST_NOTIFIED, latest);
                                popup.remove();
                            };
                            document.body.appendChild(popup);
                        }
                    } catch (e) {}
                },
                onerror: () => {}
            });
        }
    };

    const RenderState = {
        isRendering: false,
        geminiBoxExists: false,

        startRendering() {
            if (this.isRendering) return false;
            this.isRendering = true;
            return true;
        },
        finishRendering() { this.isRendering = false; },
        maintainGeminiBoxPosition(wrapper) {
            const existingGeminiWrapper = document.getElementById('gemini-wrapper');
            if (existingGeminiWrapper) existingGeminiWrapper.remove();
            if (DeviceDetector.isGoogle()) {
                UI.createRHSIfNeeded();
                const rhsTarget = document.getElementById('rhs');
                if (rhsTarget) {
                    rhsTarget.prepend(wrapper);
                    this.geminiBoxExists = true;
                } else this.geminiBoxExists = false;
            } else if (DeviceDetector.isBing()) {
                const bingContextTarget = document.getElementById('b_context') || document.querySelector('.b_right');
                if (bingContextTarget) {
                    bingContextTarget.prepend(wrapper);
                    this.geminiBoxExists = true;
                } else this.geminiBoxExists = false;
            }
        }
    };

    const EventHandler = {
        observeUrlChange(onChangeCallback) {
            let lastUrl = location.href;
            const checkUrlChange = () => {
                if (location.href !== lastUrl) {
                    lastUrl = location.href;
                    onChangeCallback();
                }
            };
            const originalPushState = history.pushState;
            history.pushState = function (...args) {
                originalPushState.apply(this, args);
                checkUrlChange();
            };
            const originalReplaceState = history.replaceState;
            history.replaceState = function (...args) {
                originalReplaceState.apply(this, args);
                checkUrlChange();
            };
            window.addEventListener('popstate', checkUrlChange);
            const observer = new MutationObserver(checkUrlChange);
            const targetNode = document.querySelector('head > title') || document.body;
            observer.observe(targetNode, { childList: true, subtree: true });
        }
    };

    // ---------------------- UIRenderer ----------------------
    const UIRenderer = {
        renderDesktop(query, apiKey) {
            const wrapper = UI.createGeminiUI(query, apiKey);
            RenderState.maintainGeminiBoxPosition(wrapper);
            if (RenderState.geminiBoxExists) {
                window.requestIdleCallback(() => {
                    const content = wrapper.querySelector('#gemini-content');
                    const enabled = Utils.getGeminiEnabled();
                    if (content) {
                        if (enabled) {
                            const cache = sessionStorage.getItem(`${Config.CACHE.PREFIX}${query}`);
                            if (cache) content.innerHTML = marked.parse(cache);
                            else window.requestIdleCallback(() => GeminiAPI.fetch(query, content, apiKey));
                        } else {
                            content.innerHTML = Localization.getMessage(Config.MESSAGE_KEYS.GEMINI_OFF);
                        }
                    }
                    RenderState.finishRendering();
                });
                return true;
            }
            RenderState.finishRendering();
            return false;
        },
        refreshGemini(query, apiKey) {
            // 새로고침 버튼에서 호출 (cache 무시)
            const content = document.querySelector('#gemini-content');
            if (content) GeminiAPI.fetch(query, content, apiKey, true);
        },
        renderMobile(query) {
            const contentTarget = document.getElementById('b_content') || document.getElementById('main');
            if (!contentTarget) {
                RenderState.finishRendering();
                return false;
            }
            requestAnimationFrame(() => {
                const searchBtn = UI.createSearchButton(query);
                if (contentTarget.parentNode) {
                    contentTarget.parentNode.style.overflow = 'visible';
                    contentTarget.parentNode.style.position = 'relative';
                    contentTarget.parentNode.insertBefore(searchBtn, contentTarget);
                } else {
                    document.body.prepend(searchBtn);
                }
                RenderState.finishRendering();
            });
            return true;
        },
        renderTablet() {
            RenderState.finishRendering();
            return true;
        },
        render() {
            if (!RenderState.startRendering()) return;
            const query = Utils.getQuery();
            if (!query) {
                RenderState.finishRendering();
                return;
            }
            UI.removeExistingElements();
            const deviceType = DeviceDetector.getDeviceType();
            if (deviceType === 'desktop') {
                const apiKey = Utils.getApiKey();
                if (!apiKey) {
                    RenderState.finishRendering();
                    return;
                }
                this.renderDesktop(query, apiKey);
            } else if (deviceType === 'mobile') {
                this.renderMobile(query);
            } else if (deviceType === 'tablet') {
                this.renderTablet();
            } else {
                RenderState.finishRendering();
            }
        }
    };

    // ---------------------- Initializer ----------------------
    const Initializer = {
        init() {
            const initialize = () => {
                ThemeManager.init();
                Styles.initStyles();
                LinkCleaner.convertLinksToReal(document);
                const checkAndRender = () => {
                    const targetElement = document.getElementById('rhs') || document.getElementById('b_context') || document.querySelector('.b_right');
                    if (targetElement || DeviceDetector.isMobile() || DeviceDetector.isTablet()) {
                        UIRenderer.render();
                    } else {
                        if (DeviceDetector.isGoogle()) {
                            UI.createRHSIfNeeded();
                            setTimeout(checkAndRender, 100);
                        } else setTimeout(checkAndRender, 100);
                    }
                };
                checkAndRender();
                EventHandler.observeUrlChange(() => {
                    UIRenderer.render();
                    LinkCleaner.convertLinksToReal(document);
                });
                ThemeManager.observeThemeChange();
            };
            if (document.readyState === 'complete' || document.readyState === 'interactive') setTimeout(initialize, 1);
            else document.addEventListener('DOMContentLoaded', initialize);
        }
    };

    // ---------------------- 실행 ----------------------
    Initializer.init();
})();