PageSourceSearch

https://www.zinzenwine.com/custom/page/about

html zinzenwine.com collected 2026-09-24 11:31:58 UTC 167,648 bytes, 2,622 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en" dir="ltr">
3
4<head>
5    <!-- Meta Tags -->
6    <meta charset="UTF-8">
7    <meta http-equiv="X-UA-Compatible" content="IE=edge">
8    <meta name="viewport" content="width=device-width, initial-scale=1.0">
9
10    <title>About - Zin Zen Wine Bistro - 6841 Virginia Parkway, McKinney TX, USA - YourFoodOnline</title>
11<meta name="description" content="
12  2006
13    Our Story
14      Est. 2006 • Adriatica Village • McKinney, TX
15      A Quaint Area 
16          Nestled on 45 Acres
17        Zin Zen Wine Bist...">
18<meta name="keywords" content="Zin Zen Wine Bistro, zinzenwine.town.club, YourFoodOnline, Zin Zen Wine Bistro, zinzenwine.town.club, YourFoodOnline">
19<meta name="author" content="YourFoodOnline">
20<link rel="canonical" href="https://www.zinzenwine.com/custom/page/about">
21    <meta property="og:title" content="About - Zin Zen Wine Bistro - 6841 Virginia Parkway, McKinney TX, USA - YourFoodOnline">
22<meta property="og:description" content="Located in the heart of McKinney’s Adriatica Village, Zin Zen is a premier wine bar and culinary destination. We pair a curated selection of 80+ global wines with a relaxing atmosphere and chef-inspired dishes to help you find your Zen, one pour at a time.">
23<meta property="og:site_name" content="YourFoodOnline">
24<meta property="og:image" content="https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f">
25
26    
26<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Zin Zen Wine Bistro - 6841 Virginia Parkway, McKinney TX, USA - YourFoodOnline","description":"Located in the heart of McKinney’s Adriatica Village, Zin Zen is a premier wine bar and culinary destination. We pair a curated selection of 80+ global wines with a relaxing atmosphere and chef-inspired dishes to help you find your Zen, one pour at a time.","image":"https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f"}</script>
26
27
28    <meta name="csrf-token" content="QUAY7qp3f9vxznTgECZV7rSPGioc1ts6bDtSsma9">
29                                                <link rel="icon"   type="image/x-icon"  href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_qf1dZJw1Jhx6omp.ico?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=d313793b03c9cbb3b9dc4e10649856f2ace6a2282f876ab8568f776741e8a1fa">
30                                                <link rel="shortcut icon"   type="image/x-icon"  href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_qf1dZJw1Jhx6omp.ico?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=d313793b03c9cbb3b9dc4e10649856f2ace6a2282f876ab8568f776741e8a1fa">
31                                                <link rel="icon"  sizes="16x16"   type="image/png"  href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_kCYrqglffPJm20D.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=1b3f75230e95c5439290dceedda9851c0b29e3b3dc026d9809ac23ead7ae85b4">
32                                                <link rel="icon"  sizes="32x32"   type="image/png"  href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_2IIDBkMMqA7qR0J.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=6ce8681e0901774a3c18a05ed1b9eb31fab9b90c4df3c7ec18f32545079f5008">
33                                                <link rel="icon"  sizes="96x96"   type="image/png"  href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_fwthANiL76sv5HR.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=626fce3c98950f5614f3319aac21248339a88d0757e3c487412aeddfb8689cf4">
34                                                <link rel="apple-touch-icon"  sizes="57x57"   href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_YPOvk30nCO3soxG.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=0d4e9f4725d3b66680c92db92f7b4fe81a5cdef36fbaafeb67298d7596cf4256">
35                                                <link rel="apple-touch-icon"  sizes="60x60"   href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_xno0QAuBBsj0Yg3.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=19ddb80371a30e639920566b49b2dd06cc7adf544c6c409bc0cd6462f6bcb93f">
36                                                <link rel="apple-touch-icon"  sizes="72x72"   href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_CoiJHyzCnYiJzs7.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=c8fc0df4403a82704fb6e708b17f29686fcb2427ce87c4807dbfa206a97235ce">
37                                                <link rel="apple-touch-icon"  sizes="76x76"   href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_wuP7XYWpZDdGhdF.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=d5145c1c6760eb0946db1508ea840a667dff7029b43d5233ff2ba3b7e437bcc5">
38                                                <link rel="apple-touch-icon"  sizes="114x114"   href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_K6w8yaW6FewfV96.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=0db7a9e4f40f39de28d2d6a4876bb17cd9d4aaf1768d4c48a3f2291dd33dcf29">
39                                                <link rel="apple-touch-icon"  sizes="120x120"   href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_FYukSOzRysNZ1np.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=4e22a44db1c01ad8e23e00c7a7d6ca24a8baccb1333cf92406ecdb5da3b104bd">
40                                                <link rel="apple-touch-icon"  sizes="144x144"   href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_ZBBOuPunEIFN87z.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=0b6b69891b545114627e5b19ca5a857a91f819f8fa3ca818ed10b762cf69e9c2">
41                                                <link rel="apple-touch-icon"  sizes="152x152"   href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_wf8SS1mSOZZHrmy.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=afadfc38c4c58f37031514c6d24e28bfa6f667308865bdfda9f7a3c262ceeb26">
42                                                <link rel="apple-touch-icon"  sizes="180x180"   href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_nGhh4zqO8zFqBew.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=d95c584194f06a0b8254f6a98f10e85dff4fa84ce2c1eac2d7c314d9cdd83daf">
43                                                <link rel="icon"  sizes="192x192"   type="image/png"  href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_A79AWE6u1KPL9wt.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=8ebbe1b9b3d27502cf7fe2c0f8c615b8db6c293a4597173c0de1cad893264cf0">
44                                                <link rel="icon"  sizes="512x512"   type="image/png"  href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_HsotL9TDaGYCCZu.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=75bdcb80861008dfcdf7154eacfa3aef4e9c1532dbe27dda092f7828ec70bdeb">
45                                        <meta name="msapplication-TileImage" content="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_fRCbNhn1Kzst6f9.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=6ae0ae461e5a7297dfa3e48e85538fb4244f93acde7ddcbd1a02b6fdaa1f4c42">
46            
47    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/bootstrap.min.css">
48    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/font-awesome.css">
49    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/animate.css">
50    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/magnific-popup.css">
51    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/meanmenu.css">
52    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/swiper-bundle.min.css">
53    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/nice-select.css">
54    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/main.css">
55    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/style.css">
56    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/custom.css?v=1790249518">
57
58            <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/custom-desktop.css?v=1790249518">
59    
60
61
62    <style>
63        :root {
64            --text: #990100;
65            --theme: #2c3e50;
66            --header: #2c3e50;
67            --theme2: #009444;
68            --theme3: #c5a065;
69            --border: #2c3c50;
70            --body: #f9f8f4;
71            --white: #2c3e50;
72            --input: #FFFFFF;
73            --lightcontrast: #ffffff;
74            --darkcontrast: #2c3c50;
75        }
76        .form-control { background-color: var(--input) !important; }
77        .food-category-section { background-color: var(--body); }
78        .shop-list-items { background-color: var(--body); border: 1px solid var(--border); }
79        .nav .nav-link { color: var(--text) !important; font-weight: bold !important;     font-size: 23px !important;}
80        .food-product-wrapper.style-two .nav .nav-link.active::before{ bottom: 0px !important;}
81        .mobile-header-btn{ border: 1px solid var(--theme) !important;}
82
83
84        .mobile-bottom-nav {
85            margin-bottom: 10px;
86            margin-right: -10px;
87            margin-left: 10px;
88            border-radius: 25px;
89            width: calc(100% - 20px);
90        }
91
92    </style>
93            
94            <style>
95            * { box-sizing: border-box; } body {margin: 0;}.main-content{text-align:inherit !important;padding-top:20px !important;padding-bottom:0px !important;width:100vw !important;max-width:none !important;margin-left:calc(50% - 50vw) !important;margin-right:calc(50% - 50vw) !important;overflow-x:hidden !important;overflow-y:hidden !important;margin-top:-8.5em !important;margin-bottom:-8rem !important;position:relative !important;}.dynamic-page-section .page-content-rendered h1, .dynamic-page-section .page-content-rendered h2, .dynamic-page-section .page-content-rendered h3, .dynamic-page-section .page-content-rendered h4, .dynamic-page-section .page-content-rendered h5, .dynamic-page-section .page-content-rendered h6{margin-top:0px !important;color:inherit !important;}.dynamic-page-section .page-content-rendered img{max-width:100% !important;height:100% !important;}#i6szl{text-align:center;margin-bottom:5rem;}#ikq7r{margin-bottom:6rem;}#ixq9f{margin-top:15px;padding:0.8rem 1.5rem;font-size:0.7rem;}#ioqvv{margin-top:15px;padding:0.8rem 1.5rem;font-size:0.7rem;}#i7jng{margin-top:15px;padding:0.8rem 1.5rem;font-size:0.7rem;}#ic53a{margin-top:3rem;font-size:0.75rem;letter-spacing:2px;opacity:0.5;text-transform:uppercase;}#idvq3{color:var(--bg-cream);text-decoration:none;}#i4f5ao{text-align:center;margin-bottom:4rem;}#isrrfv{color:#fff !important;}
95#i1zhln{color:#fff !important;}#ibv0n5{color:#fff !important;}#igr2ei{color:#fff !important;}#iodfzb{color:#fff !important;}#i6ai0g{color:#fff !important;}#ilktbf{color:#fff !important;}#i76b7g{color:#fff !important;}#imvi4i{color:#fff !important;}#iml34r{color:#fff !important;}#ihdtvj{color:#fff !important;}#igwhp7{text-decoration:none !important;}#ibt598{text-align:center;margin-bottom:4rem;}
96        </style>
97        
98    <style>
99        .dynamic-page-section .page-content-rendered img {
100            max-width: 100%;
101            height: auto;
102            border-radius: 0.25rem;
103            margin-top: 1rem;
104            margin-bottom: 1rem;
105            display: block; /* Para centrar con margin auto si es necesario */
106        }
107        .dynamic-page-section .page-content-rendered h1,
108        .dynamic-page-section .page-content-rendered h2,
109        .dynamic-page-section .page-content-rendered h3,
110        .dynamic-page-section .page-content-rendered h4,
111        .dynamic-page-section .page-content-rendered h5,
112        .dynamic-page-section .page-content-rendered h6 {
113            margin-top: 1.5em; /* Espacio antes de los encabezados */
114            margin-bottom: 0.5em;
115            color: var(--header, #333); /* Usar variable de color del tema o un fallback */
116            font-weight: 600;
117        }
118        .dynamic-page-section .page-content-rendered p {
119            line-height: 1.7;
120            margin-bottom: 1em;
121        }
122        .dynamic-page-section .page-content-rendered ul,
123        .dynamic-page-section .page-content-rendered ol {
124            margin-bottom: 1em;
125            padding-left: 2em; /* Estándar para listas */
126        }
127        .dynamic-page-section .page-content-rendered li {
128            margin-bottom: 0.5em;
129        }
130        .dynamic-page-section .page-content-rendered blockquote {
131            border-left: 4px solid var(--theme, #007bff);
132            padding: 0.5em 1em;
133            margin: 1em 0;
134            font-style: italic;
135            color: #555;
136            background-color: #f9f9f9;
137        }
138        .dynamic-page-section .page-content-rendered a {
139            color: var(--theme, #007bff);
140            text-decoration: underline;
141        }
142        .dynamic-page-section .page-content-rendered a:hover {
143            color: ብዙውን(var(--theme, #007bff), 20%); /* Oscurecer el color del tema en hover */
144        }
145        /* Asegurar que el contenido del editor tenga algún padding si es necesario */
146        .page-content-rendered {
147            padding-top: 1rem;
148            padding-bottom: 1rem;
149        }
150    </style>
151
152
153    <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/tc/menu_product_modal.css">
154
155
156</head>
157
158<body>
159
160    <style>
161    html.tc-privacy-lock,
162    html.tc-privacy-lock body {
163        overflow: hidden;
164    }
165
166    .tc-privacy-consent-screen *,
167    .tc-privacy-backdrop * {
168        box-sizing: border-box;
169        letter-spacing: 0 !important;
170    }
171
172    .tc-privacy-hidden {
173        display: none !important;
174    }
175
176    .tc-privacy-consent-screen {
177        position: fixed;
178        z-index: 2147483001;
179        isolation: isolate;
180        right: 0;
181        bottom: 0;
182        left: 0;
183        display: flex;
184        align-items: flex-end;
185        justify-content: center;
186        padding: 16px;
187        background: rgba(15, 23, 42, 0.58);
188        backdrop-filter: blur(5px);
189        -webkit-backdrop-filter: blur(5px);
190        color: #1c2539;
191        font-family: inherit;
192        pointer-events: auto;
193    }
194
195    .tc-privacy-card {
196        position: relative;
197        z-index: 1;
198        display: grid;
199        grid-template-columns: minmax(0, 1fr) auto;
200        gap: 16px;
201        align-items: center;
202        width: min(1120px, 100%);
203        overflow: hidden;
204        border: 1px solid rgba(28, 37, 57, 0.14);
205        border-top: 4px solid var(--theme, #20c7d6);
206        border-radius: 8px;
207        background: #fff;
208        box-shadow: 0 18px 52px rgba(15, 23, 42, 0.22);
209        pointer-events: auto;
210    }
211
212    .tc-privacy-card:focus {
213        outline: 3px solid rgba(32, 199, 214, 0.22);
214        outline-offset: 2px;
215    }
216
217    .tc-privacy-card__body {
218        padding: 18px 20px;
219    }
220
221    .tc-privacy-card__footer {
222        display: flex;
223        align-items: center;
224        justify-content: flex-end;
225        gap: 12px;
226        padding: 18px 20px 18px 0;
227    }
228
229    .tc-privacy-card__eyebrow {
230        display: inline-flex;
231        align-items: center;
232        gap: 8px;
233        margin-bottom: 8px;
234        color: var(--theme, #20c7d6);
235        font-size: 11px !important;
236        font-weight: 800;
237        letter-spacing: 0;
238        line-height: 1;
239        text-transform: uppercase;
240    }
241
242    .tc-privacy-card__mark {
243        width: 10px;
244        height: 10px;
245        border-radius: 50%;
246        background: var(--theme, #20c7d6);
247        box-shadow: 0 0 0 5px rgba(32, 199, 214, 0.14);
248    }
249
250    .tc-privacy-banner__title,
251    .tc-privacy-modal__title {
252        margin: 0 0 5px !important;
253        color: var(--header, #1c2539) !important;
254        font-family: inherit !important;
255        font-size: 18px !important;
256        font-weight: 800;
257        line-height: 1.2 !important;
258        text-transform: none !important;
259    }
260
261    .tc-privacy-banner__copy,
262    .tc-privacy-modal__copy {
263        margin: 0 !important;
264        color: #617085;
265        font-size: 13px !important;
266        line-height: 1.45;
267        text-transform: none !important;
268    }
269
270    .tc-privacy-banner__copy {
271        max-width: 760px;
272    }
273
274    .tc-privacy-summary {
275        display: flex;
276        flex-wrap: wrap;
277        gap: 8px;
278        margin: 12px 0 0;
279        padding: 0;
280        list-style: none;
281    }
282
283    .tc-privacy-summary li {
284        display: inline-flex;
285        align-items: center;
286        gap: 6px;
287        max-width: 100%;
288        padding: 6px 9px;
289        border: 1px solid rgba(28, 37, 57, 0.08);
290        border-radius: 6px;
291        background: #f8fafc;
292    }
293
294    .tc-privacy-summary__check {
295        display: inline-flex;
296        align-items: center;
297        justify-content: center;
298        width: 18px;
299        height: 18px;
300        border-radius: 50%;
301        background: #edf5ff;
302        color: var(--theme, #20c7d6);
303        font-size: 11px !important;
304        font-weight: 800;
305        line-height: 1;
306        flex: 0 0 auto;
307    }
308
309    .tc-privacy-summary strong {
310        display: inline;
311        color: #1c2539;
312        font-size: 12px !important;
313        font-weight: 800;
314        line-height: 1.2;
315    }
316
317    .tc-privacy-summary span {
318        display: inline;
319    }
320
321    .tc-privacy-summary span span {
322        display: none;
323    }
324
325    .tc-privacy-banner__actions {
326        display: grid;
327        grid-template-columns: 1fr;
328        gap: 8px;
329        width: 220px;
330    }
331
332    .tc-privacy-modal__actions {
333        display: flex;
334        align-items: center;
335        flex-wrap: wrap;
336        justify-content: flex-end;
337        gap: 10px;
338    }
339
340    .tc-privacy-btn {
341        display: inline-flex;
342        align-items: center;
343        justify-content: center;
344        min-height: 38px;
345        padding: 0 16px;
346        border: 1px solid var(--theme, #20c7d6);
347        border-radius: 6px;
348        background: #fff;
349        color: var(--theme, #20c7d6);
350        font-family: inherit !important;
351        font-size: 13px !important;
352        font-weight: 800;
353        line-height: 1;
354        text-decoration: none;
355        text-transform: none !important;
356        cursor: pointer;
357        transition: opacity 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
358        white-space: nowrap;
359    }
360
361    .tc-privacy-btn:hover,
362    .tc-privacy-link:hover {
363        opacity: 0.88;
364    }
365
366    .tc-privacy-btn:focus-visible,
367    .tc-privacy-link:focus-visible,
368    .tc-privacy-tab:focus-visible,
369    .tc-privacy-modal__close:focus-visible {
370        outline: 3px solid rgba(32, 199, 214, 0.22);
371        outline-offset: 2px;
372    }
373
374    .tc-privacy-btn:active {
375        transform: translateY(1px);
376    }
377
378    .tc-privacy-btn:disabled {
379        cursor: wait;
380        opacity: 0.62;
381        transform: none;
382    }
383
384    .tc-privacy-btn--primary {
385        border-color: var(--header, #1c2539);
386        background: var(--header, #1c2539);
387        color: #fff;
388    }
389
390    .tc-privacy-btn--dark {
391        border-color: var(--header, #1c2539);
392        background: var(--header, #1c2539);
393        color: #fff;
394    }
395
396    .tc-privacy-btn--muted {
397        border-color: rgba(28, 37, 57, 0.16);
398        color: #526176;
399    }
400
401    .tc-privacy-link {
402        border: 0;
403        background: transparent;
404        color: var(--theme, #20c7d6);
405        font: inherit !important;
406        font-size: 12px !important;
407        font-weight: 800;
408        line-height: 1.25;
409        text-decoration: underline;
410        text-underline-offset: 2px;
411        text-transform: none !important;
412        cursor: pointer;
413    }
414
415    .tc-privacy-backdrop {
416        position: fixed;
417        inset: 0;
418        z-index: 2147483001;
419        display: flex;
420        align-items: center;
421        justify-content: center;
422        padding: 18px;
423        background: rgba(15, 23, 42, 0.58);
424        backdrop-filter: blur(5px);
425    }
426
427    .tc-privacy-modal {
428        position: relative;
429        display: flex;
430        flex-direction: column;
431        width: min(880px, 100%);
432        max-height: calc(100vh - 36px);
433        overflow: hidden;
434        border-radius: 8px;
435        background: #fff;
436        box-shadow: 0 18px 56px rgba(28, 37, 57, 0.28);
437    }
438
439    .tc-privacy-modal:focus {
440        outline: 3px solid rgba(40, 120, 255, 0.28);
441        outline-offset: 3px;
442    }
443
444    .tc-privacy-modal__close {
445        position: absolute;
446        top: 16px;
447        right: 16px;
448        display: inline-flex;
449        align-items: center;
450        justify-content: center;
451        width: 34px;
452        height: 34px;
453        border: 1px solid rgba(28, 37, 57, 0.12);
454        border-radius: 6px;
455        background: #fff;
456        color: #617085;
457        font-size: 22px;
458        line-height: 1;
459        cursor: pointer;
460    }
461
462    .tc-privacy-modal__header,
463    .tc-privacy-modal__footer {
464        padding: 20px 24px;
465    }
466
467    .tc-privacy-modal__header {
468        padding-right: 62px;
469        border-bottom: 1px solid rgba(28, 37, 57, 0.1);
470    }
471
472    .tc-privacy-modal__tabs {
473        display: grid;
474        grid-template-columns: repeat(3, minmax(0, 1fr));
475        border-bottom: 1px solid rgba(28, 37, 57, 0.1);
476        background: #f8fafc;
477    }
478
479    .tc-privacy-tab {
480        min-height: 48px;
481        border: 0;
482        border-right: 1px solid rgba(28, 37, 57, 0.08);
483        border-bottom: 3px solid transparent;
484        background: transparent;
485        color: #617085;
486        font: inherit !important;
487        font-size: 13px !important;
488        font-weight: 800;
489        text-transform: none !important;
490        cursor: pointer;
491    }
492
493    .tc-privacy-tab:last-child {
494        border-right: 0;
495    }
496
497    .tc-privacy-tab[aria-selected="true"] {
498        border-bottom-color: var(--theme, #20c7d6);
499        color: var(--header, #1c2539);
500        background: #fff;
501    }
502
503    .tc-privacy-modal__body {
504        overflow: auto;
505        padding: 22px 24px;
506    }
507
508    .tc-privacy-panel[hidden] {
509        display: none !important;
510    }
511
512    .tc-privacy-panel__lead {
513        margin: 0 0 16px !important;
514        color: #526176;
515        font-size: 14px !important;
516        line-height: 1.5;
517    }
518
519    .tc-privacy-about-list {
520        display: grid;
521        gap: 10px;
522        margin: 16px 0 0;
523        padding: 0;
524        list-style: none;
525    }
526
527    .tc-privacy-about-list a {
528        color: var(--theme, #20c7d6);
529        font-weight: 800;
530    }
531
532    .tc-privacy-modal__footer {
533        display: flex;
534        align-items: center;
535        flex-wrap: wrap;
536        justify-content: space-between;
537        gap: 12px;
538        border-top: 1px solid rgba(28, 37, 57, 0.1);
539        background: #fff;
540    }
541
542    .tc-privacy-option {
543        display: grid;
544        grid-template-columns: minmax(0, 1fr) auto;
545        gap: 16px;
546        align-items: start;
547        padding: 16px 0;
548        border-bottom: 1px solid rgba(28, 37, 57, 0.08);
549    }
550
551    .tc-privacy-option:last-child {
552        border-bottom: 0;
553    }
554
555    .tc-privacy-option input {
556        position: relative;
557        width: 44px;
558        height: 24px;
559        margin: 0;
560        border: 0;
561        border-radius: 999px;
562        appearance: none;
563        background: #d7dde5;
564        cursor: pointer;
565        transition: background 0.15s ease, opacity 0.15s ease;
566        flex: 0 0 auto;
567    }
568
569    .tc-privacy-option input::before {
570        position: absolute;
571        top: 3px;
572        left: 3px;
573        width: 18px;
574        height: 18px;
575        border-radius: 50%;
576        background: #fff;
577        box-shadow: 0 1px 4px rgba(15, 23, 42, 0.18);
578        content: "";
579        transition: transform 0.15s ease;
580    }
581
582    .tc-privacy-option input:checked {
583        background: var(--theme, #20c7d6);
584    }
585
586    .tc-privacy-option input:checked::before {
587        transform: translateX(20px);
588    }
589
590    .tc-privacy-option input:disabled {
591        cursor: not-allowed;
592        opacity: 0.62;
593    }
594
595    .tc-privacy-option strong {
596        display: block;
597        margin-bottom: 3px;
598        color: #1c2539;
599        font-size: 14px !important;
600    }
601
602    .tc-privacy-option span {
603        display: block;
604        color: #617085;
605        font-size: 13px !important;
606        line-height: 1.45;
607    }
608
609    .tc-privacy-gpc {
610        margin-top: 14px;
611        padding: 12px 14px;
612        border: 1px solid rgba(32, 199, 214, 0.22);
613        border-radius: 6px;
614        background: rgba(32, 199, 214, 0.08);
615        color: #335078;
616        font-size: 13px !important;
617        line-height: 1.45;
618    }
619
620    @media (max-width: 760px) {
621        .tc-privacy-consent-screen {
622            padding: 10px;
623        }
624
625        .tc-privacy-card {
626            grid-template-columns: 1fr;
627            gap: 0;
628        }
629
630        .tc-privacy-card__body {
631            padding: 16px;
632        }
633
634        .tc-privacy-card__footer {
635            align-items: stretch;
636            flex-direction: column;
637            padding: 0 16px 16px;
638        }
639
640        .tc-privacy-banner__actions {
641            width: 100%;
642        }
643
644        .tc-privacy-backdrop {
645            align-items: flex-start;
646            padding: 12px;
647            overflow: auto;
648        }
649
650        .tc-privacy-modal__actions {
651            justify-content: stretch;
652            min-width: 0;
653        }
654
655        .tc-privacy-btn {
656            flex: 1 1 auto;
657        }
658
659        .tc-privacy-modal__footer {
660            align-items: stretch;
661            flex-direction: column;
662        }
663
664        .tc-privacy-modal__header,
665        .tc-privacy-modal__body,
666        .tc-privacy-modal__footer {
667            padding-right: 16px;
668            padding-left: 16px;
669        }
670
671        .tc-privacy-modal__header {
672            padding-right: 58px;
673        }
674
675        .tc-privacy-modal__tabs {
676            grid-template-columns: 1fr;
677        }
678
679        .tc-privacy-tab {
680            border-right: 0;
681        }
682
683        .tc-privacy-option {
684            grid-template-columns: minmax(0, 1fr);
685        }
686    }
687</style>
688
689<script>
690    window.TC_PRIVACY_CONFIG = {
691        version: 1,
692        privacyUrl: "https:\/\/www.town.club\/privacy",
693        consentUrl: "\/privacy\/consent",
694        scripts: {"head":"","bodyStart":"","bodyEnd":"PHNjcmlwdD4NCihmdW5jdGlvbigpIHsNCiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3p6LXNhZmUtc3R5bGVzJykpIHJldHVybjsNCg0KICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICBzdHlsZS5pZCA9ICd6ei1zYWZlLXN0eWxlcyc7DQogICAgc3R5bGUuaW5uZXJIVE1MID0gYA0KICAgICAgICBAaW1wb3J0IHVybCgnaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1Db3Jtb3JhbnQrR2FyYW1vbmQ6d2dodEA2MDA7NzAwJmZhbWlseT1Nb250c2VycmF0OndnaHRANDAwOzUwMDs2MDA7NzAwJmRpc3BsYXk9c3dhcCcpOw0KICAgICAgICBAaW1wb3J0IHVybCgnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9ib290c3RyYXAtaWNvbnNAMS4xMS4zL2ZvbnQvYm9vdHN0cmFwLWljb25zLm1pbi5jc3MnKTsNCg0KICAgICAgICA6cm9vdCB7DQogICAgICAgICAgICAtLXp6LXBsdW06ICM0OTBEMzQgIWltcG9ydGFudDsNCiAgICAgICAgICAgIC0tenotZ3JlZW46ICMwMDk0NDQgIWltcG9ydGFudDsNCiAgICAgICAgICAgIC0tenotcmVkOiAjOUExQjJGICFpbXBvcnRhbnQ7DQogICAgICAgICAgICAtLXp6LXJlZC1ob3ZlcjogIzdhMTUyNSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgLS16ei1nb2xkOiAjYzVhMDY1ICFpbXBvcnRhbnQ7DQogICAgICAgICAgICAtLXp6LXNsYXRlOiAjMkMzRTUwICFpbXBvcnRhbnQ7DQogICAgICAgICAgICAtLXp6LWRhcmstc2xhdGU6ICMxYTI1MmYgIWltcG9ydGFudDsNCiAgICAgICAgICAgIC0tenotbGlnaHQ6ICNmZmZmZmYgIWltcG9ydGFudDsNCiAgICAgICAgICAgIC0tenotaGVhZC1mb250OiAnQ29ybW9yYW50IEdhcmFtb25kJywgc2VyaWYgIWltcG9ydGFudDsNCiAgICAgICAgICAgIC0tenotYm9keS1mb250OiAnTW9udHNlcnJhdCcsIHNhbnMtc2VyaWYgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KDQogICAgICAgICNidXNpbmVzc1NlbGVjdG9yTW9kYWwsIC5tb2RhbC1iYWNrZHJvcCB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgb3BhY2l0eTogMCAhaW1wb3J0YW50OyBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50OyB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsgfQ0KICAgICAgICBib2R5Lm1vZGFsLW9wZW4geyBvdmVyZmxvdy15OiBhdXRvICFpbXBvcnRhbnQ7IHBhZGRpbmctcmlnaHQ6IDAgIWltcG9ydGFudDsgfQ0KDQogICAgICAgIEBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgew0KICAgICAgICAgICAgaGVhZGVyI2hlYWRlci1zdGlja3ksIC5oZWFkZXItdG9wLCAuaGVhZGVyLXRvcC02LCAjaGVhZGVyLW1pZGRsZS1zZWN0aW9uLCBmb290ZXIuZm9vdGVyLXNlY3Rpb24sIC5mb290ZXItYm90dG9tLCAubW9iaWxlLWhlYWRlciwgLm1vYmlsZS1ib3R0b20tbmF2IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9DQogICAgICAgICAgICAjenotdG9wLWJhciwgI3p6LWN1c3RvbS1oZWFkZXIsICN6ei1jdXN0b20tZm9vdGVyIHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQ0KICAgICAgICAgICAgYm9keSB7IHBhZGRpbmctdG9wOiAxMzBweCAhaW1wb3J0YW50OyB9DQogICAgICAgIH0NCg0KICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHsNCiAgICAgICAgICAgICN6ei10b3AtYmFyLCAjenotY3VzdG9tLWhlYWRlciwgI3p6LWN1c3RvbS1mb290ZXIgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIGhlYWRlciNoZWFkZXItc3RpY2t5LCAuaGVhZGVyLXRvcCwgLmhlYWRlci10b3AtNiwgI2hlYWRlci1taWRkbGUtc2VjdGlvbiwgLm1vYmlsZS1oZWFkZXIsIC5tb2JpbGUtYm90dG9tLW5hdiB7IGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsgdmlzaWJpbGl0eTogdmlzaWJsZSAhaW1wb3J0YW50OyBvcGFjaXR5OiAxICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIGZvb3Rlci5mb290ZXItc2VjdGlvbiwgLmZvb3Rlci1ib3R0b20geyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfQ0KICAgICAgICB9DQoNCiAgICAgICAgI3p6LXRvcC1iYXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tenotcGx1bSkgIWltcG9ydGFudDsNCiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS16ei1saWdodCkgIWltcG9ydGFudDsNCiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS16ei1ib2R5LWZvbnQpICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBmb250LXNpemU6IDEzcHggIWltcG9ydGFudDsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggNXZ3ICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHRvcDogMCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgbGVmdDogMCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHotaW5kZXg6IDk5OTkgIWltcG9ydGFudDsNCiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMSkgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KICAgICAgICAuenotdG9wLWlubmVyIHsNCiAgICAgICAgICAgIG1heC13aWR0aDogMTMwMHB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogMCBhdXRvICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50OyBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7DQogICAgICAgIH0NCiAgICAgICAgLnp6LXRvcC1jb250YWN0IHsgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OyBnYXA6IDI0cHggIWltcG9ydGFudDsgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei10b3AtY29udGFjdCBhIHsNCiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS16ei1saWdodCkgIWltcG9ydGFudDsgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IGFsaWduLWl0ZW
6941zOiBjZW50ZXIgIWltcG9ydGFudDsgZ2FwOiA4cHggIWltcG9ydGFudDsNCiAgICAgICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuM3MgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KICAgICAgICAuenotdG9wLWNvbnRhY3QgYTpob3ZlciB7IGNvbG9yOiB2YXIoLS16ei1nb2xkKSAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei10b3AtY29udGFjdCBpIHsgY29sb3I6IHZhcigtLXp6LWdyZWVuKSAhaW1wb3J0YW50OyBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsgfQ0KDQogICAgICAgICN6ei1jdXN0b20taGVhZGVyIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU3RUIgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgdG9wOiA0MHB4ICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBsZWZ0OiAwICFpbXBvcnRhbnQ7DQogICAgICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgei1pbmRleDogOTk5OCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXp6LWJvZHktZm9udCkgIWltcG9ydGFudDsNCiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDIwcHggcmdiYSg0NCw2Miw4MCwwLjA4KSAhaW1wb3J0YW50Ow0KICAgICAgICB9DQogICAgICAgIC56ei1oLWlubmVyIHsNCiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnQ7IGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDEycHggNXZ3ICFpbXBvcnRhbnQ7IG1heC13aWR0aDogMTMwMHB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogMCBhdXRvICFpbXBvcnRhbnQ7DQogICAgICAgIH0NCiAgICAgICAgLnp6LWJyYW5kIGltZyB7DQogICAgICAgICAgICBtYXgtaGVpZ2h0OiA2MHB4ICFpbXBvcnRhbnQ7IHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7IG9iamVjdC1maXQ6IGNvbnRhaW4gIWltcG9ydGFudDsNCiAgICAgICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2UgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KICAgICAgICAuenotYnJhbmQgaW1nOmhvdmVyIHsgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KSAhaW1wb3J0YW50OyB9DQoNCiAgICAgICAgLnp6LW5hdi1saW5rcyB7IGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsgZ2FwOiAzMHB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogMCAhaW1wb3J0YW50OyBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7IGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDsgbGlzdC1zdHlsZTogbm9uZSAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1uYXYtbGluayB7DQogICAgICAgICAgICBjb2xvcjogdmFyKC0tenotc2xhdGUpICFpbXBvcnRhbnQ7IGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDsgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7DQogICAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlICFpbXBvcnRhbnQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDFweCAhaW1wb3J0YW50OyB0cmFuc2l0aW9uOiBjb2xvciAwLjNzICFpbXBvcnRhbnQ7IHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OyBwYWRkaW5nOiA1cHggMCAhaW1wb3J0YW50Ow0KICAgICAgICB9DQogICAgICAgIC56ei1uYXYtbGluazpob3ZlciwgLnp6LW5hdi1saW5rLmFjdGl2ZSB7IGNvbG9yOiB2YXIoLS16ei1yZWQpICFpbXBvcnRhbnQ7IH0NCg0KICAgICAgICAuenotbmF2LWFjdGlvbnMgeyBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDsgZ2FwOiAyMHB4ICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLnp6LWNhcnQgeyBmb250LXNpemU6IDIycHggIWltcG9ydGFudDsgY29sb3I6IHZhcigtLXp6LXNsYXRlKSAhaW1wb3J0YW50OyB0cmFuc2l0aW9uOiBjb2xvciAwLjNzICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLnp6LWNhcnQ6aG92ZXIgeyBjb2xvcjogdmFyKC0tenotcmVkKSAhaW1wb3J0YW50OyB9DQogICAgICAgIA0KICAgICAgICAuenotYnRuLWN0YSB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS16ei1yZWQpICFpbXBvcnRhbnQ7IGNvbG9yOiB2YXIoLS16ei1saWdodCkgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDEycHggMjRweCAhaW1wb3J0YW50OyBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDsgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2UgIWltcG9ydGFudDsNCiAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAxLjVweCAhaW1wb3J0YW50OyB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZSAhaW1wb3J0YW50OyBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsgY3Vyc29yOiBwb2ludGVyICFpbXBvcnRhbnQ7DQogICAgICAgIH0NCiAgICAgICAgLnp6LWJ0bi1jdGE6aG92ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tenotcmVkLWhvdmVyKSAhaW1wb3J0YW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgI3p6LWN1c3RvbS1mb290ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tenotc2xhdGUpICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBwYWRkaW5nOiA3MHB4IDV2dyAwICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBmb250LWZhbWlseTogdmFyKC0tenotYm9keS1mb250KSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgY29sb3I6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgYm9yZGVyLXRvcDogNXB4IHNvbGlkIHZhcigtLXp6LWdyZWVuKSAhaW1wb3J0YW50Ow0KICAgICAgICB9DQogICAgICAgIC56ei1mb290ZXItd3JhcCB7IG1heC13aWR0aDogMTIwMHB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogMCBhdXRvICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgDQogICAgICAgIC56ei1mLWJhbm5lciB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDMpICFpbXBvcnRhbnQ7IGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50OyBwYWRkaW5nOiAyNXB4ICFpbXBvcnRhbnQ7IHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiA1MHB4ICFpbXBvcnRhbnQ7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wNikgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KICAgICAgICAuenotZi1iYW5uZXIgaDMgew0KICAgICAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXp6LWhlYWQtZm9udCkgIWltcG9ydGFudDsgZm9udC1zaXplOiAyOHB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogMCAhaW1wb3J0YW50OyBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7IGxldHRlci1zcGFjaW5nOiAxcHggIWltcG9ydGFudDsgY29sb3I6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50Ow0KICAgICAgICB9DQogICAgICAgIC5keW5hbWljLXdpbmUtdGV4dCB7IHRyYW5zaXRpb246IG9wYWNpdHkgMC4yNXMgZWFzZS1pbi1vdXQgIWltcG9ydGFudDsgY29sb3I6IHZhcigtLXp6LWdvbGQpICFpbXBvcnRhbnQ7IGZvbnQtc3R5bGU6IGl0YWxpYyAhaW1wb3J0YW50OyB9DQoNCiAgICAgICAgLnp6LWZvb3Rlci1ncmlkIHsNCiAgICAgICAgICAgIGRpc3BsYXk6IGdyaWQgIWltcG9ydGFudDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNDBweCwgMWZyKSkgIWltcG9ydGFudDsgZ2FwOiA0MHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1ib3R0b206IDUwcHggIWltcG9ydGFudDsNCiAgICAgICAgfQ0KDQogICAgICAgIC56ei1mLWJyYW5kLXRpdGxlIHsgZm9udC1mYW1pbHk6IHZhcigtLXp6LWhlYWQtZm9udCkgIWltcG9ydGFudDsgZm9udC1zaXplOiAzMnB4ICFpbXBvcnRhbnQ7IGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDsgY29sb3I6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiAxNXB4ICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLnp6LWYtZGVzYyB7IGZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50OyBsaW5lLWhlaWdodDogMS43ICFpbXBvcnRhbnQ7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNzUpICFpbXBvcnRhbnQ7IG1hcmdpbjogMCAhaW1wb3J0YW50O30NCiAgICAgICAgDQogICAgICAgIC56ei1mLWNvbCBoNCB7DQogICAgICAgICAgICBmb250LWZhbWlseTogdmFyKC0tenotaGVhZC1mb250KSAhaW1wb3J0YW50OyBmb250LXdlaWdodDogNzAwICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogMjJweCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgY29sb3I6IHZhcigtLXp6LWdyZWVuKSAhaW1wb3J0YW50OyBtYXJnaW46IDAgMCAyMHB4IDAgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KICAgICAgICAuenotZi1jb2wgdWwgeyBsaXN0LXN0eWxlOiBub25lICFpbXBvcnRhbnQ7IHBhZGRpbmc6IDAgIWltcG9ydGFudDsgbWFyZ2luOiAwICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLnp6LWYtY29sIGxpIHsgbWFyZ2luLWJvdHRvbTogMTBweCAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1mLWNvbCBhIHsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC44KSAhaW1wb3J0YW50OyB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgdHJhbnNpdGlvbjogY29sb3IgMC4zcyAhaW
6941wb3J0YW50OyBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDt9DQogICAgICAgIC56ei1mLWNvbCBhOmhvdmVyIHsgY29sb3I6IHZhcigtLXp6LWdvbGQpICFpbXBvcnRhbnQ7IH0NCg0KICAgICAgICAuenotZi1ob3Vycy1yb3cgeyBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50OyBwYWRkaW5nLWJvdHRvbTogNHB4ICFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMDUpICFpbXBvcnRhbnQ7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuOCkgIWltcG9ydGFudDsgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1ib3R0b206IDhweCAhaW1wb3J0YW50O30NCiAgICAgICAgLnp6LWYtaG91cnMtcm93IHNwYW46bGFzdC1jaGlsZCB7IGNvbG9yOiB2YXIoLS16ei1saWdodCkgIWltcG9ydGFudDsgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50OyB9DQoNCiAgICAgICAgLnp6LW5sLWZvcm0geyBwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDsgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1ubC1mb3JtIGlucHV0IHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgcGFkZGluZzogMTRweCAyMHB4ICFpbXBvcnRhbnQ7IGJhY2tncm91bmQ6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50OyBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50OyBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7IGNvbG9yOiB2YXIoLS16ei1zbGF0ZSkgIWltcG9ydGFudDsgcGFkZGluZy1yaWdodDogODBweCAhaW1wb3J0YW50OyBmb250LWZhbWlseTogdmFyKC0tenotYm9keS1mb250KSAhaW1wb3J0YW50O30NCiAgICAgICAgLnp6LW5sLWZvcm0gYnV0dG9uIHsgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7IHJpZ2h0OiA1cHggIWltcG9ydGFudDsgdG9wOiA1cHggIWltcG9ydGFudDsgYm90dG9tOiA1cHggIWltcG9ydGFudDsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tenotcmVkKSAhaW1wb3J0YW50OyBjb2xvcjogdmFyKC0tenotbGlnaHQpICFpbXBvcnRhbnQ7IGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OyBwYWRkaW5nOiAwIDE2cHggIWltcG9ydGFudDsgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50OyBmb250LXNpemU6IDEzcHggIWltcG9ydGFudDsgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7IGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50OyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnMgIWltcG9ydGFudDsgfQ0KICAgICAgICAuenotbmwtZm9ybSBidXR0b246aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS16ei1yZWQtaG92ZXIpICFpbXBvcnRhbnQ7IH0NCg0KICAgICAgICAuenotbG93ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS16ei1kYXJrLXNsYXRlKSAhaW1wb3J0YW50OyBwYWRkaW5nOiAyNXB4IDAgIWltcG9ydGFudDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wNSkgIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQ0KICAgICAgICAuenotbG93ZXItaW5uZXIgeyBtYXgtd2lkdGg6IDEyMDBweCAhaW1wb3J0YW50OyBtYXJnaW46IDAgYXV0byAhaW1wb3J0YW50OyBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50OyBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7IGZsZXgtd3JhcDogd3JhcCAhaW1wb3J0YW50OyBnYXA6IDIwcHggIWltcG9ydGFudDsgcGFkZGluZzogMCAyMHB4ICFpbXBvcnRhbnQ7fQ0KICAgICAgICAuenotY29weXJpZ2h0IHsgZm9udC1zaXplOiAxM3B4ICFpbXBvcnRhbnQ7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgIWltcG9ydGFudDsgbWFyZ2luOiAwICFpbXBvcnRhbnQ7fQ0KICAgICAgICAuenotY29weXJpZ2h0IGEgeyBjb2xvcjogdmFyKC0tenotZ29sZCkgIWltcG9ydGFudDsgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgDQogICAgICAgIC56ei1jb21wbGlhbmNlIHsgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OyBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7IGdhcDogMTVweCAhaW1wb3J0YW50OyBsaXN0LXN0eWxlOiBub25lICFpbXBvcnRhbnQ7IG1hcmdpbjogMCAhaW1wb3J0YW50OyBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7IGZsZXgtd3JhcDogd3JhcCAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1jb21wbGlhbmNlIGJ1dHRvbiwgLnp6LWNvbXBsaWFuY2UgYSB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OyBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgIWltcG9ydGFudDsgZm9udC1mYW1pbHk6IHZhcigtLXp6LWJvZHktZm9udCkgIWltcG9ydGFudDsgZm9udC1zaXplOiAxM3B4ICFpbXBvcnRhbnQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyBjdXJzb3I6IHBvaW50ZXIgIWltcG9ydGFudDsgdHJhbnNpdGlvbjogY29sb3IgMC4zcyAhaW1wb3J0YW50O30NCiAgICAgICAgLnp6LWNvbXBsaWFuY2UgYnV0dG9uOmhvdmVyLCAuenotY29tcGxpYW5jZSBhOmhvdmVyIHsgY29sb3I6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1jb21wbGlhbmNlIC5zZXBhcmF0b3IgeyBtYXJnaW46IDAgIWltcG9ydGFudDsgb3BhY2l0eTogMC41ICFpbXBvcnRhbnQ7IH0NCg0KICAgICAgICAuenotc29jaWFscyB7IGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsgZ2FwOiAxNXB4ICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogMThweCAhaW1wb3J0YW50O30NCiAgICAgICAgLnp6LXNvY2lhbHMgYSB7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNikgIWltcG9ydGFudDsgdHJhbnNpdGlvbjogY29sb3IgMC4zcyAhaW
6941wb3J0YW50O30NCiAgICAgICAgLnp6LXNvY2lhbHMgYTpob3ZlciB7IGNvbG9yOiB2YXIoLS16ei1saWdodCkgIWltcG9ydGFudDt9DQoNCiAgICAgICAgLnp6LXBvd2VyZWQgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDsgd2lkdGg6IDkwcHggIWltcG9ydGFudDsgb3BhY2l0eTogMC44ICFpbXBvcnRhbnQ7IHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1wb3dlcmVkIGltZyB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IGhlaWdodDogYXV0byAhaW1wb3J0YW50OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLnp6LXBvd2VyZWQ6aG92ZXIgeyBvcGFjaXR5OiAxICFpbXBvcnRhbnQ7IH0NCg0KICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogMTAyNHB4KSB7DQogICAgICAgICAgICAuenotZm9vdGVyLWdyaWQgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgIWltcG9ydGFudDsgfQ0KICAgICAgICB9DQogICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgew0KICAgICAgICAgICAgLnp6LWZvb3Rlci1ncmlkIHsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgIWltcG9ydGFudDsgZ2FwOiA0MHB4ICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIC56ei1sb3dlci1pbm5lciB7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4gIWltcG9ydGFudDsgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7IGp1c3RpZnktY29udGVudDogY2VudGVyICFpbXBvcnRhbnQ7fQ0KICAgICAgICAgICAgLnp6LWNvbXBsaWFuY2UgeyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50OyB9DQogICAgICAgIH0NCiAgICBgOw0KICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOw0KDQogICAgZnVuY3Rpb24gYnVpbGRVSSgpIHsNCiAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5KSByZXR1cm47DQoNCiAgICAgICAgY29uc3QgT1VSX0lEUyA9IG5ldyBTZXQoWyd6ei10b3AtYmFyJywgJ3p6LWN1c3RvbS1oZWFkZXInLCAnenotY3VzdG9tLWZvb3RlciddKTsNCiAgICAgICAgY29uc3QgS0lMTF9TRUxFQ1RPUlMgPSBbJyNidXNpbmVzc1NlbGVjdG9yTW9kYWwnLCAnLm1vZGFsLWJhY2tkcm9wJ107DQoNCiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID49IDk5Mikgew0KICAgICAgICAgICAgS0lMTF9TRUxFQ1RPUlMucHVzaCgnLmhlYWRlci10b3AnLCAnLmhlYWRlci10b3AtNicsICcjaGVhZGVyLW1pZGRsZS1zZWN0aW9uJywgJyNoZWFkZXItc3RpY2t5JywgJ2Zvb3Rlci5mb290ZXItc2VjdGlvbicsICcuZm9vdGVyLXNlY3Rpb246bm90KC5keW5hbWljLXBhZ2Utc2VjdGlvbiknLCAnLmZvb3Rlci1ib3R0b20nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIG51a2Uocm9vdCkgew0KICAgICAgICAgICAgaWYoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGFsLW9wZW4nKSkgew0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpOw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJzsNCiAgICAgICAgICAgICAgICBkb2
694N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgS0lMTF9TRUxFQ1RPUlMuZm9yRWFjaChzZWwgPT4gew0KICAgICAgICAgICAgICAgIChyb290ID09PSBkb2N1bWVudCA\/IGRvY3VtZW50IDogcm9vdCkucXVlcnlTZWxlY3RvckFsbChzZWwpLmZvckVhY2goZWwgPT4gew0KICAgICAgICAgICAgICAgICAgICBpZiAoIU9VUl9JRFMuaGFzKGVsLmlkKSkgZWwucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3QgIT09IGRvY3VtZW50ICYmIHJvb3QubWF0Y2hlcyAmJiByb290Lm1hdGNoZXMoc2VsKSAmJiAhT1VSX0lEUy5oYXMocm9vdC5pZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHt9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+PSA5OTIpIHsNCiAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4td3JhcHBlcicpOw0KICAgICAgICAgICAgICAgIGlmICh3cmFwcGVyKSB7DQogICAgICAgICAgICAgICAgICAgIHdyYXBwZXIucXVlcnlTZWxlY3RvckFsbCgnaGVhZGVyLCBmb290ZXInKS5mb3JFYWNoKGVsID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT1VSX0lEUy5oYXMoZWwuaWQpKSBlbC5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgbnVrZShkb2N1bWVudCk7DQogICAgICAgIGNvbnN0IG9icyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG0gPT4gbS5mb3JFYWNoKG11ID0+IG11LmFkZGVkTm9kZXMuZm9yRWFjaChuID0+IHsgaWYgKG4ubm9kZVR5cGUgPT09IDEpIG51a2Uobik7IH0pKSk7DQogICAgICAgIG9icy5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KDQogICAgICAgIGxldCBzd2VlcENvdW50ID0gMDsNCiAgICAgICAgY29uc3QgZmFzdEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gew0KICAgICAgICAgICAgbnVrZShkb2N1bWVudCk7DQogICAgICAgICAgICBzd2VlcENvdW50Kys7DQogICAgICAgICAgICBpZiAoc3dlZXBDb3VudCA+PSA1MCkgeyBjbGVhckludGVydmFsKGZhc3RJbnRlcnZhbCk7IG9icy5kaXNjb25uZWN0KCk7IH0NCiAgICAgICAgfSwgMjAwKTsNCg0KICAgICAgICBjb25zdCBsb2dvVXJsID0gJ2h0dHBzOi8vdG93bi1wdWJsaWMuczMuYW1hem9uYXdzLmNvbS96aW56ZW53aW5lL3ppbnplbndpbmUud2VicCc7DQogICAgICAgIGNvbnN0IGN1cnJlbnREeW5hbWljWWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTsNCiAgICAgICAgY29uc3QgYmFzZVVybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47DQogICAgICAgIGNvbnN0IGNzcmZUb2tlbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT0iY3NyZi10b2tlbiJdJyk\/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9Il90b2tlbiJdJyk\/LnZhbHVlIHx8ICcnOw0KDQogICAgICAgIGNvbnN0IG5hdkxpbmtzID0gWw0KICAgICAgICAgICAgeyB0ZXh0OiAnSG9tZScsICAgIGhyZWY6IGAke2Jhc2VVcmx9YCB9LA0KICAgICAgICAgICAgeyB0ZXh0OiAnTWVudScsICAgIGhyZWY6IGAke2Jhc2VVcmx9L21gIH0sDQogICAgICAgICAgICB7IHRleHQ6ICdBYm91dCcsICAgaHJlZjogYCR7YmFzZVVybH0vY3VzdG9tL3BhZ2UvYWJvdXRgIH0sDQogICAgICAgICAgICB7IHRleHQ6ICdDbHViJywgICAgaHJlZjogYCR7YmFzZVVybH0vY3VzdG9tL3BhZ2UvY2x1YmAgfSwNCiAgICAgICAgICAgIHsgdGV4dDogJ0V2ZW50cycsICBocmVmOiBgJHtiYXNlVXJsfS9jdXN0b20vcGFnZS9ldmVudHNgIH0sDQogICAgICAgICAgICB7IHRleHQ6ICdDb250YWN0JywgaHJlZjogYCR7YmFzZVVybH0vY3VzdG9tL3BhZ2UvY29udGFjdGAgfQ0KICAgICAgICBdOw0KDQogICAgICAgIGNvbnN0IGN1c3RvbVRvcEJhckhUTUwgPSBgDQogICAgICAgICAgICA8ZGl2IGlkPSJ6ei10b3AtYmFyIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei10b3AtaW5uZXIiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei10b3AtY29udGFjdCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iYmkgYmktZ2VvLWFsdC1maWxsIj48L2k+IDY4NDEgVmlyZ2luaWEgUGFya3dheSwgTWNLaW5uZXkgVFgsIFVTQTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inp6LXRvcC1jb250YWN0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InRlbDo5NzI1NDc0NjIwIj48aSBjbGFzcz0iYmkgYmktdGVsZXBob25lLWZpbGwiPjwvaT4gKDk3MikgNTQ3LTQ2MjA8L2E+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIGA7DQoNCiAgICAgICAgY29uc3QgY3VzdG9tSGVhZGVySFRNTCA9IGANCiAgICAgICAgICAgIDxuYXYgaWQ9Inp6LWN1c3RvbS1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inp6LWgtaW5uZXIiPg0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIke2Jhc2VVcmx9IiBjbGFzcz0ienotYnJhbmQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IiR7bG9nb1VybH0iIGFsdD0iWmluIFplbiBXaW5lIEJpc3RybyI+DQogICAgICAgICAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJ6ei1uYXYtbGlua3MiPg0KICAgICAgICAgICAgICAgICAgICAgICAgJHtuYXZMaW5rcy5tYXAobCA9PiBgPGxpPjxhIGhyZWY9IiR7bC5ocmVmfSIgY2xhc3M9Inp6LW5h
694di1saW5rIj4ke2wudGV4dH08L2E+PC9saT5gKS5qb2luKCcnKX0NCiAgICAgICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ienotbmF2LWFjdGlvbnMiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJHtiYXNlVXJsfS9jIiBjbGFzcz0ienotY2FydCIgYXJpYS1sYWJlbD0iU2hvcHBpbmcgQ2FydCI+PGkgY2xhc3M9ImJpIGJpLWJhZy1kYXNoLWZpbGwiPjwvaT48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3RhYmxlcy5ob3N0bWVhcHAuY29tL3Jlc2VydmUvMTE4MTIiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIiBjbGFzcz0ienotYnRuLWN0YSI+Qm9vayBhIFRhYmxlPC9hPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvbmF2Pg0KICAgICAgICBgOw0KDQogICAgICAgIGNvbnN0IGN1c3RvbUZvb3RlckhUTUwgPSBgDQogICAgICAgICAgICA8Zm9vdGVyIGlkPSJ6ei1jdXN0b20tZm9vdGVyIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei1mb290ZXItd3JhcCI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inp6LWYtYmFubmVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5GaW5kIFlvdXIgWmVuLCBPbmUgUG91ciBhdCBhIFRpbWUgd2l0aCA8c3BhbiBjbGFzcz0iZHluYW1pYy13aW5lLXRleHQiPldpbmUgTG92ZXJzPC9zcGFuPjwvaDM+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inp6LWZvb3Rlci1ncmlkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei1mLWJyYW5kLXRpdGxlIj5aaW4gWmVuPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Inp6LWYtZGVzYyI+TG9jYXRlZCBpbiB0aGUgaGVhcnQgb2YgTWNLaW5uZXnigJlzIEFkcmlhdGljYSBWaWxsYWdlLCBaaW4gWmVuIGlzIGEgcHJlbWllciB3aW5lIGJhciBhbmQgY3VsaW5hcnkgZGVzdGluYXRpb24uIFdlIHBhaXIgYSBjdXJhdGVkIHNlbGVjdGlvbiBvZiA4MCsgZ2xvYmFsIHdpbmVzIHdpdGggYSByZWxheGluZyBhdG1vc3BoZXJlLjwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei1mLWNvbCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PlF1aWNrIEFjY2VzczwvaDQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iJHtiYXNlVXJsfSI+SG9tZSBCYXNlPC9hPjwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIke2Jhc2VVcmx9L20iPkJpc3RybyBNZW51PC9hPjwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIke2Jhc2VVcmx9L2N1c3RvbS9wYWdlL2Fib3V0Ij5PdXIgU3Rvcnk8L2E+PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiR7YmFzZVVybH0vY3VzdG9tL3BhZ2UvY2x1YiI+Q2x1YiBaaW48L2E+PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiR7YmFzZVVybH0vY3VzdG9tL3BhZ2UvZXZlbnRzIj5MaXZlIEV2ZW50czwvYT48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ienotZi1jb2wiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5CaXN0cm8gSG91cnM8L2g0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Ww0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ01vbiAtIFRodScsJzExOjAwYW0g4oCTIDEwOjAwcG0nXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydGcmkgLSBTYXQnLCcxMTowMGFtIOKAkyAxMTo1OXBtJ10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnU3VuZGF5JywnMTE6MDBhbSDigJMgOTowMHBtJ10NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLm1hcCgoW2QsaF0pID0+IGA8ZGl2IGNsYXNzPSJ6ei1mLWhvdXJzLXJvdyI+PHNwYW4+JHtkfTwvc3Bhbj48c3Bhbj4ke2h9PC9zcGFuPjwvZGl2PmApLmpvaW4oJycpfQ0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inp6LWYtY29sIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+TmV3c2xldHRlcjwvaDQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDEuNjsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC43NSk7IG1hcmdpbi1ib3R0b206IDE1cHg7Ij5TdWJzY3JpYmUgZm9yIHVwZGF0ZXMgYW5kIGJpc3RybyBub3RpZmljYXRpb25zLjwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cuemluemVud2luZS5jb20vZm9ybXMvemluLXplbi1uZXdzbGV0dGVyLXNpZ251cHMiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjIwMCIgZnJhbWVib3JkZXI9IjAiIHRpdGxlPSJaaW4gWmVuIE5ld3NsZXR0ZXIgU2lnbnVwcyI+PC9pZnJhbWU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ienotbG93ZXIiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei1sb3dlci1pbm5lciI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei1jb3B5cmlnaHQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIMKpIENvcHlyaWdodCAke2N1cnJlbnREeW5hbWljWWVhcn0gPGEgaHJlZj0iJHtiYXNlVXJsfSI+WmluIFplbiBXaW5lIEJpc3RybzwvYT4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ienotY29tcGxpYW5jZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJ3aW5kb3cuVENQcml2YWN5JiZ3aW5kb3cuVENQcml2YWN5Lm9wZW5QcmVmZXJlbmNlcygpIj5Qcml2YWN5IENob2ljZXM8L2J1dHRvbj48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic2VwYXJhdG9yIj58PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cudG93bi5jbHViL3ByaXZhY3kiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj5Qcml2YWN5IFBvbGljeTwvYT48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic2VwYXJhdG9yIj58PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cudG93bi5jbHViL3Rlcm1zIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+VGVybXM8L2E+PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2x
694hc3M9InNlcGFyYXRvciI+fDwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnRvd24uY2x1Yi9kaXNjbGFpbWVyIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+RGlzY2xhaW1lcjwvYT48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic2VwYXJhdG9yIj58PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iJHtiYXNlVXJsfS9jdXN0b20vcGFnZS9hY2Nlc3NpYmlsaXR5Ij5BY2Nlc3NpYmlsaXR5PC9hPjwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3VsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAyNXB4OyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90b3duLmNsdWIiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIiBjbGFzcz0ienotcG93ZXJlZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgYWx0PSJQb3dlcmVkIGJ5IFRvd24iIHNyYz0iJHtiYXNlVXJsfS9hc3NldHMvaW1hZ2VzL3Bvd2VyZWRfYnlfbG9nb19uYW1lLnN2ZyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9mb290ZXI+DQogICAgICAgIGA7DQogICAgICAgIA0KICAgICAgICBjb25zdCBtYWluV3JhcHBlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXdyYXBwZXInKSB8fCBkb2N1bWVudC5ib2R5Ow0KICAgICAgICBtYWluV3JhcHBlci5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCBjdXN0b21IZWFkZXJIVE1MKTsNCiAgICAgICAgbWFpbldyYXBwZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgY3VzdG9tVG9wQmFySFRNTCk7DQogICAgICAgIA0KICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgIG1haW5XcmFwcGVyLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgY3VzdG9tRm9vdGVySFRNTCk7DQogICAgICAgIH0sIDMwMCk7DQoNCiAgICAgICAgY29uc3QgY3VycmVudFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc\/JylbMF0ucmVwbGFjZSgvXC8kLywgIiIpOw0KICAgICAgICBjb25zdCBjbGVhbkJhc2VVcmwgPSBiYXNlVXJsLnJlcGxhY2UoL1wvJC8sICIiKTsNCiAgICAgICAgDQogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy56ei1uYXYtbGluaycpLmZvckVhY2gobGluayA9PiB7DQogICAgICAgICAgICBpZiAoIWxpbmsuaHJlZikgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgbGlua1VybCA9IGxpbmsuaHJlZi5zcGxpdCgnPycpWzBdLnJlcGxhY2UoL1wvJC8sICIiKTsNCiAgICAgICAgICAgIGlmIChsaW5rVXJsID09PSBjdXJyZW50VXJsIHx8IChsaW5rVXJsICE9PSBjbGVhbkJhc2VVcmwgJiYgY3VycmVudFVybC5zdGFydHNXaXRoKGxpbmtVcmwpKSkgew0KICAgICAgICAgICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGNvbnN0IHBocmFzZXMgPSBbIldpbmUgTG92ZXJzIiwgIkNvbm5vaXNzZXVycyIsICJTaW5jZXJlIEZyaWVuZHMiLCAiQ3VyYXRlZCBUYXN0ZXMiLCAiRWxldmF0ZWQgRGF0ZSBOaWdodHMiXTsNCiAgICAgICAgY29uc3QgcGhyYXNlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZHluYW1pYy13aW5lLXRleHQnKTsNCiAgICAgICAgaWYgKHBocmFzZUNvbnRhaW5lckVsKSB7DQogICAgICAgICAgICBsZXQgdHJhY2tlciA9IDA7DQogICAgICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7DQogICAgICAgICAgICAgICAgdHJhY2tlciA9ICh0cmFja2VyICsgMSkgJSBwaHJhc2VzLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBwaHJhc2VDb250YWluZXJFbC5zdHlsZS5vcGFjaXR5ID0gJzAnOw0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICBwaHJhc2VDb250YWluZXJFbC5pbm5lclRleHQgPSBwaHJhc2VzW3RyYWNrZXJdOw0KICAgICAgICAgICAgICAgICAgICBwaHJhc2VDb250YWluZXJFbC5zdHlsZS5vcGFjaXR5ID0gJzEnOw0KICAgICAgICAgICAgICAgIH0sIDI1MCk7DQogICAgICAgICAgICB9LCA0MDAwKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGJ1aWxkVUkpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGJ1aWxkVUkoKTsNCiAgICB9DQp9KSgpOw0KICAgIA0KICAgIA0KICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYA0KICAubWJuLWNlbnRlciwNCiAgLnNpbmdsZS1mb290ZXItd2lkZ2V0IC53aWRnZXQtaGVhZCBoNCwNCiAgLmZvb3Rlci13aWRnZXRzLXdyYXBwZXIuc3R5bGUtMiAuc2luZ2xlLWZvb3Rlci13aWRnZXQgLmZvb3Rlci1jb250ZW50IHAsDQogIHAud293LmZhZGVJbkxlZnQsDQogIC5mb290ZXItd2lkZ2V0cy13cmFwcGVyLnN0eWxlLTIgLnNpbmdsZS1mb290ZXItd2lkZ2V0IC5mb290ZXItY29udGVudCAubGluaywNCiAgLmZvb3Rlci13aWRnZXRzLXdyYXBwZXIuc3R5bGUtMiAuc2luZ2xlLWZvb3Rlci13aWRnZXQgLmZvb3Rlci1jb250ZW50IC5pbmZvLWRhdGUgbGksDQogIC5mb290ZXItYm90dG9tLnN0eWxlLTIgLmZvb3Rlci1ib3R0b20td3JhcHBlciB1bCBsaSBhDQpgKS5mb3JFYWNoKGVsID0+IHsNCiAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2NvbG9yJywgJyNmZmYnLCAnaW1wb3J0YW50Jyk7DQp9KTsNCiAgICANCiAgICAoZnVuY3Rpb24oKSB7DQogICAgZnVuY3Rpb24gcmVwbGFjZUZvcm1Pbk1vYmlsZSgpIHsNCiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID4gOTkxKSByZXR1cm47DQoNCiAgICAgICAgY29uc3QgdGFyZ2V0Rm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm1bYWN0aW9uKj0iL25ld3NsZXR0ZXIvc3RvcmUiXScpOw0KICAgICAgICBpZiAodGFyZ2V0Rm9ybSkgew0KICAgICAgICAgICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7DQogICAgICAgICAgICBpZnJhbWUuc3JjID0gJ2h0dHBzOi8vd3d3LnppbnplbndpbmUuY29tL2Zvcm1zL3ppbi16ZW4tbmV3c2xldHRlci1zaWdudXBzJzsNCiAgICAgICAgICAgIGlmcmFtZS53aWR0aCA9ICcxMDAlJzsNCiAgICAgICAgICAgIGlmcmFtZS5oZWlnaHQgPSAnMTUwJzsNCiAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2ZyYW1lYm9yZGVyJywgJzAnKTsNCiAgICAgICAgICAgIGlmcmFtZS50aXRsZSA9ICdaaW4gWmVuIE5ld3NsZXR0ZXIgU2lnbnVwcyc7DQogICAgICAgICAgICBpZnJhbWUuc3R5bGUuYm9yZGVyID0gJ25vbmUnOw0KDQogICAgICAgICAgICB0YXJnZXRGb3JtLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGlmcmFtZSwgdGFyZ2V0Rm9ybSk7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaW5pdFJlcGxhY2VtZW50KCkgew0KICAgICAgICBpZiAocmVwbGFjZUZvcm1Pbk1vYmlsZSgpKSByZXR1cm47DQoNCiAgICAgICAgbGV0IGF0dGVtcHRzID0gMDsNCiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGF0dGVtcHRzKys7DQogICAgICAgICAgICBpZiAocmVwbGFjZUZvcm1Pbk1vYmlsZSgpIHx8IGF0dGVtcHRzID49IDUwKSB7DQogICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7DQogICAgICAgICAgICB9DQogICAgICAgI
694H0sIDEwMCk7DQoNCiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGlmIChyZXBsYWNlRm9ybU9uTW9iaWxlKCkpIHsNCiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7DQogICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGlmIChkb2N1bWVudC5ib2R5KSB7DQogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgew0KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdFJlcGxhY2VtZW50KTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBpbml0UmVwbGFjZW1lbnQoKTsNCiAgICB9DQp9KSgpOw0KPC9zY3JpcHQ+"},
695    };
696</script>
696
697
698<div id="tc-privacy-banner" class="tc-privacy-consent-screen tc-privacy-hidden" role="presentation">
699    <section class="tc-privacy-card" role="region" aria-labelledby="tc-privacy-banner-title" aria-describedby="tc-privacy-banner-description" tabindex="-1">
700        <div class="tc-privacy-card__body">
701            <div class="tc-privacy-card__eyebrow">
702                <span class="tc-privacy-card__mark" aria-hidden="true"></span>
703                Privacy center
704            </div>
705            <h2 id="tc-privacy-banner-title" class="tc-privacy-banner__title">We respect your privacy</h2>
706            <p id="tc-privacy-banner-description" class="tc-privacy-banner__copy">
707                We use essential cookies for ordering, security, checkout, and location selection. Analytics and marketing tools stay off unless you allow them.
708                <button type="button" class="tc-privacy-link" data-tc-privacy-open>Do Not Sell or Share / Privacy Choices</button>
709            </p>
710            <ul class="tc-privacy-summary" aria-label="Cookie categories">
711                <li>
712                    <span class="tc-privacy-summary__check" aria-hidden="true">✓</span>
713                    <span>
714                        <strong>Necessary cookies are always on</strong>
715                        <span>These keep the cart, checkout, fraud protection, selected business, and storefront scripts working.</span>
716                    </span>
717                </li>
718                <li>
719                    <span class="tc-privacy-summary__check" aria-hidden="true">✓</span>
720                    <span>
721                        <strong>Analytics is optional</strong>
722                        <span>Page view attribution starts only after you allow analytics.</span>
723                    </span>
724                </li>
725                <li>
726                    <span class="tc-privacy-summary__check" aria-hidden="true">✓</span>
727                    <span>
728                        <strong>Marketing is optional</strong>
729                        <span>Pixels and targeted advertising load only after marketing consent.</span>
730                    </span>
731                </li>
732            </ul>
733        </div>
734        <div class="tc-privacy-card__footer">
735            <div class="tc-privacy-banner__actions">
736                <button type="button" class="tc-privacy-btn tc-privacy-btn--primary" data-tc-privacy-accept>Accept all</button>
737                <button type="button" class="tc-privacy-btn" data-tc-privacy-open>Manage settings</button>
738                <button type="button" class="tc-privacy-btn tc-privacy-btn--muted" data-tc-privacy-reject>Necessary only</button>
739            </div>
740        </div>
741    </section>
742</div>
743
744<div id="tc-privacy-modal" class="tc-privacy-backdrop tc-privacy-hidden" role="presentation">
745    <div class="tc-privacy-modal" role="dialog" aria-modal="true" aria-labelledby="tc-privacy-modal-title" tabindex="-1">
746        <button type="button" class="tc-privacy-modal__close" aria-label="Close privacy preferences" data-tc-privacy-close>&times;</button>
747        <div class="tc-privacy-modal__header">
748            <h2 id="tc-privacy-modal-title" class="tc-privacy-modal__title">Manage privacy choices</h2>
749            <p class="tc-privacy-modal__copy">Choose how this site can use non-essential tracking. You can change this anytime from the footer.</p>
750            <div id="tc-privacy-gpc" class="tc-privacy-gpc tc-privacy-hidden">
751                Your browser is sending a Global Privacy Control signal. Marketing, targeted advertising, and sale/share style processing will remain off for this browser.
752            </div>
753        </div>
754        <div class="tc-privacy-modal__tabs" role="tablist" aria-label="Privacy settings sections">
755            <button type="button" class="tc-privacy-tab" role="tab" aria-selected="true" aria-controls="tc-privacy-panel-consent" id="tc-privacy-tab-consent" data-tc-privacy-tab="consent">Consent</button>
756            <button type="button" class="tc-privacy-tab" role="tab" aria-selected="false" aria-controls="tc-privacy-panel-details" id="tc-privacy-tab-details" data-tc-privacy-tab="details">Details</button>
757            <button type="button" class="tc-privacy-tab" role="tab" aria-selected="false" aria-controls="tc-privacy-panel-about" id="tc-privacy-tab-about" data-tc-privacy-tab="about">About</button>
758        </div>
759        <div class="tc-privacy-modal__body">
760            <section class="tc-privacy-panel" role="tabpanel" aria-labelledby="tc-privacy-tab-consent" id="tc-privacy-panel-consent" data-tc-privacy-panel="consent">
761                <p class="tc-privacy-panel__lead">
762                    Essential cookies stay on so ordering, checkout, forms, business selection, and security work correctly. You control analytics and marketing below.
763                </p>
764                <label class="tc-privacy-option">
765                    <span>
766                        <strong>Strictly necessary</strong>
767                        <span>Required for security, checkout, forms, business selection, configured storefront scripts, and core site functionality. These cannot be turned off here.</span>
768                    </span>
769                    <input type="checkbox" checked disabled>
770                </label>
771                <label class="tc-privacy-option">
772                    <span>
773                        <strong>Analytics</strong>
774                        <span>Allows first-party page view analytics, attribution, referrer, UTM, and performance signals so the business can understand site activity.</span>
775                    </span>
776                    <input type="checkbox" data-tc-privacy-category="analytics">
777                </label>
778                <label class="tc-privacy-option">
779                    <span>
780                        <strong>Marketing and targeted advertising</strong>
781                        <span>Allows pixels, advertising scripts, and targeted advertising. Turning this off is treated as an opt-out of sale/share or targeted advertising where applicable.</span>
782                    </span>
783                    <input type="checkbox" data-tc-privacy-category="marketing">
784                </label>
785            </section>
786            <section class="tc-privacy-panel" role="tabpanel" aria-labelledby="tc-privacy-tab-details" id="tc-privacy-panel-details" data-tc-privacy-panel="details" hidden>
787                <p class="tc-privacy-panel__lead">
788                    The site separates cookies by purpose. Essential functionality is always available; optional categories are only enabled after your choice.
789                </p>
790                <label class="tc-privacy-option">
791                    <span>
792                        <strong>Necessary cookies</strong>
793                        <span>Used for cart, checkout, CSRF protection, business selection, security, form flow, and configured storefront scripts. These are needed for the service to work.</span>
794                    </span>
795                    <input type="checkbox" checked disabled>
796                </label>
797                <label class="tc-privacy-option">
798                    <span>
799                        <strong>Analytics cookies</strong>
800                        <span>Used for page view attribution, referrer, UTM, and performance reporting. These do not run until analytics is allowed.</span>
801                    </span>
802                    <input type="checkbox" data-tc-privacy-category="analytics">
803                </label>
804                <label class="tc-privacy-option">
805                    <span>
806                        <strong>Marketing cookies</strong>
807                        <span>Used for advertising pixels and targeted advertising. These do not load until marketing is allowed.</span>
808                    </span>
809                    <input type="checkbox" data-tc-privacy-category="marketing">
810                </label>
811            </section>
812            <section class="tc-privacy-panel" role="tabpanel" aria-labelledby="tc-privacy-tab-about" id="tc-privacy-panel-about" data-tc-privacy-panel="about" hidden>
813                <p class="tc-privacy-panel__lead">
814                    You can accept, reject, or update non-essential cookie choices at any time. Global Privacy Control signals are respected for marketing and sale/share style processing.
815                </p>
816                <ul class="tc-privacy-about-list">
817                    <li><a href="https://www.town.club/privacy" target="_blank" rel="noopener">Privacy Policy</a></li>
818                    <li><a href="https://www.town.club/terms" target="_blank" rel="noopener">Terms</a></li>
819                    <li><a href="https://www.town.club/disclaimer" target="_blank" rel="noopener">Disclaimer</a></li>
820                </ul>
821            </section>
822        </div>
823        <div class="tc-privacy-modal__footer">
824            <a class="tc-privacy-link" href="https://www.town.club/privacy" target="_blank" rel="noopener">Privacy Policy</a>
825            <div class="tc-privacy-modal__actions">
826                <button type="button" class="tc-privacy-btn" data-tc-privacy-reject>Necessary only</button>
827                <button type="button" class="tc-privacy-btn tc-privacy-btn--dark" data-tc-privacy-save>Save choices</button>
828                <button type="button" class="tc-privacy-btn tc-privacy-btn--primary" data-tc-privacy-accept>Accept all</button>
829            </div>
830        </div>
831    </div>
832</div>
833
834<script>
835    (function () {
836        const config = window.TC_PRIVACY_CONFIG || {};
837        const storageKey = `tc_privacy_preferences_v${config.version || 1}`;
838        const consentCookieName = 'tc_privacy_consent';
839        const gpcEnabled = navigator.globalPrivacyControl === true;
840        let currentPreferences = null;
841        let customScriptsLoaded = false;
842        const listeners = [];
843        const privacyLockClass = 'tc-privacy-lock';
844
845        function bannerElement() {
846            return document.getElementById('tc-privacy-banner');
847        }
848
849        function modalElement() {
850            return document.getElementById('tc-privacy-modal');
851        }
852
853        function hasSavedChoice() {
854            return Boolean(currentPreferences && currentPreferences.savedAt);
855        }
856
857        function elementIsOpen(element) {
858            return Boolean(element && !element.classList.contains('tc-privacy-hidden'));
859        }
860
861    function refreshLockState() {
862        document.documentElement.classList.toggle(
863            privacyLockClass,
864            elementIsOpen(bannerElement()) || elementIsOpen(modalElement())
865        );
866    }
867
868        function focusElement(element) {
869            if (!element || typeof element.focus !== 'function') {
870                return;
871            }
872
873            window.setTimeout(function () {
874                try {
875                    element.focus({ preventScroll: true });
876                } catch (error) {
877                    element.focus();
878                }
879            }, 0);
880        }
881
882        function defaultPreferences() {
883            return {
884                necessary: true,
885                analytics: false,
886                marketing: false,
887                saleShare: false,
888                savedAt: null,
889                gpc: gpcEnabled,
890                consentId: null,
891            };
892        }
893
894        function normalizePreferences(preferences) {
895            const normalized = Object.assign(defaultPreferences(), preferences || {});
896            normalized.necessary = true;
897            normalized.analytics = normalized.analytics === true;
898            normalized.marketing = normalized.marketing === true;
899            normalized.saleShare = normalized.saleShare === true;
900            normalized.gpc = gpcEnabled;
901            normalized.consentId = normalized.consentId || null;
902
903            if (gpcEnabled) {
904                normalized.marketing = false;
905                normalized.saleShare = false;
906            }
907
908            return normalized;
909        }
910
911        function loadSavedPreferences() {
912            try {
913                const raw = localStorage.getItem(storageKey);
914                return raw ? normalizePreferences(JSON.parse(raw)) : null;
915            } catch (error) {
916                return null;
917            }
918        }
919
920        function makeConsentId() {
921            if (window.crypto?.randomUUID) {
922                return window.crypto.randomUUID();
923            }
924
925            return `tc-${Date.now()}-${Math.random().toString(16).slice(2)}`;
926        }
927
928        function setDecisionPending() {
929            document.querySelectorAll('[data-tc-privacy-accept], [data-tc-privacy-reject], [data-tc-privacy-save]').forEach(function (button) {
930                button.disabled = true;
931            });
932        }
933
934        function reloadAfterConsent() {
935            window.setTimeout(function () {
936                window.location.reload();
937            }, 80);
938        }
939
940        function savePreferences(preferences, action) {
941            setDecisionPending();
942
943            currentPreferences = normalizePreferences(Object.assign({}, preferences, {
944                consentId: preferences.consentId || currentPreferences?.consentId || makeConsentId(),
945                savedAt: new Date().toISOString(),
946            }));
947
948            try {
949                localStorage.setItem(storageKey, JSON.stringify(currentPreferences));
950            } catch (error) {}
951
952            saveConsentCookie(currentPreferences);
953            const consentSaved = recordConsent(action || 'save_choices', currentPreferences);
954            applyPreferences(currentPreferences);
955            hideBanner();
956            hideModal();
957
958            consentSaved.finally(reloadAfterConsent);
959        }
960
961        function saveConsentCookie(preferences) {
962            try {
963                const payload = {
964                    version: config.version || 1,
965                    analytics: preferences.analytics === true,
966                    marketing: preferences.marketing === true,
967                    saleShare: preferences.saleShare === true,
968                    gpc: gpcEnabled,
969                    consentId: preferences.consentId || null,
970                    savedAt: preferences.savedAt || new Date().toISOString(),
971                };
972                const encoded = btoa(JSON.stringify(payload))
973                    .replace(/\+/g, '-')
974                    .replace(/\//g, '_')
975                    .replace(/=+$/g, '');
976                const secure = window.location.protocol === 'https:' ? '; Secure' : '';
977                document.cookie = `${consentCookieName}=${encoded}; Max-Age=31536000; Path=/; SameSite=Lax${secure}`;
978            } catch (error) {}
979        }
980
981        function recordConsent(action, preferences) {
982            if (!config.consentUrl) {
983                return Promise.resolve();
984            }
985
986            try {
987                const request = fetch(config.consentUrl, {
988                    method: 'POST',
989                    headers: {
990                        'Content-Type': 'application/json',
991                        'Accept': 'application/json',
992                        'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '',
993                    },
994                    body: JSON.stringify({
995                        consent_id: preferences.consentId,
996                        action,
997                        preferences,
998                        privacy_policy_url: config.privacyUrl || '',
999                        page_url: window.location.href,
1000                    }),
1001                    keepalive: true,
1002                }).catch(() => {});
1003
1004                return Promise.race([
1005                    request,
1006                    new Promise(function (resolve) {
1007                        window.setTimeout(resolve, 1200);
1008                    }),
1009                ]);
1010            } catch (error) {
1011                return Promise.resolve();
1012            }
1013        }
1014
1015        function canUse(category) {
1016            const preferences = currentPreferences || defaultPreferences();
1017
1018            if (category === 'necessary') {
1019                return true;
1020            }
1021
1022            if ((category === 'marketing' || category === 'saleShare') && gpcEnabled) {
1023                return false;
1024            }
1025
1026            return preferences[category] === true;
1027        }
1028
1029        function decodeBase64(value) {
1030            if (!value) {
1031                return '';
1032            }
1033
1034            try {
1035                const binary = atob(value);
1036                const bytes = new Uint8Array(binary.length);
1037                for (let index = 0; index < binary.length; index += 1) {
1038                    bytes[index] = binary.charCodeAt(index);
1039                }
1040
1041                if (window.TextDecoder) {
1042                    return new TextDecoder().decode(bytes);
1043                }
1044
1045                let decoded = '';
1046                bytes.forEach(function (byte) {
1047                    decoded += String.fromCharCode(byte);
1048                });
1049
1050                return decoded;
1051            } catch (error) {
1052                return '';
1053            }
1054        }
1055
1056        function appendNode(target, node, anchor) {
1057            if (node.nodeType === Node.ELEMENT_NODE && node.tagName.toLowerCase() === 'script') {
1058                const script = document.createElement('script');
1059                Array.from(node.attributes).forEach(function (attribute) {
1060                    script.setAttribute(attribute.name, attribute.value);
1061                });
1062                script.text = node.textContent || '';
1063                if (anchor) {
1064                    target.insertBefore(script, anchor);
1065                    return;
1066                }
1067
1068                target.appendChild(script);
1069                return;
1070            }
1071
1072            const clone = node.cloneNode(true);
1073            if (anchor) {
1074                target.insertBefore(clone, anchor);
1075                return;
1076            }
1077
1078            target.appendChild(clone);
1079        }
1080
1081        function appendHtml(target, encodedHtml, prepend) {
1082            const html = decodeBase64(encodedHtml);
1083            if (!html.trim()) {
1084                return;
1085            }
1086
1087            const template = document.createElement('template');
1088            template.innerHTML = html;
1089            const anchor = prepend ? target.firstChild : null;
1090            Array.from(template.content.childNodes).forEach(function (node) {
1091                appendNode(target, node, anchor);
1092            });
1093        }
1094
1095        function loadCustomScripts() {
1096            if (customScriptsLoaded) {
1097                return;
1098            }
1099
1100            customScriptsLoaded = true;
1101            const scripts = config.scripts || {};
1102            appendHtml(document.head, scripts.head || '', false);
1103            appendHtml(document.body, scripts.bodyStart || '', true);
1104            appendHtml(document.body, scripts.bodyEnd || '', false);
1105        }
1106
1107        function notifyListeners() {
1108            const snapshot = getPreferences();
1109            listeners.forEach(function (callback) {
1110                try {
1111                    callback(snapshot);
1112                } catch (error) {}
1113            });
1114            document.dispatchEvent(new CustomEvent('tc:privacy-consent', { detail: snapshot }));
1115        }
1116
1117        function applyPreferences(preferences) {
1118            currentPreferences = normalizePreferences(preferences);
1119            syncForm(currentPreferences);
1120            loadCustomScripts();
1121            notifyListeners();
1122        }
1123
1124        function getPreferences() {
1125            return Object.assign({}, currentPreferences || defaultPreferences());
1126        }
1127
1128        function showBanner() {
1129            const banner = bannerElement();
1130            banner?.classList.remove('tc-privacy-hidden');
1131            refreshLockState();
1132            focusElement(banner?.querySelector('.tc-privacy-card'));
1133        }
1134
1135        function hideBanner() {
1136            bannerElement()?.classList.add('tc-privacy-hidden');
1137            refreshLockState();
1138        }
1139
1140        function showModal() {
1141            hideBanner();
1142            syncForm(currentPreferences || defaultPreferences());
1143            showTab('consent');
1144            const modal = modalElement();
1145            modal?.classList.remove('tc-privacy-hidden');
1146            refreshLockState();
1147            focusElement(modal?.querySelector('.tc-privacy-modal'));
1148        }
1149
1150        function hideModal() {
1151            modalElement()?.classList.add('tc-privacy-hidden');
1152
1153            if (!hasSavedChoice()) {
1154                showBanner();
1155                return;
1156            }
1157
1158            refreshLockState();
1159        }
1160
1161        function showTab(tabName) {
1162            document.querySelectorAll('[data-tc-privacy-tab]').forEach(function (button) {
1163                const isSelected = button.getAttribute('data-tc-privacy-tab') === tabName;
1164                button.setAttribute('aria-selected', isSelected ? 'true' : 'false');
1165                button.setAttribute('tabindex', isSelected ? '0' : '-1');
1166            });
1167
1168            document.querySelectorAll('[data-tc-privacy-panel]').forEach(function (panel) {
1169                panel.hidden = panel.getAttribute('data-tc-privacy-panel') !== tabName;
1170            });
1171        }
1172
1173        function syncForm(preferences) {
1174            document.querySelectorAll('[data-tc-privacy-category]').forEach(function (input) {
1175                const category = input.getAttribute('data-tc-privacy-category');
1176                input.checked = preferences[category] === true;
1177                input.disabled = gpcEnabled && category === 'marketing';
1178            });
1179
1180            const gpcNotice = document.getElementById('tc-privacy-gpc');
1181            if (gpcNotice) {
1182                gpcNotice.classList.toggle('tc-privacy-hidden', !gpcEnabled);
1183            }
1184        }
1185
1186        function syncCategory(category, checked, source) {
1187            document.querySelectorAll(`[data-tc-privacy-category="${category}"]`).forEach(function (input) {
1188                if (input !== source) {
1189                    input.checked = checked;
1190                }
1191            });
1192        }
1193
1194        function readFormPreferences() {
1195            const preferences = defaultPreferences();
1196            const categories = new Set();
1197            document.querySelectorAll('[data-tc-privacy-category]').forEach(function (input) {
1198                categories.add(input.getAttribute('data-tc-privacy-category'));
1199            });
1200            categories.forEach(function (category) {
1201                preferences[category] = Array.from(document.querySelectorAll(`[data-tc-privacy-category="${category}"]`))
1202                    .some(function (input) {
1203                        return input.checked === true;
1204                    });
1205            });
1206            preferences.saleShare = preferences.marketing;
1207
1208            return preferences;
1209        }
1210
1211        function acceptAll() {
1212            savePreferences({
1213                necessary: true,
1214                analytics: true,
1215                marketing: !gpcEnabled,
1216                saleShare: !gpcEnabled,
1217                gpc: gpcEnabled,
1218            }, 'accept_all');
1219        }
1220
1221        function rejectNonEssential() {
1222            savePreferences(defaultPreferences(), 'necessary_only');
1223        }
1224
1225        function bindControls() {
1226            document.querySelectorAll('[data-tc-privacy-open]').forEach(function (button) {
1227                button.addEventListener('click', showModal);
1228            });
1229
1230            document.querySelectorAll('[data-tc-privacy-tab]').forEach(function (button) {
1231                button.addEventListener('click', function () {
1232                    showTab(button.getAttribute('data-tc-privacy-tab'));
1233                });
1234            });
1235
1236            document.querySelectorAll('[data-tc-privacy-category]').forEach(function (input) {
1237                input.addEventListener('change', function () {
1238                    syncCategory(input.getAttribute('data-tc-privacy-category'), input.checked === true, input);
1239                });
1240            });
1241
1242            document.querySelectorAll('[data-tc-privacy-accept]').forEach(function (button) {
1243                button.addEventListener('click', acceptAll);
1244            });
1245
1246            document.querySelectorAll('[data-tc-privacy-reject]').forEach(function (button) {
1247                button.addEventListener('click', rejectNonEssential);
1248            });
1249
1250            document.querySelectorAll('[data-tc-privacy-save]').forEach(function (button) {
1251                button.addEventListener('click', function () {
1252                    savePreferences(readFormPreferences());
1253                });
1254            });
1255
1256            document.querySelectorAll('[data-tc-privacy-close]').forEach(function (button) {
1257                button.addEventListener('click', hideModal);
1258            });
1259
1260            modalElement()?.addEventListener('click', function (event) {
1261                if (event.target === event.currentTarget) {
1262                    hideModal();
1263                }
1264            });
1265
1266            document.addEventListener('keydown', function (event) {
1267                if (event.key === 'Escape' && elementIsOpen(modalElement())) {
1268                    hideModal();
1269                }
1270            });
1271        }
1272
1273        window.TCPrivacy = {
1274            acceptAll,
1275            canUse,
1276            getPreferences,
1277            onConsentChange(callback) {
1278                if (typeof callback === 'function') {
1279                    listeners.push(callback);
1280                    callback(getPreferences());
1281                }
1282            },
1283            openPreferences: showModal,
1284            rejectNonEssential,
1285            savePreferences,
1286        };
1287
1288        document.addEventListener('DOMContentLoaded', function () {
1289            bindControls();
1290
1291            const saved = loadSavedPreferences();
1292            if (saved) {
1293                saveConsentCookie(saved);
1294                applyPreferences(saved);
1295                return;
1296            }
1297
1298            applyPreferences(defaultPreferences());
1299            showBanner();
1300        });
1301    })();
1302</script>
1302
1303
1304
1305<div id="preloader" class="preloader">
1306    <div class="animation-preloader">
1307        <div class="spinner"></div>
1308        <p class="text-center">Loading</p>
1309    </div>
1310    <div class="loader"><div class="row">
1311            <div class="col-3 loader-section section-left"><div class="bg"></div></div>
1312            <div class="col-3 loader-section section-left"><div class="bg"></div></div>
1313            <div class="col-3 loader-section section-right"><div class="bg"></div></div>
1314            <div class="col-3 loader-section section-right"><div class="bg"></div></div>
1315        </div></div>
1316</div>
1317
1318<div id="social-sidebar">
1319    <ul>
1320                                                                                                                <li>
1321                    <a href="https://www.facebook.com/ZinZenWine/" target="_blank" aria-label="FACEBOOK">
1322                        <i class="fab fa-facebook"></i>
1323                    </a>
1324                </li>
1325                                                                                    <li>
1326                    <a href="https://www.instagram.com/zin_zen_wine_bistro/" target="_blank" aria-label="INSTAGRAM">
1327                        <i class="fab fa-instagram"></i>
1328                    </a>
1329                </li>
1330                        </ul>
1331</div>
1332
1333<div id="main-wrapper">
1334            <style>
1335    .business-selector-action {
1336        height: 56px !important;
1337        border-radius: 999px !important;
1338        background: var(--theme) !important;
1339        color: var(--text) !important;
1340        border: 1px solid rgba(0, 0, 0, 0.08) !important;
1341        display: inline-flex !important;
1342        align-items: center !important;
1343        justify-content: center !important;
1344        padding: 0 18px !important;
1345        font-weight: 900 !important;
1346        letter-spacing: 0.6px !important;
1347        text-transform: uppercase !important;
1348        box-shadow: 0 10px 22px rgba(0, 0, 0, 0.14) !important;
1349    }
1350
1351    .business-selector-action:disabled {
1352        opacity: 0.65 !important;
1353        box-shadow: none !important;
1354    }
1355
1356    body.tc-business-selector-open .mobile-bottom-nav {
1357        opacity: 0 !important;
1358        visibility: hidden !important;
1359        pointer-events: none !important;
1360    }
1361</style>
1362
1363<div
1364    class="modal fade"
1365    id="tcBusinessSelectorModal"
1366    tabindex="-1"
1367    aria-labelledby="businessSelectorLabel"
1368    aria-describedby="businessSelectorDescription"
1369    data-switch-url="https://www.zinzenwine.com/context/switch-business"
1370    data-csrf-token="QUAY7qp3f9vxznTgECZV7rSPGioc1ts6bDtSsma9"
1371    data-current-business-id="168"
1372    data-auto-open="0"
1373    data-has-cart="0"
1374    data-google-maps-key="AIzaSyBR2DmXKK6EypRvjknGtRFi9zQ_NS-6N5U"
1375>
1376    <div class="modal-dialog modal-dialog-centered modal-md modal-dialog-scrollable">
1377        <div class="modal-content border-0 shadow">
1378            <div class="modal-header border-0 pb-0">
1379                <div>
1380                    <h2 class="modal-title fs-4" id="businessSelectorLabel">Select location</h2>
1381                </div>
1382                                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
1383                            </div>
1384
1385            <div class="modal-body pt-3">
1386                <p id="businessSelectorDescription" class="text-muted mb-3">Choose where you want to order from.</p>
1387
1388                                    <div class="rounded-3 border bg-light p-2 mb-3" aria-label="Current location">
1389                        <div class="d-flex align-items-center gap-2">
1390                            <span class="text-success px-1" aria-hidden="true"><i class="fas fa-map-marker-alt"></i></span>
1391                            <div class="min-w-0">
1392                                <div class="d-flex flex-wrap align-items-center gap-2 mb-1">
1393                                    <span class="fw-semibold" id="businessSelectorCurrentName">Zin Zen Wine Bistro</span>
1394                                    <span class="badge bg-success-subtle text-success-emphasis">Current</span>
1395                                </div>
1396                                <div class="small text-muted lh-sm">
1397                                    6841 Virginia Parkway, McKinney TX, USA
1398                                </div>
1399                            </div>
1400                        </div>
1401                    </div>
1402                
1403                <form id="tcBusinessSelectorForm" novalidate>
1404                    <div class="position-relative rounded-3 overflow-hidden border mb-3">
1405                        <div
1406                            id="businessSelectorMap"
1407                            class="business-selector-map"
1408                            role="group"
1409                            aria-label="Map of available locations"
1410                            style="height:220px;min-height:220px;background:#f3f5f7"
1411                        ></div>
1412                        <div
1413                            id="businessSelectorMapLoading"
1414                            class="business-selector-map-loading d-flex align-items-center justify-content-center"
1415                            role="status"
1416                            style="position:absolute;inset:0;background:rgba(243,245,247,.88);z-index:2"
1417                        >
1418                            <span class="spinner-border spinner-border-sm text-secondary" aria-hidden="true"></span>
1419                            <span class="visually-hidden">Loading map</span>
1420                        </div>
1421                    </div>
1422                    <div id="businessSelectorMapMessage" class="small text-muted mb-3 d-none" role="status"></div>
1423
1424                    <label for="business" class="form-label fw-semibold">Location</label>
1425                    <select id="business" name="business_id" class="form-select form-select-lg" required>
1426                                                    <option
1427                                value="168"
1428                                data-name="Zin Zen Wine Bistro"
1429                                data-address="6841 Virginia Parkway, McKinney TX, USA"
1430                                data-logo="https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f"
1431                                data-phone="(972) 547-4620"
1432                                data-lat="33.1982988"
1433                                data-lng="-96.7069675"
1434                                selected                            >
1435                                Zin Zen Wine Bistro — 6841 Virginia Parkway, McKinney TX, USA                            </option>
1436                                            </select>
1437
1438                        <div id="businessSelectorCartWarning" class="alert alert-warning mt-3 mb-0 d-none" role="alert">
1439                            <div class="fw-semibold">Changing locations may clear your cart.</div>
1440                            <div class="small">Menu items and prices can vary by location.</div>
1441                            <div id="businessSelectorCartConfirmation" class="small fw-semibold mt-2 d-none">
1442                                This cart is not compatible with the selected location. Select Change location again to clear it and continue.
1443                            </div>
1444                        </div>
1445
1446                    <div id="businessSelectorError" class="alert alert-danger mt-3 mb-0 d-none" role="alert"></div>
1447                    <div id="businessSelectorStatus" class="visually-hidden" role="status" aria-live="polite"></div>
1448
1449                <div class="mt-4 d-grid gap-2">
1450                    <button type="submit" id="businessSelectorSubmit" class="btn business-selector-action w-100">
1451                            <span class="business-selector-submit-label">Keep location</span>
1452                            <span class="business-selector-submit-loading d-none" aria-hidden="true">
1453                                <span class="spinner-border spinner-border-sm me-2"></span>Changing location…
1454                        </span>
1455                    </button>
1456                    <button type="button" id="businessSelectorCancel" class="btn btn-link text-secondary fw-semibold" data-bs-dismiss="modal">
1457                        Cancel
1458                    </button>
1459                </div>
1460                </form>
1461            </div>
1462        </div>
1463    </div>
1464</div>
1465
1466            <div class="header-top header-top-6">
1467    <div class="container">
1468        <div class="header-top-wrapper style-6">
1469                            <ul>
1470                    <li>
1471                        <i class="fas fa-map-marker-alt"></i>
1472                        <div class="business-select-wrapper">
1473
1474                        <select
1475                            id="business-selector"
1476                            class="form-select business-selector"
1477                            aria-label="Select location">
1478                                                            <option
1479                                    value="168"
1480                                    data-name="Zin Zen Wine Bistro"
1481                                    data-lat="33.1982988"
1482                                    data-lng="-96.7069675"
1483                                    data-logo="https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;
1483X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f"
1484                                    data-phone="(972) 547-4620"
1485                                     selected                                 >
1486                                    Zin Zen Wine Bistro — 6841 Virginia Parkway, McKinney TX, USA                                </option>
1487                                                    </select>
1488                        </div>
1489                    </li>
1490                </ul>
1491            
1492            <div class="top-right">
1493                <div class="social-icon d-flex align-items-center">
1494                    <ul>
1495
1496                        
1497
1498                                                                                <li>
1499                                <a href="https://www.zinzenwine.com/login/phone">
1500                                    <i class="fas fa-sign-in-alt"></i> Login
1501                                </a>
1502                            </li>
1503                                                                    </ul>
1504                </div>
1505            </div>
1506        </div>
1507    </div>
1508</div>
1509
1510<div class="header-middle-section sticky-header" id="header-middle-section">
1511    <div class="container">
1512        <div class="header-middle-wrapper">
1513            <div class="middle-header-logo" id="selected-business-logo">
1514                <a href="https://www.zinzenwine.com">
1515                                            <img src="https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f" alt="Zin Zen Wine Bistro" loading="eager">
1516                                    </a>
1517            </div>
1518                            <form action="https://www.zinzenwine.com/products" method="GET" class="search-toggle-box d-md-block">
1519                    <div class="input-area">
1520                        <input type="text" name="search" placeholder="Search">
1521                        <button type="submit" class="cmn-btn">
1522                            <i class="far fa-search"></i>
1523                        </button>
1524                    </div>
1525                </form>
1526                        <div class="middle-header-right">
1527                <div class="icon-items">
1528                    <i class="far fa-phone-alt"></i>
1529                    <div class="content">
1530                                                    <p id="business-status" style="color: red">Closed Now</p>
1531                                                                            <h5>
1532                                <a href="tel:(972) 547-4620" id="business-phone">
1533                                    (972) 547-4620
1534                                </a>
1535                            </h5>
1536                                            </div>
1537                </div>
1538
1539                                    <div class="menu-cart">
1540    
1541    <a href="https://www.zinzenwine.com/c" class="cart-icon js-cart-icon-counter" data-count="0">
1542        <i class="far fa-shopping-basket"></i>
1543    </a>
1544</div>
1545                            </div>
1546        </div>
1547    </div>
1548</div>
1549
1550<header id="header-sticky" class="header-1 style-6">
1551    <div class="container">
1552        <div class="mega-menu-wrapper">
1553            <div class="header-main">
1554                <div class="logo">
1555                    <a href="https://www.zinzenwine.com" class="header-logo">
1556                                                    <img src="https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20260924T113158Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=43200&amp;
1556X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f" alt="Zin Zen Wine Bistro" loading="eager">
1557                                            </a>
1558                </div>
1559                <div class="header-right d-flex justify-content-end align-items-center">
1560                    <div class="mean__menu-wrapper d-none d-lg-block">
1561                        <div class="main-menu">
1562                            <nav id="mobile-menu">
1563                                <ul>
1564
1565                                    <li class="has-dropdown active">
1566                                        <a href="https://www.zinzenwine.com">Home</a>
1567                                    </li>
1568
1569
1570
1571
1572                                    
1573                                            <li>
1574                                                <a href="https://www.zinzenwine.com/m">
1575                                                    Menu
1576                                                </a>
1577                                            </li>
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594                                    
1595                                                                                                                                                            <li><a href="https://www.zinzenwine.com/custom/page/about">About</a></li>
1596                                                                                    <li><a href="https://www.zinzenwine.com/custom/page/club">Club</a></li>
1597                                                                                    <li><a href="https://www.zinzenwine.com/custom/page/events">Events</a></li>
1598                                                                                    <li><a href="https://www.zinzenwine.com/custom/page/contact">Contact</a></li>
1599                                                                                                                                                        <li><a href="https://www.zinzenwine.com/c">Cart</a></li>
1600                                                                    </ul>
1601                            </nav>
1602                        </div>
1603                    </div>
1604                    <div class="sidebar__toggle" id="mobileSidebarToggle" style="background-color: white; padding: 12px 8px; border-radius: 5px; display: none;">
1605                        <div class="header-bar">
1606                            <span style="background: black!important;"></span>
1607                            <span style="background: black!important;"></span>
1608                            <span style="background: black!important;"></span>
1609                        </div>
1610                    </div>
1611                </div>
1612            </div>
1613        </div>
1614    </div>
1615</header>
1616
1617<div class="fix-area">
1618    <div class="offcanvas__info">
1619        <div class="offcanvas__wrapper">
1620            <div class="offcanvas__content">
1621                <div class="offcanvas__top mb-5 d-flex justify-content-between align-items-center">
1622                    <div class="offcanvas__logo"></div>
1623                    <div class="offcanvas__close"><button><i class="fas fa-times"></i></button></div>
1624                </div>
1625                <div class="mobile-menu fix mb-3"></div>
1626                <div class="offcanvas__contact">
1627                    <h4>Contact Us</h4>
1628                    <ul>
1629                                                    <li class="d-flex align-items-center">
1630                                <div class="offcanvas__contact-icon">
1631                                    <i class="fal fa-map-marker-alt"></i>
1632                                </div>
1633                                <div class="offcanvas__contact-text">
1634                                    <a href="#">6841 Virginia Parkway, McKinney TX, USA</a>
1635                                </div>
1636                            </li>
1637                        
1638                                                    <li class="d-flex align-items-center">
1639                                <div class="offcanvas__contact-icon mr-15">
1640                                    <i class="fal fa-envelope"></i>
1641                                </div>
1642                                <div class="offcanvas__contact-text">
1643                                    <a href="/cdn-cgi/l/email-protection#a8ebc7c6dcc9cbdce8d2c1c6d2cdc6dfc1c6cd86cbc7c5"><span class="__cf_email__" data-cfemail="a4e7cbcad0c5c7d0e4decdcadec1cad3cdcac18ac7cbc9">[email&#160;protected]</span></a>
1644                                </div>
1645                            </li>
1646                        
1647                                                    <li class="d-flex align-items-center">
1648                                <div class="offcanvas__contact-icon mr-15">
1649                                    <i class="far fa-phone"></i>
1650                                </div>
1651                                <div class="offcanvas__contact-text">
1652                                    <a href="tel:(972) 547-4620">(972) 547-4620</a>
1653                                </div>
1654                            </li>
1655                                            </ul>
1656                </div>
1657            </div>
1658        </div>
1659    </div>
1660</div>
1661<div class="offcanvas__overlay"></div>
1662    
1663    
1664    
1665    
1666    <main>
1667        
1668        
1669    
1670    <section class="dynamic-page-section section-padding">
1671        <div class="container">
1672            <div class="row">
1673                <div class="col-lg-10 offset-lg-1">
1674                    <div class="page-content-rendered wow fadeInUp" data-wow-delay=".5s">
1675                        <body><div id="ixj5"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css"/>
1675<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=Cormorant+Garamond:ital,wght@0,400;0,600;0,700;1,400&family=Montserrat:wght@300;400;500;600&display=swap" rel="stylesheet"/><div class="main-content"><div class="texture-overlay">
1676  </div><div class="page-header fade-up"><div class="header-watermark">2006
1677    </div><div class="header-content"><span class="accent-line"></span><h1>Our Story
1678      </h1><p>Est. 2006 • Adriatica Village • McKinney, TX
1679      </p></div></div><section><div class="story-split fade-up"><div class="story-img-container"><img src="https://town-public.s3.amazonaws.com/zinzenwine/hero2.webp" alt="Zin Zen Exterior" class="story-img"/></div><div class="story-text"><h2>A Quaint Area 
1680          <br/>Nestled on 45 Acres
1681        </h2><p><strong>Zin Zen Wine Bistro</strong> was established in 2006 with a singular vision: to bring the rich, slow-paced culture of European dining to the Croatian-inspired Adriatica Village.
1682        </p><p>Locally owned and operated, we curate over 
1683          <strong>80 different wines</strong> from around the world. Whether you are here for a quick glass or a lingering evening, our creative menu invites you to pause and savor the moment.
1684        </p><a href="https://www.zinzenwine.com/m/all-day-menu-3po-50" class="btn-primary">View The Menu</a></div></div></section><section class="experience-section"><div class="section-head fade-up" id="i6szl"><p>The Atmosphere
1685      </p><h2>The Zin Zen Experience
1686      </h2></div><div class="story-split fade-up" id="ikq7r"><div class="story-text"><h3>Ambiance Incomparable to Any Other
1687        </h3><p>Patrons will find several comfortable living room seating areas, intimate table options, and a beautiful patio where wine aficionados and novices alike are invited to explore.
1688        </p><p>From 
1689          <strong>Wine Down Wednesdays</strong> to the soulful sounds of 
1690          <strong>Live Music</strong>, the experience at Zin Zen is truly incomparable.
1691        </p></div><div class="story-img-container"><img src="https://town-public.s3.amazonaws.com/zinzenwine/hero3.webp" alt="Interior Vibe" class="story-img"/></div></div><div class="features-grid fade-up"><div class="feature-card"><i class="bi bi-cup-straw feature-icon">
1692        </i><h3>80+ Wines
1693        </h3><p>A curated selection from around the globe, perfect for novices and aficionados alike.
1694        </p><a href="https://drive.google.com/file/d/1_LS-pjMdD7zMsp02_qBKkF1-GUBTL3TQ/preview" target="_blank" rel="noopener" class="btn-primary" id="ixq9f">Wine Menu</a></div><div class="feature-card"><i class="bi bi-music-note-beamed feature-icon">
1695        </i><h3>Live Music
1696        </h3><p>Enhancing the atmosphere every Thursday, Friday, and Saturday evening.
1697        </p><a href="https://www.zinzenwine.com/custom/page/live-music-mckinney-this-weekend" class="btn-primary" id="ioqvv">Live Music</a></div><div class="feature-card"><i class="bi bi-egg-fried feature-icon">
1698        </i><h3>Creative Menu
1699        </h3><p>From lunch specials to curated bites that pair perfectly with your pour.
1700        </p><a href="https://www.zinzenwine.com/m/all-day-menu-3po-50" class="btn-primary" id="i7jng">Food Menu</a></div></div></section><section class="community-section fade-up"><h2>Community Impact
1701    </h2><p class="lead">We feel blessed to be part of such an amazing and supportive community in McKinney. Giving back is at the heart of what we do.
1702    </p><div id="charity-list" class="charity-list">
1703    </div><p id="ic53a">Proud Members of the 
1704      <a href="https://www.mckinneychamber.com" target="_blank" id="idvq3">McKinney Chamber of Commerce</a> Since 2016
1705    </p></section><section class="specials-section"><div class="section-head fade-up" id="i4f5ao"><p>Something Every Day
1706      </p><h2>Weekly Specials
1707      </h2></div><div class="specials-grid fade-up"><div class="feature-card special-card"><i class="bi bi-clock-history feature-icon">
1708        </i><h3>Monday
1709        </h3><p><strong>All Day Happy Hour</strong><br/>Start your week right with special pricing on select pours and bites.
1710        </p></div><div class="feature-card special-card"><i class="bi bi-collection feature-icon">
1711        </i><h3>Tuesday
1712        </h3><p><strong>Flight Night</strong><br/>Explore our extensive list and discover new favorites with curated flights.
1713        </p></div><div class="feature-card special-card"><i class="bi bi-cup-straw feature-icon">
1714        </i><h3>Wednesday
1715        </h3><p><strong>Wine Wednesday</strong><br/>Celebrate the middle of the week to unwind with the perfect glass.
1716        </p></div><div class="feature-card special-card"><i class="bi bi-music-note-beamed feature-icon">
1717        </i><h3>Thu - Fri - Sat
1718        </h3><p><strong>Live Music</strong><br/>Enjoy the soulful sounds of local musicians while you sip and savor.
1719        </p></div><div class="feature-card special-card"><i class="bi bi-brightness-alt-high feature-icon">
1720        </i><h3>Sat - Sun
1721        </h3><p><strong>Mimosa Brunch</strong><br/>Weekend mornings made perfect with a creative brunch menu and mimosas.
1722        </p></div></div></section><section id="collection" class="section-collection"><div class="section-head fade-up"><h2>The Zin Zen Experience
1723      </h2><p>Taste. Savor. Celebrate.
1724      </p></div><div class="mosaic-grid fade-up"><div class="mosaic-item item-large"><img src="https://town-public.s3.amazonaws.com/zinzenwine/zzwine.webp" alt="Curated Wine Selection"/><div class="mosaic-overlay"><h3 id="isrrfv">Curated Wines
1725          </h3><p>A handpicked selection of premium reds and whites.
1726          </p></div></div><div class="mosaic-item"><img src="https://town-public.s3.amazonaws.com/zinzenwine/OLD%20FASHIONED.webp" alt="Old Fashioned Cocktail"/><div class="mosaic-overlay"><h3 id="i1zhln">Old Fashioned
1727          </h3><p>Classic bourbon, bitters, and an orange twist.
1728          </p></div></div><div class="mosaic-item item-tall"><img src="https://town-public.s3.amazonaws.com/zinzenwine/salad.webp" alt="Strawberry Spinach Salad"/><div class="mosaic-overlay"><h3 id="ibv0n5">Strawberry Spinach Salad
1729          </h3><p>Fresh greens, glazed pecans, and fresh strawberries.
1730          </p></div></div><div class="mosaic-item item-wide"><img src="https://town-public.s3.amazonaws.com/zinzenwine/Flatbread.webp" alt="Breakfast Flatbread"/><div class="mosaic-overlay"><h3 id="igr2ei">Breakfast Flatbread
1731          </h3><p>Scrambled eggs and savory toppings on a crispy crust.
1732          </p></div></div><div class="mosaic-item"><img src="https://town-public.s3.amazonaws.com/zinzenwine/LEMON%20DROP.webp" alt="Lemon Drop Martini"/><div class="mosaic-overlay"><h3 id="iodfzb">Lemon Drop
1733          </h3><p>A crisp, citrusy cocktail with a sugared rim.
1734          </p></div></div><div class="mosaic-item"><img src="https://town-public.s3.amazonaws.com/zinzenwine/baked-brie.webp" alt="Baked Brie with Fruit"/><div class="mosaic-overlay"><h3 id="i6ai0g">Baked Brie
1735          </h3><p>Warm cheese served with crackers and fresh grapes.
1736          </p></div></div><div class="mosaic-item item-large"><img src="https://town-public.s3.amazonaws.com/zinzenwine/zzwinewall.webp" alt="Wine Bar Lounge"/><div class="mosaic-overlay"><h3 id="ilktbf">Wine Bar &amp; Lounge
1737          </h3><p>Catch the game while relaxing by our signature wine wall.
1738          </p></div></div><div class="mosaic-item"><img src="https://town-public.s3.amazonaws.com/zinzenwine/gambas.webp" alt="Shrimp and Cheesy Bread"/><div class="mosaic-overlay"><h3 id="i76b7g">Savory Shrimp
1739          </h3><p>Succulent shrimp served with toasted cheesy bread.
1740          </p></div></div><div class="mosaic-item item-tall"><img src="https://town-public.s3.amazonaws.com/zinzenwine/SANGRIA.webp" alt="Fruit Sangria"/><div class="mosaic-overlay"><h3 id="imvi4i">Fruit Sangria
1741          </h3><p>A refreshing, light sangria loaded with fresh fruit.
1742          </p></div></div><div class="mosaic-item"><img src="https://town-public.s3.amazonaws.com/zinzenwine/hummus.webp" alt="Hummus and Veggie Platter"/><div class="mosaic-overlay"><h3 id="iml34r">Hummus Platter
1743          </h3><p>Creamy hummus paired with pita, carrots, and cucumbers.
1744          </p></div></div><div class="mosaic-item item-cta"><div class="cta-content"><h3 id="ihdtvj">Explore Full Menu
1745          </h3><p>80+ Wines &amp; Countless Flavors
1746          </p><a href="https://drive.google.com/file/d/1_LS-pjMdD7zMsp02_qBKkF1-GUBTL3TQ/preview" target="_blank" rel="noopener" class="btn-primary" id="igwhp7">View All</a></div></div></div></section><section class="reviews-section"><div class="section-head fade-up" id="ibt598"><p>Testimonials
1747      </p><h2>Loved by Locals
1748      </h2></div><div class="slider-container fade-up"><div id="reviews-track" class="slider-track-reverse">
1749      </div></div></section><div class="cta-banner"><div class="cta-overlay">
1750    </div></div></div></div>
vendor: 108 bytes, line 1750
1750<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1750</body>
1751                    </div>
1752                </div>
1753            </div>
1754        </div>
1755    </section>
1756    </main>
1757
1758            <footer class="footer-section section-bg-3 fix bg-cover">
1759    <div class="container">
1760        <div class="footer-widgets-wrapper style-2">
1761            <div class="row">
1762                <!-- Newsletter Section -->
1763                
1764                                    <div class="col-xl-5 col-lg-4 col-md-6 ps-xl-5 pe-md-5 wow fadeInUp" data-wow-delay=".5s">
1765                        <div class="single-footer-widget border-right">
1766                            <div class="widget-head">
1767                                <h4>Quick Access</h4>
1768                            </div>
1769                            <div class="list-area d-flex align-items-center">
1770                                <ul>
1771                                    <li>
1772                                        <a href="https://www.zinzenwine.com">
1773                                        <span class="text-effect">
1774                                            <span class="effect-2">Home</span>
1775                                        </span>
1776                                        </a>
1777                                    </li>
1778
1779                                                                                                                        <li>
1780                                                <a href="https://www.zinzenwine.com/custom/page/about">
1781                                        <span class="text-effect">
1782                                            <span class="effect-2">About</span>
1783                                        </span>
1784                                                </a>
1785                                            </li>
1786                                                                                    <li>
1787                                                <a href="https://www.zinzenwine.com/custom/page/club">
1788                                        <span class="text-effect">
1789                                            <span class="effect-2">Club</span>
1790                                        </span>
1791                                                </a>
1792                                            </li>
1793                                                                                    <li>
1794                                                <a href="https://www.zinzenwine.com/custom/page/events">
1795                                        <span class="text-effect">
1796                                            <span class="effect-2">Events</span>
1797                                        </span>
1798                                                </a>
1799                                            </li>
1800                                                                                    <li>
1801                                                <a href="https://www.zinzenwine.com/custom/page/contact">
1802                                        <span class="text-effect">
1803                                            <span class="effect-2">Contact</span>
1804                                        </span>
1805                                                </a>
1806                                            </li>
1807                                                                                    <li>
1808                                                <a href="https://www.zinzenwine.com/custom/page/accessibility">
1809                                        <span class="text-effect">
1810                                            <span class="effect-2">Accessibility</span>
1811                                        </span>
1812                                                </a>
1813                                            </li>
1814                                                                            
1815
1816                                    
1817                                                                            <li>
1818                                            <a href="https://www.zinzenwine.com/products">
1819                                            <span class="text-effect">
1820                                                <span class="effect-2">Menu</span>
1821                                            </span>
1822                                            </a>
1823                                        </li>
1824                                    
1825                                                                                                                
1826                                    
1827                                                                            <li>
1828                                            <a href="https://www.zinzenwine.com/cart">
1829                                            <span class="text-effect">
1830                                                <span class="effect-2">Cart</span>
1831                                            </span>
1832                                            </a>
1833                                        </li>
1834                                                                        
1835                                    <li>
1836                                        <a href="https://www.zinzenwine.com/admin">
1837                                            <span class="text-effect">
1838                                                <span class="effect-2">Admin Area</span>
1839                                            </span>
1840                                        </a>
1841                                    </li>
1842                                </ul>
1843                            </div>
1844                        </div>
1845                    </div>
1846                                <!-- Contact Section -->
1847                <div class="col-xl-3 col-lg-4 col-md-6 ps-xl-5 wow fadeInUp" data-wow-delay=".7s">
1848                    <div class="single-footer-widget">
1849                        <div class="widget-head">
1850                            <h4>Contact Us</h4>
1851                        </div>
1852                        <div class="footer-content">
1853                                                            <p>6841 Virginia Parkway, McKinney TX, USA</p>
1854                            
1855                                                            <a href="/cdn-cgi/l/email-protection#cc8fa3a2b8adafb88cb6a5a2b6a9a2bba5a2a9e2afa3a1" class="link">
1856                                    <span class="__cf_email__" data-cfemail="87c4e8e9f3e6e4f3c7fdeee9fde2e9f0eee9e2a9e4e8ea">[email&#160;protected]</span>
1857                                </a>
1858                            
1859                                                            <a href="tel:(972) 547-4620" class="number">
1860                                    (972) 547-4620
1861                                </a>
1862                            
1863
1864                                                                    
1865                                                                            <ul class="info-date">
1866                                                                                            <li>
1867                                                    Monday: <span>11:00am – 10:00pm</span>
1868                                                </li>
1869                                                                                            <li>
1870                                                    Tuesday: <span>11:00am – 10:00pm</span>
1871                                                </li>
1872                                                                                            <li>
1873                                                    Wednesday: <span>11:00am – 10:00pm</span>
1874                                                </li>
1875                                                                                            <li>
1876                                                    Thursday: <span>11:00am – 10:00pm</span>
1877                                                </li>
1878                                                                                            <li>
1879                                                    Friday: <span>11:00am – 11:59pm</span>
1880                                                </li>
1881                                                                                            <li>
1882                                                    Saturday: <span>11:00am – 11:59pm</span>
1883                                                </li>
1884                                                                                            <li>
1885                                                    Sunday: <span>11:00am – 9:00pm</span>
1886                                                </li>
1887                                                                                    </ul>
1888                                                                    
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898                        </div>
1899                    </div>
1900                </div>
1901                <!-- End Contact Section -->
1902            </div>
1903        </div>
1904    </div>
1905
1906    <div class="footer-bottom style-2">
1907        <div id="scrollUp" class="scroll-icon bg-cover">
1908            <i class="fas fa-arrow-alt-up"></i>
1909        </div>
1910        <div class="container">
1911            <div class="footer-bottom-wrapper d-flex align-items-center justify-content-between">
1912                <p class="wow fadeInLeft" data-wow-delay=".3s">
1913                    © Copyright
1914                    <span class="theme-color-3">2026</span>
1915                    <a href="https://www.zinzenwine.com">
1916                        Zin Zen Wine Bistro
1917                    </a>. All Rights Reserved.
1918                </p>
1919                <ul class="d-flex align-items-center gap-3 flex-wrap justify-content-end" style="width: auto">
1920                    <li>
1921                        <button type="button" class="tc-privacy-link p-0" data-tc-privacy-open>
1922                            Privacy Choices
1923                        </button>
1924                    </li>
1925                    <li>
1926                        <a href="https://www.town.club/privacy" target="_blank" rel="noopener">
1927                            Privacy Policy
1928                        </a>
1929                    </li>
1930                    <li>
1931                        <a href="https://www.town.club/terms" target="_blank" rel="noopener">
1932                            Terms
1933                        </a>
1934                    </li>
1935                    <li>
1936                        <a href="https://www.town.club/disclaimer" target="_blank" rel="noopener">
1937                            Disclaimer
1938                        </a>
1939                    </li>
1940                    <li style="width: 100px">
1941                        <a href="https://app.yourfoodonline.com" target="_blank">
1942                <img alt="Town" src="https://www.zinzenwine.com/assets/images/powered_by_logo_name.svg" loading="lazy" decoding="async">
1943                        </a>
1944                    </li>
1945                </ul>
1946            </div>
1947        </div>
1948    </div>
1949</footer>
1950    </div>
vendor: 110 bytes, lines 1950-1952
1950
1951
1952<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1952<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery-3.7.1.min.js"></script>
vendor: 1 bytes, line 1952
1952
1953<script src="https://www.zinzenwine.com/assets/frontend/assets/js/viewport.jquery.js"></script>
vendor: 1 bytes, line 1953
1953
1954<script src="https://www.zinzenwine.com/assets/frontend/assets/js/bootstrap.bundle.min.js"></script>
vendor: 1 bytes, line 1954
1954
1955<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery.nice-select.min.js"></script>
vendor: 1 bytes, line 1955
1955
1956<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery.waypoints.js"></script>
vendor: 1 bytes, line 1956
1956
1957<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery.counterup.min.js"></script>
vendor: 1 bytes, line 1957
1957
1958<script src="https://www.zinzenwine.com/assets/frontend/assets/js/swiper-bundle.min.js"></script>
vendor: 1 bytes, line 1958
1958
1959<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery.meanmenu.min.js"></script>
vendor: 1 bytes, line 1959
1959
1960<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery.magnific-popup.min.js"></script>
vendor: 1 bytes, line 1960
1960
1961<script src="https://www.zinzenwine.com/assets/frontend/assets/js/animation.js"></script>
vendor: 1 bytes, line 1961
1961
1962<script src="https://www.zinzenwine.com/assets/frontend/assets/js/wow.min.js"></script>
vendor: 1 bytes, line 1962
1962
1963<script src="https://www.zinzenwine.com/assets/frontend/assets/js/color-contrast.js"></script>
vendor: 1 bytes, line 1963
1963
1964<script>
1965    window.TC_CURRENCY = {"code":"USD","stripe":"usd","symbol":"$","country":"US","exponent":2,"factor":100};
1966    window.TcMoney = (function () {
1967        const defaultConfig = window.TC_CURRENCY || {};
1968
1969        function normalizedConfig(override) {
1970            const config = Object.assign({}, defaultConfig, override || {});
1971            const exponent = Math.max(0, Math.min(4, parseInt(config.exponent ?? 2, 10) || 0));
1972            const factor = Math.max(1, parseInt(config.factor ?? Math.pow(10, exponent), 10) || Math.pow(10, exponent));
1973
1974            return {
1975                code: config.code || 'USD',
1976                symbol: config.symbol || '$',
1977                exponent,
1978                factor,
1979            };
1980        }
1981
1982        function format(value, override) {
1983            const config = normalizedConfig(override);
1984            const amount = Number(value);
1985            const safeAmount = Number.isFinite(amount) ? amount : 0;
1986            const rendered = safeAmount.toLocaleString(undefined, {
1987                minimumFractionDigits: config.exponent,
1988                maximumFractionDigits: config.exponent,
1989            });
1990
1991            return `${config.symbol} ${rendered}`.trim();
1992        }
1993
1994        function formatMinor(value, override) {
1995            const config = normalizedConfig(override);
1996            const cents = parseInt(value || 0, 10);
1997            const safeCents = Number.isFinite(cents) ? cents : 0;
1998
1999            return format(safeCents / config.factor, config);
2000        }
2001
2002        function toMinor(value, override) {
2003            const config = normalizedConfig(override);
2004            const amount = Number(value);
2005
2006            return Math.round((Number.isFinite(amount) ? amount : 0) * config.factor);
2007        }
2008
2009        function fromMinor(value, override) {
2010            const config = normalizedConfig(override);
2011            const cents = parseInt(value || 0, 10);
2012
2013            return (Number.isFinite(cents) ? cents : 0) / config.factor;
2014        }
2015
2016        return { config: normalizedConfig(), format, formatMinor, toMinor, fromMinor };
2017    })();
2018</script>
2018
2019
2020<script src="https://www.zinzenwine.com/assets/frontend/assets/js/main.js?v=1790249518"></script>
2020
2021
2022
2023<script>
2024    document.addEventListener('DOMContentLoaded', function(){
2025        const sidebar = document.getElementById('social-sidebar');
2026        if (sidebar) {
2027            const toggle = sidebar.querySelector('.toggle-btn');
2028            if (toggle) {
2029                toggle.addEventListener('click', () => {
2030                    sidebar.classList.toggle('expanded');
2031                });
2032            }
2033        }
2034    });
2035</script>
2035
2036
2037<script>
2038    document.addEventListener('DOMContentLoaded', function () {
2039        let trafficTracked = false;
2040
2041        function trackTrafficWhenAllowed() {
2042            if (trafficTracked || !window.TCPrivacy || !window.TCPrivacy.canUse('analytics')) {
2043                return;
2044            }
2045
2046            trafficTracked = true;
2047
2048            try {
2049                const storageKey = 'tc_visitor_id';
2050                let visitorId = localStorage.getItem(storageKey);
2051                if (!visitorId) {
2052                    visitorId = (window.crypto?.randomUUID ? window.crypto.randomUUID() : `${Date.now()}-${Math.random().toString(16).slice(2)}`);
2053                    localStorage.setItem(storageKey, visitorId);
2054                }
2055
2056                const params = new URLSearchParams(window.location.search);
2057                const payload = {
2058                    event_type: 'page_view',
2059                    page_url: window.location.href,
2060                    path: window.location.pathname,
2061                    referrer: document.referrer || '',
2062                    visitor_id: visitorId,
2063                    utm_source: params.get('utm_source') || '',
2064                    utm_medium: params.get('utm_medium') || '',
2065                    utm_campaign: params.get('utm_campaign') || ''
2066                };
2067
2068                fetch("\/analytics\/traffic", {
2069                    method: 'POST',
2070                    headers: {
2071                        'Content-Type': 'application/json',
2072                        'Accept': 'application/json',
2073                        'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || ''
2074                    },
2075                    body: JSON.stringify(payload),
2076                    keepalive: true
2077                }).catch(() => {});
2078
2079            } catch (error) {}
2080        }
2081
2082        if (window.TCPrivacy) {
2083            window.TCPrivacy.onConsentChange(trackTrafficWhenAllowed);
2084        }
2085
2086        trackTrafficWhenAllowed();
2087    });
2088</script>
2088
2089
2090
2091
2092
2093            
2093<script>
2094        document.addEventListener('DOMContentLoaded', function() {
2095            const sidebarToggle = document.getElementById('mobileSidebarToggle');
2096            const headerSticky  = document.getElementById('header-sticky');
2097
2098            function updateSidebarVisibility() {
2099                if (!sidebarToggle) return;
2100                sidebarToggle.style.display = window.innerWidth < 768 ? 'block' : 'none';
2101            }
2102
2103            function updateSticky() {
2104                if (!headerSticky) return;
2105                headerSticky.classList.toggle('sticky', window.scrollY > 80);
2106            }
2107            updateSidebarVisibility();
2108            updateSticky();
2109            window.addEventListener('resize', updateSidebarVisibility);
2110            window.addEventListener('scroll', updateSticky);
2111        });
2112    </script>
2112
2113
2114<script src="https://www.zinzenwine.com/assets/frontend/assets/js/tc/business_selector.js?v=1790073480"></script>
2114
2115    
2115<script>
2116        document.addEventListener('DOMContentLoaded', () => {
2117            if (window.TownClubBusinessSelector?.mount) {
2118                window.TownClubBusinessSelector.mount();
2119                return;
2120            }
2121
2122            const modalEl = document.getElementById('tcBusinessSelectorModal');
2123            const modal   = modalEl ? new bootstrap.Modal(modalEl) : null;
2124            const $dropdown        = $('#business-selector');
2125            const $form            = $('#tcBusinessSelectorForm');
2126            const $loading         = $('#loadingMessage');
2127            const $error           = $('#locationError');
2128            const $logoImg         = $('#selected-business-logo img');
2129            const $phoneEl         = $('#business-phone');
2130            const $modalSelect     = $('#business');
2131
2132            $error.hide();
2133
2134            function getCookie(name) {
2135                const match = document.cookie.match(new RegExp('(?:^|; )' + name.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1') + '=([^;]*)'));
2136                return match ? decodeURIComponent(match[1]) : undefined;
2137            }
2138
2139            function updateHeader() {
2140                const opt   = $dropdown.find(':selected');
2141                const logo  = opt.data('logo')  || 'assets/img/logo/logo-3.svg';
2142                const phone = opt.data('phone') || '+1718-904-4450';
2143                $logoImg.attr('src', logo);
2144                $phoneEl.text(phone).attr('href', `tel:${phone}`);
2145            }
2146
2147            function saveSelection() {
2148                const opt = $dropdown.find(':selected');
2149                const businessId = opt.val();
2150
2151                if (!businessId) return;
2152
2153                if ($loading) $loading.show();
2154
2155                // Cambiado de 'business.switch' a 'frontend.business.switch'
2156                fetch('https://www.zinzenwine.com/context/switch-business', {
2157                    method: 'POST',
2158                    headers: {
2159                        'Content-Type': 'application/json',
2160                        'X-CSRF-TOKEN': 'QUAY7qp3f9vxznTgECZV7rSPGioc1ts6bDtSsma9'
2161                    },
2162                    body: JSON.stringify({ business_id: businessId })
2163                })
2164                    .then(response => response.json())
2165                    .then(data => {
2166                        if (data.success) {
2167                            localStorage.setItem('selectedBusiness', JSON.stringify({
2168                                id: data.business.id,
2169                                name: data.business.name,
2170                                logo: data.business.logo,
2171                                phone: opt.data('phone')
2172                            }));
2173                            window.location.reload();
2174                        } else {
2175                            alert(data.message || 'Error switching business');
2176                        }
2177                    })
2178                    .catch(error => {
2179                        console.error('Error:', error);
2180                    })
2181                    .finally(() => {
2182                        if ($loading) $loading.hide();
2183                    });
2184            }
2185
2186            function showManualLocationSelector() {
2187                $loading.hide();
2188                $error.show();
2189                $form.show();
2190            }
2191
2192            function showNoBusinessesError() {
2193                $loading.hide();
2194                $form.hide();
2195                $error.html('<div class="alert alert-danger">There are no business available at the moment.</div>').show();
2196            }
2197
2198            function showFormOnly() {
2199                $loading.hide();
2200                $error.hide();
2201                $form.show();
2202            }
2203
2204            function init() {
2205                const saved  = localStorage.getItem('selectedBusiness');
2206                const cookie = getCookie('resolved_business');
2207                const forced = new URLSearchParams(window.location.search).get('tc_business_id');
2208                const opts   = $dropdown.find('option');
2209                let savedBusiness = null;
2210
2211                try {
2212                    savedBusiness = saved ? JSON.parse(saved) : null;
2213                } catch (error) {
2214                    localStorage.removeItem('selectedBusiness');
2215                }
2216
2217                const savedId = savedBusiness?.id;
2218                const validSaved  = savedId && opts.filter(`[value="${savedId}"]`).length;
2219                const validCookie = cookie && opts.filter(`[value="${cookie}"]`).length;
2220                const validForced = forced && opts.filter(`[value="${forced}"]`).length;
2221
2222                if (validSaved || validCookie || validForced) {
2223                    if (validForced || validCookie) {
2224                        $dropdown.val(validForced ? forced : cookie);
2225                        const opt = $dropdown.find(':selected');
2226                        const data = {
2227                            id:   opt.val(),
2228                            name: opt.text().trim(),
2229                            lat:  opt.data('lat'),
2230                            lng:  opt.data('lng'),
2231                            logo: opt.data('logo'),
2232                            phone:opt.data('phone'),
2233                        };
2234                        localStorage.setItem('selectedBusiness', JSON.stringify(data));
2235                    } else {
2236                        $dropdown.val(savedId);
2237                    }
2238                    updateHeader();
2239                } else {
2240                    localStorage.removeItem('selectedBusiness');
2241
2242                    const businessCount = opts.length;
2243
2244                    if (businessCount === 0) {
2245                        if (modal) modal.show();
2246                        showNoBusinessesError();
2247                    } else if (businessCount === 1) {
2248                        $dropdown.val(opts.first().val());
2249                        saveSelection();
2250                    } else {
2251                        if (modal) modal.show();
2252                        showManualLocationSelector();
2253                    }
2254                }
2255            }
2256
2257            $form.on('submit', e => {
2258                e.preventDefault();
2259                const id = $modalSelect.val();
2260                if (id) {
2261                    $dropdown.val(id);
2262                }
2263                saveSelection();
2264            });
2265
2266            $dropdown.on('change', saveSelection);
2267
2268            if (modalEl) {
2269                modalEl.addEventListener('show.bs.modal', e => {
2270                    $modalSelect.val($dropdown.val());
2271
2272                if (e.relatedTarget?.dataset.bsTarget === '#tcBusinessSelectorModal') {
2273                        showFormOnly();
2274                        return;
2275                    }
2276                    $loading.show();
2277                    $form.hide();
2278                    $error.hide();
2279
2280                    showManualLocationSelector();
2281                });
2282            }
2283
2284            init();
2285        });
2286    </script>
2286
2287            
2287<script>
2288  document.addEventListener('DOMContentLoaded', () => {
2289    // --- 0. OBSERVER SETUP ---
2290    const observerOptions = {
2291      root: null,
2292      rootMargin: '0px',
2293      threshold: 0.1
2294    };
2295    const observer = new IntersectionObserver((entries, observer) => {
2296      entries.forEach(entry => {
2297        if (entry.isIntersecting) {
2298          entry.target.style.opacity = 1;
2299          entry.target.style.transform = 'translateY(0)';
2300          observer.unobserve(entry.target);
2301        }
2302      }
2303                     );
2304    }
2305                                              , observerOptions);
2306    document.querySelectorAll('.fade-up').forEach(el => {
2307      el.style.opacity = 0;
2308      el.style.transform = 'translateY(40px)';
2309      el.style.transition = 'opacity 1s ease-out, transform 1s cubic-bezier(0.2, 0.8, 0.2, 1)';
2310      observer.observe(el);
2311    }
2312                                                 );
2313    // --- INJECT CSS ---
2314    const injectStyles = (css) => {
2315      const style = document.createElement('style');
2316      style.textContent = css;
2317      document.head.appendChild(style);
2318    };
2319    const pageStyles = `
2320:root {
2321--brand-navy: #2C3E50 !important;
2322--brand-red: #9A1B2F !important;
2323--brand-green: #009444 !important;
2324--bg-cream: #F9F8F4 !important;
2325--bg-white: #ffffff !important;
2326--section-padding: 80px !important; 
2327}
2328body {
2329font-family: 'Montserrat', sans-serif !important;
2330background-color: var(--bg-cream) !important;
2331color: var(--brand-navy) !important;
2332line-height: 1.9 !important;
2333font-weight: 300 !important;
2334overflow-x: hidden !important;
2335}
2336/* --- GENERAL STYLES --- */
2337.texture-overlay {
2338position: fixed !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important;
2339pointer-events: none !important; z-index: 9999 !important; opacity: 0.04 !important;
2340background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E") !important;
2341}
2342h1, h2, h3, h4 { font-family: 'Cormorant Garamond', serif !important; color: var(--brand-navy) !important; font-weight: 700 !important; line-height: 1.05 !important; }
2343strong { font-weight: 600 !important; color: var(--brand-red) !important; }
2344img { width: 100% !important; display: block !important; object-fit: cover !important; }
2345.page-header { padding-top: 100px !important; padding-bottom: 120px !important; text-align: center !important; background: var(--bg-cream) !important; position: relative !important; overflow: hidden !important; }
2346.header-watermark { position: absolute !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; font-family: 'Cormorant Garamond', serif !important; font-size: 18vw !important; color: var(--brand-navy) !important; opacity: 0.03 !important; font-weight: 700 !important; z-index: 0 !important; pointer-events: none !important; line-height: 0 !important; }
2347.accent-line { width: 1px !important; height: 80px !important; background: var(--brand-green) !important; margin: 0 auto 2rem auto !important; display: block !important; }
2348.page-header h1 { font-size: 4.5rem !important; margin-bottom: 1.5rem !important; letter-spacing: -1px !important; }
2349.page-header p { font-size: 0.85rem !important; letter-spacing: 4px !important; text-transform: uppercase !important; color: var(--brand-navy) !important; font-weight: 500 !important; opacity: 0.7 !important; }
2350section { padding: var(--section-padding) 8% !important; position: relative !important; }
2351.story-split { display: grid !important; grid-template-columns: 1fr 1fr !important; gap: 6rem !important; align-items: center !important; }
2352.story-img-container { position: relative !important; padding: 15px !important; }
2353.story-img-container::before { content: '' !important; position: absolute !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important; border: 1px solid var(--brand-navy) !important; z-index: 0 !important; opacity: 0.3 !important; }
2354.story-img { position: relative !important; z-index: 1 !important; box-shadow: 0 20px 50px rgba(0,0,0,0.1) !important; transform: translate(15px, 15px) !important; filter: saturate(0.9) !important; }
2355.story-text h2 { font-size: 3rem !important; margin-bottom: 2rem !important; }
2356.story-text p { margin-bottom: 1.5rem !important; color: #555 !important; font-size: 1.05rem !important; text-align: justify !important; }
2357.experience-section { background: var(--bg-white) !important; padding-bottom: 50px !important; }
2358.section-head h2 { font-size: 3.5rem !important; margin-bottom: 0.5rem !important; }
2359.section-head p { font-family: 'Montserrat', sans-serif !important; font-size: 1rem !important; color: var(--brand-green) !important; letter-spacing: 2px !important; text-transform: uppercase !important; }
2360.features-grid { display: grid !important; grid-template-columns: repeat(3, 1fr) !important; gap: 2.5rem !important; margin-top: -80px !important; position: relative !important; z-index: 10 !important; }
2361.feature-card { padding: 3rem 2rem !important; background: var(--bg-cream) !important; text-align: center !important; transition: all 0.4s ease !important; border: 1px solid rgba(0,0,0,0.03) !important; position: relative !important; }
2362.feature-card::after { content: '' !important; position: absolute !important; bottom: 0 !important; left: 0 !important; width: 100% !important; height: 3px !important; background: var(--brand-red) !important; transform: scaleX(0) !important; transition: transform 0.4s ease !important; }
2363.feature-card:hover { transform: translateY(-10px) !important; box-shadow: 0 20px 40px rgba(44, 62, 80, 0.08) !important; }
2364.feature-card:hover::after { transform: scaleX(1) !important; }
2365.feature-icon { font-size: 2.5rem !important; color: var(--brand-navy) !important; margin-bottom: 1.5rem !important; opacity: 0.8 !important; transition: 0.3s !important; }
2366.feature-card:hover .feature-icon { color: var(--brand-red) !important; opacity: 1 !important; }
2367.feature-card h3 { margin-bottom: 1rem !important; font-size: 1.8rem !important; }
2368.feature-card p { font-size: 0.95rem !important; line-height: 1.6 !important; }
2369.community-section { background: var(--brand-navy) !important; color: #fff !important; text-align: center !important; padding-top: 100px !important; padding-bottom: 100px !important; }
2370.community-section h2 { color: #fff !important; margin-bottom: 1.5rem !important; font-size: 3rem !important; }
2371.community-section p.lead { max-width: 600px !important; margin: 0 auto 4rem auto !important; color: rgba(255,255,255,0.7) !important; font-size: 1.1rem !important; }
2372.charity-list { display: flex !important; flex-wrap: wrap !important; justify-content: center !important; gap: 0.8rem !important; max-width: 900px !important; margin: 0 auto !important; }
2373.charity-tag { background: transparent !important; padding: 10px 25px !important; border: 1px solid rgba(255,255,255,0.15) !important; border-radius: 50px !important; font-size: 0.8rem !important; letter-spacing: 1px !important; text-transform: uppercase !important; font-weight: 500 !important; transition: all 0.3s ease !important; cursor: default !important; text-decoration: none !important; color: var(--bg-cream) !important; }
2374.charity-tag:hover { background: var(--bg-white) !important; border-color: var(--bg-white) !important; color: var(--brand-navy) !important; transform: translateY(-2px) !important; }
2375.cta-banner { background: url('https://town-public.s3.amazonaws.com/zinzenwine/about_cta.webp') !important; background-size: cover !important; background-position: center !important; background-attachment: fixed !important; position: relative !important; padding: 10rem 2rem !important; display: flex !important; justify-content: center !important; align-items: center !important; }
2376.cta-overlay { position: absolute !important; top:0 !important; left:0 !important; width:100% !important; height:100% !important; background: linear-gradient(135deg, rgba(44,62,80,0.9), rgba(154,27,47,0.8)) !important; }
2377.cta-content { position: relative !important; z-index: 2 !important; max-width: 800px !important; text-align: center !important; color: white !important; backdrop-filter: blur(5px) !important; }
2378.cta-content h2 { color: white !important; font-size: 3.5rem !important; margin-bottom: 1.5rem !important; }
2379.btn-primary { display: inline-block !important; padding: 1.2rem 3.5rem !important; background: var(--brand-red) !important; color: #fff !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-size: 0.8rem !important; font-weight: 600 !important; transition: all 0.3s ease !important; cursor: pointer !important; text-decoration:none !important;}
2380.btn-primary:hover { background: transparent !important; border-color: var(--brand-navy) !important; color: var(--brand-navy) !important; }
2381.cta-content .btn-primary { border-color: #fff !important; background: #fff !important; color: var(--brand-navy) !important; }
2382.cta-content .btn-primary:hover { background: transparent !important; color: #fff !important; border-color: #fff !important; }
2383@media (max-width: 968px) { .story-split { grid-template-columns: 1fr !important; gap: 3rem !important; } .features-grid { grid-template-columns: 1fr !important; margin-top: 3rem !important; } .header-watermark { font-size: 25vw !important; } .story-img-container::before { transform: translate(-10px, -10px) !important; } .story-img { transform: none !important; } .page-header h1 { font-size: 3.5rem !important; } .cta-content { padding: 2rem !important; border: none !important; } }
2384/* --- REVIEWS SLIDER (UPDATED TO FIX PADDING Y & EQUAL HEIGHTS) --- */
2385.reviews-section { background: var(--bg-white) !important; border-top: 1px solid rgba(0,0,0,0.05) !important; overflow: hidden !important; }
2386.slider-container { width: 100% !important; padding: 2rem 0 !important; position: relative !important; overflow: hidden !important; }
2387.slider-track-reverse { display: flex !important; gap: 2rem !important; width: max-content !important; will-change: transform !important; transform: translateX(0); align-items: stretch !important; }
2388.slide-card.review-slide { width: 350px !important; flex-shrink: 0 !important; display: flex !important; }
2389/* New Inner Wrapper handles all the padding, backgrounds, and equal spacing */
2390.review-inner { background: #fff !important; padding: 4rem 2.5rem !important; border: 1px solid rgba(0,0,0,0.05) !important; text-align: center !important; display: flex !important; flex-direction: column !important; justify-content: space-between !important; width: 100% !important; border-radius: 8px !important;}
2391.review-inner .stars { color: #D4AF37 !important; margin-bottom: 1rem !important; font-size: 0.9rem !important; }
2392.review-inner .review-body { font-style: italic !important; font-size: 1.1rem !important; margin-bottom: 1.5rem !important; color: #555 !important; flex-grow: 1 !important; display: flex !important; align-items: center !important; justify-content: center !important; }
2393.review-inner .review-author { font-weight: 700 !important; color: var(--brand-red) !important; font-size: 0.8rem !important; text-transform: uppercase !important; }
2394/* --- MOSAIC GALLERY --- */
2395.mosaic-grid { display: grid !important; grid-template-columns: repeat(4, 1fr) !important; grid-auto-rows: 250px !important; gap: 15px !important; max-width: 1400px !important; margin: 0 auto !important; padding: 0 15px !important; grid-auto-flow: dense !important; }
2396.mosaic-item { position: relative !important; overflow: hidden !important; border-radius: 4px !important; cursor: pointer !important; }
2397.mosaic-item img { width: 100% !important; height: 100% !important; object-fit: cover !important; transition: transform 0.8s ease !important; }
2398/* Grid Sizes */
2399.item-large { grid-column: span 2 !important;
2399 grid-row: span 2 !important; }
2400.item-wide { grid-column: span 2 !important; grid-row: span 1 !important; }
2401.item-tall { grid-column: span 1 !important; grid-row: span 2 !important; }
2402.mosaic-overlay { position: absolute !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important; background: rgba(44, 62, 80, 0.85) !important; display: flex !important; flex-direction: column !important; justify-content: center !important; align-items: center !important; text-align: center !important; opacity: 0 !important; transition: all 0.4s ease !important; }
2403.mosaic-overlay h3 { font-family: 'Cormorant Garamond', serif !important; font-size: 1.8rem !important; margin-bottom: 0.5rem !important; line-height: 1.2 !important; transform: translateY(20px) !important; transition: 0.4s ease !important; }
2404.mosaic-overlay p { color: var(--brand-green) !important; font-weight: 600 !important; text-transform: uppercase !important; font-size: 0.75rem !important; letter-spacing: 2px !important; transform: translateY(20px) !important; transition: 0.4s ease 0.1s !important; margin: 0 !important; }
2405.item-cta { background: var(--brand-navy) !important; display: flex !important; align-items: center !important; justify-content: center !important; text-align: center !important; padding: 2rem !important; border: 1px solid rgba(255,255,255,0.1) !important; }
2406.cta-content h3 { color: #fff !important; font-size: 2rem !important; margin-bottom: 0.5rem !important; }
2407.cta-content p { color: #ccc !important; font-size: 0.9rem !important; margin-bottom: 1.5rem !important; }
2408.mosaic-item:hover img { transform: scale(1.15) !important; }
2409.mosaic-item:hover .mosaic-overlay { opacity: 1 !important; }
2410.mosaic-item:hover .mosaic-overlay h3, .mosaic-item:hover .mosaic-overlay p { transform: translateY(0) !important; }
2411/* Tablet */
2412@media (max-width: 1024px) { 
2413.mosaic-grid { grid-template-columns: repeat(3, 1fr) !important; } 
2414.item-large { grid-column: span 2 !important; grid-row: span 2 !important; } 
2415}
2416/* Mobile - 1 Item Per Row & FIXED CTA */
2417@media (max-width: 768px) { 
2418.mosaic-grid { grid-template-columns: 1fr !important; gap: 15px !important; } 
2419.item-large, .item-wide, .item-tall { grid-column: span 1 !important; grid-row: span 1 !important; height: 300px !important; } 
2420.item-cta { height: 300px !important; width: 100% !important; padding: 1rem !important; box-sizing: border-box !important; }
2421.item-cta .cta-content h3 { font-size: 1.8rem !important; }
2422}
2423.dynamic-page-section .page-content-rendered img { max-width: 100% !important; height: 100% !important; }
2424/* --- WEEKLY SPECIALS --- */
2425.specials-section { background: var(--bg-cream) !important; padding: 80px 8% !important; }
2426.specials-grid { display: grid !important; grid-template-columns: repeat(5, 1fr) !important; gap: 1.5rem !important; position: relative !important; z-index: 10 !important; max-width: 1400px !important; margin: 3rem auto 0 auto !important; }
2427.special-card { padding: 3rem 1.2rem 2rem 1.2rem !important; background: var(--bg-white) !important; display: flex !important; flex-direction: column !important; justify-content: flex-start !important; align-items: center !important; height: 100% !important; box-shadow: 0 4px 15px rgba(0,0,0,0.02) !important; border: 1px solid rgba(0,0,0,0.03) !important; }
2428.special-card .feature-icon { font-size: 2rem !important; margin-bottom: 1.5rem !important; }
2429.special-card h3 { font-size: 1.5rem !important; color: var(--brand-red) !important; margin-bottom: 0.5rem !important; }
2430.special-card p { font-size: 0.85rem !important; color: #666 !important; line-height: 1.6 !important; margin: 0 !important; }
2431.special-card strong { font-family: 'Montserrat', sans-serif !important; font-size: 0.8rem !important; color: var(--brand-navy) !important; text-transform: uppercase !important; letter-spacing: 1px !important; display: block !important; margin-bottom: 0.8rem !important; font-weight: 600 !important; }
2432@media (max-width: 1200px) { .specials-grid { grid-template-columns: repeat(3, 1fr) !important; gap: 2rem !important; } }
2433@media (max-width: 900px) { .specials-grid { grid-template-columns: repeat(2, 1fr) !important; gap: 2rem !important; } }
2434@media (max-width: 600px) { .specials-grid { grid-template-columns: 1fr !important; gap: 2rem !important; } .special-card { padding: 2.5rem 1.5rem 2rem 1.5rem !important; } }
2435`;
2436    injectStyles(pageStyles);
2437    document.body.style.opacity = '1';
2438    // --- 1. SLIDER JS FORCE (UPDATED INNER HTML) ---
2439    const reviewsData = [
2440      {
2441        text: "What a fantastic place! I booked a table through hostme to celebrate my husband's birthday and so happy I did.", author: "M. S." }
2442      ,
2443      {
2444        text: "Big thanks to the team at Zin Zen! We recently hosted our 
2444car club brunch and meeting there, and we couldn’t have been happier. The food was excellent, the service outstanding and the venue was perfect for a small social event. The team there went above and beyond to accommodate a larger group than we had expected. Highly recommend!", author: "Jason" }
2445      ,
2446      {
2447        text: "The food and the wine were both delicious! We loved the baked brie, and the shrimp was very tasty as well. We don't know too much about wine, so we really appreciated the pre built flights. We ordered one to share, which was plenty. The price was quite reasonable as well.", author: "Rachael Hudson" }
2448      ,
2449      {
2450        text: "We had my birthday celebration there and it was amazing. The service was great. The food was incredible!", author: "Laurie McGuire" }
2451      ,
2452      {
2453        text: "Delicious flatbread and wine cocktail. Our server was very nice and helpful.", author: "Nikolett Fülöp" }
2454      ,
2455      {
2456        text: "Decided to come in for a peaceful lunch by myself today. There were 2 ladies that helped me. One took my order and the other one brought me my food. Both ladies were very sweet.", author: "April" }
2457      ,
2458      {
2459        text: "I've been wanting to try this place for years! We went for a girl's night and it was great! Monday is all day Happy Hour, so we tried a lot of the appetizers on that menu. They were good and very easy to share. The drinks were also delicious.", author: "Michelle Flannigan" }
2460      ,
2461      {
2462        text: "We've been coming for so many years, if you go, the service is incredible. We always sit with Daniel… We have an incredible experience in music is surreal. The service is amazing and the food is great. You will never be disappointed if you come here.", author: "Teresa D" }
2463      ,
2464      {
2465        text: "I was hosting a baby shower at Zin Zen in December. Food, ambience and service were superb! Guests said it is perfect place for that. I am also a guest there and enjoy their warm atmosphere, yummy food and very friendly stuff. I am happy that we have this bistro in our neighbourhood", author: "Tihana Kosanović" }
2466      ,
2467      {
2468        text: "Not even sure how to describe it! Little Italy meets Texas - Charming, great service, great food, wine, atmosphere. We sat outside on the patio & could hear the live music inside. Completely perfect evening!", author: "Homes By Katina" }
2469    ];
2470    const reviewsTrack = document.getElementById('reviews-track');
2471    if (reviewsTrack) {
2472      const fullReviews = [...reviewsData, ...reviewsData, ...reviewsData];
2473      const getStars = (count) => {
2474        return Array(5).fill('<i class="bi bi-star"></i>').map((s, i) => i < count ? '<i class="bi bi-star-fill"></i>' : s).join('');
2475      };
2476      /* INNER WRAPPER ADDED HERE */
2477      reviewsTrack.innerHTML = fullReviews.map(review => `
2478<div class="slide-card review-slide">
2479<div class="review-inner">
2480<div>
2481<div class="stars">${getStars(5)}
2482  </div>
2483<p class="review-body">"${review.text}
2484"</p>
2485  </div>
2486<div class="review-author">- ${review.author}
2487  </div>
2488  </div>
2489  </div>
2490`).join('');
2491      // Javascript Animation Loop
2492      let currentPosition = 0;
2493      const speed = 0.5;
2494      let isHovered = false;
2495      reviewsTrack.addEventListener('mouseenter', () => isHovered = true);
2496      reviewsTrack.addEventListener('mouseleave', () => isHovered = false);
2497      function animateSlider() {
2498        if (!isHovered) {
2499          currentPosition -= speed;
2500          const totalWidth = reviewsTrack.scrollWidth;
2501          const oneSetWidth = totalWidth / 3;
2502          if (Math.abs(currentPosition) >= oneSetWidth) {
2503            currentPosition = 0;
2504          }
2505          reviewsTrack.style.transform = `translateX(${currentPosition}
2506px)`;
2507        }
2508        requestAnimationFrame(animateSlider);
2509      }
2510      requestAnimationFrame(animateSlider);
2511    }
2512    // --- 2. CHARITY LIST ---
2513    const charityData = [
2514      {
2515        name: "Goodwill", url: "https://www.goodwillnorthtexas.org/" }
2516      ,
2517      {
2518        name: "Kidd's Kids", url: "https://www.kiddskids.org/" }
2519      ,
2520      {
2521        name: "Relay For Life", url: "https://connect.relayforlife.org/" }
2522      ,
2523      {
2524        name: "Meals on Wheels", url: "https://connect.relayforlife.org/" }
2525      ,
2526      {
2527        name: "The Samaritan Inn", url: "https://connect.relayforlife.org/" }
2528      ,
2529      {
2530        name: "Heritage High School", url: "https://connect.relayforlife.org/" }
2531      ,
2532      {
2533        name: "Delicious Wishes 2016", url: "#" }
2534      ,
2535      {
2536        name: "The Parker Foundation", url: "https://connect.relayforlife.org/" }
2537      ,
2538      {
2539        name: "Eagle’s Wings Athletics", url: "https://connect.relayforlife.org/" }
2540      ,
2541      {
2542        name: "St. Mark Catholic School", url: "https://connect.relayforlife.org/" }
2543      ,
2544      {
2545        name: "Wolford Elementary PTA", url: "https://connect.relayforlife.org/" }
2546      ,
2547      {
2548        name: "Bennett Elementary PTO", url: "https://connect.relayforlife.org/" }
2549      ,
2550      {
2551        name: "Slaughter Elementary PTO", url: "https://connect.relayforlife.org/" }
2552      ,
2553      {
2554        name: "Allen Community Outreach", url: "https://connect.relayforlife.org/" }
2555      ,
2556      {
2557        name: "Children’s Advocacy Center", url: "https://connect.relayforlife.org/" }
2558      ,
2559      {
2560        name: "McKinney Performing Arts Center", url: "https://connect.relayforlife.org/" }
2561      ,
2562      {
2563        name: "Pulmonary Hypertension Association", url: "https://connect.relayforlife.org/" }
2564      ,
2565      {
2566        name: "McKinney Boyd Engineering Boosters", url: "https://connect.relayforlife.org/" }
2567      ,
2568      {
2569        name: "St. Peter’s Episcopal Church Youth Group", url: "https://connect.relayforlife.org/" }
2570      ,
2571      {
2572        name: "McKinney High School Cross Country Team", url: "https://connect.relayforlife.org/" }
2573      ,
2574    ];
2575    const charityContainer = document.getElementById('charity-list');
2576    if (charityContainer) {
2577      charityContainer.innerHTML = charityData.map(item => `
2578<a href="${item.url}
2579" target="_blank" class="charity-tag">${item.name}
2580  </a>
2581`).join('');
2582    }
2583    // --- 3. APPLY WHITE TITLES ---
2584    const mosaicTitles = document.querySelectorAll('.mosaic-overlay h3');
2585    mosaicTitles.forEach(h3 => {
2586      h3.setAttribute('style', 'color: #ffffff !important;');
2587    }
2588                        );
2589  }
2590                           );
2591</script>
2591
2592
2593<script type="application/ld+json">
2594{
2595  "@context": "https://schema.org",
2596  "@type": "AboutPage",
2597  "name": "Our Story | Zin Zen Wine Bistro",
2598  "mainEntity": {
2599    "@type": ["BarOrPub", "Restaurant"],
2600    "name": "Zin Zen Wine Bistro",
2601    "description": "Zin Zen Wine Bistro was established in 2006 with a singular vision: to bring the rich, slow-paced culture of European dining to the Croatian-inspired Adriatica Village. Locally owned and operated, we curate over 80 different wines from around the world.",
2602    "foundingDate": "2006",
2603    "image": [
2604      "https://town-public.s3.amazonaws.com/zinzenwine/hero2.webp",
2605      "https://town-public.s3.amazonaws.com/zinzenwine/hero3.webp"
2606    ],
2607    "address": {
2608      "@type": "PostalAddress",
2609      "addressLocality": "McKinney",
2610      "addressRegion": "TX"
2611    },
2612    "hasMenu": "https://www.zinzenwine.com/m/all-day-menu-3po-50",
2613    "memberOf": {
2614      "@type": "Organization",
2615      "name": "McKinney Chamber of Commerce"
2616    }
2617  }
2618}
2619</script>
2619
2620    
2621</body>
2622</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.