Giới
thiệu
Bộ dữ liệu mpg
là một tập dữ liệu kinh điển được thu
thập bởi Cơ quan Bảo vệ Môi trường Hoa Kỳ (EPA), chứa thông tin về mức
tiêu thụ nhiên liệu của các mẫu xe phổ biến từ năm 1999 đến 2008. Dữ
liệu này thường được dùng để nghiên cứu mối quan hệ giữa các đặc tính
của xe và hiệu suất nhiên liệu. Trong nghiên cứu này, tác giả tập trung
vào hai biến định tính quan trọng liên quan đến cấu trúc và phân loại
xe, đó là:
drv
: Loại hệ dẫn động của xe
(f
= cầu trước, r
= cầu sau, 4
=
hai cầu).
class
: Phân loại xe (ví dụ:
compact
, suv
, midsize
).
Hai biến này được chọn làm biến nghiên cứu chính,
với mục tiêu phân tích xem các yếu tố kỹ thuật và đặc điểm của
nhà sản xuất như:
- Nhà sản xuất (
manufacturer
)
- Số xi-lanh của động cơ (
cyl
)
- Dung tích động cơ (
displ
)
- Loại hộp số (
trans
)
… có ảnh hưởng như thế nào đến loại hệ dẫn động và
phân khúc xe của một mẫu xe.
Thông qua việc sử dụng các công cụ phân tích dữ liệu định tính như:
bảng tần số, biểu đồ minh họa, kiểm định Chi bình phương, phân tích tỷ
số chênh lệch (Odds Ratio) và rủi ro tương đối (Relative Risk), bài
nghiên cứu sẽ làm rõ các yếu tố quan trọng ảnh hưởng đến đặc tính kỹ
thuật của các dòng xe, từ đó đưa ra những góc nhìn hữu ích cho ngành
công nghiệp ô tô về xu hướng thiết kế và sản xuất.
Đọc và khám
phá dữ liệu
library(ggplot2)
library(dplyr)
library(epitools)
# Đọc dữ liệu từ package ggplot2
data("mpg")
str(mpg)
## tibble [234 × 11] (S3: tbl_df/tbl/data.frame)
## $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
## $ model : chr [1:234] "a4" "a4" "a4" "a4" ...
## $ displ : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
## $ year : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
## $ cyl : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
## $ trans : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
## $ drv : chr [1:234] "f" "f" "f" "f" ...
## $ cty : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
## $ hwy : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
## $ fl : chr [1:234] "p" "p" "p" "p" ...
## $ class : chr [1:234] "compact" "compact" "compact" "compact" ...
summary(mpg)
## manufacturer model displ year
## Length:234 Length:234 Min. :1.600 Min. :1999
## Class :character Class :character 1st Qu.:2.400 1st Qu.:1999
## Mode :character Mode :character Median :3.300 Median :2004
## Mean :3.472 Mean :2004
## 3rd Qu.:4.600 3rd Qu.:2008
## Max. :7.000 Max. :2008
## cyl trans drv cty
## Min. :4.000 Length:234 Length:234 Min. : 9.00
## 1st Qu.:4.000 Class :character Class :character 1st Qu.:14.00
## Median :6.000 Mode :character Mode :character Median :17.00
## Mean :5.889 Mean :16.86
## 3rd Qu.:8.000 3rd Qu.:19.00
## Max. :8.000 Max. :35.00
## hwy fl class
## Min. :12.00 Length:234 Length:234
## 1st Qu.:18.00 Class :character Class :character
## Median :24.00 Mode :character Mode :character
## Mean :23.44
## 3rd Qu.:27.00
## Max. :44.00
sapply(mpg, function(x) length(unique(x)))
## manufacturer model displ year cyl trans
## 15 38 35 2 4 10
## drv cty hwy fl class
## 3 21 27 5 7
Mô tả các
biến
manufacturer |
Character |
15 |
Hãng sản xuất xe (ví dụ: audi , ford ,
toyota ). |
model |
Character |
38 |
Tên dòng xe. |
displ |
Numeric |
47 |
Dung tích động cơ (lít). |
year |
Integer |
2 |
Năm sản xuất (1999 hoặc 2008). |
cyl |
Integer |
4 |
Số xi-lanh động cơ (4, 5, 6, 8). |
trans |
Character |
10 |
Loại hộp số (ví dụ: auto(l5) ,
manual(m6) ). |
drv |
Character |
3 |
Loại hệ dẫn động (f =cầu trước, r =cầu sau,
4 =hai cầu). |
cty |
Integer |
21 |
Mức tiêu thụ nhiên liệu trong thành phố (dặm/gallon). |
hwy |
Integer |
27 |
Mức tiêu thụ nhiên liệu trên cao tốc (dặm/gallon). |
fl |
Character |
5 |
Loại nhiên liệu (p =premium, r =regular,
e =ethanol, d =diesel, c =cng). |
class |
Character |
7 |
Phân loại xe (ví dụ: compact , suv ,
pickup ). |
Nhận xét
Bộ dữ liệu gồm 11 biến và 234 quan sát, được chia thành hai nhóm
chính: biến định lượng và biến định tính.
Biến định lượng: Gồm các biến
displ
, year
, cyl
,
cty
, hwy
. Các biến này đo lường các thông số
kỹ thuật và hiệu suất, có thể dùng để tính toán các chỉ số thống kê và
xây dựng mô hình hồi quy.
Các biến định tính: Gồm các biến
manufacturer
, model
, trans
,
drv
, fl
, class
. Các biến này mang
thông tin dạng danh mục, thường được phân tích bằng cách đếm tần số, tỷ
lệ, và sử dụng các phương pháp thống kê cho dữ liệu định tính.
Tạo bộ dữ liệu chỉ có biến định tính (và các biến định lượng
cần thiết)
# Tạo bộ dữ liệu chỉ chứa các biến cần thiết cho phân tích định tính
data1 <- mpg %>%
select(manufacturer, class, drv, cyl, trans)
# Xem trước dữ liệu mới
str(data1)
## tibble [234 × 5] (S3: tbl_df/tbl/data.frame)
## $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
## $ class : chr [1:234] "compact" "compact" "compact" "compact" ...
## $ drv : chr [1:234] "f" "f" "f" "f" ...
## $ cyl : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
## $ trans : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
head(data1)
Phương pháp Ước
lượng Hợp lý Tối đa (Maximum Likelihood Estimation – MLE)
Giới thiệu
chung
Trong thống kê và học máy, dữ liệu thường được mô hình hóa thông qua
các phân phối xác suất. Một phân phối xác suất được đặc
trưng bởi một số tham số, ví dụ như:
- Phân phối chuẩn (Gaussian): \(\mu\)
(trung bình), \(\sigma^2\) (phương
sai).
- Phân phối Poisson: tham số đặc trưng là \(\lambda\).
Nếu ta đã biết được dạng của phân phối xác suất, vấn đề đặt ra là:
làm sao tìm được các tham số mô tả phân phối đó một cách phù hợp
nhất với dữ liệu quan sát? Đó chính là nhiệm vụ của phương pháp
ước lượng hợp lý tối đa (Maximum Likelihood Estimation –
MLE).
MLE là một công cụ căn bản và quan trọng trong thống kê suy diễn và
học máy, giúp chúng ta tìm ra các tham số mô hình sao cho phân
phối xác suất sinh ra dữ liệu là “phù hợp nhất” với thực tế đã quan
sát.
Mục tiêu và
nguyên lý của MLE
Khái niệm
hàm hợp lý (Likelihood Function)
Hàm hợp lý (likelihood function) đo lường
mức độ phù hợp của mô hình (tham số) với dữ liệu đã quan
sát. Tức là, với một mô hình xác suất có tham số \(\mathbf{w}\), hàm hợp lý cho biết
xác suất để toàn bộ tập dữ liệu \(\mathcal{D}\) xảy ra, dưới giả
định rằng dữ liệu được sinh ra từ mô hình đó.
Giả sử có một bộ dữ liệu gồm \(N\)
quan sát đầu vào:
\[
\mathcal{D} = \{ \mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_N \}
\]
và mô hình phân phối xác suất \(P(\mathbf{x}|\mathbf{w})\) phụ thuộc vào
tham số
\[
\mathbf{w} = (w_1, w_2, \ldots, w_k)^T
\]
Khi đó, hàm hợp lý được định nghĩa là:
\[
L(\mathbf{w}) = P(\mathcal{D}|\mathbf{w}) = P(\mathbf{x}_1,
\mathbf{x}_2, \ldots, \mathbf{x}_N|\mathbf{w})
\]
Nếu các quan sát \(\mathbf{x}_i\) là
độc lập và phân phối giống nhau (i.i.d – independent and
identically distributed), thì hàm hợp lý có thể viết lại
thành:
\[
L(\mathbf{w}) = \prod_{i=1}^{N} P(\mathbf{x}_i|\mathbf{w})
\]
Nguyên lý
tối đa hóa hợp lý
Nguyên lý cốt lõi của MLE là chọn giá trị tham số \(\hat{\mathbf{w}}\) sao cho hàm hợp
lý đạt giá trị lớn nhất. Nói cách khác, ta tìm tham số mà
dưới nó thì xác suất tạo ra dữ liệu quan sát là cao
nhất:
\[
\hat{\mathbf{w}} = \arg\max_{\mathbf{w}} L(\mathbf{w})
\]
Tuy nhiên, việc tối ưu một tích lớn các xác suất như vậy thường không
thuận tiện. Vì vậy, ta thường lấy log của hàm hợp lý để
thu được hàm log-hợp lý (log-likelihood function):
\[
\ell(\mathbf{w}) = \log L(\mathbf{w}) = \sum_{i=1}^{N} \log
P(\mathbf{x}_i|\mathbf{w})
\]
Do hàm log là đơn điệu tăng, nên điểm cực đại của \(\ell(\mathbf{w})\) cũng chính là cực đại
của \(L(\mathbf{w})\). Vậy nên:
\[
\hat{\mathbf{w}} = \arg\max_{\mathbf{w}} \ell(\mathbf{w})
\]
Tóm tắt quy
trình MLE
Bước 1 |
Xác định mô hình xác suất \(P(x|\mathbf{w})\) và giả định dữ liệu độc
lập (i.i.d). |
Bước 2 |
Viết hàm hợp lý \(L(\mathbf{w})\)
hoặc log-hợp lý \(\ell(\mathbf{w})\). |
Bước 3 |
Tính đạo hàm của \(\ell(\mathbf{w})\) theo \(\mathbf{w}\), rồi giải phương trình đạo hàm
bằng 0. |
Bước 4 |
Kiểm tra điều kiện tối ưu (đạo hàm bậc hai, tính lồi, v.v.). |
Bước 5 |
Kết luận \(\hat{\mathbf{w}}\) là
ước lượng MLE. |
Mô hình hóa
bài toán dưới dạng toán học
Trong trường hợp dữ liệu phân phối i.i.d, bài toán MLE trở thành:
\[
\hat{\mathbf{w}} = \arg\max_{\mathbf{w}} \sum_{i=1}^{N} \log
P(\mathbf{x}_i|\mathbf{w})
\]
Đây là một bài toán tối ưu hóa có thể giải bằng:
- Đạo hàm tường minh (nếu có thể),
- Gradient Descent / Newton-Raphson (trong trường hợp phức tạp),
- Kỹ thuật tối ưu hóa số.
Tính chất của
ước lượng MLE
Nhất quán (Consistency) |
Khi \(N \to \infty\), MLE hội tụ về
đúng tham số thực sự. |
Bất biến (Invariance) |
Nếu \(\hat{\theta}\) là MLE của
\(\theta\), thì \(g(\hat{\theta})\) là MLE của \(g(\theta)\). |
Phân phối tiệm cận chuẩn |
MLE tiệm cận theo phân phối chuẩn khi \(N
\to \infty\). |
Không thiên lệch tiệm cận |
Khi mẫu lớn, sai số trung bình của MLE tiến về 0. |
Kết
luận
Phương pháp ước lượng hợp lý tối đa (MLE) là một
công cụ then chốt trong thống kê và học máy. Bằng cách tối đa hóa xác
suất sinh ra dữ liệu đã quan sát, MLE hướng tới mục tiêu chọn mô hình
phù hợp nhất với thực tế. Phương pháp này có cơ sở lý thuyết vững chắc
và có thể áp dụng để ước lượng tham số của nhiều phân phối phổ biến như
Bernoulli, Gaussian, Poisson, v.v.
Mô hình Hồi quy
Logistic và Probit
Giới thiệu
chung
Khi các phương pháp phân tích bảng chéo và kiểm định Chi bình phương
đã xác nhận sự tồn tại của mối quan hệ giữa các biến định tính, bước
tiếp theo là xây dựng một mô hình dự báo để lượng hóa tác động của các
biến độc lập lên một biến phụ thuộc nhị phân. Khi biến phụ thuộc có hai
giá trị (ví dụ: 4WD
/ Không 4WD
), mô hình hồi
quy tuyến tính thông thường (OLS) sẽ không còn phù hợp vì nó có thể dự
đoán các giá trị nằm ngoài khoảng [0, 1], điều vô lý đối với một xác
suất.
Để giải quyết vấn đề này, các mô hình xác suất phi tuyến như
Hồi quy Logistic và Hồi quy Probit
được sử dụng. Cả hai đều thuộc nhóm Mô hình Tuyến tính Tổng quát
(Generalized Linear Models - GLM), với mục tiêu mô hình hóa xác
suất xảy ra của một sự kiện, \(P(Y=1|X)\), dựa trên các biến độc lập \(X\).
Hồi quy
Logistic (Logistic Regression)
Mục tiêu và
nguyên lý
Hồi quy Logistic không mô hình hóa trực tiếp xác suất \(p\), mà mô hình hóa logarit của tỷ
số chênh (log-odds), còn gọi là hàm logit.
- Tỷ số chênh (Odds): Là tỷ lệ giữa xác suất xảy ra
sự kiện và xác suất không xảy ra sự kiện: \[
\text{Odds} = \frac{p}{1-p} \]
- Hàm Logit: Là logarit tự nhiên của Odds: \[ \text{logit}(p) = \ln\left(\frac{p}{1-p}\right)
\]
Hàm logit có một đặc tính tuyệt vời: nó biến một giá trị xác suất
\(p\) trong khoảng (0, 1) thành một giá
trị trên toàn bộ trục số thực \((-\infty,
+\infty)\). Điều này cho phép chúng ta mô hình hóa nó như một tổ
hợp tuyến tính của các biến độc lập:
\[
\ln\left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 X_{i1} + \beta_2
X_{i2} + \ldots + \beta_k X_{ik}
\]
Diễn giải
hệ số
Việc diễn giải hệ số \(\beta\) trực
tiếp khá phức tạp (“sự thay đổi trong log-odds”). Thay vào đó, chúng ta
thường lấy lũy thừa cơ số \(e\) của hệ
số để có được Tỷ số chênh (Odds Ratio - OR):
\[
\text{OR} = e^\beta
\]
- Nếu \(\beta_1 > 0 \implies e^{\beta_1}
> 1\): Khi \(X_1\) tăng 1 đơn
vị, odds để sự kiện \(Y=1\) xảy ra sẽ
tăng lên \(e^{\beta_1}\) lần, giữ các biến khác không
đổi.
- Nếu \(\beta_1 < 0 \implies e^{\beta_1}
< 1\): Khi \(X_1\) tăng 1 đơn
vị, odds để sự kiện \(Y=1\) xảy ra sẽ
giảm xuống còn \(e^{\beta_1}\) lần, giữ các biến khác không
đổi.
- Nếu \(\beta_1 = 0 \implies e^{\beta_1} =
1\): Biến \(X_1\) không ảnh
hưởng đến odds của sự kiện.
Hồi quy
Probit (Probit Regression)
Mục tiêu và
nguyên lý
Hồi quy Probit cũng mô hình hóa xác suất \(p\), nhưng thay vì dùng hàm logit, nó sử
dụng hàm phân phối tích lũy (CDF) của phân phối chuẩn
tắc, ký hiệu là \(\Phi(z)\).
Ý tưởng cơ bản là có một “biến tiềm ẩn” (latent variable) \(Y^*\) tuân theo phân phối chuẩn. Chúng ta
không quan sát được \(Y^*\), mà chỉ
quan sát được \(Y=1\) nếu \(Y^*\) vượt qua một ngưỡng nào đó.
Mô hình Probit có dạng: \[
P(Y=1|X) = \Phi(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \ldots + \beta_k
X_k)
\] Hoặc viết theo dạng hàm ngược (hàm probit): \[
\Phi^{-1}(p_i) = \beta_0 + \beta_1 X_{i1} + \beta_2 X_{i2} + \ldots +
\beta_k X_{ik}
\]
Diễn giải
hệ số
Hệ số \(\beta\) trong mô hình Probit
thể hiện sự thay đổi trong z-score (giá trị trên trục
hoành của phân phối chuẩn tắc) khi biến độc lập \(X\) thay đổi 1 đơn vị. Việc diễn giải này
không trực quan và thường ít được sử dụng trong báo cáo kinh doanh. Thay
vào đó, người ta thường tính toán và báo cáo tác động biên
(marginal effects), tức là sự thay đổi trong xác suất \(p\) khi \(X\) thay đổi.
Logistic
vs. Probit: Lựa chọn nào?
Hàm liên kết |
Logit, dựa trên phân phối Logistic |
Probit, dựa trên phân phối Chuẩn |
Độ dốc |
Đường cong S (sigmoid) hơi phẳng hơn ở đuôi |
Đường cong S (sigmoid) dốc hơn ở đuôi |
Diễn giải |
Hệ số có thể diễn giải trực tiếp qua Odds Ratio
(OR) |
Hệ số khó diễn giải, thường dùng tác động biên |
Sử dụng |
Rất phổ biến trong y sinh, khoa học xã hội,
marketing |
Phổ biến trong kinh tế lượng |
Trong thực tế, cả hai mô hình thường cho kết quả dự đoán rất giống
nhau. Hồi quy Logistic thường được ưa chuộng hơn vì tính dễ diễn
giải của Odds Ratio.
Áp dụng mô
hình dự đoán hệ dẫn động hai cầu (4WD
)
Câu hỏi nghiên cứu: Những yếu tố kỹ thuật nào (dung
tích động cơ, số xi-lanh) ảnh hưởng đến khả năng một chiếc xe được trang
bị hệ dẫn động hai cầu (4WD
)?
Chuẩn bị dữ
liệu
Chúng ta sẽ tạo một biến phụ thuộc mới là is_4wd
, nhận
giá trị 1
nếu xe là 4WD
và 0
trong trường hợp còn lại.
# Tạo biến phụ thuộc nhị phân
mpg_model_data <- mpg %>%
mutate(is_4wd = ifelse(drv == "4", 1, 0))
# Xem qua dữ liệu mới
head(mpg_model_data %>% select(manufacturer, model, drv, is_4wd, displ, cyl))
Xây dựng và
phân tích mô hình Hồi quy Logistic
Chúng ta sẽ xây dựng mô hình dự đoán is_4wd
dựa trên
displ
(dung tích động cơ) và cyl
(số
xi-lanh).
# Xây dựng mô hình Logistic
logit_model <- glm(is_4wd ~ displ + cyl,
data = mpg_model_data,
family = binomial(link = "logit"))
# Xem kết quả
summary(logit_model)
##
## Call:
## glm(formula = is_4wd ~ displ + cyl, family = binomial(link = "logit"),
## data = mpg_model_data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.2004 0.6051 -3.637 0.000276 ***
## displ 0.7385 0.3118 2.368 0.017871 *
## cyl -0.1056 0.2412 -0.438 0.661626
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 321.03 on 233 degrees of freedom
## Residual deviance: 289.07 on 231 degrees of freedom
## AIC: 295.07
##
## Number of Fisher Scoring iterations: 4
Diễn giải kết quả mô hình Logistic:
- Hệ số của
displ
(Dung tích động cơ):
- Hệ số là
0.7385
. Giá trị này dương và có ý nghĩa thống
kê (p-value = 0.017 < 0.05).
- Để diễn giải, ta tính Odds Ratio:
exp(0.7385) ≈ 2.09
.
- Diễn giải: Nếu số xi-lanh không đổi thì khi dung
tích động cơ tăng 1 lít, tỷ lệ (odds) để chiếc xe đó là
xe
4WD
tăng lên 2.09 lần.
- Hệ số của
cyl
(Số xi-lanh):
- Hệ số là
-0.1056
. Giá trị âm nhưng không có ý
nghĩa thống kê ở mức 5% (p-value = 0.661 > 0.05).
Xây dựng và
phân tích mô hình Hồi quy Probit
# Xây dựng mô hình Probit
probit_model <- glm(is_4wd ~ displ + cyl,
data = mpg_model_data,
family = binomial(link = "probit"))
# Xem kết quả
summary(probit_model)
##
## Call:
## glm(formula = is_4wd ~ displ + cyl, family = binomial(link = "probit"),
## data = mpg_model_data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.37030 0.36683 -3.736 0.000187 ***
## displ 0.42691 0.18580 2.298 0.021581 *
## cyl -0.04788 0.14594 -0.328 0.742878
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 321.03 on 233 degrees of freedom
## Residual deviance: 289.29 on 231 degrees of freedom
## AIC: 295.29
##
## Number of Fisher Scoring iterations: 5
Diễn giải kết quả mô hình Probit:
- Hệ số của
displ
(Dung tích động cơ):
- Hệ số là
0.4269
. Giá trị này dương và có ý nghĩa thống
kê (p-value = 0.0001 < 0.05).
- Diễn giải: Nếu số xi-lanh không đổi thì khi dung
tích động cơ tăng 1 lít, z-score dự
đoán xác suất xe là
4WD
tăng lên 0.4269 đơn
vị.
- Hệ số của
cyl
(Số xi-lanh):
- Hệ số là
-0.0478
. Giá trị âm nhưng không có ý
nghĩa thống kê ở mức 5% (p-value = 0.7428 > 0.05).
So sánh hai
mô hình
Cả hai mô hình đều cho cùng một kết luận: dung tích động cơ
(displ
) là yếu tố dự báo quan trọng cho việc một chiếc xe
có phải là 4WD
hay không. Chúng ta có thể so sánh trực tiếp
xác suất dự đoán từ hai mô hình.
# Lấy xác suất dự đoán từ hai mô hình
mpg_model_data$pred_logit <- predict(logit_model, type = "response")
mpg_model_data$pred_probit <- predict(probit_model, type = "response")
# Vẽ biểu đồ so sánh
ggplot(mpg_model_data, aes(x = pred_logit, y = pred_probit)) +
geom_point(alpha = 0.5) +
geom_abline(intercept = 0, slope = 1, color = "red", linetype = "dashed") +
labs(
title = "So sánh xác suất dự đoán giữa mô hình Logit và Probit",
x = "Xác suất dự đoán từ mô hình Logistic",
y = "Xác suất dự đoán từ mô hình Probit"
) +
theme_minimal()

Kết luận:
Biểu đồ cho thấy các điểm dữ liệu nằm rất sát đường chéo màu đỏ,
chứng tỏ xác suất dự đoán từ hai mô hình gần như tương đương nhau.
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA2Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBlbmNvZGluZzogVVRGLTgNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpDQpgYGANCg0KDQojICoqR2nhu5tpIHRoaeG7h3UqKg0KDQpC4buZIGThu68gbGnhu4d1IGBtcGdgIGzDoCBt4buZdCB04bqtcCBk4buvIGxp4buHdSBraW5oIMSRaeG7g24gxJHGsOG7o2MgdGh1IHRo4bqtcCBi4bufaSBDxqEgcXVhbiBC4bqjbyB24buHIE3DtGkgdHLGsOG7nW5nIEhvYSBL4buzIChFUEEpLCBjaOG7qWEgdGjDtG5nIHRpbiB24buBIG3hu6ljIHRpw6p1IHRo4bulIG5oacOqbiBsaeG7h3UgY+G7p2EgY8OhYyBt4bqrdSB4ZSBwaOG7lSBiaeG6v24gdOG7qyBuxINtIDE5OTkgxJHhur9uIDIwMDguIEThu68gbGnhu4d1IG7DoHkgdGjGsOG7nW5nIMSRxrDhu6NjIGTDuW5nIMSR4buDIG5naGnDqm4gY+G7qXUgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIMSR4bq3YyB0w61uaCBj4bunYSB4ZSB2w6AgaGnhu4d1IHN14bqldCBuaGnDqm4gbGnhu4d1LiBUcm9uZyBuZ2hpw6puIGPhu6l1IG7DoHksIHTDoWMgZ2nhuqMgdOG6rXAgdHJ1bmcgdsOgbyBoYWkgYmnhur9uIMSR4buLbmggdMOtbmggcXVhbiB0cuG7jW5nIGxpw6puIHF1YW4gxJHhur9uIGPhuqV1IHRyw7pjIHbDoCBwaMOibiBsb+G6oWkgeGUsIMSRw7MgbMOgOg0KDQotICoqYGRydmAqKjogTG/huqFpIGjhu4cgZOG6q24gxJHhu5luZyBj4bunYSB4ZSAoYGZgID0gY+G6p3UgdHLGsOG7m2MsIGByYCA9IGPhuqd1IHNhdSwgYDRgID0gaGFpIGPhuqd1KS4NCi0gKipgY2xhc3NgKio6IFBow6JuIGxv4bqhaSB4ZSAodsOtIGThu6U6IGBjb21wYWN0YCwgYHN1dmAsIGBtaWRzaXplYCkuDQoNCkhhaSBiaeG6v24gbsOgeSDEkcaw4bujYyBjaOG7jW4gbMOgbSAqKmJp4bq/biBuZ2hpw6puIGPhu6l1IGNow61uaCoqLCB24bubaSBt4bulYyB0acOqdSBwaMOibiB0w61jaCB4ZW0gKipjw6FjIHnhur91IHThu5Ega+G7uSB0aHXhuq10IHbDoCDEkeG6t2MgxJFp4buDbSBj4bunYSBuaMOgIHPhuqNuIHh14bqldCoqIG5oxrA6DQoNCi0gTmjDoCBz4bqjbiB4deG6pXQgKGBtYW51ZmFjdHVyZXJgKQ0KLSBT4buRIHhpLWxhbmggY+G7p2EgxJHhu5luZyBjxqEgKGBjeWxgKQ0KLSBEdW5nIHTDrWNoIMSR4buZbmcgY8ahIChgZGlzcGxgKQ0KLSBMb+G6oWkgaOG7mXAgc+G7kSAoYHRyYW5zYCkNCg0KLi4uIGPDsyDhuqNuaCBoxrDhu59uZyBuaMawIHRo4bq/IG7DoG8gxJHhur9uICoqbG/huqFpIGjhu4cgZOG6q24gxJHhu5luZyoqIHbDoCAqKnBow6JuIGtow7pjIHhlKiogY+G7p2EgbeG7mXQgbeG6q3UgeGUuDQoNClRow7RuZyBxdWEgdmnhu4djIHPhu60gZOG7pW5nIGPDoWMgY8O0bmcgY+G7pSBwaMOibiB0w61jaCBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oIG5oxrA6IGLhuqNuZyB04bqnbiBz4buRLCBiaeG7g3UgxJHhu5MgbWluaCBo4buNYSwga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nLCBwaMOibiB0w61jaCB04bu3IHPhu5EgY2jDqm5oIGzhu4djaCAoT2RkcyBSYXRpbykgdsOgIHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIChSZWxhdGl2ZSBSaXNrKSwgYsOgaSBuZ2hpw6puIGPhu6l1IHPhur0gbMOgbSByw7UgY8OhYyB54bq/dSB04buRIHF1YW4gdHLhu41uZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gxJHhurdjIHTDrW5oIGvhu7kgdGh14bqtdCBj4bunYSBjw6FjIGTDsm5nIHhlLCB04burIMSRw7MgxJHGsGEgcmEgbmjhu69uZyBnw7NjIG5ow6xuIGjhu691IMOtY2ggY2hvIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCDDtCB0w7QgduG7gSB4dSBoxrDhu5tuZyB0aGnhur90IGvhur8gdsOgIHPhuqNuIHh14bqldC4NCg0KIyMgKirEkOG7jWMgdsOgIGtow6FtIHBow6EgZOG7ryBsaeG7h3UqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KDQojIMSQ4buNYyBk4buvIGxp4buHdSB04burIHBhY2thZ2UgZ2dwbG90Mg0KZGF0YSgibXBnIikNCnN0cihtcGcpDQpzdW1tYXJ5KG1wZykNCnNhcHBseShtcGcsIGZ1bmN0aW9uKHgpIGxlbmd0aCh1bmlxdWUoeCkpKQ0KYGBgDQoNCg0KIyMgKipNw7QgdOG6oyBjw6FjIGJp4bq/bioqDQoNCnwgVMOqbiBiaeG6v24gfCBLaeG7g3UgZOG7ryBsaeG7h3UgfCBT4buRIGzGsOG7o25nIGdpw6EgdHLhu4sgZHV5IG5o4bqldCB8IE3DtCB04bqjIG7hu5lpIGR1bmcgfA0KfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfA0KfCBgbWFudWZhY3R1cmVyYHwgQ2hhcmFjdGVyIHwgMTUgfCBIw6NuZyBz4bqjbiB4deG6pXQgeGUgKHbDrSBk4bulOiBgYXVkaWAsIGBmb3JkYCwgYHRveW90YWApLiB8DQp8IGBtb2RlbGAgfCBDaGFyYWN0ZXIgfCAzOCB8IFTDqm4gZMOybmcgeGUuIHwNCnwgYGRpc3BsYCB8IE51bWVyaWMgfCA0NyB8IER1bmcgdMOtY2ggxJHhu5luZyBjxqEgKGzDrXQpLiB8DQp8IGB5ZWFyYCB8IEludGVnZXIgfCAyIHwgTsSDbSBz4bqjbiB4deG6pXQgKDE5OTkgaG/hurdjIDIwMDgpLiB8DQp8IGBjeWxgIHwgSW50ZWdlciB8IDQgfCBT4buRIHhpLWxhbmggxJHhu5luZyBjxqEgKDQsIDUsIDYsIDgpLiB8DQp8IGB0cmFuc2AgfCBDaGFyYWN0ZXIgfCAxMCB8IExv4bqhaSBo4buZcCBz4buRICh2w60gZOG7pTogYGF1dG8obDUpYCwgYG1hbnVhbChtNilgKS4gfA0KfCBgZHJ2YCB8IENoYXJhY3RlciB8IDMgfCBMb+G6oWkgaOG7hyBk4bqrbiDEkeG7mW5nIChgZmA9Y+G6p3UgdHLGsOG7m2MsIGByYD1j4bqndSBzYXUsIGA0YD1oYWkgY+G6p3UpLiB8DQp8IGBjdHlgIHwgSW50ZWdlciB8IDIxIHwgTeG7qWMgdGnDqnUgdGjhu6Ugbmhpw6puIGxp4buHdSB0cm9uZyB0aMOgbmggcGjhu5EgKGThurdtL2dhbGxvbikuIHwNCnwgYGh3eWAgfCBJbnRlZ2VyIHwgMjcgfCBN4bupYyB0acOqdSB0aOG7pSBuaGnDqm4gbGnhu4d1IHRyw6puIGNhbyB04buRYyAoZOG6t20vZ2FsbG9uKS4gfA0KfCBgZmxgIHwgQ2hhcmFjdGVyIHwgNSB8IExv4bqhaSBuaGnDqm4gbGnhu4d1IChgcGA9cHJlbWl1bSwgYHJgPXJlZ3VsYXIsIGBlYD1ldGhhbm9sLCBgZGA9ZGllc2VsLCBgY2A9Y25nKS4gfA0KfCBgY2xhc3NgIHwgQ2hhcmFjdGVyIHwgNyB8IFBow6JuIGxv4bqhaSB4ZSAodsOtIGThu6U6IGBjb21wYWN0YCwgYHN1dmAsIGBwaWNrdXBgKS4gfA0KDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpC4buZIGThu68gbGnhu4d1IGfhu5NtIDExIGJp4bq/biB2w6AgMjM0IHF1YW4gc8OhdCwgxJHGsOG7o2MgY2hpYSB0aMOgbmggaGFpIG5ow7NtIGNow61uaDogYmnhur9uIMSR4buLbmggbMaw4bujbmcgdsOgIGJp4bq/biDEkeG7i25oIHTDrW5oLg0KDQotICoqQmnhur9uIMSR4buLbmggbMaw4bujbmc6KiogR+G7k20gY8OhYyBiaeG6v24gYGRpc3BsYCwgYHllYXJgLCBgY3lsYCwgYGN0eWAsIGBod3lgLiBDw6FjIGJp4bq/biBuw6B5IMSRbyBsxrDhu51uZyBjw6FjIHRow7RuZyBz4buRIGvhu7kgdGh14bqtdCB2w6AgaGnhu4d1IHN14bqldCwgY8OzIHRo4buDIGTDuW5nIMSR4buDIHTDrW5oIHRvw6FuIGPDoWMgY2jhu4kgc+G7kSB0aOG7kW5nIGvDqiB2w6AgeMOieSBk4buxbmcgbcO0IGjDrG5oIGjhu5NpIHF1eS4NCg0KLSAqKkPDoWMgYmnhur9uIMSR4buLbmggdMOtbmg6KiogR+G7k20gY8OhYyBiaeG6v24gYG1hbnVmYWN0dXJlcmAsIGBtb2RlbGAsIGB0cmFuc2AsIGBkcnZgLCBgZmxgLCBgY2xhc3NgLiBDw6FjIGJp4bq/biBuw6B5IG1hbmcgdGjDtG5nIHRpbiBk4bqhbmcgZGFuaCBt4bulYywgdGjGsOG7nW5nIMSRxrDhu6NjIHBow6JuIHTDrWNoIGLhurFuZyBjw6FjaCDEkeG6v20gdOG6p24gc+G7kSwgdOG7tyBs4buHLCB2w6Agc+G7rSBk4bulbmcgY8OhYyBwaMawxqFuZyBwaMOhcCB0aOG7kW5nIGvDqiBjaG8gZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaC4NCg0KKipU4bqhbyBi4buZIGThu68gbGnhu4d1IGNo4buJIGPDsyBiaeG6v24gxJHhu4tuaCB0w61uaCAodsOgIGPDoWMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgY+G6p24gdGhp4bq/dCkqKg0KDQpgYGB7cn0NCiMgVOG6oW8gYuG7mSBk4buvIGxp4buHdSBjaOG7iSBjaOG7qWEgY8OhYyBiaeG6v24gY+G6p24gdGhp4bq/dCBjaG8gcGjDom4gdMOtY2ggxJHhu4tuaCB0w61uaA0KZGF0YTEgPC0gbXBnICU+JQ0KICBzZWxlY3QobWFudWZhY3R1cmVyLCBjbGFzcywgZHJ2LCBjeWwsIHRyYW5zKQ0KDQojIFhlbSB0csaw4bubYyBk4buvIGxp4buHdSBt4bubaQ0Kc3RyKGRhdGExKQ0KaGVhZChkYXRhMSkNCmBgYA0KDQotLS0NCg0KIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biBuZ2hpw6puIGPhu6l1KioNCg0KIyMgKipUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gcGjhu6UgdGh14buZYyoqDQoNCiMjIyAqKkJp4bq/biBgZHJ2YCAoSOG7hyBk4bqrbiDEkeG7mW5nKSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KdGFibGUoZGF0YTEkZHJ2KQ0KcHJvcC50YWJsZSh0YWJsZShkYXRhMSRkcnYpKQ0KYGBgDQoNCg0KKipW4bq9IGJp4buDdSDEkeG7kyBj4buZdCoqDQoNCmBgYHtyfQ0KZnJlcV9kcnYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhMSRkcnYpKQ0KY29sbmFtZXMoZnJlcV9kcnYpIDwtIGMoIkRSViIsICJDb3VudCIpDQoNCmdncGxvdChmcmVxX2RydiwgYWVzKHggPSBEUlYsIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjOTM3MERCIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSkgKw0KICBsYWJzKHRpdGxlID0gIlThuqduIHPhu5EgdGhlbyBsb+G6oWkgaOG7hyBk4bqrbiDEkeG7mW5nIiwgeCA9ICJMb+G6oWkgaOG7hyBk4bqrbiDEkeG7mW5nIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoqKkThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgYmnhu4N1IMSR4buTIGPhu6dhIGJp4bq/biBgZHJ2YCwgdGEgY8OzIGPDoWMgbmjhuq1uIMSR4buLbmggc2F1OioqDQoNCi0gWGUgZOG6q24gxJHhu5luZyBj4bqndSB0csaw4bubYyAoYGZgKSBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIDEwNiB4ZSwgdMawxqFuZyDhu6luZyA0NS4zJSB04buVbmcgc+G7kSBt4bqrdS4NCi0gWGUgZOG6q24gxJHhu5luZyBoYWkgY+G6p3UgKGA0YCkgxJHhu6luZyB0aOG7qSBoYWkgduG7m2kgMTAzIHhlLCBjaGnhur9tIDQ0LjAlLg0KLSBYZSBk4bqrbiDEkeG7mW5nIGPhuqd1IHNhdSAoYHJgKSBjaOG7iSBjw7MgMjUgeGUsIGzDoCBsb+G6oWkgw610IHBo4buVIGJp4bq/biBuaOG6pXQgdHJvbmcgYuG7mSBk4buvIGxp4buHdSwgY2hp4bq/bSBraG/huqNuZyAxMC43JS4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KUGjDom4gYuG7kSBjaG8gdGjhuqV5IGPDoWMgbeG6q3UgeGUgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGNo4bunIHnhur91IGzDoCB4ZSBk4bqrbiDEkeG7mW5nIGPhuqd1IHRyxrDhu5tjIHbDoCBoYWkgY+G6p3UsIHBo4bqjbiDDoW5oIHh1IGjGsOG7m25nIHBo4buVIGJp4bq/biBj4bunYSB0aOG7iyB0csaw4budbmcgeGUgZHUgbOG7i2NoIHThuqFpIE3hu7kgdHJvbmcgZ2lhaSDEkW/huqFuIMSRw7MuDQoNCiMjIyAqKkJp4bq/biBgY2xhc3NgIChQaMOibiBsb+G6oWkgeGUpKioNCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQp0YWJsZShkYXRhMSRjbGFzcykNCnByb3AudGFibGUodGFibGUoZGF0YTEkY2xhc3MpKQ0KYGBgDQoNCg0KKipW4bq9IGJp4buDdSDEkeG7kyBj4buZdCoqDQoNCmBgYHtyfQ0KZnJlcV9jbGFzcyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdGExJGNsYXNzKSkNCmNvbG5hbWVzKGZyZXFfY2xhc3MpIDwtIGMoIkNsYXNzIiwgIkNvdW50IikNCg0KZ2dwbG90KGZyZXFfY2xhc3MsIGFlcyh4ID0gcmVvcmRlcihDbGFzcywgLUNvdW50KSwgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiM2NkNEQUEiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41KSArDQogIGxhYnModGl0bGUgPSAiVOG6p24gc+G7kSB0aGVvIHBow6JuIGxv4bqhaSB4ZSIsIHggPSAiUGjDom4gbG/huqFpIHhlIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoqKkThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EgdsOgIGJp4buDdSDEkeG7kyBj4bunYSBiaeG6v24gYGNsYXNzYCwgdGEgY8OzIGPDoWMgbmjhuq1uIMSR4buLbmggc2F1OioqDQoNCi0gRMOybmcgeGUgKipTVVYqKiBsw6AgcGjhu5UgYmnhur9uIG5o4bqldCB24bubaSA2MiB4ZSwgY2hp4bq/bSAyNi41JS4NCi0gVGhlbyBzYXUgbMOgIGPDoWMgZMOybmcgKipjb21wYWN0KiogKDQ3IHhlLCB+MjAuMSUpIHbDoCAqKm1pZHNpemUqKiAoNDEgeGUsIH4xNy41JSkuDQotIEPDoWMgZMOybmcgeGUgw610IHBo4buVIGJp4bq/biBoxqFuIGzDoCBgMnNlYXRlcmAsIGBtaW5pdmFuYCwgdsOgIGBzdWJjb21wYWN0YC4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KUGjDom4gYuG7kSBk4buvIGxp4buHdSBjaG8gdGjhuqV5IHPhu7EgdGjhu5FuZyB0cuG7iyBj4bunYSBwaMOibiBraMO6YyBTVVYsIHBow7kgaOG7o3AgduG7m2kgeHUgaMaw4bubbmcgdGnDqnUgZMO5bmcgeGUgdOG6oWkgTeG7uS4gQ8OhYyBkw7JuZyB4ZSBzZWRhbiBj4buhIHbhu6thIHbDoCBuaOG7jyBjxaluZyBjaGnhur9tIG3hu5l0IHRo4buLIHBo4bqnbiDEkcOhbmcga+G7gy4NCg0KDQojIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biDEkeG7mWMgbOG6rXAqKg0KDQojIyMgKipCaeG6v24gYG1hbnVmYWN0dXJlcmAgKEjDo25nIHPhuqNuIHh14bqldCkqKg0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCnRhYmxlKGRhdGExJG1hbnVmYWN0dXJlcikNCnByb3AudGFibGUodGFibGUoZGF0YTEkbWFudWZhY3R1cmVyKSkNCmBgYA0KDQoqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCg0KYGBge3J9DQpmcmVxX21mciA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdGExJG1hbnVmYWN0dXJlcikpDQpjb2xuYW1lcyhmcmVxX21mcikgPC0gYygiTWFudWZhY3R1cmVyIiwgIkNvdW50IikNCg0KZ2dwbG90KGZyZXFfbWZyLCBhZXMoeCA9IHJlb3JkZXIoTWFudWZhY3R1cmVyLCAtQ291bnQpLCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzY0OTVFRCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArDQogIGxhYnModGl0bGUgPSAiVOG6p24gc+G7kSB0aGVvIGjDo25nIHPhuqNuIHh14bqldCIsIHggPSAiSMOjbmcgc+G6o24geHXhuqV0IiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCioqROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSB2w6AgYmnhu4N1IMSR4buTIHRyw6puLCB0YSBjw7MgY8OhYyBuaOG6rW4gxJHhu4tuaCBzYXU6KioNCg0KLSAqKkRvZGdlKiogbMOgIGjDo25nIGPDsyBuaGnhu4F1IG3huqt1IHhlIG5o4bqldCB0cm9uZyBi4buZIGThu68gbGnhu4d1ICgzNyB4ZSkuDQotIFRoZW8gc2F1IGzDoCAqKlRveW90YSoqICgzNCB4ZSkgdsOgICoqVm9sa3N3YWdlbioqICgyNyB4ZSkuDQotIEPDoWMgaMOjbmcgbmjGsCBgbGluY29sbmAsIGBsYW5kIHJvdmVyYCwgYG1lcmN1cnlgIGPDsyBz4buRIGzGsOG7o25nIG3huqt1IHLhuqV0IMOtdC4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KUGjDom4gYuG7kSBraMO0bmcgxJHhu4F1LCBjaG8gdGjhuqV5IGLhu5kgZOG7ryBsaeG7h3UgdOG6rXAgdHJ1bmcgdsOgbyBjw6FjIG3huqt1IHhlIHThu6sgbeG7mXQgc+G7kSBow6NuZyBz4bqjbiB4deG6pXQgcGjhu5UgYmnhur9uIHThuqFpIHRo4buLIHRyxrDhu51uZyBN4bu5Lg0KDQoNCiMjIyAqKkJp4bq/biBgY3lsYCAoU+G7kSB4aS1sYW5oKSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KdGFibGUoZGF0YTEkY3lsKQ0KcHJvcC50YWJsZSh0YWJsZShkYXRhMSRjeWwpKQ0KYGBgDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQqKg0KDQpgYGB7cn0NCmZyZXFfY3lsIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGF0YTEkY3lsKSkNCmNvbG5hbWVzKGZyZXFfY3lsKSA8LSBjKCJDeWxpbmRlcnMiLCAiQ291bnQiKQ0KDQpnZ3Bsb3QoZnJlcV9jeWwsIGFlcyh4ID0gYXMuZmFjdG9yKEN5bGluZGVycyksIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjRkY5OTY2IiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSkgKw0KICBsYWJzKHRpdGxlID0gIlThuqduIHPhu5EgdGhlbyBz4buRIHhpLWxhbmgiLCB4ID0gIlPhu5EgeGktbGFuaCIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KKipE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIGBjeWxgLCB0YSBjw7MgY8OhYyBuaOG6rW4gxJHhu4tuaCBzYXU6KioNCg0KLSDEkOG7mW5nIGPGoSAqKjQgeGktbGFuaCoqIHbDoCAqKjYgeGktbGFuaCoqIGzDoCBwaOG7lSBiaeG6v24gbmjhuqV0LCBjaGnhur9tIGzhuqduIGzGsOG7o3QgMzQuNiUgdsOgIDMzLjglLg0KLSDEkOG7mW5nIGPGoSAqKjggeGktbGFuaCoqIGPFqW5nIGNoaeG6v20gbeG7mXQgdOG7tyBs4buHIMSRw6FuZyBr4buDICgzMC4zJSkuDQotIMSQ4buZbmcgY8ahIDUgeGktbGFuaCBy4bqldCBoaeG6v20sIGNo4buJIGPDsyA0IG3huqt1Lg0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpQaMOibiBi4buRIGNobyB0aOG6pXkgc+G7sSDEkWEgZOG6oW5nIHRyb25nIGPhuqV1IGjDrG5oIMSR4buZbmcgY8ahLCBuaMawbmcgdOG6rXAgdHJ1bmcgY2jhu6cgeeG6v3UgdsOgbyBjw6FjIGxv4bqhaSDEkeG7mW5nIGPGoSA0LCA2LCB2w6AgOCB4aS1sYW5oLCBwaMO5IGjhu6NwIHbhu5tpIGPDoWMgcGjDom4ga2jDumMgeGUga2jDoWMgbmhhdSB04burIHhlIG5o4buPIHRp4bq/dCBraeG7h20gbmhpw6puIGxp4buHdSDEkeG6v24geGUgU1VWIHbDoCBiw6FuIHThuqNpIG3huqFuaCBt4bq9Lg0KDQotLS0NCg0KIyAqKsav4bubYyBsxrDhu6NuZyBraG/huqNuZyB2w6Aga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgY2hvIHThu7cgbOG7hyoqDQoNCiMjICoqS2nhu4NtIMSR4buLbmggaGFpIHBow61hKioNCg0KIyMjICoqQmnhur9uIGBjbGFzc2A6IFThu7cgbOG7hyB4ZSBTVVYqKg0KDQojIyMjICoqTeG7pWMgdGnDqnUqKg0KDQpUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIMSR4buDIHjDoWMgxJHhu4tuaCB4ZW0gKip04bu3IGzhu4cgeGUgdGh14buZYyBwaMOibiBraMO6YyBTVVYgKGBjbGFzcyA9ICJzdXYiYCkqKiB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBjw7Mga2jDoWMgYmnhu4d0IHNvIHbhu5tpIDI1JSBoYXkga2jDtG5nLg0KDQojIyMjICoqVMOtbmggdG/DoW4gdOG7tyBs4buHIG3huqt1KioNCg0KYGBge3J9DQojIFPhu5EgbMaw4bujbmcgeGUgU1VWDQpzdW1TVVYgPC0gc3VtKGRhdGExJGNsYXNzID09ICJzdXYiKQ0KDQojIFThu5VuZyBz4buRIHhlDQpzdW1Ub3RhbCA8LSBucm93KGRhdGExKQ0KDQojIFThu7cgbOG7hyBt4bqrdQ0KcF9oYXRfc3V2IDwtIHN1bVNVViAvIHN1bVRvdGFsDQpwX2hhdF9zdXYNCmBgYA0KDQojIyMjICoqS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIDEgbeG6q3UqKg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oKioNCg0KLSAqKkgwOioqIHAgPSAwLjI1IChU4bu3IGzhu4cgeGUgU1VWIGLhurFuZyAyNSUpDQotICoqSDE6KiogcCDiiaAgMC4yNSAoVOG7tyBs4buHIHhlIFNVViBraMOhYyAyNSUpDQoNClRp4bq/biBow6BuaCBraeG7g20gxJHhu4tuaCBoYWkgcGjDrWEgduG7m2kgbeG7qWMgw70gbmdoxKlhIM6xID0gMC4wNS4NCg0KYGBge3J9DQpwcm9wLnRlc3QoeCA9IHN1bVNVViwgbiA9IHN1bVRvdGFsLCBwID0gMC4yNSwgY29uZi5sZXZlbCA9IDAuOTUsIGNvcnJlY3QgPSBUUlVFKQ0KYGBgDQoNCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIChYLXNxdWFyZWQpOiAwLjIwNzk4DQotIEdpw6EgdHLhu4sgcCAocC12YWx1ZSk6IDAuNjQ4Mw0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgdGjhu7FjOiBbMC4yMTEsIDAuMzI2XQ0KLSDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIHThu6sgbeG6q3UgKHDMgik6IDAuMjY0OTU3Mw0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpW4bubaSBwLXZhbHVlID0gMC42NDgzID4gMC4wNSwgY2jDum5nIHRhICoqa2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSDAqKi4gQ8OzIHRo4buDIGNo4bqlcCBuaOG6rW4gcuG6sW5nIHThu7cgbOG7hyB4ZSBTVVYgdHJvbmcgdOG7lW5nIHRo4buDIGtow7RuZyBraMOhYyBiaeG7h3QgbeG7mXQgY8OhY2ggY8OzIMO9IG5naMSpYSBzbyB24bubaSAyNSUuDQoNCiMjICoqS2nhu4NtIMSR4buLbmggbeG7mXQgcGjDrWEqKg0KDQojIyMgKipCaeG6v24gYGRydmA6IFThu7cgbOG7hyB4ZSBk4bqrbiDEkeG7mW5nIGhhaSBj4bqndSAoYDRXRGApKioNCg0KIyMjIyAqKk3hu6VjIHRpw6p1KioNCg0KWMOhYyDEkeG7i25oIHhlbSB04bu3IGzhu4cgeGUgY8OzIGjhu4cgZOG6q24gxJHhu5luZyBoYWkgY+G6p3UgKGBkcnYgPSAiNCJgKSBjw7Mgbmjhu48gaMahbiA1MCUgaGF5IGtow7RuZy4NCg0KIyMjIyAqKlTDrW5oIHRvw6FuIHThu7cgbOG7hyBt4bqrdSoqDQoNCmBgYHtyfQ0Kc3VtNFdEIDwtIHN1bShkYXRhMSRkcnYgPT0gIjQiKQ0KcF9oYXRfNHdkIDwtIHN1bTRXRCAvIHN1bVRvdGFsDQpwX2hhdF80d2QNCmBgYA0KDQojIyMjICoqS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIDEgbeG6q3UqKg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oKioNCg0KLSAqKkgwOioqIHAg4omlIDAuNTAgKFThu7cgbOG7hyB4ZSA0V0Qga2jDtG5nIG5o4buPIGjGoW4gNTAlKQ0KLSAqKkgxOioqIHAgPCAwLjUwIChU4bu3IGzhu4cgeGUgNFdEIG5o4buPIGjGoW4gNTAlKQ0KDQpUaeG6v24gaMOgbmgga2nhu4NtIMSR4buLbmggbeG7mXQgcGjDrWEgduG7m2kgbeG7qWMgw70gbmdoxKlhIM6xID0gMC4wNS4NCg0KYGBge3J9DQpwcm9wLnRlc3QoeCA9IHN1bTRXRCwgbiA9IHN1bVRvdGFsLCBwID0gMC41MCwgY29uZi5sZXZlbCA9IDAuOTUsIGNvcnJlY3QgPSBUUlVFLCBhbHRlcm5hdGl2ZSA9ICJsZXNzIikNCmBgYA0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiAoWC1zcXVhcmVkKTogMi40MDQyDQotIHAtdmFsdWU6IDAuMDYwNjkNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSAobeG7mXQgcGjDrWEpOiBbMCwgMC40OTVdDQotIFThu7cgbOG7hyBt4bqrdSAocMyCKTogMC40NDAxNzA5DQoNCioqS+G6v3QgbHXhuq1uOioqDQoNClbhu5tpIHAtdmFsdWUgPSAwLjA2MDY5LCBs4bubbiBoxqFuIG3hu5l0IGNow7p0IHNvIHbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLjA1LCBjaMO6bmcgdGEgKipraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMCoqLiBN4bq3YyBkw7kgdOG7tyBs4buHIG3huqt1ICg0NCUpIG5o4buPIGjGoW4gNTAlLCBz4buxIGtow6FjIGJp4buHdCBuw6B5IGNoxrBhIMSR4bunIGzhu5tuIMSR4buDIGPDsyB0aOG7gyBraOG6s25nIMSR4buLbmggbeG7mXQgY8OhY2ggY2jhuq9jIGNo4bqvbiDhu58gbeG7qWMgw70gbmdoxKlhIDUlLg0KDQotLS0NCg0KIyAqKlBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYmnhur9uIMSR4buZYyBs4bqtcCB2w6AgcGjhu6UgdGh14buZYyoqDQoNCiMjICoqUGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBgZHJ2YCAoaOG7hyBk4bqrbiDEkeG7mW5nKSB2w6AgYGNsYXNzYCAocGjDom4gbG/huqFpIHhlKSoqDQoNCioqQ8OidSBo4buPaSBuZ2hpw6puIGPhu6l1OioqICJQaMOibiBsb+G6oWkgeGUgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBsb+G6oWkgaOG7hyBk4bqrbiDEkeG7mW5nIMSRxrDhu6NjIHRyYW5nIGLhu4sga2jDtG5nPyINCg0KIyMjICoqUGjDom4gbG/huqFpIHhlIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gaOG7hyBk4bqrbiDEkeG7mW5nIGtow7RuZz8qKg0KDQoqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioNCg0KYGBge3J9DQp0YWJsZV9kcnZfY2xhc3MgPC0gdGFibGUoZGF0YTEkZHJ2LCBkYXRhMSRjbGFzcykNCnRhYmxlX2Rydl9jbGFzcw0KYGBgDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCmRmX2Rydl9jbGFzcyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlX2Rydl9jbGFzcykNCmNvbG5hbWVzKGRmX2Rydl9jbGFzcykgPC0gYygiRFJWIiwgIkNsYXNzIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCB0aGVvIG5ow7NtDQpnZ3Bsb3QoZGZfZHJ2X2NsYXNzLCBhZXMoeCA9IENsYXNzLCB5ID0gQ291bnQsIGZpbGwgPSBEUlYpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQaMOibiBi4buRIGjhu4cgZOG6q24gxJHhu5luZyB0aGVvIHBow6JuIGxv4bqhaSB4ZSIsDQogICAgeCA9ICJQaMOibiBsb+G6oWkgeGUiLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyIsDQogICAgZmlsbCA9ICJI4buHIGThuqtuIMSR4buZbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQoqKktp4buDbSDEkeG7i25oIGNoaSBiw6xuaCBwaMawxqFuZyoqDQoNCioqR2nhuqMgdGh1eeG6v3QgdGjhu5FuZyBrw6oqKg0KDQotIEdp4bqjIHRodXnhur90IGtow7RuZyAoSOKCgCk6IEtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgcGjDom4gbG/huqFpIHhlIHbDoCBo4buHIGThuqtuIMSR4buZbmcuDQotIEdp4bqjIHRodXnhur90IMSR4buRaSAoSOKCgSk6IEPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBwaMOibiBsb+G6oWkgeGUgdsOgIGjhu4cgZOG6q24gxJHhu5luZy4NCg0KYGBge3J9DQpjaGlzcV90ZXN0IDwtIGNoaXNxLnRlc3QodGFibGVfZHJ2X2NsYXNzKQ0KY2hpc3FfdGVzdA0KYGBgDQoNCioqTmjhuq1uIHjDqXQga+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KVuG7m2kgcC12YWx1ZSA8IDIuMmUtMTYgKHLhuqV0IGfhuqduIDApLCB0YSAqKmLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMCoqLiBEbyDEkcOzLCBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyAqKnBow6JuIGxv4bqhaSB4ZSB2w6AgbG/huqFpIGjhu4cgZOG6q24gxJHhu5luZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IG3huqFuaCBt4bq9KiouIFThu6sgYmnhu4N1IMSR4buTLCBjw7MgdGjhu4MgdGjhuqV5IHLDtSB4ZSBTVVYgdsOgIHBpY2t1cCBn4bqnbiBuaMawIGNo4buJIGPDsyBo4buHIGThuqtuIMSR4buZbmcgYDRgIGhv4bq3YyBgcmAsIHRyb25nIGtoaSB4ZSBgY29tcGFjdGAgdsOgIGBtaWRzaXplYCBjaOG7pyB54bq/dSBsw6AgYGZgLg0KDQojIyMgKipTbyBzw6FuaCBraOG6oyBuxINuZyDEkcaw4bujYyB0cmFuZyBi4buLIGThuqtuIMSR4buZbmcgaGFpIGPhuqd1IChgNFdEYCkgZ2nhu69hIHhlIFNVViB2w6AgQ29tcGFjdCoqDQoNCioqVOG6oW8gYuG6o25nIHThuqduIHPhu5EgbeG7m2kqKg0KDQpgYGB7cn0NCiMgTOG7jWMgZOG7ryBsaeG7h3UgY2jhu4kgYmFvIGfhu5NtIDIgbmjDs20gJ3N1dicgdsOgICdjb21wYWN0Jw0KZGF0YV9zdWIgPC0gZGF0YTEgJT4lDQogIGZpbHRlcihjbGFzcyAlaW4lIGMoInN1diIsICJjb21wYWN0IikpDQoNCiMgVOG6oW8gYuG6o25nIDJ4MjogQ2xhc3MgKHN1diB2cyBjb21wYWN0KSB+IERSViAoNFdEIHZzIE5vdCA0V0QpDQojIMSQ4bq3dCAnc3V2JyBsw6AgbmjDs20gcGjGoWkgbmhp4buFbSwgJzQnIGzDoCBz4buxIGtp4buHbg0KdGFibGVfc3V2X2NvbXBhY3QgPC0gdGFibGUoDQogIENsYXNzID0gZmFjdG9yKGRhdGFfc3ViJGNsYXNzLCBsZXZlbHMgPSBjKCJzdXYiLCAiY29tcGFjdCIpKSwNCiAgSXNfNFdEID0gaWZlbHNlKGRhdGFfc3ViJGRydiA9PSAiNCIsICJ5ZXMiLCAibm8iKQ0KKQ0KDQojIMSQ4bqjbSBi4bqjbyB0aOG7qSB04buxIGPhu5l0IGzDoCAneWVzJywgJ25vJw0KdGFibGVfc3V2X2NvbXBhY3QgPC0gdGFibGVfc3V2X2NvbXBhY3RbLCBjKCJ5ZXMiLCAibm8iKV0NCnByaW50KHRhYmxlX3N1dl9jb21wYWN0KQ0KYGBgDQoNCioqVMOtbmggUmVsYXRpdmUgUmlzayAoUlIpIHbDoCBPZGRzIFJhdGlvIChPUikqKg0KDQpgYGB7cn0NCiMgVMOtbmggUlINCnJyX3Jlc3VsdCA8LSByaXNrcmF0aW8odGFibGVfc3V2X2NvbXBhY3QpDQpwcmludChycl9yZXN1bHQkbWVhc3VyZSkNCg0KIyBUw61uaCBPUg0Kb3JfcmVzdWx0IDwtIG9kZHNyYXRpbyh0YWJsZV9zdXZfY29tcGFjdCkNCnByaW50KG9yX3Jlc3VsdCRtZWFzdXJlKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotICoqUmVsYXRpdmUgUmlzayAoUlIpID0gNC4xOTcqKjogVOG7tyBs4buHIG3hu5l0IGNoaeG6v2MgeGUgbMOgIHhlIGThuqtuIMSR4buZbmcgaGFpIGPhuqd1IChgNFdEYCkg4bufIG5ow7NtICoqQ29tcGFjdCoqIGNhbyBn4bqlcCAqKjQuMTk3IGzhuqduKiogc28gduG7m2kgbmjDs20gKipTVVYqKi4NCi0gKipPZGRzIFJhdGlvIChPUikgPSAxMi45NyoqOiBU4bu3IGzhu4cgxJHhu4MgbeG7mXQgY2hp4bq/YyB4ZSBsw6AgeGUgYDRXRGAg4bufIG5ow7NtICoqQ29tcGFjdCoqIGNhbyBn4bqlcCAqKjEyLjk3IGzhuqduKiogc28gduG7m2kgb2RkcyDhu58gbmjDs20gKipTVVYqKi4NCg0KQ+G6oyBoYWkgY2jhu4kgc+G7kSDEkeG7gXUgY2hvIHRo4bqleSBt4buZdCBt4buRaSBsacOqbiBo4buHIGPhu7FjIGvhu7MgbeG6oW5oIG3hur0uIFhlIENvbXBhY3QgY8OzIGto4bqjIG7Eg25nIMSRxrDhu6NjIHRyYW5nIGLhu4sgaOG7hyBk4bqrbiDEkeG7mW5nIGhhaSBj4bqndSBjYW8gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIHhlIFNVVi4NCg0KLS0tDQoNCiMjICoqUGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBgZHJ2YCAoaOG7hyBk4bqrbiDEkeG7mW5nKSB2w6AgYGN5bGAgKHPhu5EgeGktbGFuaCkqKg0KDQoqKkPDonUgaOG7j2kgbmdoacOqbiBj4bupdToqKiAiU+G7kSB4aS1sYW5oIGPhu6dhIMSR4buZbmcgY8ahLCBt4buZdCBjaOG7iSBz4buRIHF1YW4gdHLhu41uZyB24buBIHPhu6ljIG3huqFuaCwgY8OzIGxpw6puIHF1YW4gxJHhur9uIGxv4bqhaSBo4buHIGThuqtuIMSR4buZbmcgxJHGsOG7o2MgdHJhbmcgYuG7iyB0csOqbiB4ZSBoYXkga2jDtG5nPyINCg0KIyMjICoqU+G7kSB4aS1sYW5oIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gaOG7hyBk4bqrbiDEkeG7mW5nIGtow7RuZz8qKg0KDQoqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioNCg0KYGBge3J9DQp0YWJsZV9kcnZfY3lsIDwtIHRhYmxlKGRhdGExJGRydiwgZGF0YTEkY3lsKQ0KdGFibGVfZHJ2X2N5bA0KYGBgDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCmRmX2Rydl9jeWwgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZV9kcnZfY3lsKQ0KY29sbmFtZXMoZGZfZHJ2X2N5bCkgPC0gYygiRFJWIiwgIkN5bGluZGVycyIsICJDb3VudCIpDQoNCmdncGxvdChkZl9kcnZfY3lsLCBhZXMoeCA9IGFzLmZhY3RvcihDeWxpbmRlcnMpLCB5ID0gQ291bnQsIGZpbGwgPSBEUlYpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlThu7cgbOG7hyBo4buHIGThuqtuIMSR4buZbmcgdGhlbyBz4buRIHhpLWxhbmgiLA0KICAgIHggPSAiU+G7kSB4aS1sYW5oIiwNCiAgICB5ID0gIlThu7cgbOG7hyIsDQogICAgZmlsbCA9ICJI4buHIGThuqtuIMSR4buZbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoqKktp4buDbSDEkeG7i25oIGNoaSBiw6xuaCBwaMawxqFuZyoqDQoNCioqR2nhuqMgdGh1eeG6v3QgdGjhu5FuZyBrw6oqKg0KDQotIEdp4bqjIHRodXnhur90IGtow7RuZyAoSOKCgCk6IEtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2Egc+G7kSB4aS1sYW5oIHbDoCBo4buHIGThuqtuIMSR4buZbmcuDQotIEdp4bqjIHRodXnhur90IMSR4buRaSAoSOKCgSk6IEPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBz4buRIHhpLWxhbmggdsOgIGjhu4cgZOG6q24gxJHhu5luZy4NCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlX2Rydl9jeWwpDQpgYGANCg0KKipOaOG6rW4geMOpdCBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQpW4bubaSBwLXZhbHVlIDwgMi4yZS0xNiwgdGEgKipiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSDAqKi4gQ8OzIG3hu5l0IG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBt4bqhbmggbeG6vSBnaeG7r2Egc+G7kSB4aS1sYW5oIHbDoCBsb+G6oWkgaOG7hyBk4bqrbiDEkeG7mW5nLg0KDQojIyMgKipQaMOibiB0w61jaCBy4bunaSBybyB2w6AgdOG7tyBz4buRIGNow6puaCoqDQoNCsSQ4buDIGzGsOG7o25nIGjDs2EgbeG7kWkgcXVhbiBo4buHIG7DoHksIGNow7puZyB0YSBz4bq9IHNvIHPDoW5oIGto4bqjIG7Eg25nIG3hu5l0IGNoaeG6v2MgeGUgxJHGsOG7o2MgdHJhbmcgYuG7iyBo4buHIGThuqtuIMSR4buZbmcgaGFpIGPhuqd1IChgNFdEYCkgZ2nhu69hIGhhaSBuaMOzbSDEkeG7mW5nIGPGoSBwaOG7lSBiaeG6v24gdsOgIMSR4buRaSBs4bqtcCBuaOG6pXQ6ICoqOCB4aS1sYW5oKiogKGPDtG5nIHN14bqldCBjYW8pIHbDoCAqKjQgeGktbGFuaCoqIChjw7RuZyBzdeG6pXQgdGjhuqVwKS4NCg0KKipU4bqhbyBi4bqjbmcgdOG6p24gc+G7kSAyeDIqKg0KDQpgYGB7cn0NCiMgTOG7jWMgZOG7ryBsaeG7h3UgY2jhu4kgYmFvIGfhu5NtIHhlIDQgdsOgIDggeGktbGFuaA0KZGF0YV9jeWxfc3ViIDwtIGRhdGExICU+JQ0KICBmaWx0ZXIoY3lsICVpbiUgYyg4LCA0KSkNCg0KIyBU4bqhbyBi4bqjbmcgMngyOiBT4buRIHhpLWxhbmggKDggdnMgNCkgfiBI4buHIGThuqtuIMSR4buZbmcgKDRXRCB2cyBOb3QgNFdEKQ0KIyDEkOG6t3QgOCB4aS1sYW5oIGzDoCBuaMOzbSBwaMahaSBuaGnhu4VtIChleHBvc3VyZSBncm91cCkNCnRhYmxlX2N5bF80d2QgPC0gdGFibGUoDQogIEN5bGluZGVycyA9IGZhY3RvcihkYXRhX2N5bF9zdWIkY3lsLCBsZXZlbHMgPSBjKDgsIDQpKSwNCiAgSXNfNFdEID0gaWZlbHNlKGRhdGFfY3lsX3N1YiRkcnYgPT0gIjQiLCAieWVzIiwgIm5vIikNCikNCg0KIyDEkOG6o20gYuG6o28gdGjhu6kgdOG7sSBj4buZdCAieWVzIiwgIm5vIg0KdGFibGVfY3lsXzR3ZCA8LSB0YWJsZV9jeWxfNHdkWywgYygieWVzIiwgIm5vIildDQpwcmludCh0YWJsZV9jeWxfNHdkKQ0KYGBgDQoNCioqVMOtbmggUmVsYXRpdmUgUmlzayAoUlIpKioNCg0KYGBge3J9DQojIFTDrW5oIFJSDQpycl9jeWxfNHdkIDwtIHJpc2tyYXRpbyh0YWJsZV9jeWxfNHdkKQ0KcHJpbnQocnJfY3lsXzR3ZCRtZWFzdXJlKQ0KYGBgDQoNCioqVMOtbmggT2RkcyBSYXRpbyAoT1IpKioNCg0KYGBge3J9DQojIFTDrW5oIE9SDQpvcl9jeWxfNHdkIDwtIG9kZHNyYXRpbyh0YWJsZV9jeWxfNHdkKQ0KcHJpbnQob3JfY3lsXzR3ZCRtZWFzdXJlKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotICoqUmVsYXRpdmUgUmlzayAoUlIpID0gMi4yNyoqOg0KVOG7tyBs4buHIG3hu5l0IGNoaeG6v2MgeGUgxJHGsOG7o2MgdHJhbmcgYuG7iyBo4buHIGThuqtuIMSR4buZbmcgaGFpIGPhuqd1IChgNFdEYCkg4bufIG5ow7NtICoqNCB4aS1sYW5oKiogY2FvIGfhuqVwICoqMi4yNyBs4bqnbioqIHNvIHbhu5tpIG5ow7NtICoqOCB4aS1sYW5oKiouIMSQw6J5IGzDoCBt4buZdCBz4buxIGtow6FjIGJp4buHdCBy4bqldCBs4bubbi4NCg0KLSAqKk9kZHMgUmF0aW8gKE9SKSA9IDUuNDEqKjoNClThu7cgbOG7hyDEkeG7gyBt4buZdCBjaGnhur9jIHhlIGzDoCB4ZSBgNFdEYCDhu58gbmjDs20gKio0IHhpLWxhbmgqKiBjYW8gZ+G6pXAgKio1LjQxIGzhuqduKiogc28gduG7m2kgb2RkcyDhu58gbmjDs20gKio4IHhpLWxhbmgqKi4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KQ+G6oyBoYWkgY2jhu4kgc+G7kSBSUiB2w6AgT1IgxJHhu4F1IGNobyB0aOG6pXkgbeG7mXQgbeG7kWkgbGnDqm4gaOG7hyBj4buxYyBr4buzIG3huqFuaCBt4bq9LiBWaeG7h2MgbeG7mXQgY2hp4bq/YyB4ZSDEkcaw4bujYyB0cmFuZyBi4buLIMSR4buZbmcgY8ahIDQgeGktbGFuaCBsw6BtIHTEg25nIMSRw6FuZyBr4buDIGto4bqjIG7Eg25nIHhlIMSRw7MgY8WpbmcgxJHGsOG7o2MgdHJhbmcgYuG7iyBo4buHIGThuqtuIMSR4buZbmcgaGFpIGPhuqd1Lg0KDQotLS0NCg0KIyAqKlBoxrDGoW5nIHBow6FwIMav4bubYyBsxrDhu6NuZyBI4bujcCBsw70gVOG7kWkgxJFhIChNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiDigJMgTUxFKSoqDQoNCiMjICoqR2nhu5tpIHRoaeG7h3UgY2h1bmcqKg0KDQpUcm9uZyB0aOG7kW5nIGvDqiB2w6AgaOG7jWMgbcOheSwgZOG7ryBsaeG7h3UgdGjGsOG7nW5nIMSRxrDhu6NjIG3DtCBow6xuaCBow7NhIHRow7RuZyBxdWEgY8OhYyAqKnBow6JuIHBo4buRaSB4w6FjIHN14bqldCoqLiBN4buZdCBwaMOibiBwaOG7kWkgeMOhYyBzdeG6pXQgxJHGsOG7o2MgxJHhurdjIHRyxrBuZyBi4bufaSBt4buZdCBz4buRICoqdGhhbSBz4buRKiosIHbDrSBk4bulIG5oxrA6DQoNCi0gUGjDom4gcGjhu5FpIGNodeG6qW4gKEdhdXNzaWFuKTogJFxtdSQgKHRydW5nIGLDrG5oKSwgJFxzaWdtYV4yJCAocGjGsMahbmcgc2FpKS4NCi0gUGjDom4gcGjhu5FpIFBvaXNzb246IHRoYW0gc+G7kSDEkeG6t2MgdHLGsG5nIGzDoCAkXGxhbWJkYSQuDQoNCk7hur91IHRhIMSRw6MgYmnhur90IMSRxrDhu6NjIGThuqFuZyBj4bunYSBwaMOibiBwaOG7kWkgeMOhYyBzdeG6pXQsIHbhuqVuIMSR4buBIMSR4bq3dCByYSBsw6A6ICoqbMOgbSBzYW8gdMOsbSDEkcaw4bujYyBjw6FjIHRoYW0gc+G7kSBtw7QgdOG6oyBwaMOibiBwaOG7kWkgxJHDsyBt4buZdCBjw6FjaCBwaMO5IGjhu6NwIG5o4bqldCB24bubaSBk4buvIGxp4buHdSBxdWFuIHPDoXQ/KiogxJDDsyBjaMOtbmggbMOgIG5oaeG7h20gduG7pSBj4bunYSBwaMawxqFuZyBwaMOhcCAqKsaw4bubYyBsxrDhu6NuZyBo4bujcCBsw70gdOG7kWkgxJFhIChNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiDigJMgTUxFKSoqLg0KDQpNTEUgbMOgIG3hu5l0IGPDtG5nIGPhu6UgY8SDbiBi4bqjbiB2w6AgcXVhbiB0cuG7jW5nIHRyb25nIHRo4buRbmcga8OqIHN1eSBkaeG7hW4gdsOgIGjhu41jIG3DoXksIGdpw7pwIGNow7puZyB0YSB0w6xtIHJhIGPDoWMgdGhhbSBz4buRIG3DtCBow6xuaCBzYW8gY2hvICoqcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0IHNpbmggcmEgZOG7ryBsaeG7h3UgbMOgICJwaMO5IGjhu6NwIG5o4bqldCIgduG7m2kgdGjhu7FjIHThur8gxJHDoyBxdWFuIHPDoXQqKi4NCg0KIyMgKipN4bulYyB0acOqdSB2w6Agbmd1ecOqbiBsw70gY+G7p2EgTUxFKioNCg0KIyMjICoqS2jDoWkgbmnhu4dtIGjDoG0gaOG7o3AgbMO9IChMaWtlbGlob29kIEZ1bmN0aW9uKSoqDQoNCioqSMOgbSBo4bujcCBsw70qKiAobGlrZWxpaG9vZCBmdW5jdGlvbikgxJFvIGzGsOG7nW5nICoqbeG7qWMgxJHhu5kgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggKHRoYW0gc+G7kSkgduG7m2kgZOG7ryBsaeG7h3UgxJHDoyBxdWFuIHPDoXQqKi4gVOG7qWMgbMOgLCB24bubaSBt4buZdCBtw7QgaMOsbmggeMOhYyBzdeG6pXQgY8OzIHRoYW0gc+G7kSAkXG1hdGhiZnt3fSQsIGjDoG0gaOG7o3AgbMO9IGNobyBiaeG6v3QgKip4w6FjIHN14bqldCDEkeG7gyB0b8OgbiBi4buZIHThuq1wIGThu68gbGnhu4d1ICRcbWF0aGNhbHtEfSQgeOG6o3kgcmEqKiwgZMaw4bubaSBnaeG6oyDEkeG7i25oIHLhurFuZyBk4buvIGxp4buHdSDEkcaw4bujYyBzaW5oIHJhIHThu6sgbcO0IGjDrG5oIMSRw7MuDQoNCkdp4bqjIHPhu60gY8OzIG3hu5l0IGLhu5kgZOG7ryBsaeG7h3UgZ+G7k20gJE4kIHF1YW4gc8OhdCDEkeG6p3UgdsOgbzoNCg0KJCQNClxtYXRoY2Fse0R9ID0gXHsgXG1hdGhiZnt4fV8xLCBcbWF0aGJme3h9XzIsIFxsZG90cywgXG1hdGhiZnt4fV9OIFx9DQokJA0KDQp2w6AgbcO0IGjDrG5oIHBow6JuIHBo4buRaSB4w6FjIHN14bqldCAkUChcbWF0aGJme3h9fFxtYXRoYmZ7d30pJCBwaOG7pSB0aHXhu5ljIHbDoG8gdGhhbSBz4buRDQoNCiQkDQpcbWF0aGJme3d9ID0gKHdfMSwgd18yLCBcbGRvdHMsIHdfayleVA0KJCQNCg0KS2hpIMSRw7MsICoqaMOgbSBo4bujcCBsw70qKiDEkcaw4bujYyDEkeG7i25oIG5naMSpYSBsw6A6DQoNCiQkDQpMKFxtYXRoYmZ7d30pID0gUChcbWF0aGNhbHtEfXxcbWF0aGJme3d9KSA9IFAoXG1hdGhiZnt4fV8xLCBcbWF0aGJme3h9XzIsIFxsZG90cywgXG1hdGhiZnt4fV9OfFxtYXRoYmZ7d30pDQokJA0KDQpO4bq/dSBjw6FjIHF1YW4gc8OhdCAkXG1hdGhiZnt4fV9pJCBsw6AgKirEkeG7mWMgbOG6rXAgdsOgIHBow6JuIHBo4buRaSBnaeG7kW5nIG5oYXUgKGkuaS5kIOKAkyBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQpKiosIHRow6wgaMOgbSBo4bujcCBsw70gY8OzIHRo4buDIHZp4bq/dCBs4bqhaSB0aMOgbmg6DQoNCiQkDQpMKFxtYXRoYmZ7d30pID0gXHByb2Rfe2k9MX1ee059IFAoXG1hdGhiZnt4fV9pfFxtYXRoYmZ7d30pDQokJA0KDQojIyMgKipOZ3V5w6puIGzDvSB04buRaSDEkWEgaMOzYSBo4bujcCBsw70qKg0KDQpOZ3V5w6puIGzDvSBj4buRdCBsw7VpIGPhu6dhIE1MRSBsw6AgY2jhu41uIGdpw6EgdHLhu4sgdGhhbSBz4buRICRcaGF0e1xtYXRoYmZ7d319JCBzYW8gY2hvICoqaMOgbSBo4bujcCBsw70gxJHhuqF0IGdpw6EgdHLhu4sgbOG7m24gbmjhuqV0KiouIE7Ds2kgY8OhY2gga2jDoWMsIHRhIHTDrG0gdGhhbSBz4buRIG3DoCAqKmTGsOG7m2kgbsOzIHRow6wgeMOhYyBzdeG6pXQgdOG6oW8gcmEgZOG7ryBsaeG7h3UgcXVhbiBzw6F0IGzDoCBjYW8gbmjhuqV0Kio6DQoNCiQkDQpcaGF0e1xtYXRoYmZ7d319ID0gXGFyZ1xtYXhfe1xtYXRoYmZ7d319IEwoXG1hdGhiZnt3fSkNCiQkDQoNClR1eSBuaGnDqm4sIHZp4buHYyB04buRaSDGsHUgbeG7mXQgdMOtY2ggbOG7m24gY8OhYyB4w6FjIHN14bqldCBuaMawIHbhuq15IHRoxrDhu51uZyBraMO0bmcgdGh14bqtbiB0aeG7h24uIFbDrCB24bqteSwgdGEgdGjGsOG7nW5nICoqbOG6pXkgbG9nKiogY+G7p2EgaMOgbSBo4bujcCBsw70gxJHhu4MgdGh1IMSRxrDhu6NjICoqaMOgbSBsb2ctaOG7o3AgbMO9IChsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbikqKjoNCg0KJCQNClxlbGwoXG1hdGhiZnt3fSkgPSBcbG9nIEwoXG1hdGhiZnt3fSkgPSBcc3VtX3tpPTF9XntOfSBcbG9nIFAoXG1hdGhiZnt4fV9pfFxtYXRoYmZ7d30pDQokJA0KDQpEbyBow6BtIGxvZyBsw6AgxJHGoW4gxJFp4buHdSB0xINuZywgbsOqbiDEkWnhu4NtIGPhu7FjIMSR4bqhaSBj4bunYSAkXGVsbChcbWF0aGJme3d9KSQgY8WpbmcgY2jDrW5oIGzDoCBj4buxYyDEkeG6oWkgY+G7p2EgJEwoXG1hdGhiZnt3fSkkLiBW4bqteSBuw6puOg0KDQokJA0KXGhhdHtcbWF0aGJme3d9fSA9IFxhcmdcbWF4X3tcbWF0aGJme3d9fSBcZWxsKFxtYXRoYmZ7d30pDQokJA0KDQojIyAqKlTDs20gdOG6r3QgcXV5IHRyw6xuaCBNTEUqKg0KDQp8ICoqQsaw4bubYyoqIHwgKipNw7QgdOG6oyoqIHwNCnwtLS0tLS0tLS18LS0tLS0tLS0tLS18DQp8IELGsOG7m2MgMSB8IFjDoWMgxJHhu4tuaCBtw7QgaMOsbmggeMOhYyBzdeG6pXQgJFAoeHxcbWF0aGJme3d9KSQgdsOgIGdp4bqjIMSR4buLbmggZOG7ryBsaeG7h3UgxJHhu5ljIGzhuq1wIChpLmkuZCkuIHwNCnwgQsaw4bubYyAyIHwgVmnhur90IGjDoG0gaOG7o3AgbMO9ICRMKFxtYXRoYmZ7d30pJCBob+G6t2MgbG9nLWjhu6NwIGzDvSAkXGVsbChcbWF0aGJme3d9KSQuIHwNCnwgQsaw4bubYyAzIHwgVMOtbmggxJHhuqFvIGjDoG0gY+G7p2EgJFxlbGwoXG1hdGhiZnt3fSkkIHRoZW8gJFxtYXRoYmZ7d30kLCBy4buTaSBnaeG6o2kgcGjGsMahbmcgdHLDrG5oIMSR4bqhbyBow6BtIGLhurFuZyAwLiB8DQp8IELGsOG7m2MgNCB8IEtp4buDbSB0cmEgxJFp4buBdSBraeG7h24gdOG7kWkgxrB1ICjEkeG6oW8gaMOgbSBi4bqtYyBoYWksIHTDrW5oIGzhu5NpLCB2LnYuKS4gfA0KfCBCxrDhu5tjIDUgfCBL4bq/dCBsdeG6rW4gJFxoYXR7XG1hdGhiZnt3fX0kIGzDoCDGsOG7m2MgbMaw4bujbmcgTUxFLiB8DQoNCiMjICoqTcO0IGjDrG5oIGjDs2EgYsOgaSB0b8OhbiBkxrDhu5tpIGThuqFuZyB0b8OhbiBo4buNYyoqDQoNClRyb25nIHRyxrDhu51uZyBo4bujcCBk4buvIGxp4buHdSBwaMOibiBwaOG7kWkgaS5pLmQsIGLDoGkgdG/DoW4gTUxFIHRy4bufIHRow6BuaDoNCg0KJCQNClxoYXR7XG1hdGhiZnt3fX0gPSBcYXJnXG1heF97XG1hdGhiZnt3fX0gXHN1bV97aT0xfV57Tn0gXGxvZyBQKFxtYXRoYmZ7eH1faXxcbWF0aGJme3d9KQ0KJCQNCg0KxJDDonkgbMOgIG3hu5l0IGLDoGkgdG/DoW4gdOG7kWkgxrB1IGjDs2EgY8OzIHRo4buDIGdp4bqjaSBi4bqxbmc6DQoNCi0gxJDhuqFvIGjDoG0gdMaw4budbmcgbWluaCAobuG6v3UgY8OzIHRo4buDKSwNCi0gR3JhZGllbnQgRGVzY2VudCAvIE5ld3Rvbi1SYXBoc29uICh0cm9uZyB0csaw4budbmcgaOG7o3AgcGjhu6ljIHThuqFwKSwNCi0gS+G7uSB0aHXhuq10IHThu5FpIMawdSBow7NhIHPhu5EuDQoNCiMjICoqVMOtbmggY2jhuqV0IGPhu6dhIMaw4bubYyBsxrDhu6NuZyBNTEUqKg0KDQp8ICoqVMOtbmggY2jhuqV0KiogfCAqKk3DtCB04bqjKiogfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwNCnwgKipOaOG6pXQgcXXDoW4gKENvbnNpc3RlbmN5KSoqIHwgS2hpICROIFx0byBcaW5mdHkkLCBNTEUgaOG7mWkgdOG7pSB24buBIMSRw7puZyB0aGFtIHPhu5EgdGjhu7FjIHPhu7EuIHwNCnwgKipC4bqldCBiaeG6v24gKEludmFyaWFuY2UpKiogfCBO4bq/dSAkXGhhdHtcdGhldGF9JCBsw6AgTUxFIGPhu6dhICRcdGhldGEkLCB0aMOsICRnKFxoYXR7XHRoZXRhfSkkIGzDoCBNTEUgY+G7p2EgJGcoXHRoZXRhKSQuIHwNCnwgKipQaMOibiBwaOG7kWkgdGnhu4dtIGPhuq1uIGNodeG6qW4qKiB8IE1MRSB0aeG7h20gY+G6rW4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbiBraGkgJE4gXHRvIFxpbmZ0eSQuIHwNCnwgKipLaMO0bmcgdGhpw6puIGzhu4djaCB0aeG7h20gY+G6rW4qKiB8IEtoaSBt4bqrdSBs4bubbiwgc2FpIHPhu5EgdHJ1bmcgYsOsbmggY+G7p2EgTUxFIHRp4bq/biB24buBIDAuIHwNCg0KIyMgKipL4bq/dCBsdeG6rW4qKg0KDQpQaMawxqFuZyBwaMOhcCAqKsaw4bubYyBsxrDhu6NuZyBo4bujcCBsw70gdOG7kWkgxJFhIChNTEUpKiogbMOgIG3hu5l0IGPDtG5nIGPhu6UgdGhlbiBjaOG7kXQgdHJvbmcgdGjhu5FuZyBrw6ogdsOgIGjhu41jIG3DoXkuIELhurFuZyBjw6FjaCB04buRaSDEkWEgaMOzYSB4w6FjIHN14bqldCBzaW5oIHJhIGThu68gbGnhu4d1IMSRw6MgcXVhbiBzw6F0LCBNTEUgaMaw4bubbmcgdOG7m2kgbeG7pWMgdGnDqnUgY2jhu41uIG3DtCBow6xuaCBwaMO5IGjhu6NwIG5o4bqldCB24bubaSB0aOG7sWMgdOG6vy4gUGjGsMahbmcgcGjDoXAgbsOgeSBjw7MgY8ahIHPhu58gbMO9IHRodXnhur90IHbhu69uZyBjaOG6r2MgdsOgIGPDsyB0aOG7gyDDoXAgZOG7pW5nIMSR4buDIMaw4bubYyBsxrDhu6NuZyB0aGFtIHPhu5EgY+G7p2Egbmhp4buBdSBwaMOibiBwaOG7kWkgcGjhu5UgYmnhur9uIG5oxrAgQmVybm91bGxpLCBHYXVzc2lhbiwgUG9pc3Nvbiwgdi52Lg0KDQotLS0NCg0KIyAqKk3DtCBow6xuaCBI4buTaSBxdXkgTG9naXN0aWMgdsOgIFByb2JpdCoqDQoNCiMjICoqR2nhu5tpIHRoaeG7h3UgY2h1bmcqKg0KDQpLaGkgY8OhYyBwaMawxqFuZyBwaMOhcCBwaMOibiB0w61jaCBi4bqjbmcgY2jDqW8gdsOgIGtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZyDEkcOjIHjDoWMgbmjhuq1uIHPhu7EgdOG7k24gdOG6oWkgY+G7p2EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oLCBixrDhu5tjIHRp4bq/cCB0aGVvIGzDoCB4w6J5IGThu7FuZyBt4buZdCBtw7QgaMOsbmggZOG7sSBiw6FvIMSR4buDIGzGsOG7o25nIGjDs2EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCBsw6puIG3hu5l0IGJp4bq/biBwaOG7pSB0aHXhu5ljIG5o4buLIHBow6JuLiBLaGkgYmnhur9uIHBo4bulIHRodeG7mWMgY8OzIGhhaSBnacOhIHRy4buLICh2w60gZOG7pTogYDRXRGAgLyBgS2jDtG5nIDRXRGApLCBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggdGjDtG5nIHRoxrDhu51uZyAoT0xTKSBz4bq9IGtow7RuZyBjw7JuIHBow7kgaOG7o3AgdsOsIG7DsyBjw7MgdGjhu4MgZOG7sSDEkW/DoW4gY8OhYyBnacOhIHRy4buLIG7hurFtIG5nb8OgaSBraG/huqNuZyBbMCwgMV0sIMSRaeG7gXUgdsO0IGzDvSDEkeG7kWkgduG7m2kgbeG7mXQgeMOhYyBzdeG6pXQuDQoNCsSQ4buDIGdp4bqjaSBxdXnhur90IHbhuqVuIMSR4buBIG7DoHksIGPDoWMgbcO0IGjDrG5oIHjDoWMgc3XhuqV0IHBoaSB0dXnhur9uIG5oxrAgKipI4buTaSBxdXkgTG9naXN0aWMqKiB2w6AgKipI4buTaSBxdXkgUHJvYml0KiogxJHGsOG7o2Mgc+G7rSBk4bulbmcuIEPhuqMgaGFpIMSR4buBdSB0aHXhu5ljIG5ow7NtICoqTcO0IGjDrG5oIFR1eeG6v24gdMOtbmggVOG7lW5nIHF1w6F0IChHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWxzIC0gR0xNKSoqLCB24bubaSBt4bulYyB0acOqdSBtw7QgaMOsbmggaMOzYSB4w6FjIHN14bqldCB44bqjeSByYSBj4bunYSBt4buZdCBz4buxIGtp4buHbiwgJFAoWT0xfFgpJCwgZOG7sWEgdHLDqm4gY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wICRYJC4NCg0KIyMgKipI4buTaSBxdXkgTG9naXN0aWMgKExvZ2lzdGljIFJlZ3Jlc3Npb24pKioNCg0KIyMjICoqTeG7pWMgdGnDqnUgdsOgIG5ndXnDqm4gbMO9KioNCg0KSOG7k2kgcXV5IExvZ2lzdGljIGtow7RuZyBtw7QgaMOsbmggaMOzYSB0cuG7sWMgdGnhur9wIHjDoWMgc3XhuqV0ICRwJCwgbcOgIG3DtCBow6xuaCBow7NhICoqbG9nYXJpdCBj4bunYSB04bu3IHPhu5EgY2jDqm5oIChsb2ctb2RkcykqKiwgY8OybiBn4buNaSBsw6AgKipow6BtIGxvZ2l0KiouDQoNCi0gKipU4bu3IHPhu5EgY2jDqm5oIChPZGRzKToqKiBMw6AgdOG7tyBs4buHIGdp4buvYSB4w6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiB2w6AgeMOhYyBzdeG6pXQga2jDtG5nIHjhuqN5IHJhIHPhu7Ega2nhu4duOg0KICAkJCBcdGV4dHtPZGRzfSA9IFxmcmFje3B9ezEtcH0gJCQNCi0gKipIw6BtIExvZ2l0OioqIEzDoCBsb2dhcml0IHThu7Egbmhpw6puIGPhu6dhIE9kZHM6DQogICQkIFx0ZXh0e2xvZ2l0fShwKSA9IFxsblxsZWZ0KFxmcmFje3B9ezEtcH1ccmlnaHQpICQkDQoNCkjDoG0gbG9naXQgY8OzIG3hu5l0IMSR4bq3YyB0w61uaCB0dXnhu4d0IHbhu51pOiBuw7MgYmnhur9uIG3hu5l0IGdpw6EgdHLhu4sgeMOhYyBzdeG6pXQgJHAkIHRyb25nIGtob+G6o25nICgwLCAxKSB0aMOgbmggbeG7mXQgZ2nDoSB0cuG7iyB0csOqbiB0b8OgbiBi4buZIHRy4bulYyBz4buRIHRo4buxYyAkKC1caW5mdHksICtcaW5mdHkpJC4gxJBp4buBdSBuw6B5IGNobyBwaMOpcCBjaMO6bmcgdGEgbcO0IGjDrG5oIGjDs2EgbsOzIG5oxrAgbeG7mXQgdOG7lSBo4bujcCB0dXnhur9uIHTDrW5oIGPhu6dhIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcDoNCg0KJCQNClxsblxsZWZ0KFxmcmFje3BfaX17MS1wX2l9XHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFhfe2kxfSArIFxiZXRhXzIgWF97aTJ9ICsgXGxkb3RzICsgXGJldGFfayBYX3tpa30NCiQkDQoNCiMjIyAqKkRp4buFbiBnaeG6o2kgaOG7hyBz4buRKioNCg0KVmnhu4djIGRp4buFbiBnaeG6o2kgaOG7hyBz4buRICRcYmV0YSQgdHLhu7FjIHRp4bq/cCBraMOhIHBo4bupYyB04bqhcCAoInPhu7EgdGhheSDEkeG7lWkgdHJvbmcgbG9nLW9kZHMiKS4gVGhheSB2w6BvIMSRw7MsIGNow7puZyB0YSB0aMaw4budbmcgbOG6pXkgbMWpeSB0aOG7q2EgY8ahIHPhu5EgJGUkIGPhu6dhIGjhu4cgc+G7kSDEkeG7gyBjw7MgxJHGsOG7o2MgKipU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpKio6DQoNCiQkDQpcdGV4dHtPUn0gPSBlXlxiZXRhDQokJA0KDQotIE7hur91ICRcYmV0YV8xID4gMCBcaW1wbGllcyBlXntcYmV0YV8xfSA+IDEkOiBLaGkgJFhfMSQgdMSDbmcgMSDEkcahbiB24buLLCBvZGRzIMSR4buDIHPhu7Ega2nhu4duICRZPTEkIHjhuqN5IHJhIHPhur0gKip0xINuZyBsw6puKiogJGVee1xiZXRhXzF9JCBs4bqnbiwgZ2nhu68gY8OhYyBiaeG6v24ga2jDoWMga2jDtG5nIMSR4buVaS4NCi0gTuG6v3UgJFxiZXRhXzEgPCAwIFxpbXBsaWVzIGVee1xiZXRhXzF9IDwgMSQ6IEtoaSAkWF8xJCB0xINuZyAxIMSRxqFuIHbhu4ssIG9kZHMgxJHhu4Mgc+G7sSBraeG7h24gJFk9MSQgeOG6o3kgcmEgc+G6vSAqKmdp4bqjbSB4deG7kW5nKiogY8OybiAkZV57XGJldGFfMX0kIGzhuqduLCBnaeG7ryBjw6FjIGJp4bq/biBraMOhYyBraMO0bmcgxJHhu5VpLg0KLSBO4bq/dSAkXGJldGFfMSA9IDAgXGltcGxpZXMgZV57XGJldGFfMX0gPSAxJDogQmnhur9uICRYXzEkIGtow7RuZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gb2RkcyBj4bunYSBz4buxIGtp4buHbi4NCg0KIyMgKipI4buTaSBxdXkgUHJvYml0IChQcm9iaXQgUmVncmVzc2lvbikqKg0KDQojIyMgKipN4bulYyB0acOqdSB2w6Agbmd1ecOqbiBsw70qKg0KDQpI4buTaSBxdXkgUHJvYml0IGPFqW5nIG3DtCBow6xuaCBow7NhIHjDoWMgc3XhuqV0ICRwJCwgbmjGsG5nIHRoYXkgdsOsIGTDuW5nIGjDoG0gbG9naXQsIG7DsyBz4butIGThu6VuZyAqKmjDoG0gcGjDom4gcGjhu5FpIHTDrWNoIGzFqXkgKENERikgY+G7p2EgcGjDom4gcGjhu5FpIGNodeG6qW4gdOG6r2MqKiwga8O9IGhp4buHdSBsw6AgJFxQaGkoeikkLg0KDQrDnSB0xrDhu59uZyBjxqEgYuG6o24gbMOgIGPDsyBt4buZdCAiYmnhur9uIHRp4buBbSDhuqluIiAobGF0ZW50IHZhcmlhYmxlKSAkWV4qJCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluLiBDaMO6bmcgdGEga2jDtG5nIHF1YW4gc8OhdCDEkcaw4bujYyAkWV4qJCwgbcOgIGNo4buJIHF1YW4gc8OhdCDEkcaw4bujYyAkWT0xJCBu4bq/dSAkWV4qJCB2xrDhu6N0IHF1YSBt4buZdCBuZ8aw4buhbmcgbsOgbyDEkcOzLg0KDQpNw7QgaMOsbmggUHJvYml0IGPDsyBk4bqhbmc6DQokJA0KUChZPTF8WCkgPSBcUGhpKFxiZXRhXzAgKyBcYmV0YV8xIFhfMSArIFxiZXRhXzIgWF8yICsgXGxkb3RzICsgXGJldGFfayBYX2spDQokJA0KSG/hurdjIHZp4bq/dCB0aGVvIGThuqFuZyBow6BtIG5nxrDhu6NjIChow6BtIHByb2JpdCk6DQokJA0KXFBoaV57LTF9KHBfaSkgPSBcYmV0YV8wICsgXGJldGFfMSBYX3tpMX0gKyBcYmV0YV8yIFhfe2kyfSArIFxsZG90cyArIFxiZXRhX2sgWF97aWt9DQokJA0KDQojIyMgKipEaeG7hW4gZ2nhuqNpIGjhu4cgc+G7kSoqDQoNCkjhu4cgc+G7kSAkXGJldGEkIHRyb25nIG3DtCBow6xuaCBQcm9iaXQgdGjhu4MgaGnhu4duIHPhu7EgdGhheSDEkeG7lWkgdHJvbmcgKip6LXNjb3JlKiogKGdpw6EgdHLhu4sgdHLDqm4gdHLhu6VjIGhvw6BuaCBj4bunYSBwaMOibiBwaOG7kWkgY2h14bqpbiB04bqvYykga2hpIGJp4bq/biDEkeG7mWMgbOG6rXAgJFgkIHRoYXkgxJHhu5VpIDEgxJHGoW4gduG7iy4gVmnhu4djIGRp4buFbiBnaeG6o2kgbsOgeSBraMO0bmcgdHLhu7FjIHF1YW4gdsOgIHRoxrDhu51uZyDDrXQgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgYsOhbyBjw6FvIGtpbmggZG9hbmguIFRoYXkgdsOgbyDEkcOzLCBuZ8aw4budaSB0YSB0aMaw4budbmcgdMOtbmggdG/DoW4gdsOgIGLDoW8gY8OhbyAqKnTDoWMgxJHhu5luZyBiacOqbiAobWFyZ2luYWwgZWZmZWN0cykqKiwgdOG7qWMgbMOgIHPhu7EgdGhheSDEkeG7lWkgdHJvbmcgeMOhYyBzdeG6pXQgJHAkIGtoaSAkWCQgdGhheSDEkeG7lWkuDQoNCiMjICoqTG9naXN0aWMgdnMuIFByb2JpdDogTOG7sWEgY2jhu41uIG7DoG8/KioNCg0KfCBUacOqdSBjaMOtIHwgSOG7k2kgcXV5IExvZ2lzdGljIHwgSOG7k2kgcXV5IFByb2JpdCB8DQp8Oi0tLXw6LS0tfDotLS18DQp8ICoqSMOgbSBsacOqbiBr4bq/dCoqIHwgTG9naXQsIGThu7FhIHRyw6puIHBow6JuIHBo4buRaSBMb2dpc3RpYyB8IFByb2JpdCwgZOG7sWEgdHLDqm4gcGjDom4gcGjhu5FpIENodeG6qW4gfA0KfCAqKsSQ4buZIGThu5FjKiogfCDEkMaw4budbmcgY29uZyBTIChzaWdtb2lkKSBoxqFpIHBo4bqzbmcgaMahbiDhu58gxJF1w7RpIHwgxJDGsOG7nW5nIGNvbmcgUyAoc2lnbW9pZCkgZOG7kWMgaMahbiDhu58gxJF1w7RpIHwNCnwgKipEaeG7hW4gZ2nhuqNpKiogfCBI4buHIHPhu5EgY8OzIHRo4buDIGRp4buFbiBnaeG6o2kgdHLhu7FjIHRp4bq/cCBxdWEgT2RkcyBSYXRpbyAoT1IpIHwgSOG7hyBz4buRIGtow7MgZGnhu4VuIGdp4bqjaSwgdGjGsOG7nW5nIGTDuW5nIHTDoWMgxJHhu5luZyBiacOqbiB8DQp8ICoqU+G7rSBk4bulbmcqKiB8IFLhuqV0IHBo4buVIGJp4bq/biB0cm9uZyB5IHNpbmgsIGtob2EgaOG7jWMgeMOjIGjhu5lpLCBtYXJrZXRpbmcgfCBQaOG7lSBiaeG6v24gdHJvbmcga2luaCB04bq/IGzGsOG7o25nIHwNCg0KVHJvbmcgdGjhu7FjIHThur8sIGPhuqMgaGFpIG3DtCBow6xuaCB0aMaw4budbmcgY2hvIGvhur90IHF14bqjIGThu7EgxJFvw6FuIHLhuqV0IGdp4buRbmcgbmhhdS4gKipI4buTaSBxdXkgTG9naXN0aWMgdGjGsOG7nW5nIMSRxrDhu6NjIMawYSBjaHXhu5luZyBoxqFuIHbDrCB0w61uaCBk4buFIGRp4buFbiBnaeG6o2kgY+G7p2EgT2RkcyBSYXRpby4qKg0KDQojIyAqKsOBcCBk4bulbmcgbcO0IGjDrG5oIGThu7EgxJFvw6FuIGjhu4cgZOG6q24gxJHhu5luZyBoYWkgY+G6p3UgKGA0V0RgKSoqDQoNCioqQ8OidSBo4buPaSBuZ2hpw6puIGPhu6l1OioqIE5o4buvbmcgeeG6v3UgdOG7kSBr4bu5IHRodeG6rXQgbsOgbyAoZHVuZyB0w61jaCDEkeG7mW5nIGPGoSwgc+G7kSB4aS1sYW5oKSDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgbeG7mXQgY2hp4bq/YyB4ZSDEkcaw4bujYyB0cmFuZyBi4buLICoqaOG7hyBk4bqrbiDEkeG7mW5nIGhhaSBj4bqndSAoYDRXRGApKio/DQoNCiMjIyAqKkNodeG6qW4gYuG7iyBk4buvIGxp4buHdSoqDQoNCkNow7puZyB0YSBz4bq9IHThuqFvIG3hu5l0IGJp4bq/biBwaOG7pSB0aHXhu5ljIG3hu5tpIGzDoCBgaXNfNHdkYCwgbmjhuq1uIGdpw6EgdHLhu4sgYDFgIG7hur91IHhlIGzDoCBgNFdEYCB2w6AgYDBgIHRyb25nIHRyxrDhu51uZyBo4bujcCBjw7JuIGzhuqFpLg0KDQpgYGB7cn0NCiMgVOG6oW8gYmnhur9uIHBo4bulIHRodeG7mWMgbmjhu4sgcGjDom4NCm1wZ19tb2RlbF9kYXRhIDwtIG1wZyAlPiUNCiAgbXV0YXRlKGlzXzR3ZCA9IGlmZWxzZShkcnYgPT0gIjQiLCAxLCAwKSkNCg0KIyBYZW0gcXVhIGThu68gbGnhu4d1IG3hu5tpDQpoZWFkKG1wZ19tb2RlbF9kYXRhICU+JSBzZWxlY3QobWFudWZhY3R1cmVyLCBtb2RlbCwgZHJ2LCBpc180d2QsIGRpc3BsLCBjeWwpKQ0KYGBgDQoNCiMjIyAqKljDonkgZOG7sW5nIHbDoCBwaMOibiB0w61jaCBtw7QgaMOsbmggSOG7k2kgcXV5IExvZ2lzdGljKioNCg0KQ2jDum5nIHRhIHPhur0geMOieSBk4buxbmcgbcO0IGjDrG5oIGThu7EgxJFvw6FuIGBpc180d2RgIGThu7FhIHRyw6puIGBkaXNwbGAgKGR1bmcgdMOtY2ggxJHhu5luZyBjxqEpIHbDoCBgY3lsYCAoc+G7kSB4aS1sYW5oKS4NCg0KYGBge3J9DQojIFjDonkgZOG7sW5nIG3DtCBow6xuaCBMb2dpc3RpYw0KbG9naXRfbW9kZWwgPC0gZ2xtKGlzXzR3ZCB+IGRpc3BsICsgY3lsLCANCiAgICAgICAgICAgICAgICAgICBkYXRhID0gbXBnX21vZGVsX2RhdGEsIA0KICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCg0KIyBYZW0ga+G6v3QgcXXhuqMNCnN1bW1hcnkobG9naXRfbW9kZWwpDQpgYGANCg0KKipEaeG7hW4gZ2nhuqNpIGvhur90IHF14bqjIG3DtCBow6xuaCBMb2dpc3RpYzoqKg0KDQotICoqSOG7hyBz4buRIGPhu6dhIGBkaXNwbGAgKER1bmcgdMOtY2ggxJHhu5luZyBjxqEpOioqDQogIC0gSOG7hyBz4buRIGzDoCBgMC43Mzg1YC4gR2nDoSB0cuG7iyBuw6B5IGTGsMahbmcgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogKHAtdmFsdWUgPSAwLjAxNyA8IDAuMDUpLg0KICAtIMSQ4buDIGRp4buFbiBnaeG6o2ksIHRhIHTDrW5oIE9kZHMgUmF0aW86IGBleHAoMC43Mzg1KSDiiYggMi4wOWAuDQogIC0gKipEaeG7hW4gZ2nhuqNpOioqIE7hur91IHPhu5EgeGktbGFuaCBraMO0bmcgxJHhu5VpIHRow6wga2hpIGR1bmcgdMOtY2ggxJHhu5luZyBjxqEgKip0xINuZyAxIGzDrXQqKiwgdOG7tyBs4buHIChvZGRzKSDEkeG7gyBjaGnhur9jIHhlIMSRw7MgbMOgIHhlIGA0V0RgICoqdMSDbmcgbMOqbiAyLjA5IGzhuqduKiouDQoNCi0gKipI4buHIHPhu5EgY+G7p2EgYGN5bGAgKFPhu5EgeGktbGFuaCk6KioNCiAgLSBI4buHIHPhu5EgbMOgIGAtMC4xMDU2YC4gR2nDoSB0cuG7iyDDom0gbmjGsG5nICoqa2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKiDhu58gbeG7qWMgNSUgKHAtdmFsdWUgPSAwLjY2MSA+IDAuMDUpLg0KDQojIyMgKipYw6J5IGThu7FuZyB2w6AgcGjDom4gdMOtY2ggbcO0IGjDrG5oIEjhu5NpIHF1eSBQcm9iaXQqKg0KDQpgYGB7cn0NCiMgWMOieSBk4buxbmcgbcO0IGjDrG5oIFByb2JpdA0KcHJvYml0X21vZGVsIDwtIGdsbShpc180d2QgfiBkaXNwbCArIGN5bCwgDQogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBtcGdfbW9kZWxfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpDQoNCiMgWGVtIGvhur90IHF14bqjDQpzdW1tYXJ5KHByb2JpdF9tb2RlbCkNCmBgYA0KDQoqKkRp4buFbiBnaeG6o2kga+G6v3QgcXXhuqMgbcO0IGjDrG5oIFByb2JpdDoqKg0KDQotICoqSOG7hyBz4buRIGPhu6dhIGBkaXNwbGAgKER1bmcgdMOtY2ggxJHhu5luZyBjxqEpOioqDQogIC0gSOG7hyBz4buRIGzDoCBgIDAuNDI2OWAuIEdpw6EgdHLhu4sgbsOgeSBkxrDGoW5nIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIChwLXZhbHVlID0gMC4wMDAxIDwgMC4wNSkuDQogIC0gKipEaeG7hW4gZ2nhuqNpOioqIE7hur91IHPhu5EgeGktbGFuaCBraMO0bmcgxJHhu5VpIHRow6wga2hpIGR1bmcgdMOtY2ggxJHhu5luZyBjxqEgKip0xINuZyAxIGzDrXQqKiwgKip6LXNjb3JlKiogZOG7sSDEkW/DoW4geMOhYyBzdeG6pXQgeGUgbMOgIGA0V0RgICoqdMSDbmcgbMOqbiAwLjQyNjkgxJHGoW4gduG7iyoqLg0KDQotICoqSOG7hyBz4buRIGPhu6dhIGBjeWxgIChT4buRIHhpLWxhbmgpOioqDQogIC0gSOG7hyBz4buRIGzDoCBgLTAuMDQ3OGAuIEdpw6EgdHLhu4sgw6JtIG5oxrBuZyAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiog4bufIG3hu6ljIDUlIChwLXZhbHVlID0gMC43NDI4ID4gMC4wNSkuDQoNCiMjIyAqKlNvIHPDoW5oIGhhaSBtw7QgaMOsbmgqKg0KDQpD4bqjIGhhaSBtw7QgaMOsbmggxJHhu4F1IGNobyBjw7luZyBt4buZdCBr4bq/dCBsdeG6rW46IGR1bmcgdMOtY2ggxJHhu5luZyBjxqEgKGBkaXNwbGApIGzDoCB54bq/dSB04buRIGThu7EgYsOhbyBxdWFuIHRy4buNbmcgY2hvIHZp4buHYyBt4buZdCBjaGnhur9jIHhlIGPDsyBwaOG6o2kgbMOgIGA0V0RgIGhheSBraMO0bmcuIENow7puZyB0YSBjw7MgdGjhu4Mgc28gc8OhbmggdHLhu7FjIHRp4bq/cCB4w6FjIHN14bqldCBk4buxIMSRb8OhbiB04burIGhhaSBtw7QgaMOsbmguDQoNCmBgYHtyfQ0KIyBM4bqleSB4w6FjIHN14bqldCBk4buxIMSRb8OhbiB04burIGhhaSBtw7QgaMOsbmgNCm1wZ19tb2RlbF9kYXRhJHByZWRfbG9naXQgPC0gcHJlZGljdChsb2dpdF9tb2RlbCwgdHlwZSA9ICJyZXNwb25zZSIpDQptcGdfbW9kZWxfZGF0YSRwcmVkX3Byb2JpdCA8LSBwcmVkaWN0KHByb2JpdF9tb2RlbCwgdHlwZSA9ICJyZXNwb25zZSIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5Mgc28gc8OhbmgNCmdncGxvdChtcGdfbW9kZWxfZGF0YSwgYWVzKHggPSBwcmVkX2xvZ2l0LCB5ID0gcHJlZF9wcm9iaXQpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiU28gc8OhbmggeMOhYyBzdeG6pXQgZOG7sSDEkW/DoW4gZ2nhu69hIG3DtCBow6xuaCBMb2dpdCB2w6AgUHJvYml0IiwNCiAgICB4ID0gIljDoWMgc3XhuqV0IGThu7EgxJFvw6FuIHThu6sgbcO0IGjDrG5oIExvZ2lzdGljIiwNCiAgICB5ID0gIljDoWMgc3XhuqV0IGThu7EgxJFvw6FuIHThu6sgbcO0IGjDrG5oIFByb2JpdCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNCkJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IGPDoWMgxJFp4buDbSBk4buvIGxp4buHdSBu4bqxbSBy4bqldCBzw6F0IMSRxrDhu51uZyBjaMOpbyBtw6B1IMSR4buPLCBjaOG7qW5nIHThu48geMOhYyBzdeG6pXQgZOG7sSDEkW/DoW4gdOG7qyBoYWkgbcO0IGjDrG5oIGfhuqduIG5oxrAgdMawxqFuZyDEkcawxqFuZyBuaGF1Lg==