3909 lines
179 KiB
HTML
3909 lines
179 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<html lang="ua">
|
||
|
||
<head>
|
||
|
||
<meta charset="UTF-8">
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
||
<title>Image Optimizer [NAT] — Інструкція / Инструкция / Documentation</title>
|
||
|
||
|
||
|
||
<!-- Google Fonts -->
|
||
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
|
||
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;600&display=swap" rel="stylesheet">
|
||
|
||
|
||
|
||
<style>
|
||
|
||
/* DESIGN SYSTEM & CSS VARIABLES */
|
||
|
||
:root {
|
||
|
||
--bg-primary: #0b0f19;
|
||
|
||
--bg-secondary: #131b2e;
|
||
|
||
--bg-tertiary: #1e2942;
|
||
|
||
--text-primary: #f1f5f9;
|
||
|
||
--text-secondary: #94a3b8;
|
||
|
||
--accent: #f97316;
|
||
|
||
--accent-hover: #fb923c;
|
||
|
||
--accent-rgb: 249, 115, 22;
|
||
|
||
--brand-blue: #3b82f6;
|
||
|
||
--success: #10b981;
|
||
|
||
--success-bg: rgba(16, 185, 129, 0.1);
|
||
|
||
--success-border: rgba(16, 185, 129, 0.25);
|
||
|
||
--warning: #ef4444;
|
||
|
||
--warning-bg: rgba(239, 68, 68, 0.1);
|
||
|
||
--warning-border: rgba(239, 68, 68, 0.25);
|
||
|
||
--info: #06b6d4;
|
||
|
||
--info-bg: rgba(6, 182, 212, 0.1);
|
||
|
||
--info-border: rgba(6, 182, 212, 0.25);
|
||
|
||
--border: #1e2942;
|
||
|
||
--shadow: rgba(0, 0, 0, 0.4);
|
||
|
||
--sidebar-width: 290px;
|
||
|
||
--font-sans: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
||
|
||
--font-mono: 'JetBrains Mono', monospace;
|
||
|
||
}
|
||
|
||
|
||
|
||
body.light-theme {
|
||
|
||
--bg-primary: #f8fafc;
|
||
|
||
--bg-secondary: #ffffff;
|
||
|
||
--bg-tertiary: #f1f5f9;
|
||
|
||
--text-primary: #0f172a;
|
||
|
||
--text-secondary: #475569;
|
||
|
||
--accent: #f97316;
|
||
|
||
--accent-hover: #ea580c;
|
||
|
||
--accent-rgb: 249, 115, 22;
|
||
|
||
--brand-blue: #2563eb;
|
||
|
||
--success: #059669;
|
||
|
||
--success-bg: rgba(5, 150, 105, 0.08);
|
||
|
||
--success-border: rgba(5, 150, 105, 0.2);
|
||
|
||
--warning: #dc2626;
|
||
|
||
--warning-bg: rgba(220, 38, 38, 0.08);
|
||
|
||
--warning-border: rgba(220, 38, 38, 0.2);
|
||
|
||
--info: #0891b2;
|
||
|
||
--info-bg: rgba(8, 145, 178, 0.08);
|
||
|
||
--info-border: rgba(8, 145, 178, 0.2);
|
||
|
||
--border: #e2e8f0;
|
||
|
||
--shadow: rgba(0, 0, 0, 0.05);
|
||
|
||
}
|
||
|
||
|
||
|
||
* {
|
||
|
||
box-sizing: border-box;
|
||
|
||
margin: 0;
|
||
|
||
padding: 0;
|
||
|
||
}
|
||
|
||
|
||
|
||
html {
|
||
|
||
scroll-behavior: smooth;
|
||
|
||
}
|
||
|
||
|
||
|
||
body {
|
||
|
||
font-family: var(--font-sans);
|
||
|
||
background-color: var(--bg-primary);
|
||
|
||
color: var(--text-primary);
|
||
|
||
line-height: 1.6;
|
||
|
||
overflow-x: hidden;
|
||
|
||
transition: background-color 0.3s ease, color 0.3s ease;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* LANGUAGE DISPLAY LOGIC */
|
||
|
||
.ua-only, .ru-only, .en-only {
|
||
|
||
display: none;
|
||
|
||
}
|
||
|
||
body.lang-ua .ua-only { display: block; }
|
||
|
||
body.lang-ru .ru-only { display: block; }
|
||
|
||
body.lang-en .en-only { display: block; }
|
||
|
||
|
||
|
||
/* LAYOUT STRUCTURE */
|
||
|
||
.app-container {
|
||
|
||
display: flex;
|
||
|
||
min-height: 100vh;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* SIDEBAR */
|
||
|
||
.sidebar {
|
||
|
||
width: var(--sidebar-width);
|
||
|
||
background-color: var(--bg-secondary);
|
||
|
||
border-right: 1px solid var(--border);
|
||
|
||
position: fixed;
|
||
|
||
top: 0;
|
||
|
||
bottom: 0;
|
||
|
||
left: 0;
|
||
|
||
z-index: 100;
|
||
|
||
display: flex;
|
||
|
||
flex-direction: column;
|
||
|
||
padding: 12px 16px;
|
||
|
||
transition: transform 0.3s ease, background-color 0.3s ease, border-color 0.3s ease;
|
||
|
||
}
|
||
|
||
|
||
|
||
.sidebar-header {
|
||
margin-bottom: 20px;
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
text-align: center;
|
||
gap: 12px;
|
||
}
|
||
|
||
|
||
|
||
.brand-logo-img {
|
||
width: 190px;
|
||
height: 150px;
|
||
object-fit: contain;
|
||
border-radius: 12px;
|
||
margin-bottom: 4px;
|
||
box-shadow: 0 4px 10px rgba(0,0,0,0.3);
|
||
transition: transform 0.2s ease;
|
||
}
|
||
|
||
|
||
|
||
.brand-logo-img:hover {
|
||
|
||
transform: scale(1.05);
|
||
|
||
}
|
||
|
||
|
||
|
||
.logo-text h1 {
|
||
|
||
font-size: 16px;
|
||
|
||
font-weight: 800;
|
||
|
||
letter-spacing: 0.3px;
|
||
|
||
color: var(--text-primary);
|
||
|
||
margin-bottom: 2px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.logo-text span {
|
||
|
||
font-size: 10px;
|
||
|
||
color: var(--text-secondary);
|
||
|
||
text-transform: uppercase;
|
||
|
||
font-weight: 700;
|
||
|
||
letter-spacing: 1px;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* LANGUAGE SWITCHER */
|
||
|
||
.lang-switcher {
|
||
|
||
display: grid;
|
||
|
||
grid-template-columns: repeat(3, 1fr);
|
||
|
||
gap: 6px;
|
||
|
||
background-color: var(--bg-primary);
|
||
|
||
padding: 4px;
|
||
|
||
border-radius: 8px;
|
||
|
||
margin-bottom: 12px;
|
||
|
||
border: 1px solid var(--border);
|
||
|
||
}
|
||
|
||
|
||
|
||
.lang-btn {
|
||
|
||
background: none;
|
||
|
||
border: none;
|
||
|
||
color: var(--text-secondary);
|
||
|
||
font-size: 11.5px;
|
||
|
||
font-weight: 700;
|
||
|
||
padding: 6px 0;
|
||
|
||
border-radius: 6px;
|
||
|
||
cursor: pointer;
|
||
|
||
transition: all 0.2s ease;
|
||
|
||
}
|
||
|
||
|
||
|
||
.lang-btn:hover {
|
||
|
||
color: var(--text-primary);
|
||
|
||
}
|
||
|
||
|
||
|
||
.lang-btn.active {
|
||
|
||
background-color: var(--accent);
|
||
|
||
color: #0b0f19;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* SIDEBAR NAV */
|
||
|
||
.sidebar-nav {
|
||
|
||
flex: 1;
|
||
|
||
overflow-y: auto;
|
||
|
||
margin-bottom: 20px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.sidebar-nav::-webkit-scrollbar {
|
||
|
||
width: 4px;
|
||
|
||
}
|
||
|
||
.sidebar-nav::-webkit-scrollbar-thumb {
|
||
|
||
background: var(--border);
|
||
|
||
border-radius: 4px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.nav-list {
|
||
|
||
list-style: none;
|
||
|
||
}
|
||
|
||
|
||
|
||
.nav-item {
|
||
|
||
margin-bottom: 6px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.nav-link {
|
||
|
||
display: flex;
|
||
|
||
align-items: center;
|
||
|
||
gap: 10px;
|
||
|
||
color: var(--text-secondary);
|
||
|
||
text-decoration: none;
|
||
|
||
font-size: 13.5px;
|
||
|
||
font-weight: 600;
|
||
|
||
padding: 8px 12px;
|
||
|
||
border-radius: 8px;
|
||
|
||
transition: all 0.2s ease;
|
||
|
||
border-left: 3.5px solid transparent;
|
||
|
||
}
|
||
|
||
|
||
|
||
.nav-link svg {
|
||
|
||
width: 16px;
|
||
|
||
height: 16px;
|
||
|
||
fill: none;
|
||
|
||
stroke: currentColor;
|
||
|
||
stroke-width: 2;
|
||
|
||
}
|
||
|
||
|
||
|
||
.nav-link:hover, .nav-link.active {
|
||
|
||
color: var(--text-primary);
|
||
|
||
background-color: var(--bg-tertiary);
|
||
|
||
}
|
||
|
||
|
||
|
||
.nav-link.active {
|
||
|
||
border-left-color: var(--accent);
|
||
|
||
border-top-left-radius: 0;
|
||
|
||
border-bottom-left-radius: 0;
|
||
|
||
}
|
||
|
||
|
||
|
||
.sidebar-footer {
|
||
|
||
display: flex;
|
||
|
||
justify-content: space-between;
|
||
|
||
align-items: center;
|
||
|
||
padding-top: 16px;
|
||
|
||
border-top: 1px solid var(--border);
|
||
|
||
}
|
||
|
||
|
||
|
||
.theme-toggle-btn {
|
||
|
||
background-color: var(--bg-tertiary);
|
||
|
||
border: 1px solid var(--border);
|
||
|
||
color: var(--text-primary);
|
||
|
||
width: 36px;
|
||
|
||
height: 36px;
|
||
|
||
border-radius: 8px;
|
||
|
||
cursor: pointer;
|
||
|
||
display: flex;
|
||
|
||
align-items: center;
|
||
|
||
justify-content: center;
|
||
|
||
transition: all 0.2s ease;
|
||
|
||
}
|
||
|
||
|
||
|
||
.theme-toggle-btn:hover {
|
||
|
||
border-color: var(--accent);
|
||
|
||
}
|
||
|
||
|
||
|
||
.theme-toggle-btn svg {
|
||
|
||
width: 18px;
|
||
|
||
height: 18px;
|
||
|
||
fill: none;
|
||
|
||
stroke: currentColor;
|
||
|
||
stroke-width: 2;
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
.version-tag {
|
||
|
||
font-size: 11px;
|
||
|
||
font-weight: 700;
|
||
|
||
color: var(--text-secondary);
|
||
|
||
background-color: var(--bg-tertiary);
|
||
|
||
padding: 4px 8px;
|
||
|
||
border-radius: 6px;
|
||
|
||
border: 1px solid var(--border);
|
||
|
||
}
|
||
|
||
|
||
|
||
/* MAIN CONTENT */
|
||
|
||
.main-content {
|
||
|
||
flex: 1;
|
||
|
||
margin-left: var(--sidebar-width);
|
||
|
||
padding: 40px 50px;
|
||
|
||
max-width: 1100px;
|
||
|
||
transition: margin-left 0.3s ease;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* MOBILE MENU HEADER */
|
||
|
||
.mobile-header {
|
||
|
||
display: none;
|
||
|
||
background-color: var(--bg-secondary);
|
||
|
||
border-bottom: 1px solid var(--border);
|
||
|
||
padding: 16px 24px;
|
||
|
||
position: sticky;
|
||
|
||
top: 0;
|
||
|
||
z-index: 90;
|
||
|
||
justify-content: space-between;
|
||
|
||
align-items: center;
|
||
|
||
}
|
||
|
||
|
||
|
||
.menu-toggle-btn {
|
||
|
||
background: none;
|
||
|
||
border: none;
|
||
|
||
color: var(--text-primary);
|
||
|
||
cursor: pointer;
|
||
|
||
}
|
||
|
||
|
||
|
||
.menu-toggle-btn svg {
|
||
|
||
width: 24px;
|
||
|
||
height: 24px;
|
||
|
||
fill: none;
|
||
|
||
stroke: currentColor;
|
||
|
||
stroke-width: 2;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* HERO HEADER */
|
||
|
||
.hero-header {
|
||
|
||
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.08), rgba(59, 130, 246, 0.08));
|
||
|
||
border: 1px solid var(--border);
|
||
|
||
border-radius: 16px;
|
||
|
||
padding: 32px;
|
||
|
||
margin-bottom: 40px;
|
||
|
||
box-shadow: 0 4px 20px var(--shadow);
|
||
|
||
position: relative;
|
||
|
||
overflow: hidden;
|
||
|
||
}
|
||
|
||
|
||
|
||
.hero-header::after {
|
||
|
||
content: '';
|
||
|
||
position: absolute;
|
||
|
||
width: 300px;
|
||
|
||
height: 300px;
|
||
|
||
background: radial-gradient(circle, rgba(var(--accent-rgb), 0.1) 0%, transparent 70%);
|
||
|
||
top: -100px;
|
||
|
||
right: -100px;
|
||
|
||
pointer-events: none;
|
||
|
||
}
|
||
|
||
|
||
|
||
.badge-cat {
|
||
display: inline-block;
|
||
padding: 5px 11px;
|
||
font-size: 11.5px;
|
||
font-weight: 700;
|
||
border-radius: 6px;
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.5px;
|
||
line-height: 1.3;
|
||
white-space: nowrap;
|
||
}
|
||
.badge-cat.scanner {
|
||
background-color: rgba(59, 130, 246, 0.18);
|
||
color: #60a5fa;
|
||
border: 1px solid rgba(59, 130, 246, 0.35);
|
||
}
|
||
body.light-theme .badge-cat.scanner {
|
||
background-color: #dbeafe;
|
||
color: #1d4ed8;
|
||
border: 1px solid #bfdbfe;
|
||
}
|
||
.badge-cat.generator {
|
||
background-color: rgba(16, 185, 129, 0.18);
|
||
color: #34d399;
|
||
border: 1px solid rgba(16, 185, 129, 0.35);
|
||
}
|
||
body.light-theme .badge-cat.generator {
|
||
background-color: #d1fae5;
|
||
color: #047857;
|
||
border: 1px solid #a7f3d0;
|
||
}
|
||
.badge-cat.experimental {
|
||
background-color: rgba(239, 68, 68, 0.18);
|
||
color: #f87171;
|
||
border: 1px solid rgba(239, 68, 68, 0.35);
|
||
}
|
||
body.light-theme .badge-cat.experimental {
|
||
background-color: #fee2e2;
|
||
color: #b91c1c;
|
||
border: 1px solid #fca5a5;
|
||
}
|
||
|
||
.badge-series {
|
||
|
||
display: inline-block;
|
||
|
||
font-size: 11px;
|
||
|
||
font-weight: 800;
|
||
|
||
text-transform: uppercase;
|
||
|
||
letter-spacing: 1px;
|
||
|
||
color: var(--accent);
|
||
|
||
background-color: rgba(var(--accent-rgb), 0.12);
|
||
|
||
padding: 4px 10px;
|
||
|
||
border-radius: 20px;
|
||
|
||
margin-bottom: 16px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.hero-title {
|
||
|
||
font-size: 28px;
|
||
|
||
font-weight: 800;
|
||
|
||
margin-bottom: 12px;
|
||
|
||
letter-spacing: -0.5px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.hero-desc {
|
||
|
||
font-size: 15px;
|
||
|
||
color: var(--text-secondary);
|
||
|
||
line-height: 1.6;
|
||
|
||
max-width: 800px;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* SECTIONS */
|
||
|
||
.section {
|
||
|
||
padding-top: 40px;
|
||
|
||
margin-bottom: 40px;
|
||
|
||
border-top: 1px solid var(--border);
|
||
|
||
}
|
||
|
||
|
||
|
||
.section:first-of-type {
|
||
|
||
border-top: none;
|
||
|
||
padding-top: 0;
|
||
|
||
}
|
||
|
||
|
||
|
||
.section-title {
|
||
|
||
font-size: 20px;
|
||
|
||
font-weight: 800;
|
||
|
||
margin-bottom: 24px;
|
||
|
||
display: flex;
|
||
|
||
align-items: center;
|
||
|
||
gap: 12px;
|
||
|
||
letter-spacing: -0.3px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.section-title svg {
|
||
|
||
width: 22px;
|
||
|
||
height: 22px;
|
||
|
||
fill: none;
|
||
|
||
stroke: var(--accent);
|
||
|
||
stroke-width: 2;
|
||
|
||
}
|
||
|
||
|
||
|
||
p {
|
||
|
||
font-size: 14.5px;
|
||
|
||
color: var(--text-secondary);
|
||
|
||
margin-bottom: 16px;
|
||
|
||
line-height: 1.7;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* GRID CARDS */
|
||
|
||
.grid-cards {
|
||
|
||
display: grid;
|
||
|
||
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
||
|
||
gap: 20px;
|
||
|
||
margin-top: 24px;
|
||
|
||
margin-bottom: 24px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.card {
|
||
|
||
background-color: var(--bg-secondary);
|
||
|
||
border: 1px solid var(--border);
|
||
|
||
border-radius: 12px;
|
||
|
||
padding: 20px;
|
||
|
||
box-shadow: 0 4px 10px var(--shadow);
|
||
|
||
transition: all 0.2s ease;
|
||
|
||
}
|
||
|
||
|
||
|
||
.card:hover {
|
||
|
||
border-color: var(--accent);
|
||
|
||
transform: translateY(-2px);
|
||
|
||
}
|
||
|
||
|
||
|
||
.card-icon {
|
||
|
||
background-color: rgba(var(--accent-rgb), 0.08);
|
||
|
||
color: var(--accent);
|
||
|
||
width: 40px;
|
||
|
||
height: 40px;
|
||
|
||
border-radius: 8px;
|
||
|
||
display: flex;
|
||
|
||
align-items: center;
|
||
|
||
justify-content: center;
|
||
|
||
margin-bottom: 16px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.card-icon svg {
|
||
|
||
width: 20px;
|
||
|
||
height: 20px;
|
||
|
||
fill: none;
|
||
|
||
stroke: currentColor;
|
||
|
||
stroke-width: 2;
|
||
|
||
}
|
||
|
||
|
||
|
||
.card-title {
|
||
|
||
font-size: 15px;
|
||
|
||
font-weight: 700;
|
||
|
||
margin-bottom: 8px;
|
||
|
||
color: var(--text-primary);
|
||
|
||
}
|
||
|
||
|
||
|
||
.card-desc {
|
||
|
||
font-size: 13px;
|
||
|
||
color: var(--text-secondary);
|
||
|
||
line-height: 1.6;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* STEP LISTS */
|
||
|
||
.steps-list {
|
||
|
||
list-style: none;
|
||
|
||
margin-bottom: 24px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.step-item {
|
||
|
||
display: flex;
|
||
|
||
gap: 16px;
|
||
|
||
margin-bottom: 16px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.step-number {
|
||
|
||
background-color: rgba(var(--accent-rgb), 0.1);
|
||
|
||
color: var(--accent);
|
||
|
||
font-weight: 800;
|
||
|
||
font-size: 14px;
|
||
|
||
width: 28px;
|
||
|
||
height: 28px;
|
||
|
||
border-radius: 50%;
|
||
|
||
display: flex;
|
||
|
||
align-items: center;
|
||
|
||
justify-content: center;
|
||
|
||
flex-shrink: 0;
|
||
|
||
}
|
||
|
||
|
||
|
||
.step-content {
|
||
|
||
padding-top: 2px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.step-content h4 {
|
||
|
||
font-size: 15px;
|
||
|
||
font-weight: 700;
|
||
|
||
margin-bottom: 6px;
|
||
|
||
color: var(--text-primary);
|
||
|
||
}
|
||
|
||
|
||
|
||
.step-content p {
|
||
|
||
font-size: 13.5px;
|
||
|
||
margin-bottom: 0;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* COLLAPSIBLE ACCORDION */
|
||
|
||
.accordion {
|
||
|
||
border: 1px solid var(--border);
|
||
|
||
border-radius: 10px;
|
||
|
||
margin-bottom: 12px;
|
||
|
||
overflow: hidden;
|
||
|
||
background-color: var(--bg-secondary);
|
||
|
||
transition: border-color 0.2s ease;
|
||
|
||
}
|
||
|
||
|
||
|
||
.accordion:hover {
|
||
|
||
border-color: var(--accent);
|
||
|
||
}
|
||
|
||
|
||
|
||
.accordion-header {
|
||
|
||
width: 100%;
|
||
|
||
background: none;
|
||
|
||
border: none;
|
||
|
||
color: var(--text-primary);
|
||
|
||
text-align: left;
|
||
|
||
padding: 16px 20px;
|
||
|
||
font-size: 14px;
|
||
|
||
font-weight: 700;
|
||
|
||
cursor: pointer;
|
||
|
||
display: flex;
|
||
|
||
justify-content: space-between;
|
||
|
||
align-items: center;
|
||
|
||
gap: 16px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.accordion-icon {
|
||
|
||
transition: transform 0.2s ease;
|
||
|
||
flex-shrink: 0;
|
||
|
||
}
|
||
|
||
|
||
|
||
.accordion.active .accordion-icon {
|
||
|
||
transform: rotate(180deg);
|
||
|
||
}
|
||
|
||
|
||
|
||
.accordion-content {
|
||
|
||
max-height: 0;
|
||
|
||
overflow: hidden;
|
||
|
||
transition: max-height 0.25s ease-out;
|
||
|
||
border-top: 0 solid var(--border);
|
||
|
||
background-color: var(--bg-primary);
|
||
|
||
}
|
||
|
||
|
||
|
||
.accordion.active .accordion-content {
|
||
|
||
border-top-width: 1px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.accordion-inner {
|
||
|
||
padding: 20px;
|
||
|
||
font-size: 13.5px;
|
||
|
||
color: var(--text-secondary);
|
||
|
||
line-height: 1.6;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* CODE BLOCKS */
|
||
|
||
.code-wrapper {
|
||
|
||
position: relative;
|
||
|
||
margin: 16px 0;
|
||
|
||
border-radius: 8px;
|
||
|
||
overflow: hidden;
|
||
|
||
border: 1px solid var(--border);
|
||
|
||
}
|
||
|
||
|
||
|
||
.code-header {
|
||
|
||
display: flex;
|
||
|
||
justify-content: space-between;
|
||
|
||
align-items: center;
|
||
|
||
background-color: rgba(0, 0, 0, 0.2);
|
||
|
||
padding: 8px 16px;
|
||
|
||
border-bottom: 1px solid var(--border);
|
||
|
||
}
|
||
|
||
|
||
|
||
.code-lang {
|
||
|
||
font-size: 11px;
|
||
|
||
font-weight: 700;
|
||
|
||
text-transform: uppercase;
|
||
|
||
color: var(--text-secondary);
|
||
|
||
letter-spacing: 0.5px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.copy-code-btn {
|
||
|
||
background: none;
|
||
|
||
border: none;
|
||
|
||
color: var(--text-secondary);
|
||
|
||
cursor: pointer;
|
||
|
||
font-size: 11px;
|
||
|
||
font-weight: 700;
|
||
|
||
display: flex;
|
||
|
||
align-items: center;
|
||
|
||
gap: 6px;
|
||
|
||
transition: color 0.2s ease;
|
||
|
||
}
|
||
|
||
|
||
|
||
.copy-code-btn:hover {
|
||
|
||
color: var(--text-primary);
|
||
|
||
}
|
||
|
||
|
||
|
||
pre {
|
||
|
||
background-color: rgba(0, 0, 0, 0.4);
|
||
|
||
padding: 16px;
|
||
|
||
overflow-x: auto;
|
||
|
||
margin: 0;
|
||
|
||
}
|
||
|
||
|
||
|
||
code {
|
||
|
||
font-family: var(--font-mono);
|
||
|
||
font-size: 12.5px;
|
||
|
||
color: #fb923c;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* ALERTS */
|
||
|
||
.alert-block {
|
||
|
||
border-radius: 10px;
|
||
|
||
padding: 16px 20px;
|
||
|
||
margin: 20px 0;
|
||
|
||
display: flex;
|
||
|
||
gap: 16px;
|
||
|
||
font-size: 13.5px;
|
||
|
||
}
|
||
|
||
|
||
|
||
.alert-block.info {
|
||
|
||
background-color: var(--info-bg);
|
||
|
||
border: 1px solid var(--info-border);
|
||
|
||
color: var(--text-primary);
|
||
|
||
}
|
||
|
||
.alert-block.info svg { color: var(--info); }
|
||
|
||
|
||
|
||
.alert-block.warning {
|
||
|
||
background-color: var(--warning-bg);
|
||
|
||
border: 1px solid var(--warning-border);
|
||
|
||
color: var(--text-primary);
|
||
|
||
}
|
||
|
||
.alert-block.warning svg { color: var(--warning); }
|
||
|
||
|
||
|
||
.alert-block svg {
|
||
|
||
width: 20px;
|
||
|
||
height: 20px;
|
||
|
||
fill: none;
|
||
|
||
stroke: currentColor;
|
||
|
||
stroke-width: 2;
|
||
|
||
flex-shrink: 0;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* TABLE */
|
||
|
||
.table-container {
|
||
|
||
width: 100%;
|
||
|
||
overflow-x: auto;
|
||
|
||
margin: 24px 0;
|
||
|
||
border: 1px solid var(--border);
|
||
|
||
border-radius: 10px;
|
||
|
||
}
|
||
|
||
|
||
|
||
table {
|
||
|
||
width: 100%;
|
||
|
||
border-collapse: collapse;
|
||
|
||
text-align: left;
|
||
|
||
font-size: 13.5px;
|
||
|
||
}
|
||
|
||
|
||
|
||
th {
|
||
|
||
background-color: var(--bg-secondary);
|
||
|
||
color: var(--text-primary);
|
||
|
||
font-weight: 700;
|
||
|
||
padding: 12px 16px;
|
||
|
||
border-bottom: 2px solid var(--border);
|
||
|
||
}
|
||
|
||
|
||
|
||
td {
|
||
|
||
padding: 12px 16px;
|
||
|
||
border-bottom: 1px solid var(--border);
|
||
|
||
color: var(--text-secondary);
|
||
|
||
}
|
||
|
||
|
||
|
||
tr:last-child td {
|
||
|
||
border-bottom: none;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* OVERLAY FOR MOBILE SIDEBAR */
|
||
|
||
.sidebar-overlay {
|
||
|
||
display: none;
|
||
|
||
position: fixed;
|
||
|
||
top: 0;
|
||
|
||
bottom: 0;
|
||
|
||
left: 0;
|
||
|
||
right: 0;
|
||
|
||
background-color: rgba(0, 0, 0, 0.6);
|
||
|
||
z-index: 95;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* RESPONSIVE BREAKPOINTS */
|
||
|
||
@media (max-width: 1024px) {
|
||
|
||
.sidebar {
|
||
|
||
transform: translateX(-100%);
|
||
|
||
}
|
||
|
||
.sidebar.open {
|
||
|
||
transform: translateX(0);
|
||
|
||
}
|
||
|
||
.sidebar-overlay.open {
|
||
|
||
display: block;
|
||
|
||
}
|
||
|
||
.main-content {
|
||
|
||
margin-left: 0;
|
||
|
||
padding: 30px 24px;
|
||
|
||
}
|
||
|
||
.mobile-header {
|
||
|
||
display: flex;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
a.card {
|
||
|
||
text-decoration: none;
|
||
|
||
color: inherit;
|
||
|
||
display: block;
|
||
|
||
}
|
||
|
||
|
||
|
||
/* ECOSYSTEM GRID RESPONSIVENESS & ACTIVE-CARD STYLING */
|
||
|
||
.grid-cards, .eco-grid {
|
||
|
||
display: grid !important;
|
||
|
||
grid-template-columns: repeat(3, 1fr) !important;
|
||
|
||
gap: 20px !important;
|
||
|
||
margin-top: 24px !important;
|
||
|
||
margin-bottom: 24px !important;
|
||
|
||
}
|
||
|
||
.card.active-card {
|
||
|
||
border: 2px solid var(--success) !important;
|
||
|
||
box-shadow: 0 0 12px rgba(16, 185, 129, 0.15) !important;
|
||
|
||
}
|
||
|
||
@media (max-width: 1024px) {
|
||
|
||
.grid-cards, .eco-grid {
|
||
|
||
grid-template-columns: 1fr !important;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
/* THEME TOGGLE ICON VISIBILITY - DISPLAY SUN IN DARK MODE, MOON IN LIGHT MODE */
|
||
|
||
.theme-toggle-btn .sun-icon { display: block !important; }
|
||
|
||
.theme-toggle-btn .moon-icon { display: none !important; }
|
||
|
||
body.light-theme .theme-toggle-btn .sun-icon { display: none !important; }
|
||
|
||
body.light-theme .theme-toggle-btn .moon-icon { display: block !important; }
|
||
|
||
|
||
|
||
</style>
|
||
|
||
</head>
|
||
|
||
<body class="lang-ua">
|
||
|
||
|
||
|
||
<!-- Mobile Top Header Bar -->
|
||
|
||
<div class="mobile-header">
|
||
|
||
<div class="logo-text">
|
||
|
||
<h1>Image Optimizer [NAT]</h1>
|
||
|
||
<span>Documentation</span>
|
||
|
||
</div>
|
||
|
||
<button class="menu-toggle-btn" id="menu-toggle" aria-label="Toggle Menu">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M4 6h16M4 12h16M4 18h16"></path></svg>
|
||
|
||
</button>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- Mobile Sidebar Overlay background -->
|
||
|
||
<div class="sidebar-overlay" id="sidebar-overlay"></div>
|
||
|
||
|
||
|
||
<div class="app-container">
|
||
|
||
|
||
|
||
<!-- Sidebar Navigation -->
|
||
|
||
<aside class="sidebar" id="sidebar">
|
||
|
||
|
||
|
||
<div class="sidebar-header">
|
||
|
||
<img class="brand-logo-img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAACAAElEQVR42u39e5gU533nDX9qGBBIiGkkcZTEDCBkS7JgkKVEoAhGds4RCDm72c2ViBmcbDbZNxLg1fPsvvuuBch5N9l3tRYo2Sd5ns0TAfK+yW4SG4Q2djaONSALZFsWA5Jl6wQDEhJH0ZwRh6nnj6qmq3u6uquqq6rr8P1eV18z011z9/27D7/6feo+gSRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJUkZlfo9ulYIkSZKUNRkqAkmSpBBg4fsU4AowdNkvgA7H+yX1uCfk5cuGvTNov5x/77vyu2l9ZsyjXzUlSZIkCUAkSZLSABg/uAINPTYALLT/7gYK/hIL6ZrgaQ8ARWAAOAH0A0VjPgOqaUmSJEkAIkmSFB9kdGONXHRj0nnld7+AETVkRJm+BSeDwC4bTAaM+yiqdUiSJEkCEEmSpKCxe3m6VA/Qaf/enRvI8PN/1nWDWKMlW4F+42c0UiJJkiQJQCRJkrzAxhz7966IAvU0Q4YfFTHpt4Fkk3F/xfoTSZIkSRKASJKUK+DotiFjoQ0djWFDkNFs3geBTcAGY4FGRyRJkiQBiCRJ2QeOHgdwFDIHGUmAGO9pWzBissFYKBiRJEmSBCCSJKUfOLocwLGkAjgEGc3/X7jpD2KyDthk9GialiRJkiQAkSQpLdDxPbox6MWkB4PuHExpymLe1wMbjB6dRSJJkiQAkSRJSiZ0LAEeonqUQ5CR3rxb/zsArDMeYL1auSRJkgBEkiQpedAhyEgjZHi5ZhBYY3xOICJJkiQAkSRJihM6XvEw0pHvQD3rECMQkSRJEoBIkiRFDh1dwHIbOroUqCvvNogsMz6vNSKSJEkCEEmSpHCgo2ADx3JqnTquQD17eQ+Wfj+wzPhZ7ZolSZIkAJEkSQoSf+64MtrRh5cpVoKMPECGl2vWGD/HavUgSZIkAYgkSZJX8OgBVmGd2aFAXRATJA8DmCwzfl4HGkqSJAlAJEmS3GLL7fTZ4NGlQF2QEVIeVho/z1r1LkmSJAGIJElScPBQoC7I8HdNP/Cw8QsU1dskSZIEIJIk5Rs8VtjgUVCgLsiIuPwGMXnY+EVNyZIkSRKASJKUP/B42ceIh9Z8JLts0lU/RWCl8Ys6N0SSJEkAIklSXsCjB3h2GHhocbYgI97yW2b8kiBEkiRJACJJUnbB47t02eDRI8gQZCSi/EzWGr/MSvVOSZIkAYgkSdkCjwJcWeehIFmQEX/e6//veuOXWaaeKkmSJACRJCkb8NFD9XQrBcnRp6/pbH6vWWb8iqZjSZIkCUAkSUoveLxEAWvEY4WC5Ajzrh26wkvbZJnxoCBEkiRJACJJUhrho4fSqIcgQ5CRprybzDUWaYteSZIkAYgkSemBj22sxstaDwXJgoxkTiUrAtONRTqsUJIkKclqVxFIkmRuowB8g1o7XClIzmKgnlWIKbXjB9SrJUmSkiuNgEhS3uFjK9120NaV+yBZU5rSB2C1tdJYxFr1bkmSJAGIJEnJg48lWOs9CoIMQUbKIKNSQxV/FYG5xkMMqpdLkiQlT5qCJUl5hY9++jB5VpAhyEgpZNRTAXgaeFg9XZIkKXnSCIgk5RU+cIEPQUayA/U0l024kOFFDxgP0a8eL0mSlCxpBESS8gYfL3oc+dCBfNmEmOxBRr28rwIBiCRJUtKkERBJyht8OEc+BBmCjPRDRiPNNZbobBBJkqQkqU1FIEk5gY/v2CMfph28eQ2A3V5+rsHjNVHnIUjaUaef1Lx7hQy3V1iQ0XzZLFfvlyRJSpY0AiJJ+YCPbmCna7DmJRAkxOuizEOW8h5H+l5BI7LGGXm9Fo0vMF5eQJIkSQAiSVJc8PGPdNnwURBkCDIyChmN9LDxBTbJG0iSJCVDWoQuSdnXN/B7zod2gEpf2Qgy6v3fQyAAkSRJEoBIkhS5zG+zGpNuBeqCjJZCRuvrtUfeQJIkKTnSFCxJyip8/EOddR+CDEFG/up1vPFPKMozSJIktV4aAZGk7OppQYYgQ/V6Rd3oTBBJkiQBiCRJEcWW/0Af0KM1Hy2EGEFG0uBRACJJkiQAkSQpwsBzVQYCRkGG4DHMei3IMUiSJAlAJEmKIh79e/ow6RJkCDJUr5IkSZIARJKkONSrYFSQoXoVnEiSJAlAJEmKXOa36ML0sOWoDuRrDWgIMtLXJiVJkiQBiCRJdbVcAaMgI3PwqOlYkiRJAhBJkhIq0+OBa4KM1kBGEgL1PECGQESSJEkAIklSDOzxTQrgOPVckJFfyEhqvbYWMgbkJSRJkgQgkiSFGzB3CzJiBA1BRhIho16bGZSTkGJ1ye8MG5EuQB0/PVz91W3YmKV2LAlAJElKFoD0JDLYFWRkDzLCTN+Mp90Yv6ERECl0sCj9nGPDhV/AaKRVNb7bCdSDQBHYZf8cAIrGLLV1SQAiSVJ86hRkCDLyDBl11C/3IPmEjG6gywaKTvv3ngRlsct+ASypASkDNqDssn8f0OiJJACRJCmKALxLkJHyQD3tEGMmsN1YaW+Vg5DqwEaPDRpz7J/dGTCrZMcSh51FG0a22lA+YMyiqBYgCUAkSWptoJ51yEgqxAgyom6Tm+QUJDsI78YaycgSbHhVwba9B3t6l/kOAzaMbDVmqZ9I8clQEUhSRm6sW3iRMKcI6KwMQUbS4HQoUN4HjaVMl4fILXCUAu6FNmwUVCoNYX0rsElTtqQopREQScqzBBmCjGxARj1tUEfPFXB028DxEMlas5EWLbFfT9ujIxsEI5IARJIkQUarISNNEJMfyKj3f+vlBDINHAU7YF5o/yyoVEJTt/1ywsh6rRuRBCCSJDmDumhuClqcLchIPmS4Xbfe6NOT2wxCRzfW6EYv+VrDkRQY2QRs0JoRSQAiSRJY2y0uiR00BBmCjOQC7Bq5hUxBR6/t47pUIi3VEmCJ+Q6DWKMiazUqIglAJCm/GhRkCDJyCBlu0uiHoEOKVl1Yu2ktt0dF1mitiORV2gVLkrJys95MN7BTkJHgILn1B/I1l3Z62lYRmGssUzAk6JBi1nqBiCQAkaS83bw3cZx6izC1ODuevKfzrIy0QUa969YYX2S1PEJqoKPLBg6t6RCISAIQSZJSCCDPYtKXo0BTkJFfyHDTgPFF5sobJB46Cg7o6FGJCEQkAYgkSWm9qX+DJcA3BBmCjNxuYWww1/giA/IGiQWPJVhndPSpNHKlNWixuiQAkaQM3+C/3mAaliAj+ZDhNX0t/B8W5Bi/palXCYSObqyRjj50TkeeVQRWGrN0No8kAJGkLALIs5SeLmrNhyAje5Dhdl2/8ds8IA+QGOgo2H5I6zqkavUDyzQtSwAiSVKWbvx/SxewV5AhyMggZLhpEJhr/LamdyQAPJZQ3sVKkuppjTFLI5YCEEmSshME/A0v4mdhpyBDkBFF2vG0rSLwgPEvtO6jhdDRBSxHU6wk/xrAGg1R/xWASJKUAQDpAV4UZKQEMtJUP8nL+8PGv2CTen3s0FHAGuVYjqZYSc1rpTGLtSoGAYgkSWkPEP7aZRREB/I1n7Z2F0tK3pcZv6MFrTGDR7cNHUvQaIcUrvqBh7VTlgBEkqR0A0gXZtVaEEGGICM7eRd8xAcdBbSgXIpHRRtC+lUUAhBJktIaOPwPngZWRBpo6qwMQUb8ZbPM+JeCjxjAo4fy9rmSFKc0JUsAIklSigGkgMlOoEuQkctAPYsAJviIFjoKNnAsd/UbkhSP1huzWKZiEIBIkpTGgOK/04NZtSA9LZDhNX0F6nnJ+zLjdwUfEYFHDxrtkJKnAeABrQsRgEiSlMbg4q/sqViCDEFGevMu+AgfOgpoJyspHRCirXoFIJIkpS7Q+EsKWNvydgsyBBmhpR1P2RSBh43f06LUEMGjG+1kJaVLRayREEGIAESSpJRBSDdDvBhpwCHIEMSEm/YAsMz4PQUdIYFHH9Y0qx6VhiQIkQQgkiTFE4D8txoHFAoyBBnJzHs/8LDxrzT3u0no6EKnlEuCEEkAIklSiyGkD3i2ZZChQF15b6y1xr9ipXprU+CxBGu0Y4lKQxKESAIQSZKSACGrGWKVgl3lPWFlU8RgmfGv2KReGgg6CmgLXUkQIglAJElKbLDyHM9S2nJTgXraAvUsAtgA8LDx/2JQvdM3eHRTnmYlSYIQSQAiSVKCA5eNDghRIC3IaF3e1xi/z2r1SN/g0YcWlUuCkOk6J0QAIklS+iBkBSZPK1BX3luQ9wFgmfH7eoLpAzq6KE+zKqhEJEmHFQpAJElKZ1CzwbEwXYG68h5P+muAtcbvK2jwCB496KRySXJTvzGLB1QMAhBJktIW4KynB/gG9Z6qKlAXxDSf9gCwzHhUox4eoKOAtYvVKrSoXJIaaa0xS7vnCUAkSUojhHRh8g3qnZguyBBkBPu/IrDGeJS16mkNwaMLnd0hSUG0zJjFehWDAESSpLQFP89SAJ7GbGKqhwJ15b1S64GVxmOabtUAPHps8Fii0pCkQCqinbEEIJIkpTgY+guWYK0LKShQz0new0zfuqYfg5XGYwoG6kBHAZ3dIUlhagAtSheASAm84b1GN36H9Wu3lKIxV4FFxiGkC5NnqbfNpwL1vENGLQ0Cy4zl9KsXuYJHF9bajiVompUkha31xiyWqRgEIFK0QFEKDp1gsdBxSU+MrWYArjx1KAK7HL+XYGXAmKsnE6lqY/83ffZWvf4CJUFGNsrGex4GgTXGcs3Bdi3Kt1mCNdrRo7uwJEWqh41ZbFIxCECkoDesH1Kw4aLLfs0BChgJOnwqWEsatF8lUClBikZWktgO/9xeG1JrG1AF6nmCjFr/Z4HHCoGHC3QU8DPNSndmSQpDRXRIoQBE8gwb3Q7YWAg+p0sZmWpdJUAZAE4A/cCgMZdBtZQWttH/Sg/W1JEeQUauIKOW+oENAg9X8OimvJuV7taSFL82GbN4WMUgAJGcN6dX6bIBwwKNqEY0jEy2uH4bTvYJTFrUfv8vlmCNiHQJMjINGbWu2QSsM1ZqjUfNYnqLPqxDA3si9b+6g0uSFz1gzJKvEoAIOHps4OhpGLjl6cYVLpgMYE3pGjTmyunEACJ9lA5K05qPeACiNXkoYm2nu85YKdivAR1dcAU85NslKTkaBOZqKpYAJE/AUcDa4cQbcCShxrI5WjLggJIBQUlE7f3/vDLHvTsxgbogI4z0B4B1wCZjpW7gNcCjx4aOPvl2SUqs1hizWK1iEIBkGTq6bdjopdFp0mmpxexCSb8DSgbUekPqA3/m4TA1QUbSIKP6/4pYox0bjC+pb9SAjoLdvpdH6ucFJZIUpqYbszR6KwDJ0s3oB3TbwLEEIyEHSQlK/KpoQ8lWG0y0VXDzINKFeWUBbkGQkTjIqNUHNgGbjS9p60oX8OgCD21avl2SkiidDSIAyRh01JtaZeSoxrMHJQOUR0n6tci9if7yp/Rh8hD1RkXiDvDDTD+9606KdhvfbHxJO1m5FuNPqs7ukG+XpLRKC9IFIKmEji68LjJMU6kLSrxq0A7WtqJpW8H60P9x5TyE8hRF7TAVfdqV1xUpjXT8a4101IGOArDCt7/P5pRVRQ9SVtRvzOIBFYMAJB03ou/bAVPUB//pxpU2O4sOIOkXkPjsV/+FLqwRkYcoPVkWZESV9wFgM7DJ+Ndqpw3Ao4cwFpXLt0tSUqVREAFIoqGjCy9zfbXWIpstMVh+nECySVO2fPS3P/GwY5wgw891AxVw/K+1nqlukf64xknl8u2KMqSsSqMgApBEgkcfpQOkklqqRo5aULptHaRyhERA4rUf/vGV3eRKQFLIBGREl36pnQ0IOHyBRzflHdsKCtZz6tulPGquMUujwQKQ1kNHgeqnX2krbd240mDrINbc+xKQKEj02kefuXKI5xy4Aif5PGsE+jEd59o8rpuoT+goEPYWuvLtikiktEk7YglAWgoeXWR5S0XduJJu6wDWvPx+HY4YoP+uo9sOILuwRkq6Kh4gpH861oANrbtKvws2mgKPbvyOdsi3y7dLWZbOBRGAxHwj+h5dwCqciww1H1e2ttbOIlo/Ek7/Xku3HWD2AB1Atx3Q9yQKMmDAPvBvENhn/xy0QUP1H0ZbeNMe7TAiPjBQ/i7ftkpplU5HF4C0EDyyE8DmKVjPg52DNpCURkiKclch+YGnK0ZKyr9bINGJ2zRM76BRAgonXA7Y/1/UKEYs4NFDvZ2s5Nvl2yUJisYsxqsYBCDJAQ85c924kmenE0YUwErScOjoory2o0v+TrYKSiQPetiYpfOQBCBh35BecYCHAljZmuaeUZmfIuXF7Js0OiLlGjx+RB8GD9nwIX8nWwUlkh9tMmbxsIpBABIWeBRs8FghJ6cbVw5sHaB0yJxGR6R8QEc39RaUa62FfLuiIcm7xhuz9CBPANI8fKyw4aMgZy5bcwglRTQ6ImUTOrpI8hQrjSDIt0tp1TJjFutVDAKQoODRAzxNFDud6MYlO9Nr6wCl0ZG7NDoipQ46CjZ0pHOKlXy7fLuUBmkalgAkEHgU8DLdSk5ONy7ZWsQ5OnKXRkekxIJHCTr6FMDK38lWKQZpGpYAxMdNagfdwLMYCdjfXTcu2Zo+OwfQ6IiUFH/+xpWtc5cABQWw8u2qUylGaRqWAMQzfKzAmnKVfKt045KtybeziEZHpPiho9sBHV3yA/LtqlOpRdI0LAFIQ/Ao2ODRJyenG5fqNDINoNERKSnQIT8g3y5bpWilQwkFIA3h40XCXGiuG5ds1Y2roWNGoyNSM7779RrQoQBWvl11KihJluYas/TATQBSfQPbTjfwDaBLNy7duFSnLbV1AI2OSI2hYwnl3asK8gM5DmBVp4KSdGilMYu1KgYBSDV8vNjwJiYnJ1tlZ9zpF9HoiGQBR4Hylrk9BD2LSX5AtspOQUlrpHUgApAA8CEnpxtXFntE+mwdwBod6Tfuol8uNvPQ0W3DRi/EvBuhfLtslW8XlIQrrQMRgIQEH7px6cYlW1uZdhHodwDJoFxuyoFjNwUbOEqjHF3qG7JVvl11miFNN2bpXpVrAIkMPtTxdeOSra1Ke5DydK1+TddKDXT0OKCjW31DfkB1qjrNsB42ZrFJxZBTADFfphsjRviQk9ONS7a2Iu1+ymtHBuSOE+J/d9GNQQ+wEGtNh/qGbFWdyta8aI0xi9W6E+QQQMyXKQB7K+BDHV83Ltma9fZbrAKSQbnn2ICjB64ARzfVD37UN2SrfLvab36gpN+YxQO6M+QMQGz48HbOhzq+nLlszXL7HXQAidaPhAcbXbZ/LcFGj/qGbNV9THYKSsr3HmMW03W3yB+AfINmhvx145KTU51mtU4HsXbY2goMaIctD/504ApslIHDiHBaq/yA7JStik0yACXGLK2OyRWAmC+zGlglJyc7ZatuXB7Vb0PJLmAwz1BiDtg7UsEcB3QUMt9+5Qfk21WnsjV86UT0vACI+V16sKZeycnJTtkqW5tJewBrtGSX/TMzYGIOXIGKHqDDhowu+yWfpL4hW+XbVafh6AFjlkbZMw8g5ndrLDpXx9eNS3UqW8NNu2jDSdGGE+DKDWag1VsCmzsrQKLH/jkHKGBEBBl5ar/yA/IDqlPVqXetNGaxVogQrdoTkIdn8TpVwIy40ZoJ6hBmzHbmydYs2pn39ts47YIjsF9i/7wy5dN87cp1JUgpaWsDoKlWGRaG56mzCiS8gYWp9qu+IVtVp4pNYlQBKdsAYn6XFYSxz7ycnGzNkp1qv60sx+6qv3tCy5PqVH5Avl2+Xe03DbZ2CA8yDCDmd+kiqkXnunHpxpVmO9V+1X5lp8pRAWw6ylHtN4u+vVt4kGEAwc/UK3V83bh049KNS1AinyQ/ID8gPyA/kAZbpWQCiPkSSzCrpjYogJWT041Ldaobl3ySIT8gP6A61Yi/oEQAEj58FICn5eTk5FSnCmDVftV+BSUqRz2ckG8XlAhA4tAKvG4pqQBAHV83LrVftV/VaZoDL5Wj/ID8QNrqtFt4EL1ibUbmS3RhnfmRYitanB/tfa46VZ2qTmVr9tqvylF9Q3WamLwYt2pMJGrFOwJiVu16pScvyUo7aXnRU/Vk2Kn2K5+kOlU5yrfLt6tOpTQyq7nN4+iHKF12ylbZqjpVncpWlaP8gOq0RXZqBCR6xTkC4u3MDz15yYedebJV7Vd2ylbtvKPRNfUN2Zqv2ERqPYt6Hv0QpbcmL3ryojpVncpWtd/s1anKUX1Dtgb76k8JQ6JWXCMg0Zx4ricvslV2qk5R+1X7VZ2qHBNsp/xA2mwdEB5kAEDs0Y8+OTl1fNWpblxqv6pT2So/oIcTqtOE21oUHmQAQCp2vlLHVwCrG5farwJY+SS1X7UZ+QHVaRbrVEoGgJhbKQBL1PHl5OTkVKcKYOWT1H4FJfLtqtPc+XYpfgDBmnpVUMeXk1OdKoBV+1X7VZ2mPPBSOcq358MPDAoP0g8gy9XxZatuXGq/ar+qU9VpRm1VACs/kL063Sc8SDGAmP30YNKlAFYdXzcu3bhUp/JJ8kk5a7/yA/LtWfMDUjoABOjVzUJOTrYqgNWNS+1XPkl1qnKUb09RnQ4ID1IKIGZ/1eJzOTl1fNmaPjvVftV+ZadsVQCrhxP5q9Oi8CClAGLDR0E3C3V83bh041Kdqv3KJ6n9qhzlB1LkBwaEB+kFkId0s1AAKyenG5cCWNWpfJJ8kspRtibeTkd+jNs0ApJKAGk4/UodQk5Odao6VQCrOlX7FVSrHNU3kufb+4UGKQWQyOFDTk4BgG5cqlO1X9Wp6lS26uGE/ED4KgoN4lFbBI3wIUy7sZi0djszs8YrDWmHkZc82ZqWclT7bU1eVKfySfJJar8qR/l2L3qbLvNx+szHfa5jlnwrdH40X+Q4XhagG1kuhZzaqjpVncpWtV/VqerUUDmqb6TU1r8DPgKskZBNwDrjKS1KT3yVmy/SA7yoji9bVaeqU9mq9qs6VZ1mwlaVY378wH8HTg97dwBYB2wyntIUraQCyNPACnUG2aoAVu1Xdao6VZ3KVkGJyjE1ebkAfK3uFUUbRNYbTzEohEgSgHyHnUC3bhbq+LJVdqpOZavar+pUUKJyTI2t+4B/9Hz1emCNQCQBTcj8DgXguDq+nJxslZ2yVe1Xdao6la0qx1TZudN++ZNAJKDC3AWrpzGloN1Ckp520vKiOk2GnWq/slV2qk7VflWOWe4bBwN9Ux+w13ycZ83H6RJWtAZAFupmoY6vAFY3LtWpbJVPUvtV+1U5ps7Oj5pKXSDiU2FOwXoRL6MgLc9pi9KXrfHnRXWqOpWtar+qU9WptgVWOTbSQeCboaVWxFqsvla7ZsUDIKY6hJyc6lR1Kltlp2yVnbJV5ZgqWwcIsv6jkQaBlcZTbBJuRFS15neaPP9DHV83C9Wp2q9slZ2yVT5J7Vfl2Ir0v0nQNSBetMkGkUFhR1nhrAEx6dZ8xoTYqXnNyStHtd/W5EV1Kp8kn6T2mxefpHJsTgcjLZElwE7z8ZDPyROAADBHNwvdLOTkVKeqU/kktV+1X0G1yjFV5XgwlhIoAE+bj/OiFqmHCyBdmekQulnITtmqG5far9qv6lRQncX2q3IcruOxWtyDNRrSl3cACWcNyD9G0Hw1nzF7tmpes9qv6lR1qjqVrWq/Ksck5eW7wLstsWoTsCyvO2U1PQJifpsuPcGSrYHT1hMstV/VafL6knyS2q98kuo0L+V4umVWLcEaDekWgARTlxyobhayVXaqTtV+1X5Vp7qnZtwnZbEcD9JKdQEv5nFKVhgA0p3pzqabhQIABQCqU9mqOlWdyla13+yV42mSoALwrPk4T+cJQNpDKrhgjaRaRsiNMMr0k5KXpNuZJ1uNlJSj2q98knyS6lQ+ST5J5ZgUAClphT0d6+E8rAtpC6FiF+oJQAqeRuhpXbrtRHWaGDvVfuWTVKdqv/JJ2SjHjxMXl/dgTckqCECyfuPSzUI3C9Wp6lS2qv2qTmWroDp/5XgxkbF5N7A364vTmx4QM//BR1NJ85Zx2sIwe7ZqC061X9Wp6lR1KlvVfvNbji8C+xMboxeBB4ynGMgigLTF+m1aZKVyTHqd6gmW2q/qNHl9ST5J7Vc+SXUaRfoXEh2jF7CmY3ULQKrbwj+EcJy85jMqANDNQu1XdaoAVnUqW3VPlU9KczkKQuIDEAgBQLLm5BQAKABQnerGpfar9qs6zWaAqfabrXI8SBqUSQhpS1VuNXSoclQAK6hWncpW+STVqdqvfFKaQVYQ0iSAmBTU8eVYdLPQzUJ1qgBWPkntVz5JdZq6GSuCkJQCiPMUdN245EBlq+pUdSpb1X5Vp6pTQbVGM6KGkELeAUQdXzcLtZks2qn2qwBAdar2K5+k9pvl9pu8QwhzBSHtLWmA1TJa2BmizEuU6Se9HPNkq5GSclT7zZ4fUJ3KJ8knqU5l63AIwQOIjMI6d7yks8AZ+/ci1ha9RxIbv3cDzwIPC0B045ID1c1CNwvZKVsVwKr9qk4Vm0SVFydkDNnvDQVMewQwwcN3X7SB5IjjZzJOUF9iPs7TxlOszB+A6MalAEA3CwUACgBUp7JVdSqoVvuNwrZawNFMPXn9vDpSvsF+lVQEPrRfJ1oax68wH2eX8RTr0wYgTTUl8+95FuiL9luitiJFeVE5Zs/OPNmq9is7Zat8ktqv6rSehuyXl3UcYUJGM+mdBd61YeRsS2q3CDxgPMVAmgAknoMItcjK0me3wR0bg6U7tQ/u2qZyjCptLcxLt52oThNjp9qvfJLqVO3Xz/9exprSdAG45ACQen3D6+de+1oz6Y0B7gR+AbgbuDr22i0Az6ZtUXpbojpD1p3cW71ww2K43SeETO2DWWvh7V6Vo24WslO2JttOtV/ZKjtla6Mg/5INHBeroCOpkOE1vZuAnwc+GzuIdANPpwlAmp2C9SKVewgkMJctTLuWrp0On90JR56HHy1tnJcSfLw2F07tVTkmIS8aVpetar+qU9WpfJLarz8gcU6vqvW53/Sa+Tyu9N4D3iLOResPG0+xSQCiju8fQqrh49a18MO5cHqvylG2KthRncpW+STVqdpveuwcwppiFWSEJS2Q0ejzi8BO4GAsNVMEphtPUUw6gDQ3BUvDwcF0aq8FFRMWu68JccLHqb3ptFXTQrJnZ55sVZ3mo07VftV+Vafh9qXSFKtP7OB7iGROl4orvZHATwFz7d+jVQHrfJDEq9k1IAO6cUUAIdXwkSUnpwBAAYDqNB19Se1X7Vd1qnuqHw1RXkx+OWeQ4SW9m4D5xLE2ZIn5OEuyDiAn5OSaSL8WhHiBjyzeuBQAKIBVAKD2K5+kOlX7TZ+tlykvKL+cc8holN61wP3AuMhbWOJ3xWqPtbNVSwcylSHkszvh7m0wdnYw+GiFrTrYKrq082Sr/IDqlJT0JfkktV/5pErwuFwVdIfRzsh4eu3AvcArwMnIWlMBa1esZUkFkLaWfruevJQh5P1noHA/HN8WHny0otz1BEu2yk7ZqlEhtV/VaXbvqZcZvr4jz2s8gqTXDvw0UY+E9JmPt2ijqMgBRDeucNKe0gc3PwY/WgbjFwQ/rDCvNy4FAAoA8hYAqP2q/apO81unrbLVCR6mTz+p6VfD0xsZC4SsyiaAyMk1n5epffCptfDqXPhwvfWztCZENy4FsAoA8v1wQgGs6lQ+ST6p1baaNnhcIJ4DA/MELe1YO2RFtztWj/k4fVkEkAHduJrIixM+StOuTu0tQ8hnNurGpZuFAgDZqjpVAKv2q/bbmrxctOFjKOGBfNA+lQRoKUFIdFqVxAXpzQJIUU9eAualFnyUVAtCdOPSzUJ2yta02an2K1tlZzptvQycxzrPI69TpoL6uiDfNRa4JbIa7wJWZA1A5OSC5KUEHz+4C066LDj3AiG6celmoQBWdaqHEwpgVafySWHm5YL98hJUa5vd8KBmBtY2vdFoedJGQZoFkEE5OZ+60QEfp/bUz0tQCNGNSwGAAljVqdqvAlj5JLVfP3Ib9RBkxPd9n46sdgskbBSk6R2mzW+2fC+IaPfsDjPtWvDhRdfOgHtegw83wluPpbMck5YXA5WjbJWdslXtV3WqOjWpPETQ7/8283nS02tF/n8EfBhJqykC042nAiyfiEBtoTRcPXnxLr/wAdb1P7gLTr2mp2lpbTMqx+z5gSTZqfYrW2Wn6jSIhrAWmV9CIxlJyf+MyFpkgQSNgjQ/AvJ3vAh1DjrRkxc9eVGdJr8c1WZkq+yUrfJJ+Wq/l7DWeoBGMpKW3pvAR5G0hqLxFOOT0OyjX4SuJy968hK3ndoWWG1GfkB1qvYrn6Q6dU//AtbIh0Yykpne1MhaWyEp54K0h5DGAPg86t1M0NMIM+InEkm31UhJOSbdViMleU9DORbmOZ7V7Ei/napT7xoNXDXf+v2T7daC2Lz6AbXf9NTpCOCa+8p/n3w5uXaW4ONSk/d2r5+HnV5e1qh02P7wfCS9aBWwPgsAckIBrJy5blwqx9DSnrO9/He/oYcTeXo4MfFJuPnL1u/vfwX2PyE/IJ+U/Dq95j741HfLf//AiM9OP7aadkA7JMhIRXo3AB9E0pK6zMfpMZ6iP90AYtY4DV1OTnbKVgWwGl1TnYZ5E1edyicltU7NFLRfEzhXAz6C2iHIiD69CZEBCMBySDuA1DoNXQGsblyqU7UZ+QHZGcb3CaqhY/7w905sV/tNal7MhNnqHPmIM7AeDYyZb11zfHu035XF9MZF2kKWmI/TZTwV8Xl+UQKI8Sv0m/9TAWwib1z3bIPx9wf7nlOvw6UinBuEUzvh1Pfg4+26cQlKsl+Oo4GfdiR06Gvwk0eaz8sNi+CO563fL52A7YXW2FmYB3c6+vLOGXB6rx5OJKn9dsyH634dxi2Ea+50v/7SCTi7G072w5lX4ePn5ZP0oGT49zc78tHo89HAhJVw7VwY2w3X3llun6d3w4jC8PdODcDH37ba7KUIA/m0Q0sBIjy1ow9YnVoAsVW0i0lOLklOrhmVnMX4+4FHyo7j+DY48Odw+HnVqaAkmW23WVvPA8degOsftP6+fpHlKS81mY+jW6w+1N5hva5fZL0X98OJSf+q/Pvp15uDD7XfcPPSMR9u+iPo8PjgqL0Dxt1vvUo6/gIc/q/hwojqNJ22OuEj7ClTY4CpT8LkXhjZYcUGx1+ED/8MTm23DjasGVtMh9F3wnU/CzP+AOZshiNb4PDX4cD69IBBlHlz6ppIAaS3lQAS1ja8A6F3Gm29lzy1d8CERdC9Ge7fZ53srjptnBdtCxxenuIqx6N/U9nub+gN53sPPVf+ffLvxNN+nemOAK5bVP7s8LPZ8Xlp9gPtwKzn4I6Xh8PHJ/vhxEvw0Z/AB1+xXidesl61NP5B+NRmuGsfTOzLXp1qW2DvOkvl6eZhbBM7BrhjI9xnwuguePtReLEAA4th39PWTImLddI7udd6gPmTx2DHbHjJgI9fhBlrrLhi5pNWf0jTNrtRtNch+3VVpC26y3zc5y62YYaUIQJIT+QdX09eguvD5+DA/+n+uVHji6/7RcvBXNtdHhG54oSmwR3PWk7jrUfrj4gkpU6TVq/agSu55fjRBpi5zoIPgBv+CRzc0Px3HHwabvx96/frH3QfWYnKzht6yzaV8mMmqE5No/bvWWi7bvlpB+7YXTnV6tIJOPgMHHrCOquhnq6ZAR1LoOMBCz5KumoaXDUje/00iT7JTGA5nrPhw+u9sVEe2oFPb4Qpj8Cer1jgcJ7mRx7OAoNPW6/r5sEtfwRT98FPfh8ObQl+r2/W3rDS8wIa9TQ28hbcS4sWo4cFILtyEdSlOfA6Nwgf+9ib3KByzUc7MKkPpn6xcl3JmGnWiMiRLfD64uanqSiYVgCQlLwc2wKTfrMMC1dh3XCbSfv0Hmva01g72Jy8Ej54Oj6fNPG3yr8f+lplf01asF6dp6z69k9vq4SPI1+DPY/UDh5r6cweOPNV+PCrlp++rg+mfMkCkA+fGG6vpqxm37dfoHzCeRhB98TF1qjH8W0WeJyLKIg/tgOOLYQbe+Ezz8GN22D3YvfpXFmBjDjzMlxLgGWt6CZtIXWIQZ1ynDFbq9O9iDU/8wcL4NX74HjV8P+ERTBvH1w7Q3WaljrV9Mb6en9V5d83rAynHA/85/LvN66Iz9bRQMHx8ODQ/6G+0Wpbpz1ZOeXqyNfg7UcsMAySl0vA4fWwazbsKriPrmnKagzE0SLffonagBB0OtKnnrHg442lsHNxOe0opzd9sAG2Fqz3FxZh3IzWT7/yAhlur2brNFoVzMdZkloAMR6sMXyjG1frbQ07I6V0j22H7y+AH/wMnNtf/nzMNLjntWggRMF0OttvmsuxNFpR0uRl4aR/1DGVa/Q0GBsTtE/6Svnz8/uDnzKvvhGO2oEpj5X//vgFCz7CyssnTdqptRbps9MEzoQUdLdj76TZY+3Yd+j5eNdkXABeXQw/Xg73vQc39WYbMlrbJh9KLYDYGkh9x8+qk4uKqD9+GXZ0WutLrjitjvggRDcuQUnUeTnoWKQ99k7/sFAr/UtY059KumlNPLZOWlr+/dBGLQBvta3X91Wux9m7SA/X5JOay8tZyjteNQMFI4B7dlt/fH+2lW6rRh7e3wCv3Ae3rbMgJOuQ0Zp2uCT7AKInL9mz8yLw+lJ460uVENL94vCdLFSnCrziguOw8vJR1fqMKSvDSf+jP3UEoouit6kwzxptuQJWX25N35AfKOu6X3U8zHnBWl+U94cT8u3B+9JF3NdK+IGCduCeXdY5Hd9bWDvNuHaXKl1/dDu88ll3CEk7ZDQqvxjuEK2YhhUmgGyVk8uxnYNPwxuOKSpjpsHcbc2lf918uOXJ9K0rcUu7HZi2Eqb2Bd/+oR0YP7/8ynr7bXX/uAQcfaH896RHwslLcbs1DaoE7JP6orVzsuPsj2MNgl0FsPGkfc3s8u9ndibv4cRVWOeSdMy3dtpSnUYH1VcBNz0J1y0Olp8h3Kde+YWC2zZaP99cGi9kNPr8xHvw6i/DnPXWmpCsQUbr+87C9AKIyYBuXDl98lLSgfWV07HG3w9dK4PZOvNJuPtlmPFlmPeeBSNprtMRwM8U4davwu3PQve2YOlfOx8++3L5lcf2G3f/OPh/OQDQPgsnjLwc2ugAhC9GZ2c7laMszjNOklanSVBcfeMqx4jUmVeTZ+ukJ61zSe54GbrW637dKP16f9fTuPnQbcKNX4ZZmy0Q8atPPAS2XsqlcwWMXwjfm2ONfCQt6D62HQb6YN5r1j01a5BR67rzsfWSJakFEGMRA9Q6r1FQkuwnL2Hb+vpSOOVYuDtzFYwMkHbnY5Xvdf7bdNfpjSsr53sX7rdOhBVUJz/9I/YJ5iXd8Gvh5OWjL1e2h9ER2ek8++PSiXDOM4nLJ+UlgB1xXUI3MtH9OvL0p1Td2yY/5u97hrB2pmr2AL1rZ8JtT8MPP1eGjyB9P+o1Gfs3wLFtMPf5cP1Wqw8zdEvvk9h6RJf5OF2pBBBbA4m4ccnJtdbW1x0g3d4BnQGe6JzaXfn3xy+mu05Pfa/y70sn4NReQXVa/MBB5wnmv+l/Cp3bk62iYzvrKV+JphwnOc/+eE4gm5S8OKH2ms8m21bQiH9U6Z+pCptObfOXZljb4t7+F/DOV+Dke82lF1R+RjJeWwzXL4DJD2YDMuqldybWHrAkzQCyNbGOKI9QUv1eXDq5B/b9cfnvaY9VLkj3op/0lc8aObIFDjyd7hvXx9ut02MvnbC2Ln5rRfN1mtX2G6XdQfNevRh9Ql84eTn4Fw5QWBp+2V1F5dkfB5/OXptJq28/43jI4nXuvx5OZM/Wj56Ao/aueGdeh/eX+wvavUy/ahQo39QLY7pg7xPp2GHqEvDGcvjMf8kGZNS7/mysLT3WdSBhA0i/blwJdrhx2vquYxh5ZEflgWte7Dy5xzpr5O8N62nHxQSVY9Ayf/cJ+E4BvtsJH65PX50mAapb5QeGnQnyxZCCj/XlJ+Gjp0Fhfrh2OkdVTr8Op/bkw+elwbcf21S+ZvQ0uPFLeriWVlub0SXg3UfgFQNenw1n9nq385OQAuVbnoS3n7DO3kjLDlP7N8C5Qbi5z59f8et3Wgktl4hzChZAT2oBxFgUAYDoyUs6AewilQvSpy5rXV5QnWYSquNO23kmiNc1G150dIsDbH4v3HJ0jqp88NXkt5la+cqqbz/01cppWNP/M1wzU/4uzbaGDSeN7Axj+tXN9gF/7/tYG5aUxd/v/if49JrWjWYE9TVe0zsRe8stmI/TnUoAsbVJTk4BrHWD/evy7+NmwxjVae6hJM22flg9DWtlOOm/v8oBID7WlzSydeyMyrM/jq5X30iSrZeA/VWHUM59Fyb26uGEfHtjXaB86GCQoLukm79ojX4kFTLqQcGH9hbpkxdlcwrW8Za02J40A8hWkqK8B7Ctns5waAtcdCD8db26cSW5TrXzTuOA0bkY/aYV4aQ/5o4qsOkLx1bnCeuHvmblX0Fdsmw98DQc/lrle7euhzu2lEfYNOIvKHEDkGZtGQ1ctwA+2pDebWzffRo6fzu9kFEvvVMtaZ1z0gwg/SRZeQpga+Ut7nI87tjR4/rP68aV5DpNoq1Jq9MjjjM0Rk+Da7uaT796W9+bvhSOjTc4zv746E8F7Em19a1HhkPIdQ/CPSZ86rnaU/3iPtciafdsQYn3tQH1RjKmrICDW7yvsUxiEH9gLUxZnF7IcPv8pA2Z8asntQBinwcySNokJxdN+icHyp+NnaM6zUKd5nnnnSPPl08wB7j5yebSb8eaduXU2DubX18ypa989sf5/XB8e7LKUX5gOIS8ubhyTQjAxN+0QGT2tsrDJOUH8j0KfqkqX0GnS13/Ofjob5MPGfXSOwsUd8P196YPMup937GWtbou83EKcXxRe0Tp9gN9pF21Gp+RgrSTlJeTPyj/Pm52+btaaesYrOlgV1ct+Dy3Bz5eX17Yl7U69ZufMcC1i+Hauyvfv3QcPt40/ByTLLbfWukf2Qw3P2r9fsPi5tK+wcVN3vzH8M6jTaT7q+XfD24MpxzbgcIiuPanoL0A18yBT/bB+UE49X0obqk/zSvsehoNjF0EY3+qqn1+DKdfgeKOdPn2Y1vgBwXo/GOY+vuVn3Xcb73O74fDG+HQl72dkByGH8jLfawduGY+dPxiVXsqwplX4MT25Nh6geDTpJzlNXkR7F7sDbLMJj+PMr2j/TDhl+DIK8nJn9/vc9bnZWod6x2nuolhNlM0ADLEZtoyACCCkubzc+lo5d8jcT9l1Zn2uBlwm73r0Mld8OPHmrNnJND1JEzthTHT6lz4rHVOx7611vzs6oDqxj640d6C9Sd91nbBXsvxtmfg2u7y/55q8L839sGYGVVBV1fl37c0eAL/7hP+g8zOJ2FKo3L6qlVO7zvKyZn2VEc5vdXrfuhiGvvp+4+VAaS9w4KQI88HS9853ergczD5kTLYvP1osLyPBm5wHNDlPHE9SDmOnw9df1R5nsgVVb137AV4/w+huD2cm3ytO9bklTBpmTVSVNf3nLAOXvzg0eDBety+/RLw3qNw4FGY9BWY+mh5JAusaX/T/r31OvESHPhPFrg0m5/Or4BR9ea4nvLvV3XWP1D2/B44tN7d1rEzYbrtz8/ugj1NwPWkPpjwRW9peSn3iXZ6Hfc3bk/Ht8D+R8rTn8yA7bhadzimKv9ogTcAabZ/jZtprdE8lxLIqHf98deg67fAXJUeyKinog0hrVNPagHEeIhN5maKUDWM00Y2FfeNK01PmS4eqnJ68+DYjsZpt0+C8QvCyfOsJ63DEEd2eLt+zDT49Fdh5ir4yXI4sKFs55gZMN6+UbVPAfZ4z8e13ZX/a+6pX45Tv1i+3k0zvuwPQOqV+y12ObX7KKdbvwo3r4A3f906bPHKZzPKAWv7FDD3ZgeqzwGnXodr7QB46m9bAOK3b4ymnMb5/fDmUigstILM0dNggg02fvvdhJXl34++4C34dsvfbdtcwMNF1z9ovQ78Cex9NJyF7yVbb1oJnau8t8/2Drjx963Xvj+AwS9H7+/Cao/ngX1ftl6Teq3T7KsDZOeoyP4n4NCG4HmZ9u8btIVpcHOd8jvxUhlAamnEpMr8m02U41UzGsOCl3LvmA+z/hKumua9PU34Tet15Guw9xH39m36bDPjfNpzOYQgfuRE6+Fes4cWJwFazrwFV09LF2TU08GWR7WxzJePEgn6a1ZMWFu6pQFKNB+38QhBkO/wqpHA/F0w88uV8HF4C7zeB9+fD/9owLcM2D7T+nvfH1tP9sH6nzvXw+yNVlrDHPVQtOUYl9qBebstmHEGd8dfgre+BK/eBy8a8A8GvDLD+nu/o5zGTIPPvgydKythKw1tN2h+nGdq3LDI/VFOvbSnOJ4oH7SDx6ObHZ//tv98m5R35wI4+rfBymRKH9xTrISP4kvwk2Xwg5lWe3jRgJcMGLgPPviTyvULN/4+dO8O5xFXOzBnG8z8arl9HnsB3uqDH86ErUb59cOZ1vvHXqhMo/Pfw2dDyk/cvv3gBti9AH5gwP4/qFyDVIKDW9fDPfsarxPJ0z2yLnA9CZ95uRI+PtkPH/0JvHEffM+Alw3YbsAPDfjJQxZ0lNr4hN+Eu4oWxLTC1ks0fxbFDb8IxYFsnCJ++BW4pjPaNRleYtmgIYHz/4/SqsXnTnXFFXpEpc3AksDEmMXRkrjnqifB1uqzP0wjnnIcNwPuea0SPD58Dt5ZWnuNx8k9wB74eIc13evGXmtEYMw0mPqItYB++xzvZR5GvX6/xgjQdffBPd8t//2/jOY9wLx9ldOtjmyBnyx2Kae9wF5rtOMnj1nTxGasKY+GtI+H956AkYX0tl0vbezw+vIUQbCmcXg93b6U9hTHttQf2iNV+x+Dmx6tBBs/owjXdpXP/rh0opwnP81kSh98+tlK8HinzzoNvlYgdHy79dr7KEz/Y7jJXr8w9k4LQn4wO3jfaMdKozTd6tgL8M4i91Gd03us18EN1gjOpxwjOGPvhDm7Ydfs5kdmWuHbz2GN4gx+2WobU/+3SkAcPQ1ufx4+fgHeWuTPxpdqZLbzK+WRkRMvWRBEhP4uan9a0q3PWQBxpQ2fgMEVtUdwTKy2dv55OPa81R6nPmmNBrV3wB0vw7vL4JO3W3O/bvbp/YViuOlFlZbX680Qvy/sh+NDHvN+KBF3wO44viTKMH9T05WV15GSqM9CiFNXz48nL9U7C33mG2X4uHjCGt3YvdT7AvMDG2B7Z/k093GzrZGQ9kLweo2i8Jspx3bgnt2V8PGjZbBzsY9yWg87Oi1oAWsUZeLi1p9BE3VfvQh85DwTxOfWuePnl0Gh+JJV3qUgs/iSAwZW+kvXuSuXc/G513KcsKgSPg5+DXYuqA0ftWDknUetUZKSxt4Js/7Ye51W56sEH5dOWOm+vqj+lLLqU6IHFljTr5z5cc63T6tvP7rFAoLd8yvbC1hb+N65O9rHi3H307DSnfqlSvg48zr8sFB/+lh1G9//BAzcUh4NueVZuObe6MpyGDQQ3uhDo7+bGc0I2g+i3l2qUZwZ1khGrfQa5e84SRj9sLL6ePTb8UYGIMZDFAn7VPS8QEnUDr2VQd1Jj9uBNjNSMvt5CxiuwMdd1roTv7ZexIKWEoRMfQSmLg2pDoZaX6e3PFNeg1CCjwPr/X/3JSxoKZXTHVWgltXph84zQa61t871mpepv1v+/aO/qPzM+ffkZf5sde7K9dFX/ZVjO/Dp5yrh48eP+C+Xj9bDuw4gu+n3LeDyC9I3Ploe+Ri4Cw6uD1ZPe79cmZ/C/dZ6kiz49uIOC0Sqt/Ade6cFISMScg+LspN6LcfRwPT/XAkfbwQcDTvzHrzx2XKZd/3n4XmKGmSbneLkFXiiCPyDphe0DyUJMtzK4hJJGf244ilTCyC2NkdeRIKSZKc9ZtbwoN5LXoI68+vnwUTHPOjXHxm+DsWvrbuXWutGwPtC9qTX6RhgmmP3mD1fCQYfTr2x1Fo30t5RCTZBnoKlAUoOP19eBwPW1AwveWl3gIJzmtSVdNeXA5tr74Rrp3uz1Xn2x6nX4dSgP3tmbSz/f/ElePOR4OX4/tPWAviSPv2X/tMo5eXdL1k7xjVTpx88XbkupHOVFZxn5VyLo1vgtQKcfr0SQmY+l8yDVFvhB252wPWlE8Hhww1C4vZJYUCBGXJ6YebP7/fFBRpB7mlebE3G2g+nulMNIMZDrKcVuxkLSpKT9rjPln8/uTt8ZzssiPojRyC3BQ5tCcfW1xdboyktr9OhcNKe6Ziec26/t92yPEHIAvcbclag2qmDjp2HJvd6y8sEByh8VOOMjkvA0efLf09b483WCV9wBNxf9WfHaMpbAAO8uaD5cnzH8SBg9DRrepdfFV+yYCaMOv3xonLbbO+Am7+SDJANq/2eB3bProSQSb8JhXnJtjMOP3AV1qGOJe1dEc46oDPvwUfPxG9nWFBAyiAjaVOm/MYpbp+fJ2mjHxDDTlhxLPXelIiizCOUxHWjqPdd1y0s/35qV7T5GUPl1r1vLg4v7QvAvmdaX6dh1etER9m8tyq8G+M54MONyW3LYQc6HzrAbcy0xlONqAKF/Y/Vzs+Hf1a+xsthh2OwFiZfge/1/myd5mjbB59rvHVvvbTbsUZj7qx64DD5d/yX7+C/Dc8nXcI6F+RKcL60NW0myvZ7CXj7ocr3bvx3wdJO6sO1INNzr3dMwTu/31rzEZa9+5/w99DFDSbc/q6WERIUHH8VJjyQDcgYC1w40VrIaAbiDsQQu/lXIQsAsoGkKk/bAkd9g6nV2dopr8UAOPlatPZNWuH4rt1wNmRbP3ii8c0jDXV63X2V2+0eXh9u4LXvsejtjGOOtVfgci4Cdq7tcAOF0kjAqddrL/Y3sXYZK03vau+wAvq6ULOyEiAu+SzHGxxB6/sBR8PGdsFtG2Fe0VrI7jwosPiS/y2Bz++3dtcKs14/coymjJ5mjfwkrT02m5dTe+HQ1xzB94PJvnc0E6x71XVLyr9//Hz4dXrkuej93ZXzO0IKgi8eKU8pTvtIxtXzoLg72ZDh9joEnMF9jU7r1J16ADEeoh8YTFWgrrNKwlH1lJSDa6O1Z9xdjqB6c/i2nqP2NLKkPyGtzs+4nyr/fvwlb+ty/Nh6jsq1EWltv17T/9CxaHzCYu+g8H6DaVLvO/rLhC/Uz8tkx85TztETLxpNeUcugJM+3HU7cPNKmL8P7tlrTeMqwe35/fDBH1tnKby2wFrr4qeejj4ffps5tadqsfai9LRHXw9Lqk6E7piXrr4Xdl6ucTwIO/aXzaVdK/1jfxmvrWEEwYdfgcLs8m5paZ4uNfEX4OOdyYUMt8/PMnzqVa2pca1RIfUAYiu5oyCCkmAO14u6HMPe1SMSUdy4xnSWfz/7XjQ30cvF9N2gq/PTPt4BC4PRtJnz+7IJ1bXSdy4ab++AqX3u/3/zCuvnpRPuI08lHXE8rZ+wqMaZOvZr7PTyov9zAUYNRjumjZVGcxqV4/j5cPtGWGDCrK9WAszRLfD6Q9Y21m8/Vns6l2v6ji+6VIymjZx2PEQY+1PZ3HGwetvksfe2diMIs8V+wDnie2Z7+OnHrVEhBcHF3TDhwfSvyZj8AHz8w2RChlt6l4EPqL9WBFoaO5iPRzsKEheArM9ksK7F7u66fn7l9KvBr8YDPVcC63eSHzAkAUzODUZvq2mke4ehRroIHHE8rXeu8XDq2unlM1eOPN94Eew5yuerQOXoiVNTndOvNkRn62hg+pPWaMfclysXrZ/fD+98yRrt2L24sjz81FP9N7LRZuI6+8m5GL39Ov+2miHampBqvdJfo6jTuHy7aUduYUyXOvwiTPzZdC/8HgVMXACHNibzlHa3aw9QnoJr1mlHre0zhdQDiPEQg5hsStwiN0FJdDfp2//UEUjth/c3NP9dSbHTGVinIUBOcuCVJDubyY9z2tOERbW3eHXuZrV/lbd0P/rz8u+l0ZNqTXEspv7wifDLfcJimPM8zDdh+pcrT1o/+By8dh+83An7ny4fqJiXNpPk9JsZQTJjLsus+IGo67T0/+0hBcl71sGNS9K7u5QJ3LQUju+Gk6Rn+tUR4OM6ZZIcCOlKPYDY2pDom4ugJDyHO31F5ejH20+El7bX9tJ+fWvhJC2Bl5eT3YPkpakT41MYZDoXjQPcuLJ2IF8C8pN7vaV9+Pny9K5au2xNXFyeXnJki/cT7BvZOAa49RlYWITZmyt32Dr1Ovx4GbxcgB8trT3lK88gm5T0vfbBvD2cGJ0BW0cFAKhaccjHe63PbgqwUUFSdpe65bfg3b9IHmS4pXea8tQrZ1lSB0Raty4kGwBiLGETXhajC0oiulHGVJDjZsLtjrnrJ3dbox9xOHPnOR3j7onGvjFdrb1xhV5fc5ov91p2Vh9EGEb9Jj3I/MjxjGXKMndQcC4u95K286yQ6l22pvx2+fcjXw9m36WPyr8X7ofPbrNGO25+tJznSyfgfXtB+fdnWwvKL0VUjiWN7Y4m7bGOhyOnvx9Pe2lFAOvchez8u+kDsDDL0bnxwDWLwrd19K3h213P/4/E/ZR7vyMZe9bDp//3ZEOGW3rXApMWwDvr0jH96iywx/HZkON/h1yAo1a7yEhc3Bbz921InJNLOpSkabRkJDCvaiHYwBfiq9Nj3yn/Pumh8NMfQ3kOf7NBdCunbx37Zvn38QusegszL9fOqNGwEx7shJGXA09UApjzBPOpDlA48LS/tJ3XT1hc3rWmnfKWvrVOVPeqU3sr/y7c74CaLbD7IegvwFuPlTeSiCOALSwIP+3RVC5IPvej5IFsGGlfU9UHT7/UWjvDtPWa7sbBerXOODYeKPx8+LZ2fD7achyqUZajQooXfrLa2g2rMCOcU78bXR8mFMxZD+9uhE9I/vSrS8B++6cbWDSCEGKHkIVZApC1qXDmaQCTRMLHrvK+4gBvroST7wWvU98A4liwO242XB1ym7n5yWhv1HH1jVM7Kv+e2BuuXZP6Whd4tdIPnMPa1vgKdKwcDgofPed/5ODUXmvaE3bwPKHPstO5+PyjJg9/dC52v3QC9n4FXjZg12JrGlgryr29wzqEMcy0b1hZaeepPdmcwjUlYXbiEkQFUcf9/svx2Dcc/u6RkNspcN2ieH37EO47YfmJI4awgvefrIW718czWhAUXKvfv246zOyFgd7kQIbb55eBd7DO+4D6p9F7gZCMKFYAMZZQJModsQQlrdG4mfC5YuW6jw+egz1ro6vbWjr5XuU5Hbc/H16bGQl0PhZtOcYVqF8ADjsCzlueDG8UZCQw7bHk2Bq3H6g4E+Sh4aBw6G+CpbvfsYvcjV+0g0zHNK99jzVnq3P6VnuHtZj9XALKfdrj4abtXMjvPGckS+tK2oFJj9R+MJP2jSAm91aOYHlN/+jTle278yshPnBZ2ThPzZS727WjGT4NK+iUqdIoyM2/kuxA3qmfWg8DT9ZefB60jUVl69uUR4+HXODCD4RkBEzaWvCdazLxhCkNUBKHrTNWwIJ3K0c+PngOBpa2pl73OgK1SYtg8qJw0r59Y6WNLWu/IU3dGvzD8u9jpsEtz4TTP7qeDF5OUW9dGYcfOLC+ctH4xMUw1QaFc/ut0YQggZfzzJDC/Va6pXU21SeqB7H1w/WVi+hvfT4Z5V64H6atDCeAnfFk5Xkle5a2rs1M/0p5Kl3Y5XjblsqAeO8j4YNAMyrcH8zWdmBawFHo81SeDj/1UbhmevN2jgamrWq+b3iBj1qB8BjCWZdxHtj+GzD/v1kjK0nfxvb25TC2E95YFV/+gvafQYafdJ4eCOnKFIAYSxxb8qbpyUuWACUMXT8P7t9VueA8LvioV6/vb4CPt5Xfm/2cNULTjG7uhRvtm7hzoXsS2kzg6Wo74LijnDofhZt6mwu8buyFmV8eXk5JBYeo0nZOWep8vAwKH20Inp9LWNO3Spqzufz7/q+GY+s7j5Z/n7AIZj4ZbZttVO4lkJv11cr1NEHSHz8fur5cvubgc7UPSIyjzUzpg65/D/OK1u9hluNtz8H1jh2NDvxJMDsbBcNNQ8g8/98987lKgPSrfQ4Qa++AWze7b2frRe3Abbu9j8iEEZ9U/z0mxKB73/+EQ1th/uZkb2N7/QyYuwa2/XNr+ljS8ud87cXacrfWAvKgEEKsEJItALG1LpEgoB24GuumXpi/FeZth47ZlZ/9aGXr4MOpgYXlAHhkB9z7Q7h2ZrA6nb4CZq+3n2T8MZzaVb/NpAmqdy2sBIU715chxG/fuLHX+n+AD5+D07vS2U/D8En7Vpd/H+942nvgiebyc+DPagfpjU5U92rroecrIWf6l4NDyMTF9U+E9wLSH20sr325a6e/9JwaPx/u/LvKMnt7aWvaYzvQtaYcBH/6WZi3rzkQKaV75xaY9Jvl906/DnseTUbfK+6o3Imq8z/6+95PP1e2bd8fuOepns4De75U/nvsnTB7d+1teRv5gXbgzt3lncY+/JPWxCYjgGtCDLpffgjGz4HuNcmcfjUK+Px34Edr4cNXkjs97BLWmo8jLm3UDULwACHJO6wwXQBiPEw/0J8KEMgzlIwArptnBeH3PA+/UITu9XBd1e40J3bDtpmwd20ybDkL7Phs+e+RHdY0sU/Zax281OnVwLyt5RGeQ1vgRwHXNiS1/Z4DXq+annHnevjs89aTNS9ptwO3PVOGj5O74c2l2eunftI/tadyOhP4O6PDTdVnjYA12nIxRDt/srQc9Jcg5O5t3s5OAKvdzHneOjvk1rXe2pGbLhVh92wrcG3vgNuehTs2es9LO9a0q7tertxO+LW5ladhxzm6dglrpOm8ox5HTyuDyM0rvdtXsnH6V6zRlBserISsHy8p77iThJFE51qUwv1w00pv9n3GAVYH/gSKfxc8Lx88XTkVa+ydcFfRW15K6U/qhXuKZfh4uw+O/v+j8Wn1QP3KjmchBt3nge88ALcth1uWJmv61UjgV3bBR1vhh6tbDxlu118E3sQ6aLDe6FUtgDBd6n/IQ9tIodpb+N1rgJ6mOqPRopwnKS9edesT1ivUQH+/dcjgBxuSZ+/J92DHfXD335XXJMz6MnQ9Bh9shIN/Bce2V9bpSOD6RTD5n8JNjsD8g+dg19Jw20yroaSkg1tgdx/ctq5cThMXwUQTDjwHh/7agq9qXT8Pbvw960l36f8OPAc/XhpuQJzkflov/f1r4VOOqVGHvx7Od360AWY4phKVTmAPy9ZLwKuzYe628lz9wv3wM6Y1OvLxd+D4egumDAd0jO+DCV8o7/YFVtA/9Ul4rwm/cw74XsF6Un3tnTD5Eev10XNw5G/guA1ghuOONn4xjP9Z64R45/SYEnxUbzscV5sppX3keSvf056Emx4r53H0NLjlq9br9OtQ3ArF/wWXjsGp7VbdjAbGzIexPw2Fz1VCR0mnX4fXZzeeehWHrU4NPmL515K9M79q2TC4HE7vqbx2NDD5K3Cj4yyaQ1+Ddx8NNn2rArJt316CmvYOmPFVmLoCDm+0AKdYtVNgYR4UfhkmLq2cBvZ2Hxzc4D9PQfLvdg8ZYT8wO+OjLup9fmwvfGsu/OJO6+93NjaXHk1ebwJXAQ/uglOD0N/bfHph56+kyzZ8nMV6vG/W6FvV75kuv5euNWp8n9t7Zgpi0SQAiPEw/eY36PcFIYKSZOjEbmux934HeLTFUaA+dWw7vFSA7q3lUZuRHTD9UevVSBdPwDurw93NK4lt5oMNcPK7MPvrlTuZ3fhIee1Lo3J6dzUMrvVua5L6aRSB16GnywBy6YS1OD0MHXiiDCDn9lujImG3r0vADxZY06+csDPlEevFsx7AYb/1pP9wCIvZzwE/nA0zn7EOR6zIi0cVX4I3FwQbhYqin14C9jwB+58YDiJgPV0feyfc9Pv+0h38A3j/y/63eq5la9gPSc7Zwf9nHG3i+get16UTcNrewXB05/C1Hvv+AAa/HF5efvIInH4NOldVAuC0f2+9vLSnPb1wem9rffuVs5fsoHcopNvpUQeEjJ0Jr62KL4iv1jjg53bBsYEyfLQSMtx0BviRXQeG/bPN5d5XD0KqgYKq9OqBSBRN7HF6jKfqzFhqQq1aA1IqwDWZPhcgK9O3zu63npT/aCV824CtcyrhA5J7VslZYPtC2NVXuUVvQ/D4CnynUB8+srSF7Mn34LtzrNEQP+X07ldga6E+fHi1M0t99RzlszU+3Bhe2s6zRvavjdbO956A7xr22SUeNxU49Tr8aBl8t9NaUxJWnV7COgjxZaNynYqXQPGH98GrCyxfkLT2UgKRbQV4/SFrcfwlnxs4XDoBH/wJ7DBgbxPw4cfmoDq6BQbuG25je4c10la4vxI+jr0A3zMq4eP0jpAevDwNPyxYIytey7z4kjXqsXuBO3yE0WbMAA9QriXc6UhH9sI374JbeuFnN1dOXw6SXpDpTZ0PwsNF+LAfXuxN7u5cx4A3qJzySJ2069VpvXbhtnDd7b2Eq+XP6M2v8yJuoyBGli2PIS/jZsDIScG/4+IhOLGnNcjbDnTMK+fjZEj5GDcTblgE4+6Cqzsrg+mTA3D0W5VTs6o13zGasuO++tcaNb67VB8ntwebqjQSGDe/nH6972+2nK63y2lMZ2Wwc3IAjjnKyWjQ9k7u8Gfr9Y7pDMd2pLev3tgHn3kWthnenrwbPtK941l4yWh+XYmf/ExcDNfeDdd2w8iCA4oG4dRO+HhT/elNXmwdA4y22/f57e72tQMT++Dau6z8VEDQAJx6rTxVrNX3giDpj7enWY2ZDmO7h39+egDO7YXi5uHTl8JSaboXwMWDjb/Hj53twA19MPmLMHZ2eRTi/H44vw+OfsM6u+O8S/qlKU+XDoVjfztQWARjfwo6qg5/PrMLTr8KxQ3l/Bg1/n+sw28VfUKScwrXiR31z7KoF9geo3JnqDCe7I8CFm6GyQth22/C4AvNpefl+lHA3evg1l7o/03Y+0Jz6YWdP+fn72OdcG40eJXiH+ffhsvf9X5vq+oTRo0+Eq5PeyCqEZAkAEgP8GIicpy0KVNZncIVFEqSoM/tg6uneQMQQbVsvet5eG1x+Gl/ZiO8sTRb9ar2q3KUrcMBoxpE3H4vzTw4TOPtW4ME3Z0PwsKvwce74If/xtqFKgoomL0cPrvGWmz+8kNwKgGQUUuXgLds6DOw1uLUgg1njOMGJdS5thZotNUBjvAh5IFsTsECjC802BGrVmNI8hacRJyfLCqp07dq6eppya3TtJ9ynCVbS/rx4mjK8b2lybM1L3WqcsxHOaahTqu/xwDGE84BetXvD74Af1mAD1+En/sWLNoKXQ/WT8vr9KZrgbtXw7IidH0BvvUL8M2H3E85b/X0qyLwKuVtdmlQN/WmR9WbguVWzxlRIp4f+B4F0ZOX5OYlarUSma+fD/NeLv/990Z0Oz6p/cpO2ZoOf2cobdkacl7qTbWiTvBcenh3zg6SoxotGAV8ajl8ZiVcVYDBzTD41/DhC+6HA1brhukwZRFM/1WYssBKY/cfwoffay5vYdtarUvAe8BHDB/RqB4FMRwxi9soSJApWfWmYbm9F1zZnYLlgJBngT4FAIKSxELJHc+Ud886uRu2zVEAq2BEdSpbs9V+VY6tt9MrgDj/Hqp67zjWmpWoA/kJM6HzEZj6gAUSp/bB6X3WlrnVa8Ku74arxpevOzYAe/8G9n7NO7iECRp+0hoC8wJcAEachvY3HIF+W9XPZteCtLmARFuN36OfhpULAOnCOrheTk5Q0rxGAVfPCG/xejvw+WL5zIs3V0a3Pa+CkXz3U/kk2apyzHffcDsZu9EakOr3i9TeiCHK0YIJ02HkRJj6S8OvO/UunHoHjn6vPnAkbZvd83D2Ihht5ddV36e85a7bKEgjAAHvIyFQf+1ICgGkPTE+5QsMml9nDbCq5Z09TEeks0ri10hg3i5rl6vtd5V38mpmpOQzG8vwcfFEsC1Q46pTtd/klaN8UmvyYqpOVY4pvkc2uwZgnB0kn48xiD+8F9gLB74XLRSEnV6tzy/CJ2etWVdtbWCaYJSuu57KNSBuaRoNfvf6/xlUsvYfMlmLSTG3C8qyZmer9JmN0DHbAob5r8HMFdb7QRe737Gu8mT0veui22tf7TdZecn7Itek2Kn2q3LMajlGnZ8OYCytPysjCel5/b7LYJ6AUyfh4mVqjkhdvr5BHhuBjxliexCANC/jVykCK+XkMh4ARK03llqntYMFIXc8DfdthatrXFsPSsYA9zwP0x8rv/fxNnh7VTp7u4IR2Zq1wEt1qnLMsh8wfH7mttvS1UCB8unagoza33cZOAknD8OpButnLo+LABKyutNpGgDEhpD1NNqWVwFANh16WLoIbJ8D7ztOTL5+AfysaYHItN7aMALW9K1JD8KcjfB5EyYtKn92Yjd8f2G2PICgWoGXbFWdqhyTnb7hEUzqAcsoG0Lacw4Zta6/DJyAkweheKoBHJR+jgCuS/B9PQVK5Owy82/pBnZmyjotEmyNpjwI3V8rr9+o1rFt1s8xXfXP+NjzDLyxPAUIr/ab6LzIJ6lOZavKMcyteEt/D3l4r/Q6DZz1GbQmYU1G2OkNWeBRPG2vJx9h3dPbSovNR4BhWL+3jQDT+VkbjDqEtXWSc9F4G8MXmad7K97s74JVA0KeBlbopihbm9ZIYOYamL7cHUTcdHALvLWivJDdiwQlar+yU7aq/aocm0nbDUDqwcgQw7fmrQUiQ1gzBc5QeZZVFiGjli4Cp+DjE/Y67xFl4KDNho4RZdAoQQdVYDLiIoz4Id52wfICII2gwyuAaBveJgHkbyjYbFnQkxc589A05UG4/uego3v4qMfZ/XBuEM7ug2P/CB9tCO+gQUGJ2q98knyS2q/K0U+wbTQAkGoYqTW9qNYoyJDj5zn7NZQxyKh1/VkYOgVHTzrgYkTl9rpU/V0CENPxO46fI3fZIBfFNrwCkJZCyBLgG3JyCgAyqbYc2ar2K1tlp+pU5RgseK730+1AQufftUDE+fdlrHM53EAkTZBRrQvAaSget3e0Ko1kGBZ8UAUaOKZdVYBJ2/D3zDYYdRDYQ7gHESbrHJC5xlMM5DLcM/+GbwBL5OQUAAhKBCVqv/JJslXtNzfl6GUalhuQ+BkFKf0cskHkAsO3mk8yZFR/PgScggunrfUdJTgw2hxwYYMGNUY5nNeV3ndOw2pz/F/7OawVy9WjH07QqAaGRsDhdhJ6CwDEeCq6XtRO8rUM6KE0FStII9WBTNmzM6tgMpQjKNFhe7I1zX5A7VflGFdeSlOxjKq0DJd0zTppOO8rQzUC2lFY6yYvOUBkKCAYxAktF4HTcPY0nD5r2WUYYLQ7fneMflSDBiMcYGEMhxLnyMmVawy4PBZGjLHLyq1u3SDC7W+3NmBkKyZIPIAY/4Si+TesAZ5O7I1LAUA2b4yCEgV1aYVqBbBqv6rT9Jej0cBXuIGI4SFtsyqodW4ve9mODkfY95/LdoB9mWBTtMIEDSdwnAPzHJw8Cxcu2abY0GE4RhVqwUfFlCkHjJRGOIzqdR9GGTpwfm4AE4APqb+onAag0UwbTGnck5psm3/Di1gjIektEQ2rq5VHLS12V/uVnapTZGumytFtQXq9qVlDVcG825a81etBSv93mdrTtYYoj4oMEd3idacu2a9P4NIncP4CfHKxfr05RyqoAoda0GEYlSMjplFeaH7lfaNy/Ufpf9qc07DA/+Lzen9T4+/41n/kfgpWScuwdsVK75MdPcHKpq1JUl5GS9R+82Gn/G/yyjEv7Tep5VhrpMOoAhVwn3Ll1SZn2qX/bXNEjs4F7NWQ4gcwnGmANbJhgnkRLg/B6U/Kn5mONNtGegCQqt9LwOCEh+q1IaYNCW3VcNLGsJGP0na9XAuMtgCp4ShIrfJu1KbqTb+Ktj0Wo0w8NQBi/BMG7alYq+RAFQAISgQlgpIc9NO8+1+1X5VjLZioByW1gMOskVfn9C3ntdWwMVT1f22O/x+iPE3LAHPIGjkw7f8xhyxoME0wSr/bP3F8ZtowU/rMcLzXNqL8fWa1LaZ7QG84AnfDsPJVApE2o8bIh+MzakzXGjaNy3AsZDeA8cAh6u9eFeTAQQLEZeG1x4Gom3W6Yoy/Zi/QlUgLNIVAdqZZ2oFL7Ve2qk5Vp8lM33QBDy8npVfvEOUEiFpb+JZGJUrX19vCt+r3KzBhA0UFaAyV4eLK52bV/5jD3wPr/6ByFKQmWGFDARZ0OGGkeiSkemqW4VgXUgs+zLbhIHIFFj4GfkT9Xa/c/q6+HoKffh5u2+s3nuKBqLpImqZglbQMeFFPsPQEKxN1miRpsbvar2xNp51qv9kvx1qLzmuNZlD1WXV+nLtftTkAovS3c2TjMpUjIUYNYGmrhBzDASPGCBsCSiMgRhksDNMO4B3g4Rz5MB0QZVZDV6Oicky9qh4JufJ5jSlZtcDDCSdtbmd9tAETgbftMgtyvocbSBg+21GK4pPUAYjxT+k3/5pN1DsbRAGAAoA0BwCCErVf+SQFsGq/2Wu/zaZdD0LAfT2I2/cb1J+SNaIKXC47fi+l7xwBcfxtlNJss8HCCSL2Z2abBRxtQzbf1BgBAceohyP/pktZGrX+dgEQqna3chsVMauuHwYfpfcnAgcbwEc9yKg39arR2o9o+uOgAGS4/J0NoidYCgCycGMUlCiok08SgKn95htKwoCQWms+qAEiVF1TWu9RazSkekTEARw4Rj1KIIJzxKMN2hyjIFD+223tR12XVTWy4AQP0/FZLeioBR51Rz6cf0+wASTIyeZedr1yaxtGZP1vnwCkuqz/KUXzr5s8G0RPsHSzEJRECyVZBRNBtfqpbBVUt7IcG53z4RVCqIKGoar0TdwXpztHRsxK6KhYW2L/n1ENHc5RjtL7jnRN5yiK42cJUIaqbjHVf1eARhWMDBsJqYYRyiBSEzzcgGQS8BbWlsH1Fpg3Cx8ZiSHSOgKC8U9Za/4PeoFu3Sxkp2xNEZgIStR+FcBqpFrtN7xydIMMt+15awBCxRqQ6u17qwGjpMs18mFW/V7j72EwApWL0ClfYzqgYxg/mVW3FaMqfjeqqqEKOJwQUv2566sekLTZEPJhSPCBB/iIFkoGBSDuWklpQboCAAUAqlNBiaBEPkm2qv3mqU7r7QpVb/TDCQhOCHGOYlADJoaonJJVAhHTBUYa7M5lOH+HiilXFfDhmHZlmB7K06gCD8rQ4QQO0w98uE2rco6UTAA+8ggYjeCjraXwIQCpJ+PX6Df/R50F6Qpg9QRLdSooSTqUqP3KJ6lO1X6Dpu22JsTPd1RPyXIbDSkFyENVoDLC8b9DtUGj5iiKy2nuRhWQVAOI53Jxmuwy+mB4ObfDDT7aGL7d7nV4G/WA5qZdZWA6VtpHQMAaBekhKQvSdbPQzSLNAaygRO1XPkl1KqhOF1Q32qLXC5CYVT7WCRnVoxgjHPDhduJ6vZEPt7+r81K9/qNeOdUrOy8/vR4MOKKqnKr/9yqsaVhHXOCi0c9kwcdAlIlnImwx/werieKEdB1sJVvT3JvycoiiDlBUP5WtslV12jiINxt8Vh3cV++ONdTgf6sXrtMARhrlC49/ey2jenDRCE7aHPebRiMlHwJv4G/UI3nwgfFUtN+ShREQgLVAL84T0tP4tENPsFpjq6aFpFsaKZFPkk+SrarT+jtf1UvLGdSaddIfQe0REbdF57V8dSMQwgOQBAU1vyMibVX3k0bTsko/JwFvNoCGhMMHEa//yAyAGL9G0fwfrAGeVQCrm4UCAEGJtgWWT1I/la25h2onHBgNPq/1XlsNf2rUSb/WyIZRJ29DNYDHyyiI6bH86h3W53YoYFuN+4VX8Ci9RtkQcjgk8IgfPmIBkMzcjo1fYz0Rz1er2/FrPRVIS/pJyUte7MybrUkDk+pXFqX2mw875X+TV45JtLVRMNtoy9m2GoGy2xkZbVWvEfarDeuR94gan7c7XiMc71dfV53miBrf5/YaUeN353eOcMlz9aveFrzO3yfXAJU2go16tGbBeTHqL8jKFKxSZytvy6snWHqClYUnWBopiQdKMvtoJmCdjgTGzfeX/rntcFY+SbbqnpqYvBhV6RkuvzdKv3pEpOQ3DWrvamVWfVb9Xc7tf/1Cl9+HRm0e3vezY5Xb2hFnmoYNIK9T+1yP5I56OLVLAOKnr/0z+s3/Tj/WrlgKYPMUACjYEZQISsLrS+Pmw70v+0vrna/A20/IJ8knCUqSZmu9E9Ld1n3UmrplVMGDE0RwgRE3CKm1A5cTStzsbvMBIW0NysPPFrlu17kBRTswBThUJz+N1nq09h47KADxr5XATt0sdLNQnWYAqgUlyapX9VPZmneflOY6rR4BAff1IabL9dX/W2tUpBaM1PtZ79DEWvny63ebOVm81khHI5govSbZAOIVPBp9ljEAydzt0/hnDADrA3fmrM0LvX0N3LMh+3bmqU6TbmcS8xMllORhTUme2ot8UnRpy/+23k6307er1300OoSvVnDuXCsB7utCaq2rqLXOwm0th99XvfUgXvLoxb5a62ImU38hu1u9JOMB3kDUX5DFERCANUCfnmDZ6lxqN6deuKgnWJoWkkFbkwYlmX/UU6eO9VRdPkm2psdOtxGRertXNerntUYphlwC7FqjIoaHvudHXkcaDB++ux6Ylf4eiftuWHj8/hbJeEqL0IMV3D9j0Pwr1g+DkDzfLDqXQkc3bJ3jDiFJDGA7ZsDIif7ycPEQnNirm6JsTTaUZBVMBNXqp7I1nXaaPkHEDWhqTb9qc/GLbk/9gxw+2KhMG5V1m4c0660VqXXtZCpPRU84eNjqj+NLsjoCArVGQfI+B7YwGxbu8gchrba1+1m4YYG//zm6DbYt1E1RtqYTTAQlar9pvs8IwNIL1YZLnmqt66ABwNTbAauRrxui/sLsIGoLUA5uoOHn90lYu2GlAzxKGozjSzI7McD45wziZS1InublOyFkTAQOOslrELJop84FyC6U6KwStd+k+IGk26r2Gw2IGHVgqdG5IY3OBqm+rlZkGvarnp1e16kYdX53e42i9pkgyX6otiuOL8n6zOQ1cqAuEPLzRRg3QzcLBQCqU0FJnUhDUK0AVj4pt3Xqts7B8HhNvUXsXoL9qF5BoaLNR/rVu2EZqQCPkgYEIM32Ha+jIHkMYEd2wAOvWWssknyzKEbYDxQA5MNO7cCVfimAla3ySa21NQwY8RPA+wUSP6MhjSAJmgOa6vQmp87jCkBC6pxrUtvxo06/BCFTFyX3ZnGhqAAgKwGARksEJQpg5ZPkk9LffhuBBj4D+zBGPerlsRGw1MuPMz3qXFPP1tJuWOnQYBw7YOUCQIxfrzEKkuaOH3b6IzvgvuehqzeZDjSpgY6CHdkqKKkqTzOZfTUvbVc+Sba2Iu1mRg+8AkOQqVluaftNq80FSKgBJ9TJQ3oApD+uL8ryLlhONT4XJM27XHjZ47uR7rEZbXBDdHnJmrQFp2xNM5TUknbgSpZvl0+ST0pTnTZauB4kf0YTcU2jvHndkcrPZ272pgdAdsX1Rbk4HqvmKEjWn7wESe+e9XDHmvArIE+LhfVUUramHUyGMm6j2m9+7JT/bX05Bl1nUS/w97vmo81DPurl2YstjcqxPTUQMiAACV9rUuGEWu3kbn8C7tkQ/fcoAFAAoDqVBCUKYOV/89d+m52SZfhMN0hatdJtVikAEOMpTcEKv1B/nUHzL+kHeiLp+G6NNqr0oxwO7lpq/fxBb7yVZLYgfR1sZem2AHz+41XJtFXTtyT59uTlRdOaVKdeAv1m8mHWSctIgJ0TE+/x+uP8stwAiK01kQBIFp1c11K4Zjq8vAAuZDiY0s3C0qefiA5AFADkB0yq15ZkdYxdAaxslU9Kjq2Gj3y18kFfaTesQ4n1bFvj/LI8TcHC+HX6GWKwpVtTxj4c3MQXTLgfenZZJ3lGnfekBRd5G1bPerlrW+DWAYm2Bc6+T9K0Jvkk1am39JM9DatfABKt1iTuxpjkYKQwuxJC0pB301AAoKBON0ZBiaBEtsonqU6TVacJnoYV5/qPXAKI8RusB5dDVgQl7hDyK0UozJBjSTIICEp0Y8wSlAyp/conqZ8KShJkZxj5Se5uWP1xf2EeR0DAz5a8ghJLpVPTvUKIbha6WWThZpFXKEkK6AhK1H7lk1SnWbM1maMgW+P+wrwCyLrM3BTj7JglCOmYKQcqW5NvZ96DnaxKUKL2m/cAVj4p3bYmcwRkkwAkBhm/wWDohZ1kKAkbQn7hXehcqidYChoVAAhKKr9PUCKfpABWPkl1Wj8vyZuGVTSeiu8AwlwDiK3oT9vL8rzmn95QPi8kT8F0nm4WWQuQVaf52sBAi93VT2WrfFJSbZ2QKA+yqRVfmlsAMX6DTcCgboxNQsitKxRM5xVKFABkBwQ0fUs+SQGsfJIALD4lawRkswAkJ9SXqRvj3KctEElax5cDVQCQtjpNkq1ZhhBBidZ/ySfJ1lbb2U6SFqP3C0Di17pE5y4tN8aupf4gxFcAG4IX0BMs3SwUAEjN+l4tdpdPkk/SPTVMJQNANhlPuRxNIQCJTvZi9IHU3xiTBCEjQ+78aXXQulkoANC0vHyAiaBEPkk+SQ/6gigZ07A2t+qL8z4CAkkfBUnTTbFrKXxulwUhaXxam2coyWq5a1qI+pKgRFCS1QBWPind7TcZ07A2CUByWPix3BTjVmG2BSGjEuxws+RAddq5AgAFAIKSrPokBbDySVmv09YCyECrpl8JQADjNygyxKbcLEKME0IK07Pp5PIUwOYJBhUACKoFJWq/8kmq0zhtbS2AtHQGULuiZcCaA7dk2M1CuNYkhOyE78yF4l5/nbPe3812/GEEGkK6VwMTe+GaGTC+G0aOL39W3AkXi3BmDxzeAGdjdKJR2Or2HUaL2lkYdt5wL4ycAIW73a8pvgoXj8DRV5JraztQmAc3/KL1d8dcGNXhsGHAaosnfgDFF+BcRP0sLe03KVAS1n3m+nlw/S/CyAJ0dJffv3gCTuy0fj/2LTi2I3t1mqT24taX8mKrkZJyTIqtpWlYh1ti1SYBSOu1CXg21ptFHjSqIxiEpMGpXA1MXwNdvXBNp/t1E+53/LEezuyDfRvg7VVwUQFASwKAq4HONTChB25Y4D/9o9vgw2/Ah2vLQNkqW0cDs9bB9T0W9NcNUKtsPbsfPtoE+56Bk+8l358ISoZr0oMw7Xdg0qL6aV75/Anrx6EtsOcPWwcjCmAFJbK1rPEtAZBNrZx+JQAptZdHKJrPsYnqUZCwbxZJCsbq6cw+6yma8+lpsxCy8zHYuzEdDaLejetq4DNVp8D70TWdcPsTMGs5/Gg1vL220ml1zIC56/2l2e8xiA6Sdj31bG18zfEB2LU8GTeLab1wy5caB+qNdMMC6zX7aQtG3vw31shInDfFG+bBbX8UDKCuQPQ0mPmY9Tq2DX78b+Hojnh9TRh99We2+vufEwPwxvJg3zduBtz5rL//ef8vYP+G5uwcqtGWb33SqsMgmrTIen28DXYurBwNA7jjGeiY48/G9zeEV6cKYGVnnmydCLwVe05btvuVAKR2ZSwJJaW0j5Sc2Q8/fAA+vzM8CCmdExIXhJgROKFZK+CO1eGUycgO6H4abvwCvLwALtjvF+6vGjUJUaMmhpt20OA37pvFDffC3X9Vf6SqmTJYsKM2iERh5xjg7q3NgUctXb8AfmY7fLQFfrg4nJtvXAHA9QuITSMn+f++Y/3hff/VwNyt4dl83QJYUIQfLYcPHAAx6SF/cHNsa7TlrgA2H3bmFcDGANcCp2LLUZEEbMCkCUTlBrIp0oVHaTrYauL9cHwvbClAcXd46f70Bpi+NP6O32ydjgJ+ZrN16nsY8OHUhPvh5wahMMP6e/xdee1/4fe9kcC8zbBwRzTwUQtEZq/zb6dXW6cthc8Xw4cPp6Ysgvt3wcjrk1mnUQc/SdaUB2FhMXzgGtkB3evhDrvttuN/ZMU0s+Ezktp+talK9ut0aqzf3vLpVwIQJ4wudSHCqBtskqHkE+Dbc8KHkLnrWmunH4c7CnhgF9y4OLr8XNMJD7xmQUhhrjpjGH2vYwb8UhGmLo43z7c8Zu0A1x6yrbPXwWc3WMFi1OqYDXd9LZ1BYxLzEka603rhni3R1v/0x6B7I3TMy5bP0A5csjUNdsa7G9aGJHRXAUiltiaiwSYJSi7YEBLm1KlPPQbzNiRvVKi6Tkfa8NHsmgEvGtlhQUiQKVJJ3srUNOK/WXT2wsLX4gnWa6kwGxbsan6Ca8m+z26w1mnEqTjLTtsCN4aP7vXxfNdNj8Dd39TDDAXqgpK47RyNNQ0reg0aT9EvAEmeNiX2xtXKQP0CsKM3XAiZvtSCkEa2tlKfiwk+ogr6hrXHFm4ZFNfNYsoiuHt96+AjbAjpXGpNvcqbkjwtJE5NeTA++GgFfApK0t+XNFUtPMUzDWtdUrqgAMQhYymDwGBqOkTcULKjF15fEy6E/PIuuCqBjeGutfHCRx4Vdt/omAH3PJcc+wqzYf7W4DeujunW6IeCumQGO1FrDND9NfkJBbACsLz4pHimYW0SgCRXm1LdIaIGktdXwyu94QZpnw8ZQpotz4nz4Nbl6glpulmMBO75RvKe3t6wAG5ZEczWz27Kd53mXXdtTddoRFZPdte0JtkZV/rRT8PaZDwV8kP2JqRteIdrK7CiJR2iWkk9ZGuPPRXr3pCezpYg5B/nWAvfw74Z+sXsu/4svLK6cAJO7LYCiahGVMwUtJmo+8bt65I7YnX76spDC73Y2tkbnj1Ht8GR/sr3JvTA1Z3WKyl1mtX2W8veRnZOfjDc3a5O7IZLRRg3J1qoycthvdoWOB92tsLWiUS5He+6JHUjAcjwRtKfi44fBoR8/F342dfC2Zq2MBsWFeHbd0FxT2OnENVNcfrS5gO/Iy/Bnj+HAxvL53uUdDUwaSnM+O1ozvvIy2nRZlWZzmpykfa+jXDgb+DIlsoT6jtmwMTF1ihG0K18R3bA7RvgVR8jh7c1OdXx7D748RNWG7xU4/Mfl+ybDrNWJ2edSVzt12xx32hk52f+S3PpXzxhHQy4fx2c3DP88xvmweR/Djf3Rj/KkmcoyVOwrhPsw0l7IvBeJJYkZvG5AMStjfdSNDfQD/TkruO73TTcbhbFPRYwhAUhozqstKohJM6b4qf+dfA0L5yA7/4SHK5zmvRZrMX8ezdaU73u+rPon9yX2kxxB3xnfu0288B2/+m+OL9BZzLhwuHo+8QdTYzEFXfDDx6GEy7t7cQeOLEW3lkLt6+xTrEPos6l8Gavt1GQzt7mzi3ZtxF29dYGj2H27bXA6M3eaA44TGMA0GrfPvnB4CecA7z/HLy+tH79H91hvd5aDjPWwKeeiNfWvEBJHttvVHnJi63XYK3/Ohd6rtckrWsIQGprawWApLkzRD2CUNwD3ypYO/6EEUiXIGRbg0A+CnVMD25DcTd8Z87wEY96OrwDvjUnvgMaLwBHQixTv2lF0T+uBroClt2Rl2D7gsoRj3p6cxWc2QP3rA/2fV1rrDQaaeoXgpfHq32wb4P/Mj8LbFsId29Ix65bZsxpx+nbO38n+P/u7LNGPrzqIvDWKvhoA9z3WmvXnAhKFKjLVksTgP2h5q5IghafZ717N6uBwA0waYusorxZlF4ngX8I8cDCUR3ws9thRsyB0IwVwf7vzD7/8OHU93rhwPPZ71VR9I8bA9ZZcTe8vMCqMz952bcBftAX7DuneZiCNZLghye++0wlfAQp81d7rTUjSfQ5SWi7UasdmLwo2P++sdIffDh1cg+8fFfyyj3JB/WmwT8mOTbRYnd3hb8d7/oknHwuAPGm/tR0tqToExtCPggxkL53A9z8cHw23PRQsP975dfhfJPf/b2HrClcaXe4cee9a1mw7315zvCRD6952bcBPgzQzq/phHEz6qc9IWDwWdwNu5YHL3Nnfl5daK0hyEIA4Ja/pGpKQLg9tg3eW9tcuZ/cA289mXyfISjJZmwiKClrLGHPT1qXxOYtAKkho5ciJgPazz4AhPQ/VN4lKwzFtbPRWILNu9+7EQ7taP7GeAHY+Vi62lerbxYjA7aPN5/0thajXl4GAsLqxMX10+64O1i6u/5leOV+huEjKVnzd3HmxU/6Ez4X7Dt+uDCccn9rFZzdH62NcUGJtgXOR7CeVTsnhJb6+iRtvSsA8aYBdfyAedneGy6ExKGr5wX7v5+s9n9jdNOBjcmt0yTeLIKOFuxd1XxezhBsFGTCAw0Apcd/mmf2wdFXwq3Li8X0B1LN5qUVwU6QbZEPbvG3YLVRXg5uys5dXFCi2CStdoYHIIk9zVYA4q6tqbpxJa3jb++1Tk5Piyb9QrDA7/je8G6KF1pYp2m8WRQCjBYUd3sf/Wikwy/6/59RhfDL+KPN2Q6k8hTsBDn748Ovh5uXOOBTUJIfqM5iP43D1gmEMQ2rP2lb7zqlXbDcNdB0o61W3na5eM9+oj9vQzZbyOGt4aU1lKOeFVb7DRLMf7gpPDuKAUYdGm1z2zEnQDv8duvPtahVt1nd7SZpOrpeZRCF/9UOXNmNTdJi63jgSFMprElyU9QIiIuMviYBJAmUnoSnEe9uhH+YH3yBdVyaFGDu9em9+e4krW6/hbn+v+fC8fD6x5FXwrc1yDaoF48k3w9EOS0kTnXcG13aNwScBnoOKSoo0WL37MYmaZiq1tw0rESPfghAPFRg6jt+EnRwB/zDXfFCSJ5GFFppa9puXMe/l+wbYxpvus3mJU0bcASdQhdX/SYpiBWUCErkk5pLuzkASfzUEwFIfQ1kktJboY/3WBByfHd835mnm0WSbI3LmavvZcfOtJT7yEJ0dpoZK8e89CVBSTYfTiQBStqxpmH516DxFOsFIOnubPty68yjSP/jPdZZIXFCiKAk+1DiR9fcmr1AyoyojvIW7HhRR3d0duYBBPIMJdqBS+03SNo3BEptTRqajgCkvgZy7cyjSL90YGErIaTWzSKIxs9NX4vOEpScCbAG55rp4eU96Jz9ujbt8/8/E38pH0FdEqAkyCYBUWvczHBtNTNUp/K/ik3S7pMm+v6vVIx+CECCAEjqOoORvM72CfDCHNiToCmKQRaUj5+TjVaepJugn/YVBEAmfi68vhpkNOXIS/U/D3II3NQlyfBJWQwcneU3bnqwTQI8w+eOYP9XuD9cW/MQwApKklGnWuzeWFcBo339x5q0NAkBSB0ZyygCxUR2tiw87Xi5LzoI8ZuXQE/TO2HiPHWUVt24Tu/xn9aE+2FUSO33pi/4//6Lx5v7vGYAOhuuTohPyrK/61wRbfpBd7Oatkz3GUGJ6jXLUOJ9MXp/WkY/BCDeGs2AnGiEdr7cB6+uaH1eggSzALP/Y3g3i7TBTKtvjMdfCvZ/t65uvs2MAqYu9v/dh1+sDwLHA7qbuZvD7R+NTmxPu78LkpepDwX/Lq86G2AK3g0Lhk8HbCrY6YnWxjgeTghKBCVZghLv07DWpKmaBSCNNZCr+Yy18hS1nT9eZ52cHuoX+czL6XcCQsP9cPOD4dws7v4z3Rj9qLg32NbOs1YMHwXx235vXxssz4efr5/+4W8FS3fqYpi6KJxynbXCGilKY3DhNWD3G8B2LoWrO6P3p0EABODOPwun3Kc8GOw09rQGdoISQUka2u44vBwbnvhzPwQg/nWiJU9e8rbzw7sbof/B1h1YeHBH8P+d9zUYP6O5m8Wdq62pNHm8MRamw2dWw+e3wU9vgOlLvQPCkQCn0Y/qgJ9qYsSgMB1uXe7//87sg2KDkbYjTbTDn3oOOmY0V29dvdD9dDxtZCTQ2Qv3bICFW+G2NTBuRjz+7mqPfsm0b/yffjIef3okYPxQmA2f3dhcXtqBu76WXRAQlAhKmk27lW2m0PCKNWmrPgFIYw2I0mPKy/7/Cf9rbusg5PC2YP83qgN+7jVvEFLrZjF9Kdy5Kvs9qfqmOBILOn5xD3xmlfXUffpSC0IeLMKNDzZO84O/DZaXGxfDT23w334L0+GBncG+88Dz3q778Plg6Y/sgAdegwkBT+vu6oV71jfvF7yosxd+uWh9X+dSa1Ti9ifg596D+ZutthFlADDBx4jrnA3Weq84/OmRbwZPY9ojwSCkBIM/syvaRfaCkmRBiXbgSlebqb8OZFPaRj8EIN5UTB2lp7njf7y3dRCy/+vB/7cEITc/6P1/rgLuXgfzNuSvV40FfnHQfarPqA64f4sFJPW0d2PwtlKCnVEe2++EeRZ8jAoYpL39mLf+8UET7XBkB/TsgO51VlDpRVcDPduahw+vfuD2NdZ3uQW7UxfDwl3u+Q/D393m8WHh7WssQIpLR1+Bi034vmmPwL2bvdc9WOtHPrevtSOwgpLkgImgJJltpv6BhCvTWC0CkAYyvhgRVab5tOhm7WyUr4/3wjcKwc8KCWr3nnXN2TqqAxZugZ/fBjOWuufjWuC2FfBLg/Dpx/LZsRbs8vZU+ac3WIF/3cB+bfB8TF8KvzDoPu3LBDqmW6Mln9seHD4GN8IZj/1jcEPzAD7rMfiVojW9aeoia2qW6QCOCffCHWvg53bBr5jRrvlw2jllkTXS0UiF2XDf1ujyc00n3F0H/EcC8zbDbU/E3zf2NflAYspi+IUizF4HY+pdt8gaMbl/O1w9Lbw6FpQIStIKJUluv1dhPbgbrrXGUwymsQrakZLVIYYRUE5t/QT4X3Pg53fB+NnNp++lHD/B2hZ4RpML4ifeb73mb4DDVTs1XT0NxoY8nWMoZY8VZiz197T1zv8I317g/vjk7dUwvS/4NJlrOi3QYQMUd1c+ge6YHRw6nHqj11/bfWct3NHktLyRHdC11HolRd1/7P3aGxZYoHTklWjy0rkUblgI+zdA8VW4cAQK90JhrrXjVZjTkfz49neXwy2PNV/3Mx+zXmf3DV/cfsOC6Oo4yvtYku6Rebpf14KQrD6+TnL7LQCnK94pksK1HwIQf41mAINuObmYbT1vQ8jd62FmbzzluLuveQCphhHdLCp106/6L8OrbECsZed54Ie/Dwu2NJ+3KKahvLGm9uhHPb292t6tqyM7/btjhn9InPrrcPiV+j7v4ongsHBNZ2tGOer5pLPAvo3hTf26urO5HbwEJc3lJav3bEFJ/GlPAD6oeGed8VQIywRaJE3B8qZi7oaDk2LreeC7ffDehnjK8RSwe032WnCShtVHjQ8ABg2mYX3wgrUeJHGeYze8sdp/X7oAfP83s9UGR00MUO9zG/u8I1uzU0Yl23b1NrcWJE225mEHI+3ApfYbRtoFnMMGg8ZTrE5zEQpAvGkw8U7FjNjpttrW7/bBrifjKceB1cHXn6T1ZpEF7ei1Av6k6MIJ+M6c4H3pwAvW2hGpvk868PX4vjOu9nURePWR/NZpHs7cEpSo/QZJu3DlnWVpLy4BiDfta6oBmupsoWhgFbzc6z1vzah/Tvw7cQX9PjMHPfCTQ96u+8c5yYCQCyfgO3OtkYxm+tJrCYMqrzaEFogfb3zNgQ3xjRbs+pfWeS5x6MMt8O4z8ddj0kZeBCX5gBLtwOVNFoD0p3HbXQGIHEu67Xx3oz8ICZqXU8S7HfCFE/AP3floX+/7fGLt5QC/K6BiQ0j14v84dWafBR/Fvc33pQtYoyhxQ0izQXat9ngkwBazXkY3LgLvrIu+TN580rLh3L746mHXcms9SFzavxHeXUfipYOA8wMmipMqZZ0HsiwLxSAA8dZYBjL/5KVW3pJq57sb4YUZweDAz42rdCZJ1NOxSvDx8WC62lfQm8Xetf7q7nWfi4Q/wdo16/UWrOU58Dz8fVfz8FHRPmKEkDP74DvzYXB9ND7l7XX+8jLoce3Xj1ZFWz77NsKb9q5kxweC9cOgerUXfhzD9NP9G63vCsPXZDFYF5QISpIA1VcBPdkwWQDiTUU9eSFZiwSPhXxgoVtePt5r7cT144imQhzaBpsK4cNHkqHkArDtl7zV3d6NsCfgE+DXV8PfzYxnNOTCCXilF156yPu0K78Q8q05/gJ4v/rRGvhfXXBkR4TfscrbSe8XT8DLn/OX9stzopk+tG8j/MARmF8sxt/33lwFW+dFM/3r4gl4tS84fOg+JigRlMQNJplAEAGInFxtXduivPhJ/9heeKEQ3QhF6fvPA99fDn8/zwKGsALWV1fA3y+00m/1jSvum8XhHfDtu+B0nYDq9TXWwvKmHh3ssUZDvj0/GhC5cMLaZndLwQKlqG+Mr62Ab82AIyHaMrgRXjCs3bouxNCQvvsQvFMH6Iu74cW7rLrz42fOYv9fiP5gYCV8v7cyH4e/2Rp/d/QV+McuazQkLNA6ug2+XbAOP4z63iIoSUrwKihJvx7KghE6B8RjGBPa/TjuvaNPvxcsaB41HdjbejsbpX8K+Ps58AsBDyz0o4OvwLcWwvXTYeYKuPkh/4cKnt4HP3ka3ls3/FwLk/p1FeVe8oe3Eetm9UPAx3tgUxfMXAqTPg9jp1ufvf91OLC2+sClJu3bYYFIYQbMXA6Tepo78+PA8/D+33obnQl7v/ziXvjHBTBxHkz/XbjxIf/nhZzZB3vXw+Dq2meUnN7jH3JO7/F+AOjO5fDWcpi+BiY+YOdpLxz4GziwJbifObHH2kCie0NzBzAeeQl29lnpDYPOw/XLxqjK6Jk94fm7i1ijIe+sgqm9MPULMHWxf/v2bYTBP7WgZljb2GOBiR+dfS/a+1irHsREeb/Oqq1Jg5IwfW9y1JMFI7J6pF34/fXPI3xuYOSohqPKzyjg/s1w82IriP/WwnjsuX46jL8fxs6EyS4+4fReOL4TDj5vTenKWr1GmZcobxZjgcKDMP5uC36ume5+7fGddj1+z4KZpNk6cR5M/AUYP9f9nJVD37GCy0MbrdGCrPqkUvoT7oWu3/MOIhdPwIHN8Paa2uCRVFtHAh33wsRfgqu74JouF6jqt058P7LFAhndx5LdfhUhxqv0gclcYxEDAhABiJxcUvJy/3ormPzmQt24BCW6Kar9Wg8nJiyCwt1WcF4CzYvHoTgAF47D4efDgw75AUGJbJX/jV4rjUWsFYAIQOTkkpSXab8C+/+nnHnebM0LmAhK1DdkazoiGrVf+d/otMlYxMNpLkqtAfFMIAnobK1ca5EmW+vBRxrsDDM/eZljDVme75tcO9Psk+QHstdm8rTWIk++Xf63lnrEcvnRQEVny8suF9oWOB+2ZtHO0s0iDzujJMnONPukpO0YJD8gW2Wn/G9tFcwtdKe52DQC4l1F308AsvpEIk9PXkzVaSLsDDM/eR4paaWtaW2/8u3y7arTbPaluP1v+L63B9K7EF0jIHl6CqAnL7K12bSzamue9pBP+miJ/IB8e6t8kny74qR0+d6FaS4OjYBk7WlHkvKiOdbZbF95sTUvIyVJszXNPklrLdRm5Nuzl5e4fa93/9udZtM1ApKUJwZ68pIPW7NoZ55s1UiJfJL6hmxVnWbT1vT53y5zC10CEIGJnJxslZ2CEi12V/tV35Bv11Q1QUk8/ncovbthaQpWVB2iWhoOlq1ptVPtN/jNolraFlg+SX5AU9V0H0u3H0iW5ghAJHV83bh041KdCkrSACVpab9JC6TkB2Sr7EyaegQg2VdRAaycnG5cqqvSnaoAADWSSURBVNPQ86NtgdV+5dvl2+Xbs+fb41F3Wm8JWgPiXbti6xCajys7Zau3tLXYPRtgom2B5QeyYqfuY/LtcWd3czpHQTQC4qdB6slLum3VVDW13zTbqm2B5ZPUN1rjT3UfU/tN9hSubqA/bW5eIyBZehqhJy/JK8ek25rVvqSRkmxCibYFVt+QrapTjZRUK5UHEmoERE9e9DQiz7aqTrNna9LWWkQNJUmxUztwqRxVp62JkzRS0i0AkeTkdONSnerGlcy8aAcu+ST5Afl2cmxrdqGkK42uWlOw4m6EGg5uvZ0a+k5eOar9tiYvOkBRPkl+QH5AdZp6O9O4EF0AEqSxqOPrxqU6VfvNagCbZyjRDlyNNQq4Yw38/C54uAg/sxlumBdv/5hwL9y3GZYU4ed2WfkZGWM5tgO3rYHP74LFRZi3GW64N972Mm4G3LsZFhXhc7us/LTH3GZuWwMP7IKHTbh/K0xZJN/eOt/enTYXnN2zIcNuF3/Gs0Bfy0rTyFGryYutqlPZmmZb8/T4qi0nddoo7VFAzy4ozB7+2cuL4cCW6PM+dRHc9/zw94u74R/mxFOOP+tSBj/og30bovcBN9wLC3fULoNtc+BiDG1mwVa4YcHw93/YC/s3yrfHb+t64yGWya1mU12i9JjyoqfqybBT7Ve21pN24MqfT+paUTvwBuj+43jy7vY9hdnQ1Rt9OXb21imDdfH407v/yr0MOldE32Y6l9aGD4DZz5RHo+Tb47S1i5RJAKIAVgFs0utUAKYbl6BEUJKEfnrjF9yvu6YTCjOizXvHDOt73FQvf2Hlpd53jOywpodFWU9X06AMHo6+zVw9s34ZjLtXvj1+9QhAJAWwCmAVwAqqVaf1AnUtdk+/T6r5nUa0eR81sf7/jRwffTlmoZ7k2zNpq7kpXaMgApC0Q0k7cB0wEZjueF1nv0bLyQlKVKeyNYF5EZSkr04/+Lr7ZxdOQPG9aPvG4Vfg4gn3aw58PfoyPPyi+2cXT8CRV6Ktp7PAmX3u/3ukP/o2c2ZP/f8pvhI8bd3HmpEARIq4wY4FZgHzgQVYex98pgpAuu3XPOAB4B7gNmCy/f8KYPXkJWt1qvYrKBGURNuXBtdaC51raedj8bSZnctdgt7dVv6i7h/1ymBgeTx+YNej7gD0zqro28y+De5l8OMn4ZJ8XovS7hGA5AEGWqFrgbnATwE3Ux7dqJdnHNAyCfg0cDdwr/37ZCq37lMAKyeX5gBWdZo9qNa2wMmp1wvAd+bA4MbKwP+7iyrfi7L9Dm6wdtxyBsCDG6F/jpW/qPvHRazvGtxYHo05s8/K0+CGePrqh1tge1UZ7NsI/1AYvgNWVNo2x/pOZxnsWglvrpJvb13aHWlyedqG12ub+FNebEiXUZbmDKyRDT+NuN7f1Z8VgWPAUeB8ylqOtlWVnbJVtmpbYPkk9Y10RHq6j0WVfr+xhAfS4sbakcIl1yga4e3AlCbyYHq4tmC/ZgCngQ9tGLnk43uMBJW7kaL0k5KXpNuZJ1vVfv1rKEdQkiRb0+yT8uzbdR/Lom/vSpMbE4AkvRE2Ax9mwGvHArfar6PAx8BBBbC6cenGJSgRlAhKMu6T5Afk29Nbp6kCEK0BadbpNZNeo3l+M1oAH9W6HmvB+zwbSAoh2Km5m+m2E9VpYuxU+w0WqGuxu3yS+oZ8ewZ9u/kNutPinjQC4l3dsT55uQ5vaz6CTrnye2071la/E4FPgEPAYbytF9GTlzw8eVGdIltT3X7zMlqSl5GSvPcN+YHklWM8thYEINlTIdYOcXuAxmnGdO1VwDT7VQSOYC1gv9SSzqagTjcu3bjUfgUlWYaStLRf+QGBbOtt7Qb6BSB5VjMNdhr+ttiNEz6qP+uwX102hBzHWjciJ6cbl25cguosBrB5hpKkgYkWu8sPqE6r81JIi4sRgCSxQ0zzmYaZgGtHUJ6iVYKRw8AZOTnZKjtVpxm3VYvd5ZPkB/RwIhm2puYsEAFI0qDkRtxHP5IKH7WmaE3FWkB/xgaRj7HWjiiAla26can9CkoEJYJq+Xbdx6JQtwBECqYbPDbiVk258nvtNViL6btsGDlSBSMKYHXj0o1LUCIoEZSo/coP6OFariQA8dJW/guFKw0m6kZyXYbgoxaMXAN0AmdrwIgCWN24ZKugWlCSXTARlKhvyNao0y4IQLKl7lga4LVVNZKWKVd+ri39fbUNIp02gHyMtaPWCTk53bhkq6Ba7Vc7cMkn6eGEfHuAcuwWgORJYXW2qz0E7l6+P6nXuv3/KGCy/QJrJ61TNoycVQCrG5duXLJVdgpK5JP0cEJ+IHG2CkBSBCb1GsnYjMKH3/8t2K+bgcvASRtESj8vK4DVjStjdXr/BnipV1AiqBaU+LEzaWCiHbjkB5JUpwIQyXMjNH0E72mbchUUckYA420gmWq/94kNIufsn5ewRkzk5HTjSmud3rLUAhDVqaBaUJJeWwUlKsc0+yQBSEqgIeoOkeUpV81eO8p+Farev0R5ytY5hp/Mft5+7+omblAX7JebTgtKdOPKqE9S+xWUCEryBdV6OJFKW82/pdv4VQYEINlQd6wdIm9TrsK6dgTWQn4oT2drdblcrAKWc/b7lynv/nUO9+kFCmB14xKACUoEJYIS+QH5Ae95KaShSwpAvKkQS4M10ZSrrF070n6VdE2day/aryEbTkp/xwkounHJ1izZqfYbTqCeVTARlKhvyFYBSKbVbCPJ+5SrvFzrhJVralxbWu9SgpK4wEQ3LtmaJBBQ+21NXrQDl6BaDyfSa6sARKrbSM6nFD406hHPtWNqXHvRbjcXsU6aP6egLrU3LjOBtgrAZKegJHl2prX96uGEJABJqM42aLyacqVrqz9rp7zepWD//MSGktJOYVmdvqUbl6BEdZq8vqRtgdV+5QcEJQKQ0BrNnFgayamUBcKaRpXMa6+yXx32++dsKDlNeeG7AljduJIawGqqWvZs1WJ3+ST5AUGJACSQCrE0ktL8/nbBh64N8dox9qtgt6/SoY4XMujMdeNqnTQqJFsFJYISPZzI3sMJAUgCFUUjOQ5MSHBwq6lR6b62HRhnv0owUqR8ZoqeqrfO1izeuAQlslVQkm8okR+IPX3jn9AvABGY+G+Ep2wAEXzo2qiurQUjF7BGRU673BgVwPrXz22GUQXv1//yVm/XXSjCtx/STTqtoJkFW68Cxs+z2+Mh+HhPvFACcN0MGDXJ+r24I/4R3VFAwS6Diwfh+N74oaQwHUZNjqYMvLavCY4yKO6VH0gClKREApCkNcIjwPQEBrea7pSNa806N9PrgfE2BJ+k8iR5BbD+tXMljJzoET52wGv/Jls3xiTXqdpvcM1cCnc/A6M6yu998Dxsf6hyjVlUebkKWLgNJt7vgPIT8MPHYO/GeOrwpgfh3q9VlsHhl2DbgvBBaMilDO7dDDcuriyDnRGXgVkFP5/bWVkGR16C7zZRBno4kStpUzAvbeWZquZiRFwjC2m8DkSjHro2aog8gzUl8FJKPYqRorR/y4T/28iHrUnOi9pvfV3XBb/i8pT7J8/AD5ZHn5f5G2DG0tqfbTbKm7mUFPa0prHALxYrA28niG17KPq28dl18KnHan/2j/PhyI5ov//qOmVw5CX4xwXp9kkp9wPGP01HbJ/V2ZXR02v1K8y0jwg+dG2I15o+2oHz2muAm7CmBLYnoG8krZ/m2dYs2onqtKFuW+3+2acfi74vXYU7fAB8at3w94ZqvJrR9NW1A2+AmxaXt0WPUp+qU9Yzfjc8W9100wr3MphwvzU6kmaflG4/0J+WUFoAksQGeyTkQDLItWYDO3VtOq4NA3KuAW7Emp7V1uK+oRuXoCRuGBRUlzV2ev00Jt8bbX5Kay7cdN1cb2k3AyWTPlf/86vnRdsGxjeog2umRwtg0HhtW2ldSpZ8Up7uYwKQHEPJYawdisIOJL1cGyfk6Np0QeQ4YAq1T2SXM5etSbspCkrCT/9Ug0XGx1+J1tYzDaYWnW5iIbjXQP34zvrpnI14+lOjxe4Xj0cLYF504WB6oDp7fmBQAJIVhljncgZI1A220TSsKIJOTWHKxrVRQs4IrClZE7Dmpuqpejjp5ylQF4Cl1873/sz9s0Pboj/o9BTWYu96+Quz3GsF6u//lfv1h1+ydhKMWh88X6cM/mu0AAawZ7X7Z8Xd/nbDytpDodb7gX0CkOyouyUN9kM05UrXJhcix2BNy7paAawCWNmaG6g++ArsXjP8/eO7oX9hPLb2L7C+r1rbe+HgjujL/eAO2NE7/P3T+2DHgnjq8pWHrEC/Wm89Ax+8EC2AgXV+1PdqlMGZffDKEvmk1vqBwbQE19oFq1G7WUcP8GJLSvQ+YHTEgaRGEbJzbau2/T0NfJwAb5PmnUt+24Q/N7JvZ57qNMu2XjcdptkB6Ok98O7G+O2cuRTGzrB+37N6+O5XUeflWmDG6nIZfLBx+AhQ1I94ZyyFa+wyeH8jFPfE207GYi9IL1hl8OHG+M9jibsvJT/tB4xfS8dCdAFI2AASZilPA2ZFGEgqmM/GtUnI00XgEP7nEiuo8w8gafDk2hZYtsrO2srTvJM2td+40zd+LT1xvQ4ijIViAjaoD7EOJWxHBwvq2mQDUTswCTjK8A0U/PaNMB26DtvLh615OuVYdRq/nWHmx+9p52lWkmxNc/v1nv5gmpqHAKSxulrWGS5hLUafHGIgqVGE7FybNCBqByZSexc3BTuN82IqgFUAqzrNJVQLSuSTwklfACIACbFB7akCEE250rVJhA/njSQsCMlTAPuNma2+cSmAVbCT5sBLUCIokU8y2SoAyZLMFju5c8BHDB8FyUrAqmuzB5FGhBCS1aDu6J5W37gUwApKVKeCEkFJutvvgAAkDzASp5PbUwdA8jzlSvCR3GsN4Ab8rwlJY1CnAFYBgOo0eX0pz1CSVTARlDRSvwBEUBKuzmONgkzJcMCqa7MHT23AdVgjIUMKYBXAqk4F1Wq/seUlL6MlSYeS+NrvgPHPKApAsqU5iXAsex0AoilX+bk27fDUjjUSclgBrIK6zAcAar9qv4KSpEJJ0sAk/Pbbn7ZqEoA0ViERDfA81gZrnQrQBR8pu3YUMA44qQBWT9UVwApKVKeJ6ktaV5KV9rs1bdUhAEmTk9sP3OioNU1hyu61WQGtksZhnRL8iQJYBbCqU0G1oDrRtgpK0lin/QIQQUl0aV/CGgW5RQF6Zq/Nkq3VGk/lehAFO7JTAazar9qvoERQ0mydbjL+ebrWfwhA0ujM92OdOD3Ww41N053SdW2W4WPIduBjgRMKADJppwJY2So7BSWCklbU6eY0FqkApLF6Etfx3wHmolGELF2btSlXbo57LHAauKwANhUgoABWAaygWnXabKCeVTBJDpT0C0CkeDp+kfqHEyrwT8+1WR/1qKXrgCMKdhTAyk7ZKqjOTfvVtsBRaZPx6wwKQKT4HO67WNubtjdIR9OdknttHuEDrF2xrqK5BekKAGRrWu1U+5WtslNQEp6tm9NaLAIQLx0wiZ3/EvAWcEcOgltNuUrutX7ho6RxuI+CKABQABuHnQpgBSWq0+T1Ja0r8aMisEkAknUISWLnPwxMxBoJUeCvKVdxXxsEPEoaiTUSckEBrIIdBbAKYNV+5ZMEJQFs3WT8evp2v8p6FcbT2apfrdBPsEZDGjkl00dwqWujuVbwUZnu2Az006T4gajzkhc7816nar9qv2nJy1CNV1blbuuaNJulEZB6feerdCf+ycslG0LuyFBwqylXyb02LPgAGA2MwH1HrChvilH2Uz1VT4adebJV7Vd2yta8jZT0G7+RzsXnAhBvKqSi4x8FDlJ7VyxBQmuvTUKekggfJY2FigFkBbDZC+oUwCqAVZ3KJyUJSrIBJmvSboAAxE+nSHLHf8/GpdERB6G61vu1mnLVON2rFMAqgFWdKoAVVKv9xpyXdI+W9Bu/kc6zPwQgWez4l4AfAZ9FoxNJuFZTrrzlYYQNzed1YxSUqE5lq9qv6lRQ4kGpH/0QgDTWQOI6fr30T2ONhMwQJAg+UgAfJXkBEAUAybVTwU7yylHtV1Ain5RVKMnE6Edy2S4hMv51wO3NWrnLxQfAMQ8BoHauimaXK69Bd9KvreWEh3y2T695GB1T32jFjVE7GKlOZWv67FT7lU/ycj9szQ5cmRj9AI2AZPPJy0+Au1wCO63hiOZarfcIngcDay3I+Yj6h57AZs9W1WnrbB0FfGY1THnAeu/0IPxoDRzbE76dbrZePx2618JVBevvj/ph56p46/X25dD5Bev3C0X40R/BwR3x1en10+G2VTB2uvX3wX748Sr4JMb2dctSmPlb5TL48R/CwVfy2VfjGSnZlJXRj1Y2g/Rww39uAcOHUStjgdlViKlpVNFcqylXzefhNHCyxR4rSd7QSHn6SclL0u5wWbD14V1w3ezh7//dPPjolejz0vkgfH7L8PeP74ZNc+Ipg1/eCpMWDH//Ow/C/v8ZfZ1ePx1+fieM6hheBn8/xz+EBMnLfethZu/w67b3wrsb5ZPcFBxKisDctG+9Gy2fSeFQerNDh6X1IKCpUVFdqylX4eVhTIx9oxVph5EXTQtJXjkm3dawdesjteEDYMFfxZOXn/6T2u+Pnw2zlkZfh7OW1oYPgJ/5b/HUac+Lw+GjVAYzl0ffdifdWxs+AO5+ZvjuhvJJw++t/qdwrcsSfAhAgjTENHWIQ8ABD0Fhvfd1rXsgjY+gO8nX1nKQftplGHlow9oRSwGsACyOvKhOAwbfv+3+2dhOGBdxX7phuvU9bpr2q9HX6eTPu382qgOmzIu2TkfSoAy+EH2bnfxL9cugcK/6aRhgUtaA8Ruszlp4LQBprIFUd4j3gBNV13sNFnVttkd5ooKPoPkdpQBWUKI6TXWdjpoRbX5GTm7w/YXoba3+jrjL/Sof30WC2rD6aTNQsiyLwbUApLGKqe8QP8KakuU1kNR6j+yDlpuj89PGws7vqBb0DQWw2bNTwU505fjRi+5pXDgBR/dEa+tHO6zvcdO+r0dfjge/U78MPt4RbZ2eon4ZfDwQfZs5/V79z4+/Ip8UXn7WGI94OBJCACIlskNcAt6yfzYKDrXeI/ugVQs+/LTrqPI7KiH9VAFs8spRAJYMqH5jtXvw+71H47HVbber0/vgnXXRl+O766zF3rX05rrmF4B76Uvff8wdgHYuj77NvLvRvQx+/Iz3MpBPaqQB45HsTb0SgHjXQIsbYDg6A+x2QIimXHm/VlOu4snvCNsjJXH6gAJY2So7rcByUwH2PV9+79Q+2LYU3n4uHvveWAffW2EBR0n7n4dvdoW7+5NbAPsJ8M051nc64ef7K8LfCtgtP+9stHbccpbBoW3wrblwIaY28/dz4L0NlfCz60n4/nL5pHDyUgQeznJwrW14G7WP/8RqYFWsJRdl2pOBW3wErHmfcpUVW6MAjyjyWwTOpchraVtg2ZrmO67ar2yVnUm19WFjKZuyHF/rIMLGKnoOyqI8ZCus9A/aP29p8F3a5Urw0Yr8tgfMkw7bi9/OPNlqpKQc1X5bkxf5JPmkcLUm6/AhAPGmgcw5uYPA1cCUjATYOlgwXviI0raRCgAUwCqAVZ0qgJVPym37XW8sze66DwGIPxUzeePaY9f+BMFHJm2NAjzisG1kAvqGAlgFsKpTBbBqv7I1/rQHgJV5Ca61BsRL+/pPMS1TinvupgnMAiahKVeCj+TYdrDGe5rXLFvTfGdT+5WtslN12hg+HjCWNvnQO0XSCIg3DQJdmaN0E3jb/n1iRoNxTblqHj7itm0kw3dy0bSQfNiqp+qqU9kqn5Q/nzSYN/gQgCQNQOLqEGbVz/eAa+yX4EPwkQbbFMAqAJCtslMBrNpv+ttvEXjY6M0XfIDOAfHaQLZmZp/3Wv9zCdiF+2npWT1YUKeaJ9O29hb1jSSkn5S86KwS1Wncdqr9ytb82VkEHjB6s3nSeSNpBMSbBjNB6W4dxbQhZDdwJzC2QbDoNQ8a9Yj2Wjf4aKbNJME2w34/LU/T9FQ9GXbmyVY9VVedyta0+6QBGz6KeQ2sBSDNAEiaOoSXoPCiDSGzbQgRfAg+WnWt6QIhghIFsAp21H4VwKpO0+2Tcg8frayS1Mn8/4U84Ge0oAO4BehG1WcjgE8D12UocNcuV+kph1NUTgc0WtyXtNuNbJWdslXtV3UajjYBy4y+fMMHaATET+A2AHSn7mlEI/ioDmBN++/XbQiZJPgQfLToWuf7Rgv7kp6qy9Ys2an2K1tlZ6tsXW/0sUwBtQDErywASWPHrxcE1vv9x/bPSSkO3DXlKn3lUGv6ld81IYISBbBJr1MFsApgVad58knLjD7WK5QWgATRVqAvVTcuvztHVf9eghCqIESnmsd7bRTgkeRyGHKBjmYXpqc5mFYAqwBWdSqolk9KY/stAg8Yffnc6UoAEo4GEtMZvKTvZWs4swF8lH6+CZwEbvHhhDTlSvAR9NqLDtgIG0KyFngpgBWUqE5lq9pvUuu0H3hY6z2SxaqplPkfOQ4UEl8DpkuwZjaAj+r3q6+fDNyW8OBWU67SXw5HKZ+Ebrj0k1Z4rjQv/NQCWtmK2q/qVHUaY15WGstYq8jZXTqI0J/6I4GFKA7YqQaJIQ/p14MSE/gIeA3rCXXS4EMHC2anHD6p036DgFuUfTXpfiCOvOepHJNuaxbtRHWaGDvVfr1oAJgr+BCAhK2tie8Qpo+0a0GJ2SCd4zaEXPIQSMZ5qnnSgCjotbXggxDqPi3rdi76gBUFXgoAZKvqVFCt9pscO9cYy5hrLNN6DwFI+NqUig7hZdcrt8W/9Zxd6ecp4Lv2Ty+BYqO8NXNtXJAT9bVRwUdayqF6/Yff9qLASwGAbE2nnWq/sjX9dvZjjXqsVpjsXVoD4rf9/RF7ga5ElqSfBdqNFp7XCvaqP28HbgWmeAywtctVfOCRpnJwvnfSAbZGnf5lBOxzmmOdzTuH5uXLVtmpOo1fRWCN8UVNtwoijYD4V3+iKd1s8PIKH17Svoh1YOF7Df5XU64EH14B+Szen5KaIfUPEtZXo0w/LXlPuq1ZtBPVqfxAxuo0WlvXAtMFH8GlbXj9azNu54F4CZCMCDu212v8rBOp97+l39/DenL9mRotSrtcxQsfaT6dfojyGpDqLXhr/b8RUp/SfvbpyHueylF1mu86VftNcvr9wDLjiwwqHG5OmoIVpD3/UchcHdZp537XfjTa9arW36bLeyZwLXCn/TNs+NCoR3bKwe3/T2NtclDdL/xMxdJ0hnTYqXKUraj9qk5TVaf9WNOt+hUFhyONgAQL9jcBSzL3NMLr2g+3308C3wNmAxM8Bp06WFDwUSqHcwQ7aLDeSEnYfUmnHKsck1SOSbdVT9VVp6SkL7nbKvAQgCRKm4EliblxeR39aAQdfuDEeVK18/OLwKtYy/RvQ1OuooaPNE+5cpZDCUBqgUU1YPg9GV3BtIIdBbCqU9WpoNqf+jFZY/yWwCMqaQpWkPb+hxSonCzS+lJudvpVvdGP6muGagTRtdK5FvgsMEbwIfhoUA4nsEbQqqdduU2vqvV7GP1M0xmSn77KMXu2aqqa2m9ybO0HgYcAJNkQ8ixeF6NHVfLNjHIEBRCT+utAqv8eCcwBJoUUsGrKVbrKwfRYDgeAy1Uw4RVGqq9XMCIoUQCrNqM6VZ16z0sR2GSDx6Ai3HikKVjB5X03LD/BpdHk//uBE9Pj534DUed7F4AfYE3JutUGkiABq0Y90gUfpo9yOA1cquoDjfpHralXQdaPBK0LzbFOfjkmrSw1rUm2yg8kzdZBYB2w3vhtigprs8W6mZb5hxwHCi2pJa9rPhqNftRax+E2wuEMHuvtjOU2MjIOmGv/FHz4vwFkacqVUx9gjX6U2nq9EY/q9+r9nTVvqqfBKkfZKVvVfsPQemCD8duaZtVKaQSk+Ua8omVPJIIEwrX+1ww5Hbd8FYHvAJ8GPuUx/5pyla5yMH2Wwwms0Y/qXayqF5/7KTM9DU63rSrHfNiZJ1vVfpOQ9gDWaMcmjXbkg9UzLfMP6QL2trzjm1W1GcUC9Fqw4nU9SCn4vOz4/AasBeqjBR+ZgA8zQDlcBt53gEa99R/Q3FoQPSGVrSpH2ao6zVudDgIbsKZYDSpqFYBkC0L+Ay8CPbGXaqP1GX52xWp2ATouwOH8nyFqL1D/NDDTQzCrKVfJvdYMWA4HgbPUn0oV5WJ0LVxW4KVylK2q06zZOojBJqwpVgOKUpMrTcFqXhuGAUgSh0ibeZLvZQqYif8pXBeAXfYziruBDjTqkSTbophyVdJp4AyVa5Bqne8R5dQNLVzOnp0qx/SkrzqN3ydlt04H7Fhsk/EvNNKRFmkEJIx+9B/Yi7XPU3yl73UExMsUrHrvuY16DLlcV+/6WqMpztGS24BZlHfKEnwk91qziXK4DOyjco1HvZGOJCxG19Ng2apyzHffkB9Ikp1FrG1zt9rQUVQkmj5pBCQcbQBWpfppRDUw+A2+GwXmXqZzvYk1GnIP1hoRr2WmKVfxXms2WQ4H7OvcFpoH2U5XT4OzZ2eabdXoWvbslB9otZ39wFYMNhn/QlOrsiCNgITRP/4DBazF6IXYaiqKERAva0Coc50bWNQDkCGX75+KtWXv1QEDYY16RHOt2WQ5HKJ84nn1aEZbjfbuZ1TE+bfRIq+np8HZs1XlKDtlayvSt4AD+o3f0Xa5AhDJPXb7/9Y4GT3K0nU+JW4FgAy5pBcGgJRe7Vjb9VYfYCj4iP9aM4RyOGEDiBMSvC44j/pUdAVeslXlmO++IT/QyvQHsdZxbAUGBBwCEMkfgHThZUveKIZIzRrpxzECUm9tSDWsBAGQ0utq4E5geoNgWFOuork2DPgo2vBRCyScIyBBwCMMAFEwIlvDSv+S/XLrLxdD/s526k+mHq02Iz+QqDotOmHDBo5BRZECEKk5CBk+ChJVTfidLhMXgNT6rB6A+HlNtEFkYpNBs0Y9grWhoOVQxNpy12gAIPU+93MeiBGhd9PT4OwHXpcon1k0hLVbX0kXqvpEPdhIskZROeWxGmKcn7fZfwtK1Df8a9CGjF1XYONfCjYkAUgUANJFmAcTGiEEj6bH//ECILXgwctnQ7gfTmi6fObynmmCMQlr296C4CPx8HGc4dOu/AJILcAwWgQgCrzSmbZz5OGCwy+V4OJySkGiFRpd43cnpDhhRn0jLw8nBrAeNW21oWPQ+JeaRiUJQOKGkOCjIH5rzO9C9Fqw0OhaL4vN68GHG4B4GfGoASqm/bdpQtsMYDZwjYegWVOuvF9rhlQOh4Gj1B7NaBZA3KDE7e+seVYFXpW66AAK0/45JLBouUojKdWAMrIGzKhvJN3WEmQMYK3o6weKxu9qRypJAJIUAOkCdhLljljVgaIREED8/ITGC9HdRkYuNwCYIdzPC6lxfohp/xyyf46YCcyhcsesoAF2FODhNw9pH/W4hDXl6oRHwGgLCUBqfa5gJBu2lkDisv0qAcZFn21TSqacoyZjarw3Wn0jhvT7HaBxwgEcg8bvatqUJABJC4SsJsi5IEEBpFbgaPgEEKg/rQofn/mdhuVlIbo5HEDM0stOu/0WYCYwWfDRMvj4BHgfOI/3Xa7q/d4sgKTB62k+ebmdXXTAxidEs2hbygaojAJGVAGK1/Uq+YGSAYwrh/SVwMIJG4ILSQCSKQD5A8e5IFFvxes1qDQZPlLiZ80HDQCj1ufOv73CBtQeBan6X+dULPOyA0ZMGDUZ6K4CkVbAR96mXBWBDx3/0yyA4PEzvwCS74Ck9XaWAOOC43eNZEhhywkjbcBVjs+qF+GX/k7ew4kB27NWQkUZJEp/X7nG+D2tvZAEIHmHkD7g2chLvdl1ILWubzTS4Wc3LKpAwutidI8jIaUXQ5V/myaMGAvtc4FbBB+RwsclrFGPUww/TNDveg+/54D42Z437R4ybVBSGr24QHn61Ce6N0gpkXOEpfpRy2jWMZ4BrEdd9R7JDHjqfv9K0CAJQKRwIWRnAwfVfE00sxuW2QBivE61cru2+kyQoQYA4zby4XMqVjWIGCPhqluBO6hcsB4FePgN8tM+5eoY5VGP6vUcjaDD60nofqZf1QKfLHvNpEDJRcrTpz5BIxpSVrUGWGs8NWxUQpIkn2pXEUSqlcCLTQW0jYIAA29P953XlX6v979uoyTV6VAjrer0DY8BcfUhis7/p+r3Gh/TZkFIdZGZF+H8G2C+DqOngDELmJVj+Ahj1OMU1kLz01XBvunSdhutxzAiCK7NiIJ1M0FQEmVe3NrJBQdwlF6SlG2tB9YYT2m9hCSFJY2ARB0f/AFPAysirbUwpmEFXQsCwUdB6m3JC/W35XWuB6kaCamejnXlM8f1xkgY3QXcDlwXQlCWlylXnwD7HOBhg9+Vdum2iNxtala9kY4gC9BrpdUqD5iFkRLBhiTwEHhIkgAklQBSwGQvRgzb8sYJIY3We0D93bCg8YL1RlDi+LsehEBtICn9bL8WRnVijYpc5xM8/Ab5aZ1ydRLrXI8TdUCj3pQqL2tDwtiC1y+ACErKulgDOCRJ4CFJkgAkpRDyFZYA34i0BmoFoLVGSoIASDNAUm8xOtQeIYH66z/qwMkw4KhaF1JrNMT5XvtYuKoEI9dnBD6aGfU4gnWY4OkG4NAIKLzufuUFSLz8bqTIU7bCC1+uAo4L8tOSJPCQJAFIFiHkG8CSSGvF61QsAkCIl3NB3A4mrP6/oQbpuUGI2//WghAbKNxGQ1xBxPG3MQqu7sLazreTyv3lszzl6owNHUfsQLWN+iMcjUZEai0urzUiggfoMIh29CNJ3jPM9C9UAcdl+WRJEnhIkgAkDwBSoHQ2SFQ1FWRHLBoACAEhpN56ECdI+NlJq97WvTXerxgNcZ4bUgdEKt6n8udV10P7FGASMMUBJFmYcnXaBo4ilYcItrkE/35GPBqt93Db/Qq8Tb8yWgQgSYWSIRs0NLohSQIPSRKASOZX6MHrrlhBay+sBemGC7B4WaAeJoT4+azOaEgFiDghhOEQMgxGar0PXHUdtF9vA8l1DF8/kuQpV59grec4gbW+4xOX4L8N/+d51Fr74ee082bWfiQBQuL2siXg+ITy4X6SJAk8JEkAIjkgJPxdsfARrPqBEL/Xezk3xA1CwN/uWODrUMSaIIL7aEfFzyrbzToB/5jJNohcY/8cjzVS0uopV8exRjlO28BxjtprONzgA4Kv7fCy01U9IPEDIEaKvF3Q/JROEdd0KknyoyKwDp3jIUkCkBxDiPcDCsOCjjAgpN7ffiHEy7oO8Lddr4d8uIEIDUZAqqHD9FneoycDIymPkkywf15D+XDEZkY9ztpQUYKNSzZsnKd8+rSXBeTY4NHm+B287XrlZ5SkHsB4uS4IgKTBCxoNgOMCOuBPkgQekpR66SDC1uhhYCdEtDWvQeOpWH7+3xkYmS5/17u+3oGCph3kDvnMT/X7hgM26gSUhlGZZ8NwAIZ9mrfhAA7DBhKjqjxNl6DRrRguHLb/+NCRj+p8Ae0T6wTi1UBwwg5Og+xE5QYffgP8oCeW+4WFWoddhgEfkLyDBatHOAQckhREg1gnl28SeEhS8qQRkFbFGU/aW/NGVQN+FinXm/JjNnjP76GFtf6n0eJyP1OuvJ5JUvVZzVGPIRfoMBsXrSv81Oh9hgMsStcYVcG6UQsi8AgcXhaSO/9uw9v0KC/f5wVOwlr70ZZSb3mZygXjmlIlSc1oAFhnPMV6FYUkCUCk2hCyGlgVWc0EhRAvC9mbPTm9HqA02qbXx9oPr1OzGoGGcwqWOeShrOvVZdtwyKgFJ0Y9SHAL8P2sxTBqgAc+4KPW517WiPiFDy8A0qq1H0bAfqlF45IUtvqxFpb3qygkSQAiNYaQZ4G+SIOdZiDE9JhOva15/QLBkEs+3P6/mZPa68FIAyipuKTBMIhh1KlPJ2zUC7i9BvZ+12Y4RxD8LDL3Ajp4+BzC2fkqKZ6vVtoXsdbjXMCaYiVJUlhaj3a0kqTUSWtAWq+VWAvSu33DhJdAqnr9hNv6jlpz7E2Xz5yfm3XSqfUTaq8jqV4EPdTAVrMq+DRr5Mnt/Xp2u4CIUa+8TRfAaBScukGJ1/Mu/MJIvc/b6rQlPyBieACD6jbhFT6iBPMwoaS0juOi/fqkPrxKkuRbRayF5esFHpKUTmkEJAEyn2zykEIvteplUbqX6Vhe1oTg8b1GIyNDDb6n2V24oP7Ijumj7Jqpo0ZP9b0AhhdQ8AIejeClGjaC7GTl59pWn3ruNX2T2ieNmyG3G0nKtwaxRjvWqygkSQAihQMh3ViHFBbi+cImIKQRmHi5phFUOH8O+QAZtzyYAfKMB0hpVJ5GwPf8Ltr2CyNtHqCmHhwEnablBT4IADCt8JqlxeOlaVVeYFaSpCDahLWwvF9FIUkCEClsJlhTA0LCrqFmzwhp9LmfIN/P2pMgIOI1/0EW4vspXz8LpL2uA/ECIn7AA+qPejRK3y/MGA3sT+KJ56VRjtLLbNBONPohSc2oiLW+Y52mWUmSAESKHkKWAN+ItNbqPaltdL6HlylMfoJ9L8DiBiJ+0vcLGX5hxGyixzUbnHsZNXBur9voOrfP/Y5IGD7S8woffqAtDF2mfC7HZR+QodEPSQqqAaz1HTq/Q5IEIFLMENIHPBtpTXqZVuT2vtd1FEFHQ7yOtgwF/M5anzWy1UswaQasoyBQ4mfHLKh/NofRAHq8Ago+8uoFVIL8HUbfuGhDxyWGbwntFTI0+iFJfrUe2KBpVpIkAJHSBiF+a9cvhDQK0MNYoN4siHj9Hi+fewkgzRDrJsjCdD/QUS/g97uuxEtevG6Z63cEKCzvZTjaz2XKU6uahQyNfkiSVw1S3s2qqOKQJAGIlBUIaVTjYUJI0DNGvACHl2uHfNjlZYerKANJL6MhXqcfVU+zcksrCDx4XVju9n9evq8edHgBsCAaojzKcTlkyNDohyQ10no02iFJAhApZxDS8Es9vN9sQB8WiNAARsIe5fEKJEYIPdDvAnVqAIhf8GgU7BuEf5q5V/jw+rebLjuAY8hD3Wv0Q5LC1CAa7ZAkSQCSKgjpJo4tek2f17kF5n6DMr8nsXvZ0rcWjPgNEM0A5WP66F1e4aNewN3m8pnXkQ2ahBS39OuBRZjw4QU6Si+/bVOjH5LUrIpYW+hqtEOSJAGIIKSJoNsIIXALcuaG6SMds0HaQYGkGWgLElhXv9fWIC2/IwxeFqJ7Sdvvie5ewCMofJR2SStBR706Djr9TqMfktRIA2gnK0mSBCAZgZDVdGFt0dsdac35nXIU5qGG1e8bPgNIP0+kGy1ijwpEvDztb/Nwjd/f3YDBz9a7XqDGax7Cgg8ndAx5bHtRQIZGP6R8a5DygYGDKg5JkgQg2YKQgg0hPZHXZlhb0IYBIn7yFnTBfPX7Qz5sDbPs23wE+mFCRyOA8LLDlZe8uJWX13NASnVQAo4hj5Cg0Q9JCltFNMVKkiQBSK5A5FmgL/Ia9jMaEsa5Gn7PFvGTX7/bCHtJe8gDRAStn6BBup+1F17T9TqNKwh4eAenAUz6uUQfQ46piGHvcKbRD0lqpE3AZjTFSpIkAUguIaSPIDtkBan1ZkZDGk2xijsINEOwIeqe53UKkp+zM4JOlwoCQ35GM+rnewDYAGwy/p01rcMeBVwBLMesWhNlhtSGwmqTkpQdlfqidrGSJEkAIgihG2tKVlcsLSEqEPGSRliBpN/v8Wpfs+VuhHBts1vhegUSL/nxsuC8dvqbsZ6w9pegw6XtFzB5GudIYDOjH2GDiSRlBzo2aV2HJEkCEGl4IGaNhCyJpYU0u0i9mbUeXt5rdqpVM7aGDSPNQomfHagMn+l4BQ9voGRBxxCb33i1swiYd27e562KVtEFrMJsACJRQIZGPyRBhyRJkgAk1yCyihXAKoyIt+o1QgKRoIGe3+8ym7gmaT3Uz2iCX1iIAzyqocNkM5fZ9MbOzmKpJryCx7DqfKIOiDSqc41+SIIOQYckSQIQKTCEdFHaqreVNR0WiHiBETNAfkyf+TZbUIZetuv1Ol0qKJSEDx67MFnHJTa/MWCNdDhLOSh8VFTVl+nCWh/SBy6L1aMGE0kSdEiSJAlAcggiq4FVsbaAsM7PCHuKlhs8BF1obkZYlkbA64yAn3mFF6+HFNbWLmADQ2x+47XOwVrhexjgMaya/r1jsToUYpuWJUnJ1SZgq6BDkiQBiBQlhHRhrQ3pibVVBBlFiGKtR6PA0QiQ/7jK0WgiTa+QYPj82x+A7MK0oWNn52C9WowCPoZV3f+HPhvIuzT6IeVIxSroKKpIJEkSgEhxgUgf8DQ0sTYkjK173d43IoKRMGEizDSMkMrYCJCGn217G4HHcO2zoWPjGwOdg43C9jjAY1iV/Tt6sEZEljQFGRr9kJKrQRs6NutwQEmSBCBSqyGkgPUEeEVLWk/Yu0k1s9NV0M9a0QvDGgnx+p6fRedl6NhsQ8eAl1C+FeBRA0S6gD5MevEzKuKnnUlSfNqEplZJkiQAkRIMIt1YoyE9LWlRUYxINHMye6vho1H5GU2UexB48TbFqgg8z2WeeWOgcxceT99IAnjUrPb/N0tsEFnSEDIEH1IyNAD0A1uNp9ik4pAkSQAipQVEemwQ6W5ZK2tmVMSsk35UJ5ybMfcoPwBhBMyTd+CxoMNk8xs7O5/H+4bJiQWPYdX7bylQHhXpbmidAESKT0XKoxz9GuWQJEkAIqUdRPooLc5tVcsLY1QkyLoSQs5D1D3N7yLx5oCjDB1DbH5joAI6GobmaYEO1+bwb65s5bvkSt8QfEjxAke/AzgGVCSSJAlAJIFISzLZ5PVGE+mZLeyFRhNp+p/SFRQ6MgEeNav+f6cb6HWFEUkScEiSJAlApKZAZAnWLkE9yc5oSP9ntAg6wu6Nze9eZS0k31WxpiO30OHaJP43um0QeYg4pi9KWdUg1joOAYckSQIQSboSaD1BD9AL9CWmtQRd99Fs2lGCkRHStf7zvBVrpGPrG7s6BxpYUBNC8gQeNav6cbqwFq4vxLmAXZKGawBrhGMXWsMhSZIkAJEagkiXDSHWdqVJaUGmh9ZsZrin+i/3fcBWTLbyCZvf+HFn0QdwCDq8AUkJRnrQ6EieNWgDRwk2+lUkkiRJAhApOIwswZp60pfIVtUKKDES3Zu3YrIZk6321Kp6JVATOgQcgWGkYIOIgCRHsAEM6LRxSZIkAYgUDYgU4AqMLElsSzN95sVMaa8yruR/K9bUqq1vDHRuJeD58IKOyIGkm6SvsZJqacB+7RNsSJIkCUCktMFIq1uf2WRezBh7Wv3/s4DDpN8GDr+5FXC0Fkp6bBiZY//sVqkkQoP2a6v9c0CLxCVJkgQgUvJhpLQot5C6FmnGmB9/aQ9iTfPYislADeDwdNKJYCMVUNJVBSUFlUwk6rf71T6skY1BgYYkSZIAREo/kHRTOQ++oJbqycYipTnlJrswGXhjV+egH4QSaGQKSgpVMLLQ/tmt0mkI7YNVkFFEU6ckSZIEIFJugaSbZg89NDLRkwauBEfWGo7BNwZcYePKKIcAQ7LhpMvuR6VXhwNMejJsen8VrDvfE2BIkiQJQCTJFUgKlBfkzrEDqO6MQkm/I1gaAAaN1ZruIcUKKVA5paujRn+LG1oG7H5R0qAN5LU+F1hIkiQJQCQpMjApBUk9jiCpEBhO4mnl/Y6A6QTO6R5rFDRJqYcYJ7j41aAO3pMkSZIEIFLaAaXH/rWL8pPdWk9z3aHFaAgSTpWgAspzyq3Aao0CK0mSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS0qD/ByZ2MbnqGPjlAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTAxLTE1VDE4OjQ5OjAzKzAwOjAwsvlJsQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMi0wMS0xNVQxODo0OTowMyswMDowMMOk8Q0AAAAASUVORK5CYII=" alt="NAT SERIES">
|
||
|
||
<div class="logo-text">
|
||
|
||
<h1>Image Optimizer [NAT]</h1>
|
||
|
||
<span class="lang-text" data-ua="Стиснення та Очищення" data-ru="Сжатие и Очистка" data-en="Compress & Cleaner">Стиснення та Очищення</span>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- Language Selector Buttons -->
|
||
|
||
<div class="lang-switcher">
|
||
|
||
<button class="lang-btn active" data-lang="ua">UA</button>
|
||
|
||
<button class="lang-btn" data-lang="ru">RU</button>
|
||
|
||
<button class="lang-btn" data-lang="en">EN</button>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- Navigation links (ScrollSpy active) -->
|
||
|
||
<nav class="sidebar-nav">
|
||
|
||
<ul class="nav-list">
|
||
|
||
<li class="nav-item">
|
||
|
||
<a href="#requirements" class="nav-link active">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Вимоги" data-ru="Требования" data-en="Requirements">Вимоги</span>
|
||
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="nav-item">
|
||
|
||
<a href="#installation" class="nav-link">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Встановлення" data-ru="Установка" data-en="Installation">Встановлення</span>
|
||
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="nav-item">
|
||
|
||
<a href="#update" class="nav-link">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M4 4v5h.582m15.356 2A8.001 8.001 0 1121.21 8H17"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Оновлення" data-ru="Обновление" data-en="Updating">Оновлення</span>
|
||
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="nav-item">
|
||
|
||
<a href="#settings" class="nav-link">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Налаштування" data-ru="Настройки" data-en="Settings Guide">Налаштування</span>
|
||
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="nav-item">
|
||
|
||
<a href="#utilities" class="nav-link">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Інструменти Pro" data-ru="Инструменты Pro" data-en="Pro Utilities">Інструменти Pro</span>
|
||
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="nav-item">
|
||
|
||
<a href="#cron" class="nav-link">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Крон-завдання" data-ru="Крон-задания" data-en="Cron Automation">Крон-завдання</span>
|
||
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="nav-item">
|
||
|
||
<a href="#faq" class="nav-link">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="FAQ" data-ru="FAQ" data-en="FAQ / Help">FAQ</span>
|
||
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="nav-item">
|
||
|
||
<a href="#ecosystem" class="nav-link">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Екосистема" data-ru="Экосистема" data-en="Ecosystem [NAT]">Екосистема</span>
|
||
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</nav>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<!-- Theme Switcher and Version in Sidebar Footer -->
|
||
|
||
|
||
|
||
<div class="sidebar-support-info" style="background-color: var(--bg-tertiary); border: 1px solid var(--border); border-radius: 8px; padding: 10px; margin-top: 12px; font-size: 11px; margin-bottom: 12px;">
|
||
<div style="font-weight: 700; color: var(--accent); margin-bottom: 4px; text-transform: uppercase; letter-spacing: 0.5px;" class="lang-text" data-ua="Підтримка" data-ru="Поддержка" data-en="Support">Підтримка</div>
|
||
<a href="mailto:info@nat.od.ua" style="color: var(--text-primary); text-decoration: none; font-weight: 700; display: flex; align-items: center; gap: 6px; font-size: 11.5px; transition: color 0.2s ease;">
|
||
<svg viewBox="0 0 24 24" style="width:13px; height:13px; fill:none; stroke:currentColor; stroke-width:2.5; flex-shrink:0;"><path d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path></svg>
|
||
info@nat.od.ua
|
||
</a>
|
||
</div>
|
||
<div class="sidebar-footer">
|
||
|
||
<button class="theme-toggle-btn" id="theme-toggle" aria-label="Toggle Theme">
|
||
|
||
<svg class="moon-icon" viewBox="0 0 24 24"><path d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path></svg>
|
||
|
||
<svg class="sun-icon" viewBox="0 0 24 24"><path d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364-6.364l-.707.707M6.343 17.657l-.707.707m0-12.728l.707.707m11.02 11.02l.707-.707M12 8a4 4 0 100 8 4 4 0 000-8z"></path></svg>
|
||
|
||
</button>
|
||
|
||
<span class="version-tag">v1.2.0</span>
|
||
|
||
</div>
|
||
|
||
</aside>
|
||
|
||
|
||
|
||
<!-- Main Content Area -->
|
||
|
||
<main class="main-content">
|
||
|
||
|
||
|
||
<!-- Hero Banner -->
|
||
|
||
<header class="hero-header">
|
||
|
||
<div class="badge-series">Series [NAT] Zero-Trust Web</div>
|
||
|
||
<h2 class="hero-title">Image Optimizer [NAT]</h2>
|
||
|
||
<div class="hero-desc">
|
||
|
||
<span class="ua-only">Багатофункціональна система стиснення оригіналів зображень без втрати якості, генерації WebP, накладення Smart водяних знаків та повного очищення хостингу від невикористовуваних медіафайлів для OpenCart. Розробка <b>[NAT]</b>.</span>
|
||
|
||
<span class="ru-only">Многофункциональная система сжатия оригиналов изображений без потери качества, генерации WebP, наложения Smart водяных знаков и полной очистки хостинга от неиспользуемых медиафайлов для OpenCart. Разработка <b>[NAT]</b>.</span>
|
||
|
||
<span class="en-only">All-in-one image optimization suite for OpenCart. Compresses original catalog assets with zero quality loss, automates WebP conversion on-the-fly, manages dynamic watermarks, and cleans up junk images. Developed by <b>[NAT]</b>.</span>
|
||
|
||
</div>
|
||
|
||
</header>
|
||
|
||
|
||
|
||
<!-- Demo Stand Link -->
|
||
|
||
<section style="background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.05), rgba(59, 130, 246, 0.05)); border: 1px solid rgba(var(--accent-rgb), 0.2); border-radius: 12px; padding: 24px; margin-bottom: 40px; box-shadow: 0 4px 6px var(--shadow);">
|
||
|
||
<h4 style="font-size: 16px; font-weight: 800; color: var(--text-primary); margin-bottom: 12px; display: flex; align-items: center; gap: 8px;">
|
||
|
||
<span>🖥️</span>
|
||
|
||
<span class="lang-text" data-ua="Офіційний демо-стенд модуля" data-ru="Официальный демо-стенд модуля" data-en="Official Module Demo Stand">Офіційний демо-стенд модуля</span>
|
||
|
||
</h4>
|
||
|
||
<div style="font-size: 13.5px; color: var(--text-secondary); margin-bottom: 16px; line-height: 1.6;">
|
||
|
||
<span class="ua-only">Ви можете перевірити роботу та спробувати швидкість стиснення на нашому офіційному демо-сайті. Перейдіть до панелі керування (використовуючи логін/пароль <b>demo</b> / <b>demo</b>).</span>
|
||
|
||
<span class="ru-only">Вы можете протестировать работу модуля и оценить скорость сжатия на нашем официальном демо-сайте. Перейдите в панель управления (используя логин/пароль <b>demo</b> / <b>demo</b>).</span>
|
||
|
||
<span class="en-only">You can test the module's performance and compression speed on our official demo site. Navigate to the admin control panel (using login/password <b>demo</b> / <b>demo</b>).</span>
|
||
|
||
</div>
|
||
|
||
<div style="display: flex; flex-wrap: wrap; gap: 12px; align-items: center;">
|
||
|
||
<a href="https://oc3-demo.nat.od.ua/admin/index.php?route=extension/module/img_opti" target="_blank" style="background-color: var(--accent); color: #0b0f19; font-weight: 700; text-decoration: none; padding: 10px 18px; border-radius: 8px; font-size: 13px; display: flex; align-items: center; gap: 8px; transition: background-color 0.2s ease;">
|
||
|
||
<svg viewBox="0 0 24 24" style="width:14px; height:14px; fill:none; stroke:currentColor; stroke-width:2.5;"><path d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Адмін-панель (Вхід demo/demo)" data-ru="Админ-панель (Вход demo/demo)" data-en="Admin Control Panel (demo/demo)">Адмін-панель (Вхід demo/demo)</span>
|
||
|
||
</a>
|
||
|
||
</div>
|
||
|
||
</section>
|
||
|
||
|
||
|
||
<!-- System Requirements Section -->
|
||
|
||
<section id="requirements" class="section">
|
||
|
||
<h3 class="section-title">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Системні вимоги" data-ru="Системные требования" data-en="System Requirements">Системні вимоги</span>
|
||
|
||
</h3>
|
||
|
||
|
||
|
||
<!-- UA REQUIREMENTS -->
|
||
|
||
<div class="ua-only">
|
||
|
||
<p>Модуль розроблено з урахуванням високих вимог безпеки і сумісний з наступним стеком:</p>
|
||
|
||
<div class="grid-cards">
|
||
|
||
<div class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Сумісність із CMS</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
• OpenCart 2.3.x / ocStore 2.3.x<br/>
|
||
|
||
• OpenCart 3.0.x / ocStore 3.0.x<br/>
|
||
|
||
• OpenCart 3.0 Cloud
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Окруження сервера</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
• PHP 7.1 - 8.2 (повністю сумісний)<br/>
|
||
|
||
• Бібліотека GD або розширення php-imagick (рекомендовано)<br/>
|
||
|
||
• Відкритий вихідний код (без IonCube)
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Конвертація та Колір</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
• Конвертація кольорової моделі CMYK в sRGB для Safari та iOS<br/>
|
||
|
||
• Автоматична XSS-санітизація завантажуваних SVG-файлів
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- RU REQUIREMENTS -->
|
||
|
||
<div class="ru-only">
|
||
|
||
<p>Модуль разработан с учетом высоких требований безопасности и совместим со следующим стеком:</p>
|
||
|
||
<div class="grid-cards">
|
||
|
||
<div class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Совместимость с CMS</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
• OpenCart 2.3.x / ocStore 2.3.x<br/>
|
||
|
||
• OpenCart 3.0.x / ocStore 3.0.x<br/>
|
||
|
||
• OpenCart 3.0 Cloud
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Окружение сервера</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
• PHP 7.1 - 8.2 (полностью совместим)<br/>
|
||
|
||
• Библиотека GD или расширение php-imagick (рекомендовано)<br/>
|
||
|
||
• Открытый исходный код (без IonCube)
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Конвертация и Цвет</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
• Конвертация цветовой модели CMYK в sRGB для Safari и iOS<br/>
|
||
|
||
• Автоматическая XSS-санитаризация загружаемых SVG-файлов
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- EN REQUIREMENTS -->
|
||
|
||
<div class="en-only">
|
||
|
||
<p>The module is built with high security standards and is fully compatible with the following stack:</p>
|
||
|
||
<div class="grid-cards">
|
||
|
||
<div class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">CMS Compatibility</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
• OpenCart 2.3.x / ocStore 2.3.x<br/>
|
||
|
||
• OpenCart 3.0.x / ocStore 3.0.x<br/>
|
||
|
||
• OpenCart 3.0 Cloud
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Server Stack</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
• PHP 7.1 - 8.2 compatible<br/>
|
||
|
||
• PHP-GD or php-imagick extension (recommended)<br/>
|
||
|
||
• Open source code (No IonCube encoder required)
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Security & Profiles</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
• Automatic CMYK to sRGB conversion for iOS/Safari browsers<br/>
|
||
|
||
• Built-in security sanitizer against SVG XSS vector attacks
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</section>
|
||
|
||
|
||
|
||
<!-- Installation Section -->
|
||
|
||
<section id="installation" class="section">
|
||
|
||
<h3 class="section-title">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Інструкція з встановлення" data-ru="Инструкция по установке" data-en="Installation Guide">Інструкція з встановлення</span>
|
||
|
||
</h3>
|
||
|
||
|
||
|
||
<!-- UA INSTALL -->
|
||
|
||
<div class="ua-only">
|
||
|
||
<ul class="steps-list">
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">1</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Завантаження файлів по FTP</h4>
|
||
|
||
<p>Розпакуйте завантажений архів модуля. Скопіюйте вміст теки <code>upload/</code> у кореневу директорію вашого сайту по FTP або SFTP (системні файли OpenCart при цьому не перезаписуються).</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">2</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Надання прав доступу</h4>
|
||
|
||
<p>Перейдіть у меню <code>Система -> Користувачі -> Групи користувачів</code>, відкрийте групу адміністратора (Administrator) і встановіть позначки прав на <b>Перегляд</b> та <b>Зміну</b> для контролера: <code>extension/module/img_opti</code>.</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">3</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Активація модуля</h4>
|
||
|
||
<p>В меню <code>Модулі / Розширення -> Модулі</code> знайдіть модуль <b>Image Optimizer [NAT]</b>, натисніть зелену кнопку <b>Встановити</b>, після чого перейдіть у редагування модуля.</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">4</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Встановлення OCMOD модифікатора (якщо є)</h4>
|
||
|
||
<p>Якщо до складу вашої збірки входить модифікатор <code>install.xml</code>, встановіть його через меню <code>Встановлення розширень</code> та не забудьте оновити кеш модифікаторів.</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
<div class="alert-block info">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
||
|
||
<div><b>Важлива інформація:</b> Модуль створює загальне меню <b>[NAT] Modules</b> у бічній панелі для всієї серії розширень, забезпечуючи зручний перехід між модулями.</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- RU INSTALL -->
|
||
|
||
<div class="ru-only">
|
||
|
||
<ul class="steps-list">
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">1</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Загрузка файлов по FTP</h4>
|
||
|
||
<p>Распакуйте загруженный архив модуля. Скопируйте содержимое папки <code>upload/</code> в корневую директорию вашего сайта по FTP или SFTP (системные файлы OpenCart при этом не перезаписываются).</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">2</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Назначение прав доступа</h4>
|
||
|
||
<p>Перейдите в меню <code>Система -> Пользователи -> Группы пользователей</code>, выберите группу администраторов (Administrator) и установите права на <b>Просмотр</b> и <b>Изменение</b> для контроллера: <code>extension/module/img_opti</code>.</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">3</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Активация модуля</h4>
|
||
|
||
<p>В меню <code>Модули / Расширения -> Модули</code> найдите модуль <b>Image Optimizer [NAT]</b>, нажмите зеленую кнопку <b>Установить</b>, после чего перейдите в режим редактирования модуля.</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">4</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Установка OCMOD модификатора</h4>
|
||
|
||
<p>Загрузите модификатор <code>install.xml</code> через установщик расширений OpenCart и обязательно обновите кэш модификаторов в менеджере расширений.</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- EN INSTALL -->
|
||
|
||
<div class="en-only">
|
||
|
||
<ul class="steps-list">
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">1</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Upload assets via FTP</h4>
|
||
|
||
<p>Extract the module ZIP archive. Transfer the files inside the <code>upload/</code> folder to your OpenCart root directory using an FTP client (no core system files are overwritten).</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">2</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Grant Admin Permissions</h4>
|
||
|
||
<p>Go to <code>System -> Users -> User Groups</code>, open the Administrator group and select both <b>Access</b> and <b>Modify</b> permissions for: <code>extension/module/img_opti</code>.</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">3</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Activate Extension</h4>
|
||
|
||
<p>Navigate to <code>Extensions -> Extensions -> Modules</code>, find <b>Image Optimizer [NAT]</b>, click the green <b>Install</b> button, and then click <b>Edit</b> to open the configuration dashboard.</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
<li class="step-item">
|
||
|
||
<div class="step-number">4</div>
|
||
|
||
<div class="step-content">
|
||
|
||
<h4>Upload OCMOD modification</h4>
|
||
|
||
<p>Upload the <code>install.xml</code> modification file using OpenCart Extension Installer, then clear and rebuild modifications cache.</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
</section>
|
||
|
||
|
||
|
||
<!-- Update Section -->
|
||
|
||
<section id="update" class="section">
|
||
|
||
<h3 class="section-title">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M4 4v5h.582m15.356 2A8.001 8.001 0 1121.21 8H17"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Оновлення модуля" data-ru="Обновление модуля" data-en="Updating Module">Оновлення модуля</span>
|
||
|
||
</h3>
|
||
|
||
<p class="ua-only">Щоб оновити модуль до останньої версії, завантажте файли нової версії з папки <code>upload/</code> поверх уже існуючих файлів на сервері по FTP, після чого перейдіть в адмін-панель модуля і натисніть кнопку "Зберегти" для оновлення структури налаштувань.</p>
|
||
|
||
<p class="ru-only">Чтобы обновить модуль до последней версии, загрузите файлы новой версии из папки <code>upload/</code> поверх уже существующих файлов на сервере по FTP, затем перейдите в настройки модуля и нажмите кнопку "Сохранить" для обновления структуры данных.</p>
|
||
|
||
<p class="en-only">To update the extension to the latest version, copy the files inside the <code>upload/</code> directory over the existing server files using FTP. After files are uploaded, open the module setting dashboard and click "Save" to apply new schema changes.</p>
|
||
|
||
</section>
|
||
|
||
|
||
|
||
<!-- Settings Guide Section -->
|
||
|
||
<section id="settings" class="section">
|
||
|
||
<h3 class="section-title">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Налаштування по вкладках" data-ru="Настройки по вкладкам" data-en="Tab Settings Walkthrough">Налаштування по вкладках</span>
|
||
|
||
</h3>
|
||
|
||
|
||
|
||
<!-- TABS WALKTHROUGH -->
|
||
|
||
<div style="display: flex; flex-direction: column; gap: 24px;">
|
||
|
||
|
||
|
||
<!-- TAB 1 -->
|
||
|
||
<div style="background-color: var(--bg-secondary); border: 1px solid var(--border); padding: 24px; border-radius: 12px;">
|
||
|
||
<h4 style="font-size:16px; font-weight:700; color:var(--accent); margin-bottom:12px;">
|
||
|
||
📁 Tab 1: <span class="lang-text" data-ua="Налаштування (Settings)" data-ru="Настройки (Settings)" data-en="General Settings">Налаштування (Settings)</span>
|
||
|
||
</h4>
|
||
|
||
<div class="ua-only">
|
||
|
||
<p>Ця вкладка відповідає за загальні параметри роботи та ліцензування:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Статус модуля</b>: Глобальний перемикач роботи оптимізації.</li>
|
||
|
||
<li><b>Токен активації</b>: Введіть ключ ліцензії, отриманий на пошту або придбаний на платформі. Він прив'язаний до основного домену сайту.</li>
|
||
|
||
<li><b>Рушій обробки</b>: Виберіть <b>GD</b> або <b>Imagick</b>. <i>Imagick</i> працює значно якісніше, зберігає колірні профілі та коректно обробляє стиснення.</li>
|
||
|
||
<li><b>Позиція меню</b>: Налаштування виведення посилання на модулі [NAT] в адмінці (Шапка, Сайдбар, або обидва).</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
<div class="ru-only">
|
||
|
||
<p>Эта вкладка отвечает за общие параметры работы и лицензирование:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Статус модуля</b>: Глобальный переключатель работы оптимизации.</li>
|
||
|
||
<li><b>Токен активации</b>: Введите лицензионный ключ, полученный при покупке. Ключ привязан к корню домена.</li>
|
||
|
||
<li><b>Движок обработки</b>: Выберите <b>GD</b> или <b>Imagick</b>. <i>Imagick</i> работает значительно чище, быстрее и не искажает цвета на iOS.</li>
|
||
|
||
<li><b>Позиция меню</b>: Настройка вывода ссылок на модули [NAT] в админке.</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
<div class="en-only">
|
||
|
||
<p>This tab configures general global settings and license parameters:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Status</b>: Global module state (Enabled/Disabled).</li>
|
||
|
||
<li><b>Activation Token</b>: Enter your license key linked to your domain host.</li>
|
||
|
||
<li><b>Processing Engine</b>: Toggle between <b>GD</b> (Standard) and <b>Imagick</b> (Recommended: higher quality, supports advanced color spaces).</li>
|
||
|
||
<li><b>Menu Position</b>: Choose where the NAT Modules navigation dropdown displays (Sidebar, Header, or Both).</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- TAB 2 -->
|
||
|
||
<div style="background-color: var(--bg-secondary); border: 1px solid var(--border); padding: 24px; border-radius: 12px;">
|
||
|
||
<h4 style="font-size:16px; font-weight:700; color:var(--accent); margin-bottom:12px;">
|
||
|
||
📉 Tab 2: <span class="lang-text" data-ua="Оптимізація та Ресайз" data-ru="Оптимизация и Ресайз" data-en="Optimize & Resize">Оптимізація та Ресайз</span>
|
||
|
||
</h4>
|
||
|
||
<div class="ua-only">
|
||
|
||
<p>Основний інструмент стиснення оригінальних картинок у папці <code>image/catalog/</code>:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Режим роботи</b>:
|
||
|
||
<ul>
|
||
|
||
<li><i>Створити копію (безпечно)</i>: Модуль збереже оптимізовані файли в окрему папку, дозволяючи порівняти результат.</li>
|
||
|
||
<li><i>Замінювати оригінали</i>: Файли стискаються на місці. <b>Потрібен бекап перед запуском!</b></li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li><b>Папки обробки</b>: Ви можете вказати окремі підпапки або вибрати весь каталог.</li>
|
||
|
||
<li><b>Якість і Стиснення</b>: Налаштування стиснення для JPG (0-100), PNG (0-9) та якості конвертованих WebP.</li>
|
||
|
||
<li><b>Обмеження ширини/висоти</b>: Автоматичний ресайз занадто великих фото до заданих меж (наприклад, 1920px), щоб не перевантажувати дисковий простір.</li>
|
||
|
||
<li><b>Поріг заміни (%)</b>: Запобігає оновленню, якщо вага стиснутого файлу стала більшою за оригінал.</li>
|
||
|
||
<li><b>Індивідуальні правила</b>: Можливість перевизначити параметри якості для конкретних підпапок (наприклад, для папки банерів потрібна менша компресія).</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
<div class="ru-only">
|
||
|
||
<p>Основной инструмент сжатия оригинальных картинок в папке <code>image/catalog/</code>:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Режим работы</b>:
|
||
|
||
<ul>
|
||
|
||
<li><i>Создать копию (безопасно)</i>: Модуль сохранит сжатые фото в отдельную папку для тестирования.</li>
|
||
|
||
<li><i>Заменять оригиналы</i>: Изображения сжимаются на месте. <b>Сделайте бэкап перед началом!</b></li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li><b>Качество сжатия</b>: Укажите качество для JPG (0-100), PNG (0-9) и WebP.</li>
|
||
|
||
<li><b>Лимиты по габаритам</b>: Автоматическое уменьшение разрешения фото, превышающих лимиты (например, 2000px).</li>
|
||
|
||
<li><b>Индивидуальные правила</b>: Вы можете настроить отдельный уровень сжатия для конкретных папок (например, catalog/banners/).</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
<div class="en-only">
|
||
|
||
<p>The primary panel for compressing original images inside the <code>image/catalog/</code> directory:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Operation Mode</b>:
|
||
|
||
<ul>
|
||
|
||
<li><i>Create copy (Safe)</i>: Retains original files and outputs compressed assets into a custom testing folder.</li>
|
||
|
||
<li><i>Replace originals</i>: Compresses and overrides files on-the-fly. <b>Always backup first!</b></li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li><b>Compression Quality</b>: Adjust quality targets for JPG (0-100), PNG (0-9), and WebP formats.</li>
|
||
|
||
<li><b>Max Dimensions</b>: Automates downscaling of oversized images (e.g., resizing 6000px raw uploads down to 1920px).</li>
|
||
|
||
<li><b>Folder-specific rules</b>: Set custom quality limits for selected folders (like slider banners or brands).</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
<div class="alert-block warning">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path></svg>
|
||
|
||
<div>
|
||
|
||
<span class="ua-only"><b>УВАГА:</b> Стиснення оригіналів замінює вихідні файли у вашому каталозі. Завжди рекомендується провести перший запуск у режимі "Створити копію", перевірити якість компресії, і тільки після цього виконувати заміну.</span>
|
||
|
||
<span class="ru-only"><b>ВНИМАНИЕ:</b> Сжатие оригиналов заменяет файлы на хостинге. Настоятельно рекомендуется первый запуск провести в режиме создания копии, оценить качество, и только потом переходить к замене.</span>
|
||
|
||
<span class="en-only"><b>WARNING:</b> Replacing originals will permanently overwrite your core images. Run a test compile using "Create copy" first to evaluate output weights and visual quality.</span>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- TAB 3 -->
|
||
|
||
<div style="background-color: var(--bg-secondary); border: 1px solid var(--border); padding: 24px; border-radius: 12px;">
|
||
|
||
<h4 style="font-size:16px; font-weight:700; color:var(--accent); margin-bottom:12px;">
|
||
|
||
🧹 Tab 3: <span class="lang-text" data-ua="Очищення невикористовуваних зображень" data-ru="Очистка неиспользуемых изображений" data-en="Junk Cleaner">Очищення невикористовуваних зображень</span>
|
||
|
||
</h4>
|
||
|
||
<div class="ua-only">
|
||
|
||
<p>Цей сканер порівнює фізичні файли на вашому сервері з базою даних сайту (товари, категорії, бренди, банери) та шаблонами тем, знаходячи залишкові файли від видалених товарів чи парсингу:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Звірка з БД</b>: Скануються таблиці продуктів, опцій, категорій, виробників, банерів, а також текстові HTML-описи на наявність тегів <code><img></code>.</li>
|
||
|
||
<li><b>Карантин</b>: Замість видалення файли переносяться у приховану теку. Якщо якийсь файл знадобиться — його можна відновити однією кнопкою.</li>
|
||
|
||
<li><b>Видалення назавжди</b>: Повне очищення сміття для вивільнення максимального дискового простору.</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
<div class="ru-only">
|
||
|
||
<p>Этот сканер сопоставляет физические файлы на хостинге с записями в БД (товары, категории, бренды, баннеры) и шаблонами, находя остаточный мусор от удаленных товаров или некорректного импорта:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Карантин</b>: Безопасное перемещение найденного мусора во временную папку. При необходимости все файлы возвращаются обратно в 1 клик.</li>
|
||
|
||
<li><b>Удаление навсегда</b>: Окончательная очистка диска от мусора.</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
<div class="en-only">
|
||
|
||
<p>An intelligent media scanner that indexes physical files on disk and matches them against database tables and theme code, finding files left behind by deleted products, category edits, or parsing imports:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Database Matching</b>: Cross-checks product images, description html blocks, category assets, and banner layouts.</li>
|
||
|
||
<li><b>Quarantine</b>: Safely moves files to an isolated directory. If a file was flagged by mistake, restore it instantly with one click.</li>
|
||
|
||
<li><b>Permanent Delete</b>: Purges flagged assets, freeing server storage space.</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- TAB 4 -->
|
||
|
||
<div style="background-color: var(--bg-secondary); border: 1px solid var(--border); padding: 24px; border-radius: 12px;">
|
||
|
||
<h4 style="font-size:16px; font-weight:700; color:var(--accent); margin-bottom:12px;">
|
||
|
||
⚡ Tab 4: <span class="lang-text" data-ua="Формати зображень & Захист (WebP, SVG, Fake JPG Guard)" data-ru="Форматы изображений & Защита (WebP, SVG, Fake JPG Guard)" data-en="Image Formats & Protection (WebP, SVG, Fake JPG Guard)">Формати зображень & Захист</span>
|
||
|
||
</h4>
|
||
|
||
<div class="ua-only">
|
||
|
||
<p>Налаштування інтеграції медіаформатів нового покоління та захисту вітрини:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Захист від фейкових JPG (On-the-Fly Fake JPG Guard)</b>: Автоматичний динамічний перехоплювач. Виявляє приховані бінарні PNG-заголовки всередині файлів з розширенням <code>.jpg</code> та виправляє їх на льоту при завантаженні на витрині. Усуває чорний фон у старих версіях систем. Можливість вибору режиму виправлення: конвертувати у JPG з білим фоном або зберегти як прозорий PNG.</li>
|
||
|
||
<li><b>Завантаження SVG/WebP</b>: Дозволяє додавати ці файли через стандартний диспетчер файлів (Filemanager) у адмінці OpenCart (включаючи TrueFileManager).</li>
|
||
|
||
<li><b>On-The-Fly WebP + Lazy Load</b>: Динамічний перехоплювач. Замінює посилання на зображення <code>.jpg</code>/<code>.png</code> на <code>.webp</code> версії безпосередньо при виведенні HTML покупцеві (якщо браузер підтримує WebP). Також автоматично підставляє атрибут відкладеного завантаження <code>loading="lazy"</code>.</li>
|
||
|
||
<li><b>Прогресивний Lazy Load</b>: Додає красивий ефект "розмиття" (blur-up) при завантаженні товарів під час скролу сторінки.</li>
|
||
|
||
<li><b>Заглушка битих картинок</b>: Автоматично замінює неіснуючі файли на вибране зображення-заглушку, рятуючи сітку дизайну сайту.</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
<div class="ru-only">
|
||
|
||
<p>Настройки интеграции медиаформатов нового поколения и защиты витрины:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>Защита от фейковых JPG (On-the-Fly Fake JPG Guard)</b>: Автоматический динамический перехватчик. Однозначно определяет скрытые бинарные PNG-заголовки внутри файлов с расширением <code>.jpg</code> и исправляет их на лету при обращении на витрине, полностью убирая артефакты черных фонов. Переключатель режима: конвертировать в JPG с белым фоном или сохранить прозрачный PNG.</li>
|
||
|
||
<li><b>On-The-Fly WebP + Lazy Load</b>: На лету меняет расширения изображений на <code>.webp</code> в коде страницы и добавляет отложенную загрузку. Не затрагивает базу данных!</li>
|
||
|
||
<li><b>Прогрессивный Lazy Load</b>: Эффект красивого размытия (blur-up) картинок при прокрутке.</li>
|
||
|
||
<li><b>Заглушка битых ссылок</b>: Подставляет красивое изображение вместо отсутствующих на сервере файлов.</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
<div class="en-only">
|
||
|
||
<p>Configs next-gen format delivery and storefront protection features:</p>
|
||
|
||
<ul>
|
||
|
||
<li><b>On-the-Fly Fake JPG Guard</b>: Dynamically detects PNG binary headers hidden inside <code>.jpg</code> file extensions and fixes them on-the-fly when requested by the storefront browser, eliminating black background artifacts. Includes mode selector: convert to white JPG or save as transparent PNG.</li>
|
||
|
||
<li><b>SVG/WebP Upload Support</b>: Unlocks filemanager capabilities (including TrueFileManager) to link vector SVG and WebP assets manually.</li>
|
||
|
||
<li><b>On-The-Fly WebP & Lazy Load</b>: Automatically rewrites storefront HTML response to replace standard <code>.jpg</code>/<code>.png</code> paths with their <code>.webp</code> equivalents on-the-fly, while appending native browser <code>loading="lazy"</code> tags.</li>
|
||
|
||
<li><b>Progressive Lazy Loading</b>: Introduces a beautiful blur-up placeholder effect that fades out smoothly as high-res images load.</li>
|
||
|
||
<li><b>Broken Image Redirects</b>: Redirects failed image file references to a fallback image to prevent design broken cards.</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</section>
|
||
|
||
|
||
|
||
<!-- Pro Utilities Section -->
|
||
|
||
<section id="utilities" class="section">
|
||
|
||
<h3 class="section-title">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Інструменти розробника та оптимізатора (Pro)" data-ru="Инструменты разработчика и оптимизатора (Pro)" data-en="Pro Utilities & Tools">Інструменти розробника та оптимізатора (Pro)</span>
|
||
|
||
</h3>
|
||
|
||
<p class="ua-only">У вкладці <b>"Інструменти (pro)"</b> ви можете вибрати спеціальні утиліти з випадного меню для точкового вирішення проблем з дисковим простором чи базою даних:</p>
|
||
|
||
<p class="ru-only">Во вкладке <b>"Инструменты (pro)"</b> вы можете выбрать специализированные утилиты из выпадающего списка для точечного решения проблем с сайтом:</p>
|
||
|
||
<p class="en-only">Under the <b>"Tools (pro)"</b> tab, select specific backend tools from the dropdown selector to run diagnostic and correction procedures:</p>
|
||
|
||
|
||
|
||
<div class="table-container">
|
||
|
||
<table>
|
||
|
||
<thead>
|
||
|
||
<tr>
|
||
|
||
<th style="width: 220px;"><span class="lang-text" data-ua="Назва інструменту" data-ru="Название инструмента" data-en="Utility Name">Назва інструменту</span></th>
|
||
|
||
<th style="width: 140px;"><span class="lang-text" data-ua="Категорія" data-ru="Категория" data-en="Category">Категорія</span></th>
|
||
|
||
<th><span class="lang-text" data-ua="Опис та функціонал" data-ru="Описание и функционал" data-en="Description & Features">Опис та функціонал</span></th>
|
||
|
||
</tr>
|
||
|
||
</thead>
|
||
|
||
<tbody>
|
||
|
||
<tr>
|
||
|
||
<td><b>broken_db</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Пошук записів у БД (товари, доп. фото, категорії, бренди), для яких відсутній фізичний файл на диску. Дозволяє очистити биті записи або встановити заглушку.</span>
|
||
|
||
<span class="ru-only">Поиск записей в БД (товары, доп. фото, категории, бренды), для которых отсутствует физический файл на диске. Позволяет очистить битые записи или поставить заглушку.</span>
|
||
|
||
<span class="en-only">Finds database records referencing missing image files on disk. Allows clearing broken DB records or assigning fallback placeholders.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>broken_files</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Сканування диску на наявність бінарно пошкоджених чи неповних файлів зображень (0 байт, корумповані заголовочні блоки).</span>
|
||
|
||
<span class="ru-only">Сканирование диска на наличие бинарно поврежденных или неполных файлов изображений (0 байт, битые заголовки).</span>
|
||
|
||
<span class="en-only">Scans disk for binary-corrupted or zero-byte truncated image files that fail GD/Imagick headers.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>empty_folders</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Пошук та автоматичне видалення порожніх директорій всередині <code>image/catalog/</code> для підтримки чистоти файлового дерева.</span>
|
||
|
||
<span class="ru-only">Поиск и автоматическое удаление пустых директорий внутри <code>image/catalog/</code> для поддержания чистоты файлового дерева.</span>
|
||
|
||
<span class="en-only">Finds and safely deletes empty nested folders inside <code>image/catalog/</code> to maintain a clean directory structure.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>folder_tree</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Повний аналіз об'єму та кількості файлів у кожній окремій підпапці каталогу. Допомагає знайти найважчі папки сайту.</span>
|
||
|
||
<span class="ru-only">Полный анализ объема и количества файлов в каждой отдельной подпапке каталога. Помогает найти самые тяжелые папки сайта.</span>
|
||
|
||
<span class="en-only">Deep directory tree breakdown showing total filesize and file counts for every nested catalog folder.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>html_broken</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Пошук битих посилань на зображення в HTML-описах товарів, категорій та статей блогу, які віддають помилку 404.</span>
|
||
|
||
<span class="ru-only">Поиск битых ссылок на изображения в HTML-описаниях товаров, категорий и статей блога, отдающих 404.</span>
|
||
|
||
<span class="en-only">Parses product and category HTML descriptions to locate broken <code><img></code> src paths returning 404.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>small_photos</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Пошук занадто малих/неякісних фотографій товарів (менше заданої ширини/висоти у пікселях, наприклад < 300px).</span>
|
||
|
||
<span class="ru-only">Поиск слишком маленьких/некачественных фотографий товаров (меньше заданной ширины/высоты в пикселях, например < 300px).</span>
|
||
|
||
<span class="en-only">Filters catalog images below configurable pixel dimension thresholds (e.g. height/width under 300px).</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>duplicates</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Пошук дублікатів фотографій на сервері за хеш-сумами вмісту (MD5), незалежно від імені файлу. Дозволяє вивільнити гігабайти дубльованих фото.</span>
|
||
|
||
<span class="ru-only">Поиск дубликатов фотографий на сервере по хэш-суммам содержимого (MD5), независимо от имени файла. Позволяет освободить гигабайты дубликатов.</span>
|
||
|
||
<span class="en-only">Identifies exact duplicate images across catalog directories via content MD5 hashing, regardless of filename.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>heavy_files</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Пошук надзвичайно "важких" оригінальних фотографій (понад вказаний ліміт у КБ, наприклад > 500 КБ або > 2 МБ).</span>
|
||
|
||
<span class="ru-only">Поиск чрезвычайно "тяжелых" оригинальных фотографий (свыше указанного лимита в КБ, например > 500 КБ или > 2 МБ).</span>
|
||
|
||
<span class="en-only">Highlights oversized original images exceeding KB file size thresholds (e.g. raw 5MB+ photo uploads).</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>cmyk</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Виявлення фотографій у друкарському колірному просторі CMYK (які виглядають инвертованими або не відображаються у Safari/iOS) з автоматичним переведенням у sRGB.</span>
|
||
|
||
<span class="ru-only">Обнаружение фотографий в типографском цветовом пространстве CMYK (выглядящих инвертированными или не открывающихся в Safari/iOS) с автоматическим переводом в sRGB.</span>
|
||
|
||
<span class="en-only">Scans for CMYK printing color space images causing discolored/inverted rendering on iOS/Safari, with automated sRGB conversion.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>svg_security</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Сканування та очищення SVG-файлів від потенційно шкідливих JavaScript-скриптів та XSS-ін'єкцій.</span>
|
||
|
||
<span class="ru-only">Сканирование и очистка SVG-файлов от потенциально вредоносных JavaScript-скриптов и XSS-инъекций.</span>
|
||
|
||
<span class="en-only">Audit and sanitization of uploaded SVG files to strip malicious embedded JavaScript and XSS payload tags.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>black_bg</b></td>
|
||
|
||
<td><span class="badge-cat scanner">Сканер</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Сканування фотографій з чорними фоновими рамками після некоректної конвертації PNG у JPG. Включає утиліту Edge-Only Floodfill для відновлення білого фону або збереження прозорого PNG.</span>
|
||
|
||
<span class="ru-only">Сканирование фотографий с черными фоновыми рамками после некорректной конвертации PNG в JPG. Включает утилиту Edge-Only Floodfill для восстановления белого фона или сохранения прозрачного PNG.</span>
|
||
|
||
<span class="en-only">Scans for black background border artifacts from improper PNG-to-JPG conversions. Includes Edge-Only Floodfill to replace borders with white or restore transparent PNG.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>watermark</b></td>
|
||
|
||
<td><span class="badge-cat generator">Генератор</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Пакетне накладення водяних знаків (текст або зображення) на вибіркову групу фотографій товарів або категорій.</span>
|
||
|
||
<span class="ru-only">Пакетное наложение водяных знаков (текст или изображение) на выборочную группу фотографий товаров или категорий.</span>
|
||
|
||
<span class="en-only">Batch watermarking utility for selected catalog image paths using text or graphics overlays.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>placeholders</b></td>
|
||
|
||
<td><span class="badge-cat generator">Генератор</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Пакетне встановлення зображень-заглушок для відсутніх або битих фото товарів у БД.</span>
|
||
|
||
<span class="ru-only">Пакетная установка изображений-заглушек для отсутствующих или битых фото товаров в БД.</span>
|
||
|
||
<span class="en-only">Batch assignment of fallback placeholder images for catalog items missing a physical asset.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>png_jpg</b></td>
|
||
|
||
<td><span class="badge-cat generator">Генератор</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Масове конвертування важких непрозорих PNG-зображень у компактні JPG або WebP файли із заміною посилань в БД.</span>
|
||
|
||
<span class="ru-only">Массовое конвертирование тяжелых непрозрачных PNG-изображений в компактные JPG или WebP файлы с заменой ссылок в БД.</span>
|
||
|
||
<span class="en-only">Converts heavy non-transparent PNG files into lightweight JPG/WebP assets and updates DB table references.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>exif</b></td>
|
||
|
||
<td><span class="badge-cat generator">Генератор</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Очищення службових EXIF-метаданих (геолокація GPS, модель камери, авторство) для додаткового зменшення ваги файлів на 10-15%.</span>
|
||
|
||
<span class="ru-only">Очистка служебных EXIF-метаданных (геолокация GPS, модель камеры, авторство) для дополнительного уменьшения веса файлов на 10-15%.</span>
|
||
|
||
<span class="en-only">Strips technical EXIF metadata (GPS location, camera parameters) to shave an extra 10-15% off file weights.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>smart_cache</b></td>
|
||
|
||
<td><span class="badge-cat generator">Генератор</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Розумне очищення кешу OpenCart <code>image/cache/</code> з можливістю вибіркового вилучення застарілих мініатюр.</span>
|
||
|
||
<span class="ru-only">Умная очистка кэша OpenCart <code>image/cache/</code> с возможностью выборочного удаления устаревших миниатюр.</span>
|
||
|
||
<span class="en-only">Selective purger for expired OpenCart thumbnail cache inside <code>image/cache/</code> without affecting active assets.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>sanitizer</b></td>
|
||
|
||
<td><span class="badge-cat experimental">Експериментальний</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Санітайзер імен файлів: автоматичне очищення шляхів від кирилиці, спецсимволів, пропусків та дублюючих підкреслень з синхронізацією в БД.</span>
|
||
|
||
<span class="ru-only">Санитайзер имен файлов: автоматическая очистка путей от кириллицы, спецсимволов, пробелов и дублирующих подчеркиваний с синхронизацией в БД.</span>
|
||
|
||
<span class="en-only">Filename sanitizer: strips spaces, Cyrillic, and illegal special characters from file paths while auto-updating DB tables.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>translit</b></td>
|
||
|
||
<td><span class="badge-cat experimental">Експериментальний</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Автоматична транслітерація кириличних назв фото у латиницю за стандартом SEO URL.</span>
|
||
|
||
<span class="ru-only">Автоматическая транслитерация кириллических названий фото в латиницу по стандарту SEO URL.</span>
|
||
|
||
<span class="en-only">Automated transliteration of Cyrillic filename strings into clean SEO-friendly Latin characters.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
<tr>
|
||
|
||
<td><b>cache_restore</b></td>
|
||
|
||
<td><span class="badge-cat experimental">Експериментальний</span></td>
|
||
|
||
<td>
|
||
|
||
<span class="ua-only">Відновлення втрачених оригіналів з вищих за роздільною здатністю знімків кешу при випадковому видаленні.</span>
|
||
|
||
<span class="ru-only">Восстановление утерянных оригиналов из снимков кэша с высоким разрешением при случайном удалении.</span>
|
||
|
||
<span class="en-only">Recovery tool for accidentally deleted original files by analyzing and extracting high-resolution cached thumbnails.</span>
|
||
|
||
</td>
|
||
|
||
</tr>
|
||
|
||
</tbody>
|
||
|
||
</table>
|
||
|
||
</div>
|
||
|
||
</section>
|
||
|
||
|
||
|
||
<!-- Cron Automation Section -->
|
||
|
||
<section id="cron" class="section">
|
||
|
||
<h3 class="section-title">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Автоматизація по Cron" data-ru="Автоматизация по Cron" data-en="Cron Automation">Автоматизація по Cron</span>
|
||
|
||
</h3>
|
||
|
||
<p class="ua-only">Для автоматичного регулярного фонового стиснення нових завантажених зображень ви можете налаштувати завдання у планувальнику вашого хостингу (Cron), використовуючи надане посилання:</p>
|
||
|
||
<p class="ru-only">Для автоматического регулярного сжатия новых загружаемых фото в фоновом режиме настройте планировщик задач на вашем хостинге (Cron) с помощью следующей ссылки:</p>
|
||
|
||
<p class="en-only">To automate background scans and optimize new image uploads, configure a cron job on your hosting cPanel using the following command template:</p>
|
||
|
||
|
||
|
||
<div class="code-wrapper">
|
||
|
||
<div class="code-header">
|
||
|
||
<span class="code-lang">Cron URL Command</span>
|
||
|
||
<button class="copy-code-btn" onclick="copyCode(this)">
|
||
|
||
<svg viewBox="0 0 24 24" style="width:12px; height:12px; fill:none; stroke:currentColor; stroke-width:2.5;"><path d="M8 7v8a2 2 0 002 2h6M8 7V5a2 2 0 012-2h4.586a1 1 0 01.707.293l4.414 4.414a1 1 0 01.293.707V15a2 2 0 01-2 2h-2M8 7H6a2 2 0 01-2-2V4"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Копіювати" data-ru="Копировать" data-en="Copy">Копіювати</span>
|
||
|
||
</button>
|
||
|
||
</div>
|
||
|
||
<pre><code>wget -q -O - "https://oc3-demo.nat.od.ua/index.php?route=extension/module/img_opti/cron&key=YOUR_CRON_TOKEN"</code></pre>
|
||
|
||
</div>
|
||
|
||
<p class="ua-only">Замініть <code>YOUR_CRON_TOKEN</code> на секретний токен із вкладки "Крон-завдання". Рекомендований інтервал запуску — раз на добу.</p>
|
||
|
||
<p class="ru-only">Замените <code>YOUR_CRON_TOKEN</code> на секретный токен из вкладки "Крон-задания". Рекомендуемый интервал запуска — раз в сутки.</p>
|
||
|
||
<p class="en-only">Replace <code>YOUR_CRON_TOKEN</code> with the secret token located under your Cron tab. The recommended trigger rate is once per 24 hours.</p>
|
||
|
||
</section>
|
||
|
||
|
||
|
||
<!-- FAQ Section -->
|
||
|
||
<section id="faq" class="section">
|
||
|
||
<h3 class="section-title">
|
||
|
||
<svg viewBox="0 0 24 24"><path d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Часті питання (FAQ)" data-ru="Частые вопросы (FAQ)" data-en="Frequently Asked Questions">Часті питання (FAQ)</span>
|
||
|
||
</h3>
|
||
|
||
|
||
|
||
<!-- FAQ 1 -->
|
||
|
||
<div class="accordion">
|
||
|
||
<button class="accordion-header">
|
||
|
||
<span class="ua-only">Чи погіршується якість зображень при стисненні?</span>
|
||
|
||
<span class="ru-only">Ухудшается ли качество изображений при сжатии?</span>
|
||
|
||
<span class="en-only">Does compression cause visible image quality loss?</span>
|
||
|
||
<svg class="accordion-icon" viewBox="0 0 24 24" style="width:16px; height:16px; fill:none; stroke:currentColor; stroke-width:2.5;"><path d="M19 9l-7 7-7-7"></path></svg>
|
||
|
||
</button>
|
||
|
||
<div class="accordion-content">
|
||
|
||
<div class="accordion-inner">
|
||
|
||
<span class="ua-only">Ні, при оптимальних налаштуваннях компресії (наприклад, 80-85 для JPG та 75-80 для WebP) різницю неозброєним оком помітити неможливо. При цьому вага зображень зменшується в 3-5 разів. Imagick забезпечує чистіші кольори за рахунок правильного sRGB-декодування.</span>
|
||
|
||
<span class="ru-only">Нет, при оптимальных настройках сжатия (например, 80-85 для JPG и 75-80 для WebP) разница незаметна человеческому глазу. При этом вес файла снижается в 3-5 раз. Расширение Imagick работает точнее, сберегая цветовые профили.</span>
|
||
|
||
<span class="en-only">No. At optimal configurations (typically 80-85 quality limit for JPEGs and 75-80 for WebP), visual artifacts are imperceptible to human eyes, while file size decreases by 3-5x. Using the Imagick engine yields cleaner outputs by preserving color matrices.</span>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- FAQ 2 -->
|
||
|
||
<div class="accordion">
|
||
|
||
<button class="accordion-header">
|
||
|
||
<span class="ua-only">Що робить функція Junk Cleaner (Очищення невикористовуваних)?</span>
|
||
|
||
<span class="ru-only">Что делает функция Junk Cleaner (Очистка неиспользуемых)?</span>
|
||
|
||
<span class="en-only">What does the Junk Cleaner feature actually do?</span>
|
||
|
||
<svg class="accordion-icon" viewBox="0 0 24 24" style="width:16px; height:16px; fill:none; stroke:currentColor; stroke-width:2.5;"><path d="M19 9l-7 7-7-7"></path></svg>
|
||
|
||
</button>
|
||
|
||
<div class="accordion-content">
|
||
|
||
<div class="accordion-inner">
|
||
|
||
<span class="ua-only">Вона сканує файлову систему і порівнює її з базою даних сайту. Якщо товар чи категорія були видалені, але зображення залишилися лежати на сервері мертвим вантажем, утиліта знайде їх і дозволить безпечно відправити в карантин або видалити. Це економить гігабайти дискового простору.</span>
|
||
|
||
<span class="ru-only">Она сканирует файловую систему и сверяет ее с базами данных сайта. Если товар или категория были удалены, но файлы изображений остались лежать на сервере мертвым грузом, утилита найдет их и позволит переместить в карантин или стереть, экономя гигабайты места.</span>
|
||
|
||
<span class="en-only">It searches files under your server directory and matches them to your Database rows. If a product or category was deleted, but its image files remain on hosting, the scanner lists them as junk, allowing you to quarantine or clear them.</span>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- FAQ 3 -->
|
||
|
||
<div class="accordion">
|
||
|
||
<button class="accordion-header">
|
||
|
||
<span class="ua-only">Як працює On-The-Fly WebP підміна та Lazy Load?</span>
|
||
|
||
<span class="ru-only">Как работает On-The-Fly WebP подмена и Lazy Load?</span>
|
||
|
||
<span class="en-only">How does On-The-Fly WebP conversion and Lazy Load work?</span>
|
||
|
||
<svg class="accordion-icon" viewBox="0 0 24 24" style="width:16px; height:16px; fill:none; stroke:currentColor; stroke-width:2.5;"><path d="M19 9l-7 7-7-7"></path></svg>
|
||
|
||
</button>
|
||
|
||
<div class="accordion-content">
|
||
|
||
<div class="accordion-inner">
|
||
|
||
<span class="ua-only">Цей механізм перехоплює вихідний HTML-код сайту на рівні контролера OpenCart, шукає посилання на картинки та замінює їх на WebP-копії, якщо вони є на сервері (або створює їх за потреби). Також він додає атрибут <code>loading="lazy"</code> для відкладеного завантаження, що підвищує оцінку Google PageSpeed. База даних не змінюється!</span>
|
||
|
||
<span class="ru-only">Этот механизм перехватывает выходной HTML-код сайта, ищет теги изображений и подменяет расширения на WebP (если файлы созданы). Дополнительно добавляет атрибут <code>loading="lazy"</code> для отложенной загрузки, повышая балл в Google PageSpeed. БД сайта не меняется!</span>
|
||
|
||
<span class="en-only">It intercepts storefront HTML rendering output, searches for image tags, and replaces extension references with WebP copies (generating them if they don't exist yet). It also appends browser-native <code>loading="lazy"</code> parameters, boosting Google PageSpeed index. DB rows remain unmodified.</span>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</section>
|
||
|
||
|
||
|
||
<!-- Ecosystem Section -->
|
||
|
||
<!-- Ecosystem Section -->
|
||
|
||
<section id="ecosystem" class="section">
|
||
|
||
<h3 class="section-title">
|
||
|
||
<svg viewBox="0 0 24 24" style="width:20px; height:20px; fill:none; stroke:currentColor; stroke-width:2.5;"><path d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path></svg>
|
||
|
||
<span class="lang-text" data-ua="Інші модулі серії [NAT]" data-ru="Другие модули серии [NAT]" data-en="Other Modules of [NAT] Series">Інші модулі серії [NAT]</span>
|
||
|
||
</h3>
|
||
|
||
<p style="font-size: 14px; color: var(--text-secondary); margin-bottom: 24px; line-height: 1.6;">
|
||
|
||
<span class="ua-only">Розробки студії <b>[NAT]</b> створені для оптимізації, автоматизації та прискорення інтернет-магазинів на OpenCart. Всі модулі серії [NAT] розроблені за стандартами безпечного коду та мають бездоганну сумісність.</span>
|
||
|
||
<span class="ru-only">Разработки студии <b>[NAT]</b> созданы для оптимизации, автоматизации и ускорения интернет-магазинов на OpenCart. Все модули серии [NAT] разработаны по стандартам безопасного кода и имеют безупречную совместимость.</span>
|
||
|
||
<span class="en-only">Extensions by <b>[NAT]</b> studio are designed to optimize, automate, and accelerate OpenCart web stores. All [NAT] series modules are built according to secure coding standards and offer seamless compatibility.</span>
|
||
|
||
</p>
|
||
|
||
|
||
|
||
<div class="grid-cards" style="margin-bottom: 30px;">
|
||
|
||
<!-- Card 1: Database Optimizer -->
|
||
|
||
<a href="database_optimizer_nat_instruction.html" class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24" style="width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.5;"><ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"></path><path d="M3 12c0 1.66 4 3 9 3s9-1.34 9-3"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Database Optimizer [NAT]</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
<span class="ua-only">Інтелектуальне очищення сміття в базі даних, управління системними логами та додавання критично важливих індексів для прискорення.</span>
|
||
|
||
<span class="ru-only">Интеллектуальная очистка мусора в базе данных, управление системными логами и добавление критически важных индексов для ускорения.</span>
|
||
|
||
<span class="en-only">Intelligent DB garbage cleanup, system log management, and adding critical indexes to speed up the site.</span>
|
||
|
||
</div>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<!-- Card 2: Image Optimizer -->
|
||
|
||
<a href="image_optimizer_nat_instruction.html" class="card active-card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24" style="width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.5;"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><circle cx="8.5" cy="8.5" r="1.5"></circle><polyline points="21 15 16 10 5 21"></polyline></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Image Optimizer [NAT]</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
<span class="ua-only">Стиснення та ресайз ОРИГІНАЛІВ фото (image/catalog) у WebP + Очищення хостингу від невикористовуваних зображень.</span>
|
||
|
||
<span class="ru-only">Сжатие и ресайз ОРИГИНАЛОВ фото (image/catalog) в WebP + Очистка хостинга от неиспользуемых изображений.</span>
|
||
|
||
<span class="en-only">Compression and resizing of ORIGINAL images (image/catalog) to WebP + Cleanup unused images from host.</span>
|
||
|
||
</div>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<!-- Card 3: Catalog Optimizer -->
|
||
|
||
<a href="catalog_optimizer_nat_instruction.html" class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24" style="width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.5;"><path d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"></path><path d="M12 10v4m-2-2h4"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Catalog Optimizer [NAT]</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
<span class="ua-only">Приховування порожніх категорій і брендів + SEO сортування товарів (у наявності зверху) + Очищення сміття БД.</span>
|
||
|
||
<span class="ru-only">Скрытие пустых категорий и брендов + SEO сортировка товаров (в наличии сверху) + Очистка мусора БД.</span>
|
||
|
||
<span class="en-only">Hide empty categories and brands + SEO product sorting (in stock first) + DB garbage cleanup.</span>
|
||
|
||
</div>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<!-- Card 4: Domain Scanner -->
|
||
|
||
<a href="domain_scanner_nat_instruction.html" class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24" style="width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.5;"><circle cx="12" cy="12" r="10"></circle><line x1="2" y1="12" x2="22" y2="12"></line><path d="M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Domain Scanner [NAT]</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
<span class="ua-only">Пошук та чищення зовнішніх посилань та HTTP-картинок у БД та файлах теми. Ідеально для HTTPS або очищення після парсингу.</span>
|
||
|
||
<span class="ru-only">Поиск и чистка внешних ссылок и HTTP-картинок в БД и файлах темы. Идеально для HTTPS или очистки после парсинга.</span>
|
||
|
||
<span class="en-only">Find and clean external links and HTTP images in DB and theme files. Ideal for HTTPS migrations or post-scraping cleanup.</span>
|
||
|
||
</div>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<!-- Card 5: Easy Import/Export -->
|
||
|
||
<a href="easy_import_export_nat_instruction.html" class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24" style="width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.5;"><polyline points="17 1 21 5 17 9"></polyline><line x1="3" y1="5" x2="21" y2="5"></line><polyline points="7 23 3 19 7 15"></polyline><line x1="21" y1="19" x2="3" y2="19"></line></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Easy Import/Export [NAT]</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
<span class="ua-only">Швидкий імпорт/експорт цін та залишків з файлів xls/xlsx/csv/xml/json или за посиланням. Мапінг полів, робота за Cron.</span>
|
||
|
||
<span class="ru-only">Быстрый импорт/экспорт цен и остатков из файлов xls/xlsx/csv/xml/json или по ссылке. Маппинг полей, работа по Cron.</span>
|
||
|
||
<span class="en-only">Fast import/export of prices and stock from xls/xlsx/csv/xml/json files or via link. Field mapping, Cron support.</span>
|
||
|
||
</div>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<!-- Card 6: Admin Tools -->
|
||
|
||
<a href="admin_tools_nat_instruction.html" class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24" style="width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.5;"><path d="M14.7 6.3a1 1 0 000 1.4l1.6 1.6a1 1 0 001.4 0l3.77-3.77a6 6 0 01-7.94 7.94l-6.91 6.91a2.12 2.12 0 01-3-3l6.91-6.91a6 6 0 017.94-7.94l-3.76 3.76z"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Admin Tools [NAT]</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
<span class="ua-only">Незамінний набір інструментів розробника: бекапи прав адміністраторів, аварійний скрипт очищення кешу модифікаторів (Rescue Script), моніторинг працездатності сайтів.</span>
|
||
|
||
<span class="ru-only">Незаменимый набор инструментов разработчика: бэкапы прав администраторов, аварийный скрипт очистки кэша модификаторов (Rescue Script), мониторинг работоспособности сайтов.</span>
|
||
|
||
<span class="en-only">Essential developer toolkit: admin permission backups, emergency modifier cache clearing script (Rescue Script), site status monitoring.</span>
|
||
|
||
</div>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<!-- Card 7: Poll Widget -->
|
||
|
||
<a href="poll_widget_nat_instruction.html" class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24" style="width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.5;"><line x1="18" y1="20" x2="18" y2="10"></line><line x1="12" y1="20" x2="12" y2="4"></line><line x1="6" y1="20" x2="6" y2="14"></line></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Poll Widget [NAT]</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
<span class="ua-only">Прості опитування, голосування та детальна статистика прямо на сторінках вашого магазину. Підвищуйте залученість клієнтів та збирайте зворотний зв'язок.</span>
|
||
|
||
<span class="ru-only">Простые опросы, голосования и детальная статистика прямо на страницах вашего магазина. Повышайте вовлеченность клиентов и собирайте обратную связь.</span>
|
||
|
||
<span class="en-only">Simple polls, voting, and detailed statistics directly on your store pages. Boost customer engagement and collect feedback.</span>
|
||
|
||
</div>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<!-- Card 8: New Arrivals -->
|
||
|
||
<a href="new_arrivals_nat_instruction.html" class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24" style="width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.5;"><rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect><line x1="16" y1="2" x2="16" y2="6"></line><line x1="8" y1="2" x2="8" y2="6"></line><line x1="3" y1="10" x2="21" y2="10"></line></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">New Arrivals [NAT]</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
<span class="ua-only">Автоматична SEO-сторінка новинок. Відображає новинки строго за реальною датою додавання. Слайдери, сітка та розумний сайдбар архіву дат.</span>
|
||
|
||
<span class="ru-only">Автоматическая SEO-страница новинок. Отображает новинки строго по реальной дате добавления. Слайдеры, сетка и умный сайдбар архива дат.</span>
|
||
|
||
<span class="en-only">Automatic SEO page for new products. Displays new arrivals strictly by real addition date. Sliders, grid, and smart sidebar archive.</span>
|
||
|
||
</div>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<!-- Card 9: Order UTM-Tracker -->
|
||
|
||
<a href="order_utm_tracker_nat_instruction.html" class="card">
|
||
|
||
<div class="card-icon">
|
||
|
||
<svg viewBox="0 0 24 24" style="width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.5;"><circle cx="12" cy="12" r="10"></circle><path d="M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z"></path><path d="M2 12h20"></path></svg>
|
||
|
||
</div>
|
||
|
||
<h4 class="card-title">Order UTM-Tracker [NAT]</h4>
|
||
|
||
<div class="card-desc">
|
||
|
||
<span class="ua-only">Перехоплення, збереження та аналіз UTM-меток, реферерів і посадочних сторінок у замовленнях. Моделі атрибуції First/Last click, GeoIP-визначення та статистика джерел.</span>
|
||
|
||
<span class="ru-only">Перехват, сохранение и анализ UTM-меток, рефереров и посадочных страниц в заказах. Модели атрибуции First/Last click, GeoIP-определение и статистика источников.</span>
|
||
|
||
<span class="en-only">Capture, store, and analyze UTM tags, referrers, and landing pages inside orders. First/Last click attribution models, GeoIP lookup, and acquisition stats.</span>
|
||
|
||
</div>
|
||
|
||
</a>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<!-- Developer Profiles Links -->
|
||
|
||
<div style="background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.05), rgba(59, 130, 246, 0.05)); border: 1px solid rgba(var(--accent-rgb), 0.2); border-radius: 12px; padding: 24px; text-align: center; box-shadow: 0 4px 6px var(--shadow);">
|
||
|
||
<h4 style="font-size: 16px; font-weight: 800; color: var(--text-primary); margin-bottom: 12px;">
|
||
|
||
<span class="lang-text" data-ua="Всі наші модулі на торгових майданчиках" data-ru="Все наши модули на торговых площадках" data-en="All our extensions on marketplaces">Всі наші модулі на торгових майданчиках</span>
|
||
|
||
</h4>
|
||
|
||
<p style="font-size: 13.5px; color: var(--text-secondary); margin-bottom: 20px; line-height: 1.6; max-width: 600px; margin-left: auto; margin-right: auto;">
|
||
|
||
<span class="ua-only">Перегляньте повний список наших рішень для OpenCart на офіційних майданчиках. Регулярні оновлення та професійна технічна підтримка студії <b>[NAT]</b>.</span>
|
||
|
||
<span class="ru-only">Посмотрите полный список наших решений для OpenCart на официальных площадках. Регулярные обновления и профессиональная техническая поддержка студии <b>[NAT]</b>.</span>
|
||
|
||
<span class="en-only">Check the full catalog of our OpenCart extensions on the official marketplaces. Regular updates and professional tech support from <b>[NAT]</b> studio.</span>
|
||
|
||
</p>
|
||
|
||
<div style="display: flex; flex-wrap: wrap; gap: 16px; justify-content: center; align-items: center;">
|
||
|
||
<a href="https://opencartforum.com/files/developer/725443-nertyod/" target="_blank" style="background-color: var(--accent); color: #0b0f19; font-weight: 700; text-decoration: none; padding: 12px 24px; border-radius: 8px; font-size: 14px; display: flex; align-items: center; gap: 8px; transition: background-color 0.2s ease;">
|
||
|
||
<span>💬</span>
|
||
|
||
<span>OpenCartForum.com</span>
|
||
|
||
</a>
|
||
|
||
<a href="https://www.opencart.com/index.php?route=marketplace/extension&filter_member=nat.odua" target="_blank" style="background-color: var(--bg-tertiary); color: var(--text-primary); border: 1px solid var(--border); font-weight: 600; text-decoration: none; padding: 12px 24px; border-radius: 8px; font-size: 14px; display: flex; align-items: center; gap: 8px; transition: all 0.2s ease;">
|
||
|
||
<span>🛒</span>
|
||
|
||
<span>OpenCart.com</span>
|
||
|
||
</a>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</section>
|
||
|
||
|
||
|
||
|
||
<!-- Bottom Support Block -->
|
||
<div class="bottom-support-box" style="background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.08), rgba(59, 130, 246, 0.08)); border: 1px solid rgba(var(--accent-rgb), 0.25); border-radius: 12px; padding: 24px; margin-top: 40px; margin-bottom: 40px; box-shadow: 0 4px 15px var(--shadow);">
|
||
<div style="display: flex; align-items: flex-start; gap: 16px;">
|
||
<div style="background-color: rgba(var(--accent-rgb), 0.15); padding: 12px; border-radius: 10px; color: var(--accent); flex-shrink: 0;">
|
||
<svg viewBox="0 0 24 24" style="width: 24px; height: 24px; fill: none; stroke: currentColor; stroke-width: 2.5;"><path d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path></svg>
|
||
</div>
|
||
<div>
|
||
<h4 style="font-size: 16px; font-weight: 800; color: var(--text-primary); margin-bottom: 6px;" class="lang-text" data-ua="Підтримка та зворотній зв'язок" data-ru="Поддержка и обратная связь" data-en="Support & Feedback">Підтримка та зворотній зв'язок</h4>
|
||
<p style="font-size: 13.5px; color: var(--text-secondary); margin-bottom: 12px; line-height: 1.6;" class="ua-only">Якщо у вас виникли запитання, потрібна допомога в установці чи додаткові функції, будь ласка, звертайтесь на нашу електронну пошту:</p>
|
||
<p style="font-size: 13.5px; color: var(--text-secondary); margin-bottom: 12px; line-height: 1.6;" class="ru-only">Если у вас возникли вопросы, нужна помощь в установке или доработке модуля, пожалуйста, обращайтесь на нашу электронную почту:</p>
|
||
<p style="font-size: 13.5px; color: var(--text-secondary); margin-bottom: 12px; line-height: 1.6;" class="en-only">If you have any questions, need installation assistance or custom modifications, please contact us via email:</p>
|
||
<a href="mailto:info@nat.od.ua" style="color: var(--accent); text-decoration: none; font-weight: 700; font-size: 14.5px; display: inline-flex; align-items: center; gap: 6px; transition: color 0.2s ease;">
|
||
info@nat.od.ua
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</main>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<script>
|
||
|
||
// LANGUAGE SWITCHER LOGIC
|
||
|
||
const langBtns = document.querySelectorAll('.lang-btn');
|
||
|
||
|
||
|
||
function setLanguage(lang) {
|
||
|
||
document.body.className = document.body.className.replace(/lang-\w+/g, '');
|
||
|
||
document.body.classList.add('lang-' + lang);
|
||
|
||
|
||
|
||
langBtns.forEach(btn => {
|
||
|
||
if (btn.getAttribute('data-lang') === lang) {
|
||
|
||
btn.classList.add('active');
|
||
|
||
} else {
|
||
|
||
btn.classList.remove('active');
|
||
|
||
}
|
||
|
||
});
|
||
|
||
|
||
|
||
// Update generic text elements
|
||
|
||
document.querySelectorAll('.lang-text').forEach(el => {
|
||
|
||
const text = el.getAttribute('data-' + lang);
|
||
|
||
if (text) el.innerHTML = text;
|
||
|
||
});
|
||
|
||
|
||
|
||
localStorage.setItem('img_opti_inst_lang', lang);
|
||
|
||
}
|
||
|
||
|
||
|
||
langBtns.forEach(btn => {
|
||
|
||
btn.addEventListener('click', () => {
|
||
|
||
setLanguage(btn.getAttribute('data-lang'));
|
||
|
||
});
|
||
|
||
});
|
||
|
||
|
||
|
||
// Theme Toggle Logic
|
||
|
||
const themeToggleBtn = document.getElementById('theme-toggle');
|
||
|
||
|
||
|
||
function toggleTheme() {
|
||
|
||
document.body.classList.toggle('light-theme');
|
||
|
||
const isLight = document.body.classList.contains('light-theme');
|
||
|
||
localStorage.setItem('img_opti_inst_theme', isLight ? 'light' : 'dark');
|
||
|
||
}
|
||
|
||
|
||
|
||
themeToggleBtn.addEventListener('click', toggleTheme);
|
||
|
||
|
||
|
||
// Initialize Language and Theme from localStorage
|
||
|
||
const savedLang = localStorage.getItem('img_opti_inst_lang') || 'ua';
|
||
|
||
setLanguage(savedLang);
|
||
|
||
|
||
|
||
const savedTheme = localStorage.getItem('img_opti_inst_theme');
|
||
|
||
if (savedTheme === 'light') {
|
||
|
||
document.body.classList.add('light-theme');
|
||
|
||
}
|
||
|
||
|
||
|
||
// ScrollSpy Logic to update active sidebar links
|
||
|
||
const sections = document.querySelectorAll('.section');
|
||
|
||
const navLinks = document.querySelectorAll('.nav-link');
|
||
|
||
let isScrolling = false;
|
||
|
||
let scrollTimeout;
|
||
|
||
|
||
|
||
// Custom click handler for navigation links to set active state instantly
|
||
|
||
navLinks.forEach(link => {
|
||
|
||
link.addEventListener('click', (e) => {
|
||
|
||
const targetId = link.getAttribute('href');
|
||
|
||
if (targetId.startsWith('#')) {
|
||
|
||
isScrolling = true;
|
||
|
||
clearTimeout(scrollTimeout);
|
||
|
||
|
||
|
||
navLinks.forEach(l => l.classList.remove('active'));
|
||
|
||
link.classList.add('active');
|
||
|
||
|
||
|
||
scrollTimeout = setTimeout(() => {
|
||
|
||
isScrolling = false;
|
||
|
||
}, 1000);
|
||
|
||
}
|
||
|
||
});
|
||
|
||
});
|
||
|
||
|
||
|
||
window.addEventListener('scroll', () => {
|
||
|
||
if (isScrolling) return;
|
||
|
||
|
||
|
||
let current = '';
|
||
|
||
|
||
|
||
// Auto-highlight the last section if scrolled to the absolute bottom of the page
|
||
|
||
if ((window.innerHeight + window.window.scrollY) >= document.documentElement.scrollHeight - 25) {
|
||
|
||
if (sections.length > 0) {
|
||
|
||
current = sections[sections.length - 1].getAttribute('id');
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
sections.forEach(section => {
|
||
|
||
const sectionTop = section.offsetTop;
|
||
|
||
if (window.scrollY >= (sectionTop - 150)) {
|
||
|
||
current = section.getAttribute('id');
|
||
|
||
}
|
||
|
||
});
|
||
|
||
}
|
||
|
||
|
||
|
||
navLinks.forEach(link => {
|
||
|
||
link.classList.remove('active');
|
||
|
||
if (link.getAttribute('href') === '#' + current) {
|
||
|
||
link.classList.add('active');
|
||
|
||
}
|
||
|
||
});
|
||
|
||
});
|
||
|
||
|
||
|
||
// Collapsible Accordion Logic
|
||
|
||
const accordions = document.querySelectorAll('.accordion');
|
||
|
||
|
||
|
||
accordions.forEach(acc => {
|
||
|
||
const header = acc.querySelector('.accordion-header');
|
||
|
||
const content = acc.querySelector('.accordion-content');
|
||
|
||
|
||
|
||
header.addEventListener('click', () => {
|
||
|
||
const isActive = acc.classList.contains('active');
|
||
|
||
|
||
|
||
// Close all first
|
||
|
||
accordions.forEach(item => {
|
||
|
||
item.classList.remove('active');
|
||
|
||
item.querySelector('.accordion-content').style.maxHeight = null;
|
||
|
||
});
|
||
|
||
|
||
|
||
if (!isActive) {
|
||
|
||
acc.classList.add('active');
|
||
|
||
content.style.maxHeight = content.scrollHeight + "px";
|
||
|
||
}
|
||
|
||
});
|
||
|
||
});
|
||
|
||
|
||
|
||
// Copy to clipboard utility
|
||
|
||
function copyCode(button) {
|
||
|
||
const pre = button.closest('.code-wrapper').querySelector('pre code');
|
||
|
||
const text = pre.textContent;
|
||
|
||
|
||
|
||
navigator.clipboard.writeText(text).then(() => {
|
||
|
||
const span = button.querySelector('span');
|
||
|
||
const originalText = span.innerHTML;
|
||
|
||
|
||
|
||
const activeLang = document.body.className.match(/lang-(\w+)/)[1] || 'ua';
|
||
|
||
const copiedMsgs = {
|
||
|
||
ua: 'Скопійовано!',
|
||
|
||
ru: 'Скопировано!',
|
||
|
||
en: 'Copied!'
|
||
|
||
};
|
||
|
||
|
||
|
||
span.innerHTML = copiedMsgs[activeLang];
|
||
|
||
button.style.color = 'var(--success)';
|
||
|
||
|
||
|
||
setTimeout(() => {
|
||
|
||
span.innerHTML = originalText;
|
||
|
||
button.style.color = 'var(--text-secondary)';
|
||
|
||
}, 2000);
|
||
|
||
});
|
||
|
||
}
|
||
|
||
|
||
|
||
// Mobile Menu Toggle
|
||
|
||
const menuToggle = document.getElementById('menu-toggle');
|
||
|
||
const sidebar = document.getElementById('sidebar');
|
||
|
||
const overlay = document.getElementById('sidebar-overlay');
|
||
|
||
|
||
|
||
function toggleMobileMenu() {
|
||
|
||
sidebar.classList.toggle('open');
|
||
|
||
overlay.classList.toggle('open');
|
||
|
||
}
|
||
|
||
|
||
|
||
menuToggle.addEventListener('click', toggleMobileMenu);
|
||
|
||
overlay.addEventListener('click', toggleMobileMenu);
|
||
|
||
|
||
|
||
// Close sidebar on link click (mobile)
|
||
|
||
navLinks.forEach(link => {
|
||
|
||
link.addEventListener('click', () => {
|
||
|
||
if (window.innerWidth <= 1024) {
|
||
|
||
toggleMobileMenu();
|
||
|
||
}
|
||
|
||
});
|
||
|
||
});
|
||
|
||
</script>
|
||
|
||
</body>
|
||
|
||
</html>
|
||
|
||
|