Phần 1: Tìm
hiểu và chuẩn bị dữ liệu
Đọc dữ
liệu
Bộ dữ liệu giao dịch siêu thị gồm 14059 quan sát và 10 biến định
tính, cung cấp thông tin chi tiết về giao dịch (ngày mua, sản phẩm) và
nhân khẩu học khách hàng (giới tính, thu nhập, địa lý). Đây là nguồn dữ
liệu lớn, đa dạng cho phân tích hành vi khách hàng và sản phẩm.
d <- read.csv('F:/R/data1/Supermarket Transactions.csv',header=T)
# Lọc dữ liệu (chỉ giữ các biến định tính)
d1 <- subset(d, select=-c(UnitsSold,Revenue,Children,CustomerID))
# Hiển thị cấu trúc dữ liệu
str(d1)
## 'data.frame': 14059 obs. of 12 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ PurchaseDate : chr "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
## $ Gender : chr "F" "M" "F" "M" ...
## $ MaritalStatus : chr "S" "M" "M" "M" ...
## $ Homeowner : chr "Y" "Y" "N" "Y" ...
## $ AnnualIncome : chr "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
## $ City : chr "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
## $ StateorProvince : chr "CA" "CA" "WA" "OR" ...
## $ Country : chr "USA" "USA" "USA" "USA" ...
## $ ProductFamily : chr "Food" "Food" "Food" "Food" ...
## $ ProductDepartment: chr "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
## $ ProductCategory : chr "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
Qua việc xem xét kiểu dữ liệu của từng biến, có thể thấy rằng bộ dữ
liệu này cần một bước tiền xử lý đáng kể để các biến được gán kiểu dữ
liệu phù hợp với nội dung và mục đích phân tích.
Cụ thể, các biến X và CustomerID hiện đang ở kiểu integer (số nguyên)
và đây là kiểu dữ liệu phù hợp cho các biến chỉ mục hoặc định danh.
Tuy nhiên, phần lớn các biến còn lại đang ở kiểu character (chuỗi ký
tự) nhưng lại đại diện cho thông tin định tính hoặc ngày tháng, cần được
chuyển đổi sang các kiểu phù hợp hơn.
# Hiển thị 10 dòng đầu dữ liệu
print("10 dòng đầu của bộ dữ liệu")
## [1] "10 dòng đầu của bộ dữ liệu"
z <- head(d1,10)
datatable(z)
# Hiển thị 10 dòng cuối dữ liệu
print("10 dòng cuối của bộ dữ liệu")
## [1] "10 dòng cuối của bộ dữ liệu"
z1 <- tail(d1,10)
datatable(z1)
- Kiểm tra và xử lý dữ liệu thiếu
# Kiểm tra bộ dữ liệu có giá trị thiếu (NA) hay không.
print("Kiểm tra bộ dữ liệu có các giá trị thiếu hay không:")
## [1] "Kiểm tra bộ dữ liệu có các giá trị thiếu hay không:"
z2 <- is.na(d1)
datatable(z2)
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html
# Đếm tổng số lượng giá trị thiếu (NA)
print("Tổng số lượng các giá trị thiếu:")
## [1] "Tổng số lượng các giá trị thiếu:"
sum(is.na(d1))
## [1] 0
# Tìm ra các vị trí của các giá trị thiếu (NA)
print("Vị trị của các giá trị thiếu:")
## [1] "Vị trị của các giá trị thiếu:"
which(is.na(d1))
## integer(0)
Kết quả cho thấy rằng bộ dữ liệu không chứa bất kỳ giá trị thiếu (NA)
nào.
- Chuyển đổi các biến cần thiết sang kiểu factor
Ở phần đọc dữ liệu, khi thực hiện hàm str() kết quả thu được cho ta
thấy hầu hết các biến định tính đang ở kiểu dữ liệu character (chuỗi ký
tự) nhưng lại đại diện cho thông tin định tính, cho thấy được các biến
cần được chuyển đổi sang kiểu dữ liệu phù hợp hơn như factor.
# Lưu danh sách các biến cần chuyển đổi vào một vector riêng
z3 <- c("Gender", "MaritalStatus", "Homeowner","AnnualIncome", "City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")
# Chuyển đổi kiểu dữ liệu
d1 <- d1 %>% mutate(across(all_of(z3), as.factor))
# toán tử %>% : truyền d1 vào hàm mutate
# mutate(): thay đổi biến hiện có bằng cách áp dụng một hàm và kết quả đè lên chính cột đó.
# across(): dùng để áp dụng hàm as.factor cho nhiều cột.
#all_of(): chỉ định các cột bằng tên được lưu trữ trong vector.
# Hiển thị cấu trúc dữ liệu
print("Cấu trúc dữ liệu:")
## [1] "Cấu trúc dữ liệu:"
str(d1)
## 'data.frame': 14059 obs. of 12 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ PurchaseDate : chr "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
## $ Gender : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
## $ MaritalStatus : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
## $ Homeowner : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
## $ AnnualIncome : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
## $ City : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
## $ StateorProvince : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
## $ Country : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ ProductFamily : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
## $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
## $ ProductCategory : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...
Sau khi chuyển đổi từ character sang factor, cấu trúc dữ liệu đã được
cải thiện đáng kể. Hầu hết các biến định tính đã đúng kiểu, tối ưu bộ
nhớ và sẵn sàng cho phân tích.
Phần 2: Phân
tích Mô tả Một biến Định tính (Univaruate Descriptive
Analysis)
Biến
Homeowner
table(d1$Homeowner)
##
## N Y
## 5615 8444
f <- table(d1$Homeowner)/sum(nrow(d1))
print(f)
##
## N Y
## 0.3993883 0.6006117
Vậy trong bộ dữ liệu này có 39.9388292% không sở hữu nhà và
60.0611708% có sở hữu nhà.
pie(f,
labels = paste(names(f), round(f, 2), "%"),
main = "Biểu đồ tròn: Tỷ lệ Homeowne")

# * pie(): hàm vẽ biểu đồ tròn thể hiện tỷ lệ của các thành phần so với tổng thể
# f: vector muốn thể hiện dưới dạng biểu đồ.
# labels: chỉ định các nhãn được hiển thị.
# paste (): hàm ghép các chuỗi ký tự lại với nhau.
# names(f): trả về tên của các thành phần trong f.
# round(f): làm tròn các giá trị trong vector f đến một chữ số thập phân nhất định. round(f,2): làm tròn các tỷ lệ trong f đến 2 chữ số thập phân.
# main: tên của biểu đồ.
Dựa trên phân tích biến “Homeowner”, chúng ta có thể rút ra một số
nhận xét quan trọng về đặc điểm của bộ dữ liệu. Biến này phân loại các
cá nhân dựa trên tình trạng sở hữu nhà, với hai nhóm chính là “N” (không
sở hữu nhà) và “Y” (có sở hữu nhà).
Quan sát từ bảng tần số, có 5615 cá nhân thuộc nhóm “N” và 8444 cá
nhân thuộc nhóm “Y”. Khi chuyển sang tỷ lệ, bảng tần suất cho thấy nhóm
“N” chiếm khoảng 39.94% tổng số quan sát, trong khi nhóm “Y” chiếm phần
lớn hơn với khoảng 60.06%. Biểu đồ tròn “Tỷ lệ Homeowne” cũng minh họa
rõ ràng tỷ lệ này với 0.4% (hoặc 40%) cho “N” và 0.6% (hoặc 60%) cho
“Y”, xác nhận sự phân bổ dữ liệu.
Rõ ràng, hạng mục “Y” (có sở hữu nhà) chiếm ưu thế đáng kể trong bộ
dữ liệu này. Có một sự chênh lệch lớn giữa hai hạng mục, khi số lượng và
tỷ lệ người sở hữu nhà cao hơn rõ rệt so với người không sở hữu nhà.
Điều này cho thấy rằng phần lớn các cá nhân được ghi nhận trong bộ dữ
liệu này là những người đã có tài sản nhà ở.
Biến
Gender
table(d1$Gender)
##
## F M
## 7170 6889
a <- table(d1$Gender)/sum(nrow(d1))
print(a)
##
## F M
## 0.5099936 0.4900064
Vậy trong bộ dữ liệu này có 50.9993598% nữ và 49.0006402% nam.
pie(a,
labels = paste(names(a), round(a, 2), "%"),
main = "Biểu đồ tròn: Tỷ lệ Gender")

Dựa trên phân tích biến “Gender”, chúng ta có thể nhận xét về phân bổ
giới tính trong bộ dữ liệu. Biến này phân loại các cá nhân thành hai
nhóm chính là “F” (Nữ) và “M” (Nam).
Từ bảng tần số, có 7170 cá nhân là nữ và 6889 cá nhân là nam. Khi
chuyển sang tỷ lệ, bảng tần suất cho thấy nữ giới (F) chiếm khoảng
51.00% tổng số quan sát, trong khi nam giới (M) chiếm khoảng 49.00%.
Biểu đồ tròn “Tỷ lệ Gender” cũng minh họa rõ ràng tỷ lệ này với 0.51%
(hoặc 51%) cho nữ và 0.49% (hoặc 49%) cho nam, thể hiện sự nhất quán
giữa các hình thức trình bày dữ liệu.
Nhìn chung, đặc điểm chính bạn quan sát được là sự phân bổ giới tính
tương đối cân bằng trong bộ dữ liệu. Mặc dù hạng mục “F” (Nữ) có một
chút ưu thế về số lượng và tỷ lệ so với hạng mục “M” (Nam), nhưng sự
chênh lệch này không đáng kể. Tỷ lệ giữa nữ và nam gần như 1:1, cho thấy
bộ dữ liệu này có sự đại diện khá đồng đều của cả hai giới tính. Điều
này rất thuận lợi cho các phân tích tiếp theo, đảm bảo rằng không có sự
mất cân bằng đáng kể về giới tính có thể làm sai lệch kết quả.
Biến
MaritalStatus
table(d1$MaritalStatus)
##
## M S
## 6866 7193
b <- table(d1$MaritalStatus)/sum(nrow(d1))
print(b)
##
## M S
## 0.4883704 0.5116296
Vậy trong bộ dữ liệu này có 48.8370439% đã kết hôn và 51.1629561% độc
thân.
pie(b,
labels = paste(names(b), round(b, 2), "%"),
main = "Biểu đồ tròn: Tỷ lệ MaritalStatus")

Biến “MaritalStatus” (Tình trạng hôn nhân) trong bộ dữ liệu phân loại
các cá nhân thành hai nhóm chính là “M” (Đã kết hôn) và “S” (Độc
thân).
Từ bảng tần số, có 6866 cá nhân đã kết hôn (M) và 7193 cá nhân độc
thân (S). Khi xem xét tỷ lệ, bảng tần suất cho thấy nhóm “M” chiếm
khoảng 48.83% tổng số quan sát, trong khi nhóm “S” chiếm tỷ lệ lớn hơn
một chút với khoảng 51.17%. Biểu đồ tròn “Tỷ lệ MaritalStatus” cũng minh
họa rõ ràng sự phân bổ này, với 0.49% (hoặc 49%) cho “M” và 0.51% (hoặc
51%) cho “S”, xác nhận sự nhất quán giữa các hình thức trình bày dữ
liệu.
Đặc điểm chính quan sát được là sự cân bằng tương đối giữa hai tình
trạng hôn nhân trong bộ dữ liệu. Mặc dù hạng mục “S” (Độc thân) có một
chút ưu thế về số lượng và tỷ lệ so với hạng mục “M” (Đã kết hôn), nhưng
sự chênh lệch này không đáng kể. Tỷ lệ giữa người độc thân và người đã
kết hôn gần như 1:1, cho thấy bộ dữ liệu này có sự đại diện khá đồng đều
của cả hai nhóm. Điều này có lợi cho các phân tích sau này, vì nó tránh
được tình trạng mất cân bằng dữ liệu có thể ảnh hưởng đến kết quả mô
hình hoặc thống kê liên quan đến tình trạng hôn nhân.
Biến
AnnualIncome
table(d1$AnnualIncome)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
l <- table(d1$AnnualIncome)/sum(nrow(d1))
print(l)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 0.21978804 0.04573583 0.05405790 0.01941817 0.32726367
## $50K - $70K $70K - $90K $90K - $110K
## 0.16857529 0.12155914 0.04360196
Vậy trong bộ dữ liệu này có:
21.9788036% cá nhân có thu nhập thuộc khoảng $10K - $30K ;
4.5735828% cá nhân có thu nhập thuộc khoảng $110K - $130K;
5.4057899% cá nhân có thu nhập thuộc khoảng $130K - $150K;
1.9418166% cá nhân có thu nhập thuộc khoảng $150K +;
32.7263675% cá nhân có thu nhập thuộc khoảng $50K - $70K ;
16.857529% cá nhân có thu nhập thuộc khoảng $70K - $90K;
4.3601963% cá nhân có thu nhập thuộc khoảng $90K - $110K;
pie(l,
labels = paste(names(l), round(l, 2), "%"),
main = "Biểu đồ tròn: Tỷ lệ AnnualIncome")

Biến “AnnualIncome” (Thu nhập hàng năm) trong bộ dữ liệu được phân
loại thành nhiều khoảng khác nhau, cho phép chúng ta phân tích sự phân
bổ thu nhập của các cá nhân. Các khoảng thu nhập bao gồm từ thấp nhất
($10K - $30K) đến cao nhất ($150K +).
Từ bảng tần số, chúng ta có thể thấy số lượng cá nhân trong từng
khoảng thu nhập. Cụ thể, khoảng thu nhập phổ biến nhất là $30K - $50K
với 4601 cá nhân, tiếp theo là khoảng $10K - $30K với 3090 cá nhân. Các
khoảng thu nhập cao hơn như $110K - $130K, $130K - $150K, và $150K + có
số lượng cá nhân ít hơn đáng kể.
Khi xem xét tỷ lệ, bảng tần suất cho thấy khoảng $30K - $50K chiếm tỷ
lệ lớn nhất với khoảng 32.73%. Khoảng $10K - $30K đứng thứ hai với
khoảng 21.98%. Các khoảng thu nhập còn lại có tỷ lệ thấp hơn nhiều, đặc
biệt là khoảng $150K + chỉ chiếm khoảng 1.94%. Biểu đồ tròn “Tỷ lệ
AnnualIncome” cũng minh họa rõ ràng sự phân bổ này, với 0.33% (hoặc 33%)
cho $30K - $50K và 0.22% (hoặc 22%) cho $10K - $30K.
Đặc điểm chính quan sát được là sự phân bổ thu nhập lệch về phía các
khoảng thu nhập thấp và trung bình. Hạng mục $30K - $50K chiếm ưu thế rõ
rệt nhất trong bộ dữ liệu, cho thấy đây là nhóm thu nhập phổ biến nhất.
Có sự chênh lệch lớn giữa các hạng mục thu nhập, với phần lớn các cá
nhân tập trung ở các khoảng thu nhập dưới $70K, và một tỷ lệ rất nhỏ ở
các khoảng thu nhập cao hơn $110K. Điều này ngụ ý rằng bộ dữ liệu chủ
yếu tập trung vào các cá nhân có mức thu nhập thấp và trung bình.
Biến
City
table(d1$City)
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 383 143 811 834 452
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 75 845 926 654 194
## Orizaba Portland Salem San Andres San Diego
## 464 876 1386 621 866
## San Francisco Seattle Spokane Tacoma Vancouver
## 130 922 875 1257 633
## Victoria Walla Walla Yakima
## 176 160 376
k <- table(d1$City)/sum(nrow(d1))
print(k)
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 0.027242336 0.010171420 0.057685468 0.059321431 0.032150224
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 0.005334661 0.060103848 0.065865282 0.046518245 0.013798990
## Orizaba Portland Salem San Andres San Diego
## 0.033003770 0.062308841 0.098584537 0.044170994 0.061597553
## San Francisco Seattle Spokane Tacoma Vancouver
## 0.009246746 0.065580767 0.062237712 0.089408920 0.045024539
## Victoria Walla Walla Yakima
## 0.012518671 0.011380610 0.026744434
Vậy trong bộ dữ liệu này có:
2.7242336% cá nhân sinh sống ở Acapulco;
1.017142% cá nhân sinh sống ở Bellingham;
5.7685468% cá nhân sinh sống ở Beverly Hills;
5.9321431% cá nhân sinh sống ở Bremerton;
3.2150224% cá nhân sinh sống ở Camacho;
0.5334661% cá nhân sinh sống ở Guadalajara;
6.0103848% cá nhân sinh sống ở Hidalgo;
6.5865282% cá nhân sinh sống ở Los Angeles;
4.6518245% cá nhân sinh sống ở Merida;
1.379899% cá nhân sinh sống ở Mexico City;
3.300377% cá nhân sinh sống ở Orizaba;
6.2308841% cá nhân sinh sống ở Portland;
9.8584537% cá nhân sinh sống ở Salem;
4.4170994% cá nhân sinh sống ở San Andres;
6.1597553% cá nhân sinh sống ở San Diego;
0.9246746% cá nhân sinh sống ở San Francisco;
6.5580767% cá nhân sinh sống ở Seattle;
6.2237712% cá nhân sinh sống ở Spokane;
8.940892% cá nhân sinh sống ở Tacoma;
4.5024539% cá nhân sinh sống ở Vancouver;
1.2518671% cá nhân sinh sống ở Victoria;
1.138061% cá nhân sinh sống ở Walla Walla;
2.6744434% cá nhân sinh sống ở Yakima.
table(d1$City) %>% as.data.frame() ->o2
colnames(o2)<-c("value","count")
ggplot(o2, aes(x = value, y = count, fill = value)) +
geom_bar(stat = "identity") + coord_flip() +
geom_text(aes(label = count), vjust = -0.3, size = 2.5) +
labs(title = "Biểu đồ City ", x = "City", y = "Số lượng") +
theme_minimal()

Biến “City” trong bộ dữ liệu thể hiện thành phố nơi các cá nhân sinh
sống. Có rất nhiều thành phố khác nhau được liệt kê, cho thấy sự phân bổ
địa lý rộng của tập khách hàng.
Từ bảng tần số, chúng ta có thể thấy số lượng cá nhân ở mỗi thành
phố. Quan sát nhanh cho thấy một số thành phố có tần số xuất hiện cao
hơn đáng kể so với những thành phố khác. Ví dụ, Los Angeles có 926 cá
nhân, Tacoma có 1257 cá nhân, Seattle có 922 cá nhân, Portland có 876 cá
nhân, và San Diego có 866 cá nhân. Ngược lại, một số thành phố như
Guadalajara (75 cá nhân) hoặc Victoria (176 cá nhân) có số lượng ít hơn
nhiều.
Khi xem xét tỷ lệ (tần suất), các thành phố có số lượng cá nhân cao
nhất cũng có tỷ lệ phần trăm lớn nhất. Ví dụ, Tacoma chiếm khoảng 8.94%
tổng số quan sát, Los Angeles khoảng 6.58%, Seattle khoảng 6.56%, và
Portland khoảng 6.23%. Các thành phố khác có tỷ lệ thấp hơn nhiều, một
số chỉ chiếm dưới 1% (ví dụ: Guadalajara chỉ 0.53%).
Đặc điểm chính quan sát được là sự phân bổ cá nhân không đồng đều
giữa các thành phố. Hạng mục Tacoma và Los Angeles cùng với một số thành
phố lớn khác như Seattle, Portland, San Diego, Bellingham, và Bremerton
(khi tổng hợp) chiếm ưu thế đáng kể về số lượng và tỷ lệ. Có sự chênh
lệch rất lớn giữa các hạng mục: trong khi một số thành phố tập trung
đông đảo dân cư trong bộ dữ liệu, nhiều thành phố khác chỉ có rất ít đại
diện. Điều này cho thấy bộ dữ liệu có thể tập trung vào một số khu vực
đô thị lớn nhất định, với ít dữ liệu từ các khu vực nhỏ hơn.
Biến
StateorProvince
table(d1$StateorProvince)
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
s <- table(d1$StateorProvince)/sum(nrow(d1))
print(s)
##
## BC CA DF Guerrero Jalisco OR
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378
## Veracruz WA Yucatan Zacatecas
## 0.033003770 0.324845295 0.046518245 0.092254072
vậy trong bộ dữ liệu này có:
5.7543211% cá nhân sinh sống ở bang WA;
19.4395049% cá nhân sinh sống ở bang CA;
5.7969984% cá nhân sinh sống ở bang OR;
2.7242336% cá nhân sinh sống ở bang BC;
0.5334661% cá nhân sinh sống ở bang DF;
16.0893378% cá nhân sinh sống ở bang Guerrero;
3.300377% cá nhân sinh sống ở bang Jalisco;
32.4845295% cá nhân sinh sống ở bang Veracruz;
4.6518245% cá nhân sinh sống ở bang Yucatan;
9.2254072% cá nhân sinh sống ở bang Zâctecas.
pie(s,
labels = paste(names(s), round(s, 2), "%"),
main = "Biểu đồ tròn: Tỷ lệ StateorProvince")

Biến StateorProvince (Bang/Tỉnh) trong bộ dữ liệu phân loại các cá
nhân thành nhiều nhóm chính, ví dụ như “WA”, “CA”, “OR”, “BC”, “DF”,
“Guerrero”, “Jalisco”, “Veracruz”, “Yucatan” và “Zacatecas”.
Từ bảng tần số, WA có số lượng quan sát cao nhất với 4567 cá nhân,
tiếp theo là CA với 2733 cá nhân và OR với 2262 cá nhân. Ngược lại,
Jalisco là hạng mục có số lượng quan sát thấp nhất chỉ với 75 cá nhân.
Khi xem xét tỷ lệ, bảng tần suất cho thấy nhóm “WA” chiếm khoảng 32.48%
tổng số quan sát, “CA” chiếm 19.44%, và “OR” chiếm 16.09%. Biểu đồ tròn
“Tỷ lệ StateorProvince” cũng minh họa rõ ràng sự phân bố này, với 32.48%
cho “WA”, 19.44% cho “CA”, 16.09% cho “OR”, và các tỷ lệ rất nhỏ cho các
hạng mục khác, xác nhận sự nhất quán giữa các hình thức trình bày dữ
liệu.
Đặc điểm chính quan sát được là sự mất cân bằng rõ rệt giữa các
bang/tỉnh trong bộ dữ liệu. Hạng mục “WA” chiếm ưu thế vượt trội về số
lượng và tỷ lệ, theo sau là “CA” và “OR”. Có sự chênh lệch rất lớn giữa
các hạng mục, khi một vài bang/tỉnh (như WA, CA, OR) chiếm phần lớn đáng
kể dữ liệu, trong khi các bang/tỉnh khác (ví dụ Jalisco, Guerrero,
Veracruz) chỉ có sự đại diện rất nhỏ. Điều này có thể ảnh hưởng đến các
phân tích sau này, vì nó cho thấy dữ liệu có sự tập trung mạnh vào một
số khu vực nhất định, có khả năng gây ra sai lệch hoặc giảm độ tin cậy
của mô hình đối với các nhóm có ít dữ liệu.
Biến
Country
table(d1$Country)
##
## Canada Mexico USA
## 809 3688 9562
c <- table(d1$Country)/sum(nrow(d1))
print(c)
##
## Canada Mexico USA
## 0.05754321 0.26232307 0.68013372
vậy trong bộ dữ liệu này có:
5.7543211% cá nhân sinh sống ở Canada;
26.2323067% cá nhân sinh sống ở Mexico;
68.0133722% cá nhân sinh sống ở USA.
pie(c,
labels = paste(names(c), round(c, 2), "%"),
main = "Biểu đồ tròn: Tỷ lệ Country")

Từ bảng tần số, biến Country cho thấy có ba quốc gia chính trong bộ
dữ liệu là Canada, Mexico và USA. Trong đó, USA là quốc gia có số lượng
quan sát cao nhất với 9562 bản ghi, Mexico đứng thứ hai với 3688 bản
ghi, và Canada có số lượng thấp nhất với 809 bản ghi. Phân tích bảng tần
suất và biểu đồ tròn xác nhận sự phân bố này: USA chiếm tỷ lệ áp đảo với
0.68013372 (tức khoảng 68.01%), Mexico chiếm 0.26232307 (khoảng 26.23%),
và Canada chiếm 0.05754321 (khoảng 5.75%). USA rõ ràng là hạng mục chiếm
ưu thế vượt trội trong bộ dữ liệu. Có sự chênh lệch rất lớn giữa các
hạng mục, khi tỷ lệ của USA lớn hơn gấp đôi so với Mexico và lớn hơn
khoảng 10 lần so với Canada. Điều này cho thấy dữ liệu trong tập này chủ
yếu đến từ Hoa Kỳ, và các phân tích sau này có thể bị ảnh hưởng bởi sự
đại diện không đồng đều này, đặc biệt khi suy luận về các quốc gia có tỷ
lệ thấp hơn.
Biến
ProductFamily
table(d1$ProductFamily)
##
## Drink Food Non-Consumable
## 1250 10153 2656
v <- table(d1$ProductFamily)/sum(nrow(d1))
print(v)
##
## Drink Food Non-Consumable
## 0.08891102 0.72217085 0.18891813
vậy trong bộ dữ liệu này có:
8.8911018% sản phẩm thuộc nhóm Drink;
72.2170851% sản phẩm thuộc nhóm Food;
18.8918131% sản phẩm thuộc nhóm Non-Consumable.
pie(v,
labels = paste(names(v), round(v, 2), "%"),
main = "Biểu đồ tròn: Tỷ lệ ProductFamily ")

Biến ProductFamily (Nhóm sản phẩm) trong bộ dữ liệu phân loại các sản
phẩm thành ba nhóm chính là “Drink” (Đồ uống), “Food” (Thực phẩm), và
“Non-Consumable” (Không tiêu dùng).
Từ bảng tần số, có 10153 sản phẩm thuộc nhóm “Food”, 2656 sản phẩm
thuộc nhóm “Non-Consumable”, và 1250 sản phẩm thuộc nhóm “Drink”. Khi
xem xét tỷ lệ, bảng tần suất cho thấy nhóm “Food” chiếm tỷ lệ áp đảo với
0.72217085 (tức 72.22%) tổng số quan sát. Nhóm “Non-Consumable” đứng thứ
hai với 0.18891813 (tức 18.89%), và nhóm “Drink” chiếm tỷ lệ thấp nhất
với 0.08891102 (tức 8.89%). Biểu đồ tròn (dù nhãn là “Country” nhưng dữ
liệu phản ánh “ProductFamily”) cũng minh họa rõ ràng sự phân bố này, với
0.72% (hoặc 72%) cho “Food”, 0.19% (hoặc 19%) cho “Non-Consumable”, và
0.09% (hoặc 9%) cho “Drink”, xác nhận sự nhất quán giữa các hình thức
trình bày dữ liệu.
Đặc điểm chính quan sát được là sự mất cân bằng rất lớn giữa các nhóm
sản phẩm trong bộ dữ liệu. Hạng mục “Food” chiếm ưu thế vượt trội về số
lượng và tỷ lệ, đại diện cho gần ba phần tư tổng số sản phẩm. Có sự
chênh lệch đáng kể giữa các hạng mục, khi nhóm “Food” lớn hơn rất nhiều
so với “Non-Consumable” và “Drink”, vốn chỉ chiếm một phần nhỏ. Điều này
cho thấy hoạt động kinh doanh hoặc dữ liệu thu thập đang tập trung mạnh
vào các sản phẩm thuộc nhóm Thực phẩm, điều này có thể ảnh hưởng đến các
phân tích về xu hướng mua sắm, hiệu suất sản phẩm, hoặc chiến lược
marketing nếu không được xem xét kỹ lưỡng.
Biến
ProductCategory
table(d1$ProductCategory)
##
## Baking Goods Bathroom Products Beer and Wine
## 484 365 356
## Bread Breakfast Foods Candles
## 425 417 45
## Candy Canned Anchovies Canned Clams
## 352 44 53
## Canned Oysters Canned Sardines Canned Shrimp
## 35 40 38
## Canned Soup Canned Tuna Carbonated Beverages
## 404 87 154
## Cleaning Supplies Cold Remedies Dairy
## 189 93 903
## Decongestants Drinks Eggs
## 85 135 198
## Electrical Frozen Desserts Frozen Entrees
## 355 323 118
## Fruit Hardware Hot Beverages
## 765 129 226
## Hygiene Jams and Jellies Kitchen Products
## 197 588 217
## Magazines Meat Miscellaneous
## 202 761 42
## Packaged Vegetables Pain Relievers Paper Products
## 48 192 345
## Pizza Plastic Products Pure Juice Beverages
## 194 141 165
## Seafood Side Dishes Snack Foods
## 102 153 1600
## Specialty Starchy Foods Vegetables
## 289 277 1728
v1 <- table(d1$ProductCategory)/sum(nrow(d1))
print(v1)
##
## Baking Goods Bathroom Products Beer and Wine
## 0.034426346 0.025962017 0.025321858
## Bread Breakfast Foods Candles
## 0.030229746 0.029660716 0.003200797
## Candy Canned Anchovies Canned Clams
## 0.025037343 0.003129668 0.003769827
## Canned Oysters Canned Sardines Canned Shrimp
## 0.002489508 0.002845153 0.002702895
## Canned Soup Canned Tuna Carbonated Beverages
## 0.028736041 0.006188207 0.010953837
## Cleaning Supplies Cold Remedies Dairy
## 0.013443346 0.006614980 0.064229319
## Decongestants Drinks Eggs
## 0.006045949 0.009602390 0.014083505
## Electrical Frozen Desserts Frozen Entrees
## 0.025250729 0.022974607 0.008393200
## Fruit Hardware Hot Beverages
## 0.054413543 0.009175617 0.016075112
## Hygiene Jams and Jellies Kitchen Products
## 0.014012376 0.041823743 0.015434953
## Magazines Meat Miscellaneous
## 0.014368020 0.054129028 0.002987410
## Packaged Vegetables Pain Relievers Paper Products
## 0.003414183 0.013656732 0.024539441
## Pizza Plastic Products Pure Juice Beverages
## 0.013798990 0.010029163 0.011736254
## Seafood Side Dishes Snack Foods
## 0.007255139 0.010882709 0.113806103
## Specialty Starchy Foods Vegetables
## 0.020556227 0.019702682 0.122910591
table(d1$ProductCategory) %>% as.data.frame() ->o3
colnames(o3)<-c("value","count")
ggplot(o3, aes(x = value, y = count, fill = value)) +
geom_bar(stat = "identity")+ coord_flip() +
geom_text(aes(label = count), vjust = -0.3, size = 2.5) +
labs(title = "Biểu đồ ProductCategory ", x = "ProductCategory", y = "Số lượng") +
theme_minimal()+theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
legend.position = "none" # Ẩn chú thích màu nếu không cần
)

Từ bảng tần số, “Vegetables” và “Snack Foods” là hai hạng mục có số
lượng quan sát cao nhất lần lượt là 1728 và 1600 bản ghi. Theo sau là
“Dairy” với 903 bản ghi và “Fruit” với 765 bản ghi. Ngược lại, nhiều
hạng mục có số lượng quan sát rất thấp, ví dụ như “Miscellaneous” (42),
“Canned Anchovies” (44), “Candles” (45), “Packaged Vegetables” (48), và
“Canned Clams” (53). Khi xem xét tỷ lệ, bảng tần suất cho thấy
“Vegetables” chiếm tỷ lệ cao nhất với 0.122910591 (tức khoảng 12.29%)
tổng số quan sát, và “Snack Foods” chiếm 0.113806103 (tức khoảng
11.38%). Ngược lại, “Miscellaneous” chỉ chiếm 0.002987410 (khoảng 0.30%)
và “Canned Anchovies” là 0.003129668 (khoảng 0.31%). Biểu đồ cột “Biểu
đồ ProductCategory” minh họa rõ ràng sự phân bố này, với các cột
“Vegetables” và “Snack Foods” nổi bật với chiều cao vượt trội, trong khi
nhiều cột khác gần như không đáng kể, xác nhận sự nhất quán giữa các
hình thức trình bày dữ liệu.
Đặc điểm chính quan sát được là sự mất cân bằng rất lớn giữa các danh
mục sản phẩm trong bộ dữ liệu. Các hạng mục “Vegetables” và “Snack
Foods” chiếm ưu thế rõ rệt về số lượng và tỷ lệ. Có sự chênh lệch cực kỳ
lớn giữa các hạng mục, khi hai nhóm đứng đầu chiếm tỷ trọng đáng kể,
trong khi một lượng lớn các danh mục khác (như “Miscellaneous”, “Canned
Clams”, “Candles”) có số lượng và tỷ lệ rất nhỏ, thậm chí chỉ chiếm chưa
đến 1% tổng số. Điều này cho thấy dữ liệu mua sắm hoặc tồn kho đang tập
trung mạnh vào một số ít danh mục sản phẩm nhất định, điều này có thể
ảnh hưởng đến các phân tích thị trường, chiến lược sản phẩm hoặc dự báo
doanh số nếu không được xem xét kỹ lưỡng.
Biến
ProductDepartment
table(d1$ProductDepartment)
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 356 425 1072 680
## Breakfast Foods Canned Foods Canned Products Carousel
## 188 977 109 59
## Checkout Dairy Deli Eggs
## 82 903 699 198
## Frozen Foods Health and Hygiene Household Meat
## 1382 893 1420 89
## Periodicals Produce Seafood Snack Foods
## 202 1994 102 1600
## Snacks Starchy Foods
## 352 277
v2 <- table(d1$ProductDepartment)/sum(nrow(d1))
print(v2)
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 0.025321858 0.030229746 0.076250089 0.048367594
## Breakfast Foods Canned Foods Canned Products Carousel
## 0.013372217 0.069492852 0.007753041 0.004196600
## Checkout Dairy Deli Eggs
## 0.005832563 0.064229319 0.049719041 0.014083505
## Frozen Foods Health and Hygiene Household Meat
## 0.098300021 0.063518031 0.101002916 0.006330464
## Periodicals Produce Seafood Snack Foods
## 0.014368020 0.141830856 0.007255139 0.113806103
## Snacks Starchy Foods
## 0.025037343 0.019702682
table(d1$ProductDepartment) %>% as.data.frame() ->o4
colnames(o4)<-c("value","count")
ggplot(o4, aes(x = value, y = count, fill = value)) +
geom_bar(stat = "identity")+
geom_text(aes(label = count), vjust = -0.3, size = 2.5) +
labs(title = "Biểu đồ ProductDepartment ", x = "ProductDepartment", y = "Số lượng") + theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.x = element_blank(), # Ẩn nhãn dưới trục X nếu cần
legend.position = "bottom"
)

Phân bố của các loại sản phẩm không đồng đều. “Produce” (1994 mẫu,
chiếm khoảng 14.26%) và “Snack Foods” (1600 mẫu, chiếm khoảng 11.44%) là
hai loại sản phẩm có số lượng mẫu được phân tích nhiều nhất, cho thấy
đây là những ngành hàng chiếm tỷ trọng lớn trong dữ liệu. Ngược lại, các
ngành hàng như “Checkout” (82 mẫu, chiếm khoảng 0.59%), “Meat” (89 mẫu,
chiếm khoảng 0.63%) và “Canned Products” (109 mẫu, chiếm khoảng 0.78%)
có số lượng mẫu rất thấp, có thể là những ngành hàng ít phổ biến hơn
hoặc ít được quan tâm trong quá trình phân tích dữ liệu này.
Sự chênh lệch lớn giữa các ngành hàng cho thấy rằng doanh nghiệp hoặc
tổ chức đang tập trung vào một số lĩnh vực sản phẩm nhất định
(“Produce”, “Snack Foods”, “Household”, “Frozen Foods”) trong khi một số
ngành hàng khác đang bị bỏ ngỏ hoặc không được ưu tiên. Điều này có thể
ảnh hưởng đến hiệu quả kinh doanh tổng thể nếu không có sự phân bổ hợp
lý hoặc nếu các ngành hàng ít phổ biến có tiềm năng tăng trưởng nhưng
chưa được khai thác. Để hiểu rõ hơn về lý do của sự phân bố này, cần có
thêm thông tin về bối cảnh thu thập dữ liệu và mục tiêu phân tích.
Phần 3: Ước
lượng khoảng và Kiểm định Giá thuyết cho Tỷ lệ
- Các biến được lựa chọn bao gồm: Homeowner; Gender; Country.
Biến
Homeowner
1.Xác định hạng mục quan tâm: hạng mục N (không có
sở hữu nhà) của biến Homeowner.
2.Ước lượng khoảng tin cây:
Ước lượng khoảng tin cậy cho tỷ lệ của hạng mục N với khoảng tin cậy
95%.
# Đếm số lượng quan sát của hạng mục N
count_N <- sum(d1$Homeowner == "N")
print("Số lượng quan sát của hạng mục N:")
## [1] "Số lượng quan sát của hạng mục N:"
count_N
## [1] 5615
# Đếm số tổng quan sát.
total <- nrow(d1)
print("Số tổng quan sát:")
## [1] "Số tổng quan sát:"
total
## [1] 14059
# Tính khoảng tin cây
result <- prop.test(x = count_N, n = total, conf.level = 0.95)
# Hiển thị kết quả
print("Khoảng tin cậy:")
## [1] "Khoảng tin cậy:"
result
##
## 1-sample proportions test with continuity correction
##
## data: count_N out of total, null probability 0.5
## X-squared = 568.86, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3912855 0.4075463
## sample estimates:
## p
## 0.3993883
Diễn giải
* Tỷ lệ người không sở hữu nhà trong mẫu khảo sát là 39,94%.
* Khoảng tin cậy 95% cho tỷ lệ người không sở hữu nhà (‘N’) là từ 39,13%
đến 40,75%.
* Tức là: Chúng ta tự tin 95% rằng tỷ lệ thực sự của những người không
sở hữu nhà trong tổng thể nằm trong khoảng từ 39,13% đến 40,75%.
Giải thích
Ước lượng khoảng tin cậy cho tỷ lệ người không sở hữu nhà trên tổng số
quan sát với mức ý nghĩa 0,5.
X-squared = 568.86, df = 1: giá trị thống kê kiểm định (Chi- squared)
là 568,86 với 1 bậc tự do.
Giá trị p-value rất nhỏ và gần như bằng 0 (p-value < 2.2e-16). Cho
thấy bằng chứng rất mạnh để bác bỏ giả thuyết \(H_0\) (rằng tỷ lệ bằng 0.5).
alternative hypothesis: giả thuyết đối (tỷ lệ thực sự khác 0.5).
95 percent confidence interval: 0.3912855 0.4075463: khoảng tin cậy
95% cho tỷ lệ mẫu là từ 39.13% đến 40.75%.
sample estimate p = 0.3993883: Ước lượng tỷ lệ từ mẫu là 39.94%.
3.Kiểm định giả thuyết
Đặt giả thuyết:
Giả thuyết \(H_0\): Tỷ lệ thực sự của
người không sở hữu nhà trong tổng thể bằng 0.75 (\(H_0: p=0.75\).)
Giả thuyết \(H_1\): Tỷ lệ thực sự của
những người không sở hữu nhà trong tổng thể khác 0.75 (\(H_1:p\neq 0.75\))
Thực hiện kiểm định giả thuyết:
Với số lượng quan sát của hạng mục N: 5615;
Và tổng số quan sát: 14059.
# thực hiện prop.test với p=0.7 (tỷ lệ giả định dưới H0)
test_result <- prop.test(x = count_N, n = total, p=0.75, alternative="two.sided")
print("Kết quả kiểm định giả thuyết:")
## [1] "Kết quả kiểm định giả thuyết:"
test_result
##
## 1-sample proportions test with continuity correction
##
## data: count_N out of total, null probability 0.75
## X-squared = 9215.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.75
## 95 percent confidence interval:
## 0.3912855 0.4075463
## sample estimates:
## p
## 0.3993883
Báo cáo giá trị p và đưa ra kết luận ở mức ý nghĩa \(\alpha=0.05\):
Tỷ lệ mẫu p = 39,94%.
Giá trị p_value < 2.2e-16, một con số cực kỳ nhỏ (gần như bằng
0).
Với mức ý nghĩa \(\alpha\): chúng ta
chọn \(\alpha=0.05\).
So sánh p-value với \(\alpha:
p-value(<2.2e-16)<\alpha(0.05)\).
Kết luận: vì p-value nhỏ hơn mức ý nghĩa \(\alpha\), chúng ta bác bỏ giả thuyết \(H_0\).
Tỷ lệ mẫu 39,94% chênh lệch có ý nghĩa thống kê so với giả thuyết tỷ lệ
50%, cho thấy có bằng chứng để khẳng định rằng tỷ lệ thực sự trong tổng
thể không phải là 50%.
Kết luận:
Việc bác bỏ \(H_0:p=0.75\) có nghĩa là
chúng ta không có đủ bằng chứng thống kê để kết luận rằng tỷ lệ thực sự
của những người không sở hữu nhà trong tổng thể không bằng 70%.
Kết quả kiểm định này, cùng với ước lượng điểm từ mẫu (39.94%) và khoảng
tin cậy 95% (0.3912855 0.4075463), cho thấy tỷ lệ người không sở hữu nhà
trên thực tế có vẻ thấp hơn đáng kể so với con số 70% mà giả thuyết
không đã đặt ra. Điều này khẳng định rằng giả định ban đầu về tỷ lệ
người không sở hữu nhà là 70% là không phù hợp với dữ liệu quan sát
được.
Biến
Gender
1.Xác định hạng mục quan tâm: hạng mục Nữ của biến
Gender.
2.Ước lượng khoảng tin cây:
Ước lượng khoảng tin cậy cho tỷ lệ của hạng mục F (Nữ) với khoảng tin
cậy 95%.
# Đếm số lượng quan sát của hạng mục N
count_F <- sum(d1$Gender == "F")
print("Số lượng quan sát của hạng mục F:")
## [1] "Số lượng quan sát của hạng mục F:"
count_F
## [1] 7170
print("Số tổng quan sát:")
## [1] "Số tổng quan sát:"
total
## [1] 14059
# Tính khoảng tin cây
result1 <- prop.test(x = count_F, n = total, conf.level = 0.95)
# Hiển thị kết quả
print("Khoảng tin cậy:")
## [1] "Khoảng tin cậy:"
result1
##
## 1-sample proportions test with continuity correction
##
## data: count_F out of total, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.5016931 0.5182886
## sample estimates:
## p
## 0.5099936
Diễn giải
* Tỷ lệ nữ trong mẫu khảo sát là 51%.
* Khoảng tin cậy 95% cho tỷ lệ người không sở hữu nhà (‘N’) là từ 50.17%
đến 51.83%.
* Tức là: Chúng ta tự tin 95% rằng tỷ lệ thực sự số người có giới tính
nữ trong tổng thể nằm trong khoảng từ 50.17% đến 51.83%.
3.Kiểm định giả thuyết
Đặt giả thuyết:
Giả thuyết \(H_0\): Tỷ lệ thực sự của
người có giới tính nữ trong tổng thể bằng 0.3 (\(H_0: p=0.3\).)
Giả thuyết \(H_1\): Tỷ lệ thực sự của
người có giới tính nữ trong tổng thể khác 0.3 (\(H_1:p\neq 0.3\))
Thực hiện kiểm định giả thuyết:
Với số lượng quan sát của hạng mục F: 7170;
Và tổng số quan sát: 14059.
# thực hiện prop.test với p=0.3 (tỷ lệ giả định dưới H0)
test_result1 <- prop.test(x = count_F, n = total, p=0.3, alternative="two.sided")
print("Kết quả kiểm định giả thuyết:")
## [1] "Kết quả kiểm định giả thuyết:"
test_result1
##
## 1-sample proportions test with continuity correction
##
## data: count_F out of total, null probability 0.3
## X-squared = 2951.2, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.3
## 95 percent confidence interval:
## 0.5016931 0.5182886
## sample estimates:
## p
## 0.5099936
Báo cáo giá trị p và đưa ra kết luận ở mức ý nghĩa \(\alpha=0.05\):
Tỷ lệ mẫu p = 51%.
Giá trị p_value < 2.2e-16, một con số cực kỳ nhỏ (gần như bằng
0).
Với mức ý nghĩa \(\alpha\): chúng ta
chọn \(\alpha=0.05\).
So sánh p-value với \(\alpha:
p-value(<2.2e-16)<\alpha(0.05)\).
Kết luận: vì p-value nhỏ hơn mức ý nghĩa \(\alpha\), chúng ta bác bỏ giả thuyết \(H_0\).
Kết luận:
có đủ bằng chứng thống kê để kết luận rằng tỷ lệ thực sự của người có
giới tính nữ trong tổng thể là khác 0.3.
Nói cách khác, dữ liệu mẫu của chúng ta cho thấy tỷ lệ nữ trong tổng thể
không phải là 30%. Trên thực tế, tỷ lệ ước tính trong mẫu là 0.5099936
(khoảng 51%), và khoảng tin cậy 95% cho tỷ lệ thực sự là từ 0.5016931
đến 0.5182886, không chứa giá trị 0.3.
Biến
Country
1.Xác định hạng mục quan tâm: hạng mục Mexico của
biến Country.
2.Ước lượng khoảng tin cây:
Ước lượng khoảng tin cậy cho tỷ lệ của hạng mục Mexico với khoảng tin
cậy 95%.
# Đếm số lượng quan sát của hạng mục N
count_M <- sum(d1$Country == "Mexico")
print("Số lượng quan sát của hạng mục Mexico:")
## [1] "Số lượng quan sát của hạng mục Mexico:"
count_M
## [1] 3688
print("Số tổng quan sát:")
## [1] "Số tổng quan sát:"
total
## [1] 14059
# Tính khoảng tin cây
result2 <- prop.test(x = count_M, n = total, conf.level = 0.95)
# Hiển thị kết quả
print("Khoảng tin cậy:")
## [1] "Khoảng tin cậy:"
result2
##
## 1-sample proportions test with continuity correction
##
## data: count_M out of total, null probability 0.5
## X-squared = 3175.8, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.2550820 0.2696946
## sample estimates:
## p
## 0.2623231
Diễn giải
* Uớc lượng tỷ lệ người ở Mexico trong mẫu khảo sát là 26,23%.
* Khoảng tin cậy 95% cho tỷ lệ thực sự của hạng mục Mexico trong tổng
thể là từ 50.17% đến 51.83%.
* Tức là: Chúng ta tự tin 95% rằng tỷ lệ thực sự của hạng mục Mexico
trong tổng thể nằm trong khoảng từ 25.51% đến 26.97%.
3.Kiểm định giả thuyết
Đặt giả thuyết:
Giả thuyết \(H_0\): Tỷ lệ thực sự của
người có giới tính nữ trong tổng thể bằng 0.8 (\(H_0: p=8\).)
Giả thuyết \(H_1\): Tỷ lệ thực sự của
người có giới tính nữ trong tổng thể khác 0.8 (\(H_1:p\neq 0.8\))
Thực hiện kiểm định giả thuyết:
Với số lượng quan sát của hạng mục Mexico: 3688;
Và tổng số quan sát: 14059.
# thực hiện prop.test với p=0.3 (tỷ lệ giả định dưới H0)
test_result2 <- prop.test(x = count_M, n = total, p=0.8, alternative="two.sided")
print("Kết quả kiểm định giả thuyết:")
## [1] "Kết quả kiểm định giả thuyết:"
test_result2
##
## 1-sample proportions test with continuity correction
##
## data: count_M out of total, null probability 0.8
## X-squared = 25399, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.8
## 95 percent confidence interval:
## 0.2550820 0.2696946
## sample estimates:
## p
## 0.2623231
Báo cáo giá trị p và đưa ra kết luận ở mức ý nghĩa \(\alpha=0.05\):
Tỷ lệ mẫu p = 26.23%.
Giá trị p_value < 2.2e-16, một con số cực kỳ nhỏ (gần như bằng
0).
Với mức ý nghĩa \(\alpha\): chúng ta
chọn \(\alpha=0.05\).
So sánh p-value với \(\alpha:
p-value(<2.2e-16)<\alpha(0.05)\).
Kết luận: vì p-value nhỏ hơn mức ý nghĩa \(\alpha\), chúng ta bác bỏ giả thuyết \(H_0\).
Kết luận:
Kết luận bác bỏ giả thuyết SH_0$ có nghĩa là có đủ bằng chứng thống kê
để kết luận rằng tỷ lệ thực sự của người có giới tính nữ trong tổng thể
KHÔNG phải là 0.8
Hơn nữa, dựa trên ước tính mẫu, tỷ lệ người có giới tính nữ trong mẫu
là khoảng 0.262 (hoặc 26.2%), và khoảng tin cậy 95% cho tỷ lệ thực sự
trong tổng thể là từ 0.255 đến 0.269. Giá trị 0.8 hoàn toàn nằm ngoài
khoảng tin cậy này, củng cố thêm kết luận bác bỏ giả thuyết
null.
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAyIg0KYXV0aG9yOiAicG5taW5oY2hhdSINCmRhdGU6ICIyMDI1LTA1LTI1Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW06ICJkZWZhdWx0Ig0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHtyLGVjaG89VFJVRX0NCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzdGF0cykNCmxpYnJhcnkocHN5Y2gpDQpgYGANCg0KIyAqKlBo4bqnbiAxOiBUw6xtIGhp4buDdSB2w6AgY2h14bqpbiBi4buLIGThu68gbGnhu4d1KiogICANCg0KIyMgKirEkOG7jWMgZOG7ryBsaeG7h3UqKiAgIA0KDQogQuG7mSBk4buvIGxp4buHdSBnaWFvIGThu4tjaCBzacOqdSB0aOG7iyBn4buTbSAxNDA1OSBxdWFuIHPDoXQgdsOgIDEwICBiaeG6v24gxJHhu4tuaCB0w61uaCwgY3VuZyBj4bqlcCB0aMO0bmcgdGluIGNoaSB0aeG6v3QgduG7gSBnaWFvIGThu4tjaCAobmfDoHkgbXVhLCBz4bqjbiBwaOG6qW0pIHbDoCBuaMOibiBraOG6qXUgaOG7jWMga2jDoWNoIGjDoG5nIChnaeG7m2kgdMOtbmgsIHRodSBuaOG6rXAsIMSR4buLYSBsw70pLiDEkMOieSBsw6Agbmd14buTbiBk4buvIGxp4buHdSBs4bubbiwgxJFhIGThuqFuZyBjaG8gcGjDom4gdMOtY2ggaMOgbmggdmkga2jDoWNoIGjDoG5nIHbDoCBz4bqjbiBwaOG6qW0uICAgDQogDQpgYGB7cixlY2hvPVRSVUV9DQpkIDwtIHJlYWQuY3N2KCdGOi9SL2RhdGExL1N1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YnLGhlYWRlcj1UKQ0KDQojIEzhu41jIGThu68gbGnhu4d1IChjaOG7iSBnaeG7ryBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oKQ0KZDEgPC0gc3Vic2V0KGQsIHNlbGVjdD0tYyhVbml0c1NvbGQsUmV2ZW51ZSxDaGlsZHJlbixDdXN0b21lcklEKSkNCg0KIyBIaeG7g24gdGjhu4sgY+G6pXUgdHLDumMgZOG7ryBsaeG7h3UNCnN0cihkMSkNCmBgYA0KDQogUXVhIHZp4buHYyB4ZW0geMOpdCBraeG7g3UgZOG7ryBsaeG7h3UgY+G7p2EgdOG7q25nIGJp4bq/biwgY8OzIHRo4buDIHRo4bqleSBy4bqxbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPhuqduIG3hu5l0IGLGsOG7m2MgdGnhu4FuIHjhu60gbMO9IMSRw6FuZyBr4buDIMSR4buDIGPDoWMgYmnhur9uIMSRxrDhu6NjIGfDoW4ga2nhu4N1IGThu68gbGnhu4d1IHBow7kgaOG7o3AgduG7m2kgbuG7mWkgZHVuZyB2w6AgbeG7pWMgxJHDrWNoIHBow6JuIHTDrWNoLiAgIA0KDQogQ+G7pSB0aOG7gywgY8OhYyBiaeG6v24gWCB2w6AgQ3VzdG9tZXJJRCBoaeG7h24gxJFhbmcg4bufIGtp4buDdSBpbnRlZ2VyIChz4buRIG5ndXnDqm4pIHbDoCDEkcOieSBsw6Aga2nhu4N1IGThu68gbGnhu4d1IHBow7kgaOG7o3AgY2hvIGPDoWMgYmnhur9uIGNo4buJIG3hu6VjIGhv4bq3YyDEkeG7i25oIGRhbmguICAgDQoNCiBUdXkgbmhpw6puLCBwaOG6p24gbOG7m24gY8OhYyBiaeG6v24gY8OybiBs4bqhaSDEkWFuZyDhu58ga2nhu4N1IGNoYXJhY3RlciAoY2h14buXaSBrw70gdOG7sSkgbmjGsG5nIGzhuqFpIMSR4bqhaSBkaeG7h24gY2hvIHRow7RuZyB0aW4gxJHhu4tuaCB0w61uaCBob+G6t2MgbmfDoHkgdGjDoW5nLCBj4bqnbiDEkcaw4bujYyBjaHV54buDbiDEkeG7lWkgc2FuZyBjw6FjIGtp4buDdSBwaMO5IGjhu6NwIGjGoW4uICAgDQogDQoqKioNCg0KKiAqKlF1YW4gc8OhdCBk4buvIGxp4buHdSoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCiMgSGnhu4NuIHRo4buLIDEwIGTDsm5nIMSR4bqndSBk4buvIGxp4buHdQ0KcHJpbnQoIjEwIGTDsm5nIMSR4bqndSBj4bunYSBi4buZIGThu68gbGnhu4d1IikNCnogPC0gaGVhZChkMSwxMCkNCmRhdGF0YWJsZSh6KQ0KDQojIEhp4buDbiB0aOG7iyAxMCBkw7JuZyBjdeG7kWkgZOG7ryBsaeG7h3UNCnByaW50KCIxMCBkw7JuZyBjdeG7kWkgY+G7p2EgYuG7mSBk4buvIGxp4buHdSIpDQp6MSA8LSB0YWlsKGQxLDEwKQ0KZGF0YXRhYmxlKHoxKQ0KYGBgDQoqKioNCg0KKiAqKktp4buDbSB0cmEgdsOgIHjhu60gbMO9IGThu68gbGnhu4d1IHRoaeG6v3UqKiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQojIEtp4buDbSB0cmEgYuG7mSBk4buvIGxp4buHdSBjw7MgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkgaGF5IGtow7RuZy4NCnByaW50KCJLaeG7g20gdHJhIGLhu5kgZOG7ryBsaeG7h3UgY8OzIGPDoWMgZ2nDoSB0cuG7iyB0aGnhur91IGhheSBraMO0bmc6IikNCnoyIDwtIGlzLm5hKGQxKQ0KZGF0YXRhYmxlKHoyKQ0KIyDEkOG6v20gdOG7lW5nIHPhu5EgbMaw4bujbmcgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkNCnByaW50KCJU4buVbmcgc+G7kSBsxrDhu6NuZyBjw6FjIGdpw6EgdHLhu4sgdGhp4bq/dToiKQ0Kc3VtKGlzLm5hKGQxKSkNCg0KIyBUw6xtIHJhIGPDoWMgduG7iyB0csOtIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkNCnByaW50KCJW4buLIHRy4buLIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0aGnhur91OiIpDQp3aGljaChpcy5uYShkMSkpDQoNCmBgYA0KIEvhur90IHF14bqjIGNobyB0aOG6pXkgcuG6sW5nIGLhu5kgZOG7ryBsaeG7h3Uga2jDtG5nIGNo4bupYSBi4bqldCBr4buzIGdpw6EgdHLhu4sgdGhp4bq/dSAoTkEpIG7DoG8uICAgDQoNCg0KKiAqKkNodXnhu4NuIMSR4buVaSBjw6FjIGJp4bq/biBj4bqnbiB0aGnhur90IHNhbmcga2nhu4N1IGZhY3RvcioqICAgDQoNCiDhu54gcGjhuqduIMSR4buNYyBk4buvIGxp4buHdSwga2hpIHRo4buxYyBoaeG7h24gaMOgbSBzdHIoKSBr4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgY2hvIHRhIHRo4bqleSBo4bqndSBo4bq/dCBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIMSRYW5nIOG7nyBraeG7g3UgZOG7ryBsaeG7h3UgY2hhcmFjdGVyIChjaHXhu5dpIGvDvSB04buxKSBuaMawbmcgbOG6oWkgxJHhuqFpIGRp4buHbiBjaG8gdGjDtG5nIHRpbiDEkeG7i25oIHTDrW5oLCBjaG8gdGjhuqV5IMSRxrDhu6NjIGPDoWMgYmnhur9uIGPhuqduIMSRxrDhu6NjIGNodXnhu4NuIMSR4buVaSBzYW5nIGtp4buDdSBk4buvIGxp4buHdSBwaMO5IGjhu6NwIGjGoW4gbmjGsCBmYWN0b3IuICAgDQogDQpgYGB7cixlY2hvPVRSVUV9DQojIEzGsHUgZGFuaCBzw6FjaCBjw6FjIGJp4bq/biBj4bqnbiBjaHV54buDbiDEkeG7lWkgdsOgbyBt4buZdCB2ZWN0b3IgcmnDqm5nDQp6MyA8LSBjKCJHZW5kZXIiLCAiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCJBbm51YWxJbmNvbWUiLCAiQ2l0eSIsICJTdGF0ZW9yUHJvdmluY2UiLCAiQ291bnRyeSIsICJQcm9kdWN0RmFtaWx5IiwgIlByb2R1Y3REZXBhcnRtZW50IiwgIlByb2R1Y3RDYXRlZ29yeSIpDQoNCiMgQ2h1eeG7g24gxJHhu5VpIGtp4buDdSBk4buvIGxp4buHdQ0KZDEgPC0gZDEgJT4lIG11dGF0ZShhY3Jvc3MoYWxsX29mKHozKSwgYXMuZmFjdG9yKSkNCiAjIHRvw6FuIHThu60gJT4lIDogdHJ1eeG7gW4gZDEgdsOgbyBow6BtIG11dGF0ZQ0KICMgbXV0YXRlKCk6IHRoYXkgxJHhu5VpIGJp4bq/biBoaeG7h24gY8OzIGLhurFuZyBjw6FjaCDDoXAgZOG7pW5nIG3hu5l0IGjDoG0gdsOgIGvhur90IHF14bqjIMSRw6ggbMOqbiBjaMOtbmggY+G7mXQgxJHDsy4NCiAjIGFjcm9zcygpOiBkw7luZyDEkeG7gyDDoXAgZOG7pW5nIGjDoG0gYXMuZmFjdG9yIGNobyBuaGnhu4F1IGPhu5l0Lg0KICNhbGxfb2YoKTogY2jhu4kgxJHhu4tuaCBjw6FjIGPhu5l0IGLhurFuZyB0w6puIMSRxrDhu6NjIGzGsHUgdHLhu68gdHJvbmcgdmVjdG9yLg0KDQojIEhp4buDbiB0aOG7iyBj4bqldSB0csO6YyBk4buvIGxp4buHdQ0KcHJpbnQoIkPhuqV1IHRyw7pjIGThu68gbGnhu4d1OiIpDQpzdHIoZDEpDQpgYGANCg0KIFNhdSBraGkgY2h1eeG7g24gxJHhu5VpIHThu6sgY2hhcmFjdGVyIHNhbmcgZmFjdG9yLCBj4bqldSB0csO6YyBk4buvIGxp4buHdSDEkcOjIMSRxrDhu6NjIGPhuqNpIHRoaeG7h24gxJHDoW5nIGvhu4MuIEjhuqd1IGjhur90IGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggxJHDoyDEkcO6bmcga2nhu4N1LCB04buRaSDGsHUgYuG7mSBuaOG7myB2w6Agc+G6tW4gc8OgbmcgY2hvIHBow6JuIHTDrWNoLiAgIA0KIA0KIyAqKlBo4bqnbiAyOiBQaMOibiB0w61jaCBNw7QgdOG6oyBN4buZdCBiaeG6v24gxJDhu4tuaCB0w61uaCAoVW5pdmFydWF0ZSBEZXNjcmlwdGl2ZSBBbmFseXNpcykqKiAgIA0KDQojIyAqKkJp4bq/biBIb21lb3duZXIqKiAgIA0KDQoqIELhuqNuZyB04bqnbiBz4buROiAgICANCmBgYHtyLGVjaG89VFJVRX0NCnRhYmxlKGQxJEhvbWVvd25lcikNCmBgYA0KDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpmIDwtIHRhYmxlKGQxJEhvbWVvd25lcikvc3VtKG5yb3coZDEpKQ0KcHJpbnQoZikNCmBgYA0KVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyBgciB0YWJsZShkMSRIb21lb3duZXIpWzFdL3N1bShucm93KGQxKSkqMTAwYFwlIGtow7RuZyBz4bufIGjhu691IG5ow6AgdsOgICBgciB0YWJsZShkMSRIb21lb3duZXIpIFsyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw7Mgc+G7nyBo4buvdSBuaMOgLiAgIA0KDQoqIEJp4buDdSDEkeG7kzogICANCmBgYHtyLGVjaG89VFJVRX0NCnBpZShmLA0KICAgIGxhYmVscyA9IHBhc3RlKG5hbWVzKGYpLCByb3VuZChmLCAyKSwgIiUiKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIEhvbWVvd25lIikgDQoNCiMgKiBwaWUoKTogaMOgbSB24bq9IGJp4buDdSDEkeG7kyB0csOybiB0aOG7gyBoaeG7h24gdOG7tyBs4buHIGPhu6dhIGPDoWMgdGjDoG5oIHBo4bqnbiBzbyB24bubaSB04buVbmcgdGjhu4MgIA0KIyBmOiB2ZWN0b3IgbXXhu5FuIHRo4buDIGhp4buHbiBkxrDhu5tpIGThuqFuZyBiaeG7g3UgxJHhu5MuICAgDQojIGxhYmVsczogY2jhu4kgxJHhu4tuaCBjw6FjIG5ow6NuIMSRxrDhu6NjIGhp4buDbiB0aOG7iy4gICANCiMgcGFzdGUgKCk6IGjDoG0gZ2jDqXAgY8OhYyBjaHXhu5dpIGvDvSB04buxIGzhuqFpIHbhu5tpIG5oYXUuICAgDQojIG5hbWVzKGYpOiB0cuG6oyB24buBIHTDqm4gY+G7p2EgY8OhYyB0aMOgbmggcGjhuqduIHRyb25nIGYuICAgDQojIHJvdW5kKGYpOiBsw6BtIHRyw7JuIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyB2ZWN0b3IgZiDEkeG6v24gbeG7mXQgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4gbmjhuqV0IMSR4buLbmguIHJvdW5kKGYsMik6IGzDoG0gdHLDsm4gY8OhYyB04bu3IGzhu4cgdHJvbmcgZiDEkeG6v24gMiBjaOG7ryBz4buRIHRo4bqtcCBwaMOibi4gICANCiMgbWFpbjogdMOqbiBj4bunYSBiaeG7g3UgxJHhu5MuDQpgYGANCiBE4buxYSB0csOqbiBwaMOibiB0w61jaCBiaeG6v24gIkhvbWVvd25lciIsIGNow7puZyB0YSBjw7MgdGjhu4MgcsO6dCByYSBt4buZdCBz4buRIG5o4bqtbiB4w6l0IHF1YW4gdHLhu41uZyB24buBIMSR4bq3YyDEkWnhu4NtIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UuIEJp4bq/biBuw6B5IHBow6JuIGxv4bqhaSBjw6FjIGPDoSBuaMOibiBk4buxYSB0csOqbiB0w6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCwgduG7m2kgaGFpIG5ow7NtIGNow61uaCBsw6AgIk4iIChraMO0bmcgc+G7nyBo4buvdSBuaMOgKSB2w6AgIlkiIChjw7Mgc+G7nyBo4buvdSBuaMOgKS4gICANCg0KIFF1YW4gc8OhdCB04burIGLhuqNuZyB04bqnbiBz4buRLCBjw7MgNTYxNSBjw6EgbmjDom4gdGh14buZYyBuaMOzbSAiTiIgdsOgIDg0NDQgY8OhIG5ow6JuIHRodeG7mWMgbmjDs20gIlkiLiBLaGkgY2h1eeG7g24gc2FuZyB04bu3IGzhu4csIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIHRo4bqleSBuaMOzbSAiTiIgY2hp4bq/bSBraG/huqNuZyAzOS45NCUgdOG7lW5nIHPhu5EgcXVhbiBzw6F0LCB0cm9uZyBraGkgbmjDs20gIlkiIGNoaeG6v20gcGjhuqduIGzhu5tuIGjGoW4gduG7m2kga2hv4bqjbmcgNjAuMDYlLiBCaeG7g3UgxJHhu5MgdHLDsm4gIlThu7cgbOG7hyBIb21lb3duZSIgY8WpbmcgbWluaCBo4buNYSByw7UgcsOgbmcgdOG7tyBs4buHIG7DoHkgduG7m2kgMC40JSAoaG/hurdjIDQwJSkgY2hvICJOIiB2w6AgMC42JSAoaG/hurdjIDYwJSkgY2hvICJZIiwgeMOhYyBuaOG6rW4gc+G7sSBwaMOibiBi4buVIGThu68gbGnhu4d1LiAgIA0KDQogUsO1IHLDoG5nLCBo4bqhbmcgbeG7pWMgIlkiIChjw7Mgc+G7nyBo4buvdSBuaMOgKSBjaGnhur9tIMawdSB0aOG6vyDEkcOhbmcga+G7gyB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkuIEPDsyBt4buZdCBz4buxIGNow6puaCBs4buHY2ggbOG7m24gZ2nhu69hIGhhaSBo4bqhbmcgbeG7pWMsIGtoaSBz4buRIGzGsOG7o25nIHbDoCB04bu3IGzhu4cgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuIHLDtSBy4buHdCBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgcGjhuqduIGzhu5tuIGPDoWMgY8OhIG5ow6JuIMSRxrDhu6NjIGdoaSBuaOG6rW4gdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGzDoCBuaOG7r25nIG5nxrDhu51pIMSRw6MgY8OzIHTDoGkgc+G6o24gbmjDoCDhu58uICAgDQogDQoqKiogICANCg0KIyMgKipCaeG6v24gR2VuZGVyKiogDQoNCiogQuG6o25nIHThuqduIHPhu5E6ICAgIA0KYGBge3IsZWNobz1UUlVFfQ0KdGFibGUoZDEkR2VuZGVyKQ0KYGBgDQoNCiogQuG6o25nIHThuqduIHN14bqldDogICANCmBgYHtyLGVjaG89VFJVRX0NCmEgPC0gdGFibGUoZDEkR2VuZGVyKS9zdW0obnJvdyhkMSkpDQpwcmludChhKQ0KYGBgDQoNCiBW4bqteSB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIGByIHRhYmxlKGQxJEdlbmRlcilbMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgbuG7ryB2w6AgIGByIHRhYmxlKGQxJEdlbmRlcikgWzJdL3N1bShucm93KGQxKSkqMTAwYFwlIG5hbS4gIA0KDQoqIEJp4buDdSDEkeG7kzogICANCmBgYHtyLGVjaG89VFJVRX0NCnBpZShhLA0KICAgIGxhYmVscyA9IHBhc3RlKG5hbWVzKGEpLCByb3VuZChhLCAyKSwgIiUiKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIEdlbmRlciIpIA0KYGBgDQoNCiBE4buxYSB0csOqbiBwaMOibiB0w61jaCBiaeG6v24gIkdlbmRlciIsIGNow7puZyB0YSBjw7MgdGjhu4Mgbmjhuq1uIHjDqXQgduG7gSBwaMOibiBi4buVIGdp4bubaSB0w61uaCB0cm9uZyBi4buZIGThu68gbGnhu4d1LiBCaeG6v24gbsOgeSBwaMOibiBsb+G6oWkgY8OhYyBjw6EgbmjDom4gdGjDoG5oIGhhaSBuaMOzbSBjaMOtbmggbMOgICJGIiAoTuG7rykgdsOgICJNIiAoTmFtKS4gICANCg0KIFThu6sgYuG6o25nIHThuqduIHPhu5EsIGPDsyA3MTcwIGPDoSBuaMOibiBsw6AgbuG7ryB2w6AgNjg4OSBjw6EgbmjDom4gbMOgIG5hbS4gS2hpIGNodXnhu4NuIHNhbmcgdOG7tyBs4buHLCBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyB0aOG6pXkgbuG7ryBnaeG7m2kgKEYpIGNoaeG6v20ga2hv4bqjbmcgNTEuMDAlIHThu5VuZyBz4buRIHF1YW4gc8OhdCwgdHJvbmcga2hpIG5hbSBnaeG7m2kgKE0pIGNoaeG6v20ga2hv4bqjbmcgNDkuMDAlLiBCaeG7g3UgxJHhu5MgdHLDsm4gIlThu7cgbOG7hyBHZW5kZXIiIGPFqW5nIG1pbmggaOG7jWEgcsO1IHLDoG5nIHThu7cgbOG7hyBuw6B5IHbhu5tpIDAuNTElIChob+G6t2MgNTElKSBjaG8gbuG7ryB2w6AgMC40OSUgKGhv4bq3YyA0OSUpIGNobyBuYW0sIHRo4buDIGhp4buHbiBz4buxIG5o4bqldCBxdcOhbiBnaeG7r2EgY8OhYyBow6xuaCB0aOG7qWMgdHLDrG5oIGLDoHkgZOG7ryBsaeG7h3UuICAgDQoNCiBOaMOsbiBjaHVuZywgxJHhurdjIMSRaeG7g20gY2jDrW5oIGLhuqFuIHF1YW4gc8OhdCDEkcaw4bujYyBsw6Agc+G7sSBwaMOibiBi4buVIGdp4bubaSB0w61uaCB0xrDGoW5nIMSR4buRaSBjw6JuIGLhurFuZyB0cm9uZyBi4buZIGThu68gbGnhu4d1LiBN4bq3YyBkw7kgaOG6oW5nIG3hu6VjICJGIiAoTuG7rykgY8OzIG3hu5l0IGNow7p0IMawdSB0aOG6vyB24buBIHPhu5EgbMaw4bujbmcgdsOgIHThu7cgbOG7hyBzbyB24bubaSBo4bqhbmcgbeG7pWMgIk0iIChOYW0pLCBuaMawbmcgc+G7sSBjaMOqbmggbOG7h2NoIG7DoHkga2jDtG5nIMSRw6FuZyBr4buDLiBU4bu3IGzhu4cgZ2nhu69hIG7hu68gdsOgIG5hbSBn4bqnbiBuaMawIDE6MSwgY2hvIHRo4bqleSBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIHPhu7EgxJHhuqFpIGRp4buHbiBraMOhIMSR4buTbmcgxJHhu4F1IGPhu6dhIGPhuqMgaGFpIGdp4bubaSB0w61uaC4gxJBp4buBdSBuw6B5IHLhuqV0IHRodeG6rW4gbOG7o2kgY2hvIGPDoWMgcGjDom4gdMOtY2ggdGnhur9wIHRoZW8sIMSR4bqjbSBi4bqjbyBy4bqxbmcga2jDtG5nIGPDsyBz4buxIG3huqV0IGPDom4gYuG6sW5nIMSRw6FuZyBr4buDIHbhu4EgZ2nhu5tpIHTDrW5oIGPDsyB0aOG7gyBsw6BtIHNhaSBs4buHY2gga+G6v3QgcXXhuqMuICAgDQogDQoqKioNCg0KIyMgKipCaeG6v24gTWFyaXRhbFN0YXR1cyoqICAgDQoNCiogQuG6o25nIHThuqduIHPhu5E6ICAgIA0KYGBge3IsZWNobz1UUlVFfQ0KdGFibGUoZDEkTWFyaXRhbFN0YXR1cykNCmBgYA0KDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpiIDwtIHRhYmxlKGQxJE1hcml0YWxTdGF0dXMpL3N1bShucm93KGQxKSkNCnByaW50KGIpDQpgYGANCiBW4bqteSB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIGByIHRhYmxlKGQxJE1hcml0YWxTdGF0dXMpWzFdL3N1bShucm93KGQxKSkqMTAwYFwlIMSRw6Mga+G6v3QgaMO0biB2w6AgIGByIHRhYmxlKGQxJE1hcml0YWxTdGF0dXMpIFsyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSDEkeG7mWMgdGjDom4uICANCg0KKiBCaeG7g3UgxJHhu5M6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpwaWUoYiwNCiAgICBsYWJlbHMgPSBwYXN0ZShuYW1lcyhiKSwgcm91bmQoYiwgMiksICIlIiksDQogICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdHLDsm46IFThu7cgbOG7hyBNYXJpdGFsU3RhdHVzIikgDQpgYGANCg0KIEJp4bq/biAiTWFyaXRhbFN0YXR1cyIgKFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibikgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBwaMOibiBsb+G6oWkgY8OhYyBjw6EgbmjDom4gdGjDoG5oIGhhaSBuaMOzbSBjaMOtbmggbMOgICJNIiAoxJDDoyBr4bq/dCBow7RuKSB2w6AgIlMiICjEkOG7mWMgdGjDom4pLiAgIA0KDQogVOG7qyBi4bqjbmcgdOG6p24gc+G7kSwgY8OzIDY4NjYgY8OhIG5ow6JuIMSRw6Mga+G6v3QgaMO0biAoTSkgdsOgIDcxOTMgY8OhIG5ow6JuIMSR4buZYyB0aMOibiAoUykuIEtoaSB4ZW0geMOpdCB04bu3IGzhu4csIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIHRo4bqleSBuaMOzbSAiTSIgY2hp4bq/bSBraG/huqNuZyA0OC44MyUgdOG7lW5nIHPhu5EgcXVhbiBzw6F0LCB0cm9uZyBraGkgbmjDs20gIlMiIGNoaeG6v20gdOG7tyBs4buHIGzhu5tuIGjGoW4gbeG7mXQgY2jDunQgduG7m2kga2hv4bqjbmcgNTEuMTclLiBCaeG7g3UgxJHhu5MgdHLDsm4gIlThu7cgbOG7hyBNYXJpdGFsU3RhdHVzIiBjxaluZyBtaW5oIGjhu41hIHLDtSByw6BuZyBz4buxIHBow6JuIGLhu5UgbsOgeSwgduG7m2kgMC40OSUgKGhv4bq3YyA0OSUpIGNobyAiTSIgdsOgIDAuNTElIChob+G6t2MgNTElKSBjaG8gIlMiLCB4w6FjIG5o4bqtbiBz4buxIG5o4bqldCBxdcOhbiBnaeG7r2EgY8OhYyBow6xuaCB0aOG7qWMgdHLDrG5oIGLDoHkgZOG7ryBsaeG7h3UuICAgDQoNCiDEkOG6t2MgxJFp4buDbSBjaMOtbmggcXVhbiBzw6F0IMSRxrDhu6NjIGzDoCBz4buxIGPDom4gYuG6sW5nIHTGsMahbmcgxJHhu5FpIGdp4buvYSBoYWkgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuIE3hurdjIGTDuSBo4bqhbmcgbeG7pWMgIlMiICjEkOG7mWMgdGjDom4pIGPDsyBt4buZdCBjaMO6dCDGsHUgdGjhur8gduG7gSBz4buRIGzGsOG7o25nIHbDoCB04bu3IGzhu4cgc28gduG7m2kgaOG6oW5nIG3hu6VjICJNIiAoxJDDoyBr4bq/dCBow7RuKSwgbmjGsG5nIHPhu7EgY2jDqm5oIGzhu4djaCBuw6B5IGtow7RuZyDEkcOhbmcga+G7gy4gVOG7tyBs4buHIGdp4buvYSBuZ8aw4budaSDEkeG7mWMgdGjDom4gdsOgIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBn4bqnbiBuaMawIDE6MSwgY2hvIHRo4bqleSBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIHPhu7EgxJHhuqFpIGRp4buHbiBraMOhIMSR4buTbmcgxJHhu4F1IGPhu6dhIGPhuqMgaGFpIG5ow7NtLiDEkGnhu4F1IG7DoHkgY8OzIGzhu6NpIGNobyBjw6FjIHBow6JuIHTDrWNoIHNhdSBuw6B5LCB2w6wgbsOzIHRyw6FuaCDEkcaw4bujYyB0w6xuaCB0cuG6oW5nIG3huqV0IGPDom4gYuG6sW5nIGThu68gbGnhu4d1IGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24ga+G6v3QgcXXhuqMgbcO0IGjDrG5oIGhv4bq3YyB0aOG7kW5nIGvDqiBsacOqbiBxdWFuIMSR4bq/biB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4uICAgDQogDQoqKioNCg0KIyMgKipCaeG6v24gQW5udWFsSW5jb21lKiogICANCg0KKiBC4bqjbmcgdOG6p24gc+G7kTogICAgDQpgYGB7cixlY2hvPVRSVUV9DQogdGFibGUoZDEkQW5udWFsSW5jb21lKQ0KYGBgDQoNCiogQuG6o25nIHThuqduIHN14bqldDogICANCmBgYHtyLGVjaG89VFJVRX0NCmwgPC0gdGFibGUoZDEkQW5udWFsSW5jb21lKS9zdW0obnJvdyhkMSkpDQpwcmludChsKQ0KYGBgDQogVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDszogICANCmByIHRhYmxlKGQxJEFubnVhbEluY29tZSlbMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIGPDsyB0aHUgbmjhuq1wIHRodeG7mWMga2hv4bqjbmcgJDEwSyAtICQzMEsgOyAgIA0KYHIgdGFibGUoZDEkQW5udWFsSW5jb21lKSBbMl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIGPDsyB0aHUgbmjhuq1wIHRodeG7mWMga2hv4bqjbmcgJDExMEsgLSAkMTMwSzsgICANCmByIHRhYmxlKGQxJEFubnVhbEluY29tZSkgWzNdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBjw7MgdGh1IG5o4bqtcCB0aHXhu5ljIGtob+G6o25nICQxMzBLIC0gJDE1MEs7ICAgDQpgciB0YWJsZShkMSRBbm51YWxJbmNvbWUpIFs0XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gY8OzIHRodSBuaOG6rXAgdGh14buZYyBraG/huqNuZyAkMTUwSyArOyAgIA0KYHIgdGFibGUoZDEkQW5udWFsSW5jb21lKSBbNV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIGPDsyB0aHUgbmjhuq1wIHRodeG7mWMga2hv4bqjbmcgJDUwSyAtICQ3MEsgOyAgIA0KYHIgdGFibGUoZDEkQW5udWFsSW5jb21lKSBbNl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIGPDsyB0aHUgbmjhuq1wIHRodeG7mWMga2hv4bqjbmcgJDcwSyAtICQ5MEs7ICAgDQpgciB0YWJsZShkMSRBbm51YWxJbmNvbWUpIFs4XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gY8OzIHRodSBuaOG6rXAgdGh14buZYyBraG/huqNuZyAkOTBLIC0gJDExMEs7ICAgDQoNCiogQmnhu4N1IMSR4buTOiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KcGllKGwsDQogICAgbGFiZWxzID0gcGFzdGUobmFtZXMobCksIHJvdW5kKGwsIDIpLCAiJSIpLA0KICAgIG1haW4gPSAiQmnhu4N1IMSR4buTIHRyw7JuOiBU4bu3IGzhu4cgQW5udWFsSW5jb21lIikgDQpgYGANCg0KIEJp4bq/biAiQW5udWFsSW5jb21lIiAoVGh1IG5o4bqtcCBow6BuZyBuxINtKSB0cm9uZyBi4buZIGThu68gbGnhu4d1IMSRxrDhu6NjIHBow6JuIGxv4bqhaSB0aMOgbmggbmhp4buBdSBraG/huqNuZyBraMOhYyBuaGF1LCBjaG8gcGjDqXAgY2jDum5nIHRhIHBow6JuIHTDrWNoIHPhu7EgcGjDom4gYuG7lSB0aHUgbmjhuq1wIGPhu6dhIGPDoWMgY8OhIG5ow6JuLiBDw6FjIGtob+G6o25nIHRodSBuaOG6rXAgYmFvIGfhu5NtIHThu6sgdGjhuqVwIG5o4bqldCAoJDEwSyAtICQzMEspIMSR4bq/biBjYW8gbmjhuqV0ICgkMTUwSyArKS4gICANCg0KIFThu6sgYuG6o25nIHThuqduIHPhu5EsIGNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5IHPhu5EgbMaw4bujbmcgY8OhIG5ow6JuIHRyb25nIHThu6tuZyBraG/huqNuZyB0aHUgbmjhuq1wLiBD4bulIHRo4buDLCBraG/huqNuZyB0aHUgbmjhuq1wIHBo4buVIGJp4bq/biBuaOG6pXQgbMOgICQzMEsgLSAkNTBLIHbhu5tpIDQ2MDEgY8OhIG5ow6JuLCB0aeG6v3AgdGhlbyBsw6Aga2hv4bqjbmcgJDEwSyAtICQzMEsgduG7m2kgMzA5MCBjw6EgbmjDom4uIEPDoWMga2hv4bqjbmcgdGh1IG5o4bqtcCBjYW8gaMahbiBuaMawICQxMTBLIC0gJDEzMEssICQxMzBLIC0gJDE1MEssIHbDoCAkMTUwSyArIGPDsyBz4buRIGzGsOG7o25nIGPDoSBuaMOibiDDrXQgaMahbiDEkcOhbmcga+G7gy4gICANCg0KIEtoaSB4ZW0geMOpdCB04bu3IGzhu4csIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIHRo4bqleSBraG/huqNuZyAkMzBLIC0gJDUwSyBjaGnhur9tIHThu7cgbOG7hyBs4bubbiBuaOG6pXQgduG7m2kga2hv4bqjbmcgMzIuNzMlLiBLaG/huqNuZyAkMTBLIC0gJDMwSyDEkeG7qW5nIHRo4bupIGhhaSB24bubaSBraG/huqNuZyAyMS45OCUuIEPDoWMga2hv4bqjbmcgdGh1IG5o4bqtcCBjw7JuIGzhuqFpIGPDsyB04bu3IGzhu4cgdGjhuqVwIGjGoW4gbmhp4buBdSwgxJHhurdjIGJp4buHdCBsw6Aga2hv4bqjbmcgJDE1MEsgKyBjaOG7iSBjaGnhur9tIGtob+G6o25nIDEuOTQlLiBCaeG7g3UgxJHhu5MgdHLDsm4gIlThu7cgbOG7hyBBbm51YWxJbmNvbWUiIGPFqW5nIG1pbmggaOG7jWEgcsO1IHLDoG5nIHPhu7EgcGjDom4gYuG7lSBuw6B5LCB24bubaSAwLjMzJSAoaG/hurdjIDMzJSkgY2hvICQzMEsgLSAkNTBLIHbDoCAwLjIyJSAoaG/hurdjIDIyJSkgY2hvICQxMEsgLSAkMzBLLiAgIA0KDQogxJDhurdjIMSRaeG7g20gY2jDrW5oIHF1YW4gc8OhdCDEkcaw4bujYyBsw6Agc+G7sSBwaMOibiBi4buVIHRodSBuaOG6rXAgbOG7h2NoIHbhu4EgcGjDrWEgY8OhYyBraG/huqNuZyB0aHUgbmjhuq1wIHRo4bqlcCB2w6AgdHJ1bmcgYsOsbmguIEjhuqFuZyBt4bulYyAkMzBLIC0gJDUwSyBjaGnhur9tIMawdSB0aOG6vyByw7UgcuG7h3QgbmjhuqV0IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UsIGNobyB0aOG6pXkgxJHDonkgbMOgIG5ow7NtIHRodSBuaOG6rXAgcGjhu5UgYmnhur9uIG5o4bqldC4gQ8OzIHPhu7EgY2jDqm5oIGzhu4djaCBs4bubbiBnaeG7r2EgY8OhYyBo4bqhbmcgbeG7pWMgdGh1IG5o4bqtcCwgduG7m2kgcGjhuqduIGzhu5tuIGPDoWMgY8OhIG5ow6JuIHThuq1wIHRydW5nIOG7nyBjw6FjIGtob+G6o25nIHRodSBuaOG6rXAgZMaw4bubaSAkNzBLLCB2w6AgbeG7mXQgdOG7tyBs4buHIHLhuqV0IG5o4buPIOG7nyBjw6FjIGtob+G6o25nIHRodSBuaOG6rXAgY2FvIGjGoW4gJDExMEsuIMSQaeG7gXUgbsOgeSBuZ+G7pSDDvSBy4bqxbmcgYuG7mSBk4buvIGxp4buHdSBjaOG7pyB54bq/dSB04bqtcCB0cnVuZyB2w6BvIGPDoWMgY8OhIG5ow6JuIGPDsyBt4bupYyB0aHUgbmjhuq1wIHRo4bqlcCB2w6AgdHJ1bmcgYsOsbmguICAgIA0KIA0KKioqIA0KDQojIyAqKkJp4bq/biBDaXR5KiogICANCg0KKiBC4bqjbmcgdOG6p24gc+G7kTogICAgDQpgYGB7cixlY2hvPVRSVUV9DQogdGFibGUoZDEkQ2l0eSkNCmBgYA0KDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQprIDwtIHRhYmxlKGQxJENpdHkpL3N1bShucm93KGQxKSkNCnByaW50KGspDQpgYGANClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7M6ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIEFjYXB1bGNvOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbMl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBCZWxsaW5naGFtOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbM10vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBCZXZlcmx5IEhpbGxzOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbNF0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBCcmVtZXJ0b247ICAgDQpgciB0YWJsZShkMSRDaXR5KVs1XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIENhbWFjaG87ICAgDQpgciB0YWJsZShkMSRDaXR5KVs2XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIEd1YWRhbGFqYXJhOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbN10vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBIaWRhbGdvOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbOF0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBMb3MgQW5nZWxlczsgICANCmByIHRhYmxlKGQxJENpdHkpWzldL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gTWVyaWRhOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbMTBdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gTWV4aWNvIENpdHk7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBPcml6YWJhOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbMTJdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gUG9ydGxhbmQ7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxM10vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBTYWxlbTsgICANCmByIHRhYmxlKGQxJENpdHkpWzE0XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIFNhbiBBbmRyZXM7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxNV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBTYW4gRGllZ287ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxNl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBTYW4gRnJhbmNpc2NvOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbMTddL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gU2VhdHRsZTsgICANCmByIHRhYmxlKGQxJENpdHkpWzE4XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIFNwb2thbmU7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsxOV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBUYWNvbWE7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsyMF0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBWYW5jb3V2ZXI7ICAgDQpgciB0YWJsZShkMSRDaXR5KVsyMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBWaWN0b3JpYTsgICANCmByIHRhYmxlKGQxJENpdHkpWzIyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIFdhbGxhIFdhbGxhOyAgIA0KYHIgdGFibGUoZDEkQ2l0eSlbMjNdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gWWFraW1hLiAgIA0KDQoqKioNCg0KKiBCaeG7g3UgxJHhu5M6ICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCnRhYmxlKGQxJENpdHkpICU+JSBhcy5kYXRhLmZyYW1lKCkgLT5vMg0KY29sbmFtZXMobzIpPC1jKCJ2YWx1ZSIsImNvdW50IikNCg0KZ2dwbG90KG8yLCBhZXMoeCA9IHZhbHVlLCB5ID0gY291bnQsIGZpbGwgPSB2YWx1ZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgIGNvb3JkX2ZsaXAoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3VudCksIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDIuNSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBDaXR5ICIsIHggPSAiQ2l0eSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KICBCaeG6v24gIkNpdHkiIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgdGjhu4MgaGnhu4duIHRow6BuaCBwaOG7kSBuxqFpIGPDoWMgY8OhIG5ow6JuIHNpbmggc+G7kW5nLiBDw7MgcuG6pXQgbmhp4buBdSB0aMOgbmggcGjhu5Ega2jDoWMgbmhhdSDEkcaw4bujYyBsaeG7h3Qga8OqLCBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7lSDEkeG7i2EgbMO9IHLhu5luZyBj4bunYSB04bqtcCBraMOhY2ggaMOgbmcuICAgDQoNCiAgVOG7qyBi4bqjbmcgdOG6p24gc+G7kSwgY2jDum5nIHRhIGPDsyB0aOG7gyB0aOG6pXkgc+G7kSBsxrDhu6NuZyBjw6EgbmjDom4g4bufIG3hu5dpIHRow6BuaCBwaOG7kS4gUXVhbiBzw6F0IG5oYW5oIGNobyB0aOG6pXkgbeG7mXQgc+G7kSB0aMOgbmggcGjhu5EgY8OzIHThuqduIHPhu5EgeHXhuqV0IGhp4buHbiBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaOG7r25nIHRow6BuaCBwaOG7kSBraMOhYy4gVsOtIGThu6UsIExvcyBBbmdlbGVzIGPDsyA5MjYgY8OhIG5ow6JuLCBUYWNvbWEgY8OzIDEyNTcgY8OhIG5ow6JuLCBTZWF0dGxlIGPDsyA5MjIgY8OhIG5ow6JuLCBQb3J0bGFuZCBjw7MgODc2IGPDoSBuaMOibiwgdsOgIFNhbiBEaWVnbyBjw7MgODY2IGPDoSBuaMOibi4gTmfGsOG7o2MgbOG6oWksIG3hu5l0IHPhu5EgdGjDoG5oIHBo4buRIG5oxrAgR3VhZGFsYWphcmEgKDc1IGPDoSBuaMOibikgaG/hurdjIFZpY3RvcmlhICgxNzYgY8OhIG5ow6JuKSBjw7Mgc+G7kSBsxrDhu6NuZyDDrXQgaMahbiBuaGnhu4F1LiAgIA0KDQogIEtoaSB4ZW0geMOpdCB04bu3IGzhu4cgKHThuqduIHN14bqldCksIGPDoWMgdGjDoG5oIHBo4buRIGPDsyBz4buRIGzGsOG7o25nIGPDoSBuaMOibiBjYW8gbmjhuqV0IGPFqW5nIGPDsyB04bu3IGzhu4cgcGjhuqduIHRyxINtIGzhu5tuIG5o4bqldC4gVsOtIGThu6UsIFRhY29tYSBjaGnhur9tIGtob+G6o25nIDguOTQlIHThu5VuZyBz4buRIHF1YW4gc8OhdCwgTG9zIEFuZ2VsZXMga2hv4bqjbmcgNi41OCUsIFNlYXR0bGUga2hv4bqjbmcgNi41NiUsIHbDoCBQb3J0bGFuZCBraG/huqNuZyA2LjIzJS4gQ8OhYyB0aMOgbmggcGjhu5Ega2jDoWMgY8OzIHThu7cgbOG7hyB0aOG6pXAgaMahbiBuaGnhu4F1LCBt4buZdCBz4buRIGNo4buJIGNoaeG6v20gZMaw4bubaSAxJSAodsOtIGThu6U6IEd1YWRhbGFqYXJhIGNo4buJIDAuNTMlKS4gICANCg0KICDEkOG6t2MgxJFp4buDbSBjaMOtbmggcXVhbiBzw6F0IMSRxrDhu6NjIGzDoCBz4buxIHBow6JuIGLhu5UgY8OhIG5ow6JuIGtow7RuZyDEkeG7k25nIMSR4buBdSBnaeG7r2EgY8OhYyB0aMOgbmggcGjhu5EuIEjhuqFuZyBt4bulYyBUYWNvbWEgdsOgIExvcyBBbmdlbGVzIGPDuW5nIHbhu5tpIG3hu5l0IHPhu5EgdGjDoG5oIHBo4buRIGzhu5tuIGtow6FjIG5oxrAgU2VhdHRsZSwgUG9ydGxhbmQsIFNhbiBEaWVnbywgQmVsbGluZ2hhbSwgdsOgIEJyZW1lcnRvbiAoa2hpIHThu5VuZyBo4bujcCkgY2hp4bq/bSDGsHUgdGjhur8gxJHDoW5nIGvhu4MgduG7gSBz4buRIGzGsOG7o25nIHbDoCB04bu3IGzhu4cuIEPDsyBz4buxIGNow6puaCBs4buHY2ggcuG6pXQgbOG7m24gZ2nhu69hIGPDoWMgaOG6oW5nIG3hu6VjOiB0cm9uZyBraGkgbeG7mXQgc+G7kSB0aMOgbmggcGjhu5EgdOG6rXAgdHJ1bmcgxJHDtG5nIMSR4bqjbyBkw6JuIGPGsCB0cm9uZyBi4buZIGThu68gbGnhu4d1LCBuaGnhu4F1IHRow6BuaCBwaOG7kSBraMOhYyBjaOG7iSBjw7MgcuG6pXQgw610IMSR4bqhaSBkaeG7h24uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGLhu5kgZOG7ryBsaeG7h3UgY8OzIHRo4buDIHThuq1wIHRydW5nIHbDoG8gbeG7mXQgc+G7kSBraHUgduG7sWMgxJHDtCB0aOG7iyBs4bubbiBuaOG6pXQgxJHhu4tuaCwgduG7m2kgw610IGThu68gbGnhu4d1IHThu6sgY8OhYyBraHUgduG7sWMgbmjhu48gaMahbi4gICANCiAgDQoqKioNCiMjICoqQmnhur9uIFN0YXRlb3JQcm92aW5jZSoqICAgICANCg0KKiBC4bqjbmcgdOG6p24gc+G7kTogICAgDQpgYGB7cixlY2hvPVRSVUV9DQogdGFibGUoZDEkU3RhdGVvclByb3ZpbmNlKQ0KYGBgDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpzIDwtIHRhYmxlKGQxJFN0YXRlb3JQcm92aW5jZSkvc3VtKG5yb3coZDEpKQ0KcHJpbnQocykNCmBgYA0KduG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDszogICANCmByIHRhYmxlKGQxJFN0YXRlb3JQcm92aW5jZSlbMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBiYW5nIFdBOyAgIA0KYHIgdGFibGUoZDEkU3RhdGVvclByb3ZpbmNlKVsyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIGJhbmcgQ0E7ICAgDQpgciB0YWJsZShkMSRTdGF0ZW9yUHJvdmluY2UpWzNdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gYmFuZyBPUjsgICANCmByIHRhYmxlKGQxJFN0YXRlb3JQcm92aW5jZSlbNF0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBiYW5nIEJDOyAgIA0KYHIgdGFibGUoZDEkU3RhdGVvclByb3ZpbmNlKVs1XS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIGJhbmcgREY7ICAgDQpgciB0YWJsZShkMSRTdGF0ZW9yUHJvdmluY2UpWzZdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gYmFuZyBHdWVycmVybzsgICANCmByIHRhYmxlKGQxJFN0YXRlb3JQcm92aW5jZSlbN10vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBiYW5nIEphbGlzY287ICAgDQpgciB0YWJsZShkMSRTdGF0ZW9yUHJvdmluY2UpWzhdL3N1bShucm93KGQxKSkqMTAwYFwlIGPDoSBuaMOibiBzaW5oIHPhu5FuZyDhu58gYmFuZyBWZXJhY3J1ejsgICANCmByIHRhYmxlKGQxJFN0YXRlb3JQcm92aW5jZSlbOV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY8OhIG5ow6JuIHNpbmggc+G7kW5nIOG7nyBiYW5nIFl1Y2F0YW47ICAgDQpgciB0YWJsZShkMSRTdGF0ZW9yUHJvdmluY2UpWzEwXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIGJhbmcgWsOiY3RlY2FzLiAgIA0KDQoqIEJp4buDdSDEkeG7kzogICANCmBgYHtyLGVjaG89VFJVRX0NCnBpZShzLA0KICAgIGxhYmVscyA9IHBhc3RlKG5hbWVzKHMpLCByb3VuZChzLCAyKSwgIiUiKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIFN0YXRlb3JQcm92aW5jZSIpIA0KYGBgDQoNCiAgQmnhur9uIFN0YXRlb3JQcm92aW5jZSAoQmFuZy9U4buJbmgpIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgcGjDom4gbG/huqFpIGPDoWMgY8OhIG5ow6JuIHRow6BuaCBuaGnhu4F1IG5ow7NtIGNow61uaCwgdsOtIGThu6UgbmjGsCAiV0EiLCAiQ0EiLCAiT1IiLCAiQkMiLCAiREYiLCAiR3VlcnJlcm8iLCAiSmFsaXNjbyIsICJWZXJhY3J1eiIsICJZdWNhdGFuIiB2w6AgIlphY2F0ZWNhcyIuICAgDQoNCiAgVOG7qyBi4bqjbmcgdOG6p24gc+G7kSwgV0EgY8OzIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGNhbyBuaOG6pXQgduG7m2kgNDU2NyBjw6EgbmjDom4sIHRp4bq/cCB0aGVvIGzDoCBDQSB24bubaSAyNzMzIGPDoSBuaMOibiB2w6AgT1IgduG7m2kgMjI2MiBjw6EgbmjDom4uIE5nxrDhu6NjIGzhuqFpLCBKYWxpc2NvIGzDoCBo4bqhbmcgbeG7pWMgY8OzIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IHRo4bqlcCBuaOG6pXQgY2jhu4kgduG7m2kgNzUgY8OhIG5ow6JuLiBLaGkgeGVtIHjDqXQgdOG7tyBs4buHLCBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyB0aOG6pXkgbmjDs20gIldBIiBjaGnhur9tIGtob+G6o25nIDMyLjQ4JSB04buVbmcgc+G7kSBxdWFuIHPDoXQsICJDQSIgY2hp4bq/bSAxOS40NCUsIHbDoCAiT1IiIGNoaeG6v20gMTYuMDklLiBCaeG7g3UgxJHhu5MgdHLDsm4gIlThu7cgbOG7hyBTdGF0ZW9yUHJvdmluY2UiIGPFqW5nIG1pbmggaOG7jWEgcsO1IHLDoG5nIHPhu7EgcGjDom4gYuG7kSBuw6B5LCB24bubaSAzMi40OCUgY2hvICJXQSIsIDE5LjQ0JSBjaG8gIkNBIiwgMTYuMDklIGNobyAiT1IiLCB2w6AgY8OhYyB04bu3IGzhu4cgcuG6pXQgbmjhu48gY2hvIGPDoWMgaOG6oW5nIG3hu6VjIGtow6FjLCB4w6FjIG5o4bqtbiBz4buxIG5o4bqldCBxdcOhbiBnaeG7r2EgY8OhYyBow6xuaCB0aOG7qWMgdHLDrG5oIGLDoHkgZOG7ryBsaeG7h3UuICAgDQoNCiAgxJDhurdjIMSRaeG7g20gY2jDrW5oIHF1YW4gc8OhdCDEkcaw4bujYyBsw6Agc+G7sSBt4bqldCBjw6JuIGLhurFuZyByw7UgcuG7h3QgZ2nhu69hIGPDoWMgYmFuZy904buJbmggdHJvbmcgYuG7mSBk4buvIGxp4buHdS4gSOG6oW5nIG3hu6VjICJXQSIgY2hp4bq/bSDGsHUgdGjhur8gdsaw4bujdCB0cuG7mWkgduG7gSBz4buRIGzGsOG7o25nIHbDoCB04bu3IGzhu4csIHRoZW8gc2F1IGzDoCAiQ0EiIHbDoCAiT1IiLiBDw7Mgc+G7sSBjaMOqbmggbOG7h2NoIHLhuqV0IGzhu5tuIGdp4buvYSBjw6FjIGjhuqFuZyBt4bulYywga2hpIG3hu5l0IHbDoGkgYmFuZy904buJbmggKG5oxrAgV0EsIENBLCBPUikgY2hp4bq/bSBwaOG6p24gbOG7m24gxJHDoW5nIGvhu4MgZOG7ryBsaeG7h3UsIHRyb25nIGtoaSBjw6FjIGJhbmcvdOG7iW5oIGtow6FjICh2w60gZOG7pSBKYWxpc2NvLCBHdWVycmVybywgVmVyYWNydXopIGNo4buJIGPDsyBz4buxIMSR4bqhaSBkaeG7h24gcuG6pXQgbmjhu48uIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGPDoWMgcGjDom4gdMOtY2ggc2F1IG7DoHksIHbDrCBuw7MgY2hvIHRo4bqleSBk4buvIGxp4buHdSBjw7Mgc+G7sSB04bqtcCB0cnVuZyBt4bqhbmggdsOgbyBt4buZdCBz4buRIGtodSB24buxYyBuaOG6pXQgxJHhu4tuaCwgY8OzIGto4bqjIG7Eg25nIGfDonkgcmEgc2FpIGzhu4djaCBob+G6t2MgZ2nhuqNtIMSR4buZIHRpbiBj4bqteSBj4bunYSBtw7QgaMOsbmggxJHhu5FpIHbhu5tpIGPDoWMgbmjDs20gY8OzIMOtdCBk4buvIGxp4buHdS4gICAgICANCiAgDQoqKioNCg0KIyMgKipCaeG6v24gQ291bnRyeSoqICAgIA0KDQoqIELhuqNuZyB04bqnbiBz4buROiAgICANCmBgYHtyLGVjaG89VFJVRX0NCiB0YWJsZShkMSRDb3VudHJ5KQ0KYGBgDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpjIDwtIHRhYmxlKGQxJENvdW50cnkpL3N1bShucm93KGQxKSkNCnByaW50KGMpDQpgYGANCnbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7M6ICAgDQpgciB0YWJsZShkMSRDb3VudHJ5KVsxXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIENhbmFkYTsgICANCmByIHRhYmxlKGQxJENvdW50cnkpIFsyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIE1leGljbzsgICANCmByIHRhYmxlKGQxJENvdW50cnkpIFszXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBjw6EgbmjDom4gc2luaCBz4buRbmcg4bufIFVTQS4gICANCg0KKiBCaeG7g3UgxJHhu5M6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQpwaWUoYywNCiAgICBsYWJlbHMgPSBwYXN0ZShuYW1lcyhjKSwgcm91bmQoYywgMiksICIlIiksDQogICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdHLDsm46IFThu7cgbOG7hyBDb3VudHJ5IikgDQpgYGANCg0KICBU4burIGLhuqNuZyB04bqnbiBz4buRLCBiaeG6v24gQ291bnRyeSBjaG8gdGjhuqV5IGPDsyBiYSBxdeG7kWMgZ2lhIGNow61uaCB0cm9uZyBi4buZIGThu68gbGnhu4d1IGzDoCBDYW5hZGEsIE1leGljbyB2w6AgVVNBLiBUcm9uZyDEkcOzLCBVU0EgbMOgIHF14buRYyBnaWEgY8OzIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGNhbyBuaOG6pXQgduG7m2kgOTU2MiBi4bqjbiBnaGksIE1leGljbyDEkeG7qW5nIHRo4bupIGhhaSB24bubaSAzNjg4IGLhuqNuIGdoaSwgdsOgIENhbmFkYSBjw7Mgc+G7kSBsxrDhu6NuZyB0aOG6pXAgbmjhuqV0IHbhu5tpIDgwOSBi4bqjbiBnaGkuIFBow6JuIHTDrWNoIGLhuqNuZyB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kyB0csOybiB4w6FjIG5o4bqtbiBz4buxIHBow6JuIGLhu5EgbsOgeTogVVNBIGNoaeG6v20gdOG7tyBs4buHIMOhcCDEkeG6o28gduG7m2kgMC42ODAxMzM3MiAodOG7qWMga2hv4bqjbmcgNjguMDElKSwgTWV4aWNvIGNoaeG6v20gMC4yNjIzMjMwNyAoa2hv4bqjbmcgMjYuMjMlKSwgdsOgIENhbmFkYSBjaGnhur9tIDAuMDU3NTQzMjEgKGtob+G6o25nIDUuNzUlKS4gVVNBIHLDtSByw6BuZyBsw6AgaOG6oW5nIG3hu6VjIGNoaeG6v20gxrB1IHRo4bq/IHbGsOG7o3QgdHLhu5lpIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuIEPDsyBz4buxIGNow6puaCBs4buHY2ggcuG6pXQgbOG7m24gZ2nhu69hIGPDoWMgaOG6oW5nIG3hu6VjLCBraGkgdOG7tyBs4buHIGPhu6dhIFVTQSBs4bubbiBoxqFuIGfhuqVwIMSRw7RpIHNvIHbhu5tpIE1leGljbyB2w6AgbOG7m24gaMahbiBraG/huqNuZyAxMCBs4bqnbiBzbyB24bubaSBDYW5hZGEuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGThu68gbGnhu4d1IHRyb25nIHThuq1wIG7DoHkgY2jhu6cgeeG6v3UgxJHhur9uIHThu6sgSG9hIEvhu7MsIHbDoCBjw6FjIHBow6JuIHTDrWNoIHNhdSBuw6B5IGPDsyB0aOG7gyBi4buLIOG6o25oIGjGsOG7n25nIGLhu59pIHPhu7EgxJHhuqFpIGRp4buHbiBraMO0bmcgxJHhu5NuZyDEkeG7gXUgbsOgeSwgxJHhurdjIGJp4buHdCBraGkgc3V5IGx14bqtbiB24buBIGPDoWMgcXXhu5FjIGdpYSBjw7MgdOG7tyBs4buHIHRo4bqlcCBoxqFuLiAgICAgIA0KICANCioqKiAgIA0KDQojIyAqKkJp4bq/biBQcm9kdWN0RmFtaWx5KiogICAgDQoqIELhuqNuZyB04bqnbiBz4buROiAgICANCmBgYHtyLGVjaG89VFJVRX0NCiB0YWJsZShkMSRQcm9kdWN0RmFtaWx5KQ0KYGBgDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQp2IDwtIHRhYmxlKGQxJFByb2R1Y3RGYW1pbHkpL3N1bShucm93KGQxKSkNCnByaW50KHYpDQpgYGANCnbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7M6ICAgIA0KYHIgdGFibGUoZDEkUHJvZHVjdEZhbWlseSlbMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgc+G6o24gcGjhuqltIHRodeG7mWMgbmjDs20gRHJpbms7ICAgDQpgciB0YWJsZShkMSRQcm9kdWN0RmFtaWx5KSBbMl0vc3VtKG5yb3coZDEpKSoxMDBgXCUgc+G6o24gcGjhuqltIHRodeG7mWMgbmjDs20gRm9vZDsgICANCmByIHRhYmxlKGQxJFByb2R1Y3RGYW1pbHkpIFszXS9zdW0obnJvdyhkMSkpKjEwMGBcJSBz4bqjbiBwaOG6qW0gdGh14buZYyBuaMOzbSBOb24tQ29uc3VtYWJsZS4gICAgIA0KDQoqIEJp4buDdSDEkeG7kzogICANCmBgYHtyLGVjaG89VFJVRX0NCnBpZSh2LA0KICAgIGxhYmVscyA9IHBhc3RlKG5hbWVzKHYpLCByb3VuZCh2LCAyKSwgIiUiKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIFByb2R1Y3RGYW1pbHkgIikgDQpgYGANCg0KICBCaeG6v24gUHJvZHVjdEZhbWlseSAoTmjDs20gc+G6o24gcGjhuqltKSB0cm9uZyBi4buZIGThu68gbGnhu4d1IHBow6JuIGxv4bqhaSBjw6FjIHPhuqNuIHBo4bqpbSB0aMOgbmggYmEgbmjDs20gY2jDrW5oIGzDoCAiRHJpbmsiICjEkOG7kyB14buRbmcpLCAiRm9vZCIgKFRo4buxYyBwaOG6qW0pLCB2w6AgIk5vbi1Db25zdW1hYmxlIiAoS2jDtG5nIHRpw6p1IGTDuW5nKS4gICANCg0KICBU4burIGLhuqNuZyB04bqnbiBz4buRLCBjw7MgMTAxNTMgc+G6o24gcGjhuqltIHRodeG7mWMgbmjDs20gIkZvb2QiLCAyNjU2IHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtICJOb24tQ29uc3VtYWJsZSIsIHbDoCAxMjUwIHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtICJEcmluayIuIEtoaSB4ZW0geMOpdCB04bu3IGzhu4csIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIHRo4bqleSBuaMOzbSAiRm9vZCIgY2hp4bq/bSB04bu3IGzhu4cgw6FwIMSR4bqjbyB24bubaSAwLjcyMjE3MDg1ICh04bupYyA3Mi4yMiUpIHThu5VuZyBz4buRIHF1YW4gc8OhdC4gTmjDs20gIk5vbi1Db25zdW1hYmxlIiDEkeG7qW5nIHRo4bupIGhhaSB24bubaSAwLjE4ODkxODEzICh04bupYyAxOC44OSUpLCB2w6AgbmjDs20gIkRyaW5rIiBjaGnhur9tIHThu7cgbOG7hyB0aOG6pXAgbmjhuqV0IHbhu5tpIDAuMDg4OTExMDIgKHThu6ljIDguODklKS4gQmnhu4N1IMSR4buTIHRyw7JuIChkw7kgbmjDo24gbMOgICJDb3VudHJ5IiBuaMawbmcgZOG7ryBsaeG7h3UgcGjhuqNuIMOhbmggIlByb2R1Y3RGYW1pbHkiKSBjxaluZyBtaW5oIGjhu41hIHLDtSByw6BuZyBz4buxIHBow6JuIGLhu5EgbsOgeSwgduG7m2kgMC43MiUgKGhv4bq3YyA3MiUpIGNobyAiRm9vZCIsIDAuMTklIChob+G6t2MgMTklKSBjaG8gIk5vbi1Db25zdW1hYmxlIiwgdsOgIDAuMDklIChob+G6t2MgOSUpIGNobyAiRHJpbmsiLCB4w6FjIG5o4bqtbiBz4buxIG5o4bqldCBxdcOhbiBnaeG7r2EgY8OhYyBow6xuaCB0aOG7qWMgdHLDrG5oIGLDoHkgZOG7ryBsaeG7h3UuICAgDQoNCiAgxJDhurdjIMSRaeG7g20gY2jDrW5oIHF1YW4gc8OhdCDEkcaw4bujYyBsw6Agc+G7sSBt4bqldCBjw6JuIGLhurFuZyBy4bqldCBs4bubbiBnaeG7r2EgY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gdHJvbmcgYuG7mSBk4buvIGxp4buHdS4gSOG6oW5nIG3hu6VjICJGb29kIiBjaGnhur9tIMawdSB0aOG6vyB2xrDhu6N0IHRy4buZaSB24buBIHPhu5EgbMaw4bujbmcgdsOgIHThu7cgbOG7hywgxJHhuqFpIGRp4buHbiBjaG8gZ+G6p24gYmEgcGjhuqduIHTGsCB04buVbmcgc+G7kSBz4bqjbiBwaOG6qW0uIEPDsyBz4buxIGNow6puaCBs4buHY2ggxJHDoW5nIGvhu4MgZ2nhu69hIGPDoWMgaOG6oW5nIG3hu6VjLCBraGkgbmjDs20gIkZvb2QiIGzhu5tuIGjGoW4gcuG6pXQgbmhp4buBdSBzbyB24bubaSAiTm9uLUNvbnN1bWFibGUiIHbDoCAiRHJpbmsiLCB24buRbiBjaOG7iSBjaGnhur9tIG3hu5l0IHBo4bqnbiBuaOG7jy4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgaG/huqF0IMSR4buZbmcga2luaCBkb2FuaCBob+G6t2MgZOG7ryBsaeG7h3UgdGh1IHRo4bqtcCDEkWFuZyB04bqtcCB0cnVuZyBt4bqhbmggdsOgbyBjw6FjIHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtIFRo4buxYyBwaOG6qW0sIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGPDoWMgcGjDom4gdMOtY2ggduG7gSB4dSBoxrDhu5tuZyBtdWEgc+G6r20sIGhp4buHdSBzdeG6pXQgc+G6o24gcGjhuqltLCBob+G6t2MgY2hp4bq/biBsxrDhu6NjIG1hcmtldGluZyBu4bq/dSBraMO0bmcgxJHGsOG7o2MgeGVtIHjDqXQga+G7uSBsxrDhu6FuZy4gICAgICANCiAgDQoqKioNCg0KIyMgKipCaeG6v24gUHJvZHVjdENhdGVnb3J5KiogICAgDQoqIELhuqNuZyB04bqnbiBz4buROiAgICANCmBgYHtyLGVjaG89VFJVRX0NCiB0YWJsZShkMSRQcm9kdWN0Q2F0ZWdvcnkpDQpgYGANCg0KKiBC4bqjbmcgdOG6p24gc3XhuqV0OiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KdjEgPC0gdGFibGUoZDEkUHJvZHVjdENhdGVnb3J5KS9zdW0obnJvdyhkMSkpDQpwcmludCh2MSkNCmBgYA0KDQoNCiogQmnhu4N1IMSR4buTOiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KdGFibGUoZDEkUHJvZHVjdENhdGVnb3J5KSAlPiUgYXMuZGF0YS5mcmFtZSgpIC0+bzMNCmNvbG5hbWVzKG8zKTwtYygidmFsdWUiLCJjb3VudCIpDQoNCmdncGxvdChvMywgYWVzKHggPSB2YWx1ZSwgeSA9IGNvdW50LCBmaWxsID0gdmFsdWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSsgIGNvb3JkX2ZsaXAoKSArICANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvdW50KSwgdmp1c3QgPSAtMC4zLCBzaXplID0gMi41KSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIFByb2R1Y3RDYXRlZ29yeSAiLCB4ID0gIlByb2R1Y3RDYXRlZ29yeSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpK3RoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiICAjIOG6qG4gY2jDuiB0aMOtY2ggbcOgdSBu4bq/dSBraMO0bmcgY+G6p24NCiAgKQ0KYGBgDQoNCiAgVOG7qyBi4bqjbmcgdOG6p24gc+G7kSwgIlZlZ2V0YWJsZXMiIHbDoCAiU25hY2sgRm9vZHMiIGzDoCBoYWkgaOG6oW5nIG3hu6VjIGPDsyBz4buRIGzGsOG7o25nIHF1YW4gc8OhdCBjYW8gbmjhuqV0IGzhuqduIGzGsOG7o3QgbMOgIDE3MjggdsOgIDE2MDAgYuG6o24gZ2hpLiBUaGVvIHNhdSBsw6AgIkRhaXJ5IiB24bubaSA5MDMgYuG6o24gZ2hpIHbDoCAiRnJ1aXQiIHbhu5tpIDc2NSBi4bqjbiBnaGkuIE5nxrDhu6NjIGzhuqFpLCBuaGnhu4F1IGjhuqFuZyBt4bulYyBjw7Mgc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgcuG6pXQgdGjhuqVwLCB2w60gZOG7pSBuaMawICJNaXNjZWxsYW5lb3VzIiAoNDIpLCAiQ2FubmVkIEFuY2hvdmllcyIgKDQ0KSwgIkNhbmRsZXMiICg0NSksICJQYWNrYWdlZCBWZWdldGFibGVzIiAoNDgpLCB2w6AgIkNhbm5lZCBDbGFtcyIgKDUzKS4gS2hpIHhlbSB4w6l0IHThu7cgbOG7hywgYuG6o25nIHThuqduIHN14bqldCBjaG8gdGjhuqV5ICJWZWdldGFibGVzIiBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHbhu5tpIDAuMTIyOTEwNTkxICh04bupYyBraG/huqNuZyAxMi4yOSUpIHThu5VuZyBz4buRIHF1YW4gc8OhdCwgdsOgICJTbmFjayBGb29kcyIgY2hp4bq/bSAwLjExMzgwNjEwMyAodOG7qWMga2hv4bqjbmcgMTEuMzglKS4gTmfGsOG7o2MgbOG6oWksICJNaXNjZWxsYW5lb3VzIiBjaOG7iSBjaGnhur9tIDAuMDAyOTg3NDEwIChraG/huqNuZyAwLjMwJSkgdsOgICJDYW5uZWQgQW5jaG92aWVzIiBsw6AgMC4wMDMxMjk2NjggKGtob+G6o25nIDAuMzElKS4gQmnhu4N1IMSR4buTIGPhu5l0ICJCaeG7g3UgxJHhu5MgUHJvZHVjdENhdGVnb3J5IiBtaW5oIGjhu41hIHLDtSByw6BuZyBz4buxIHBow6JuIGLhu5EgbsOgeSwgduG7m2kgY8OhYyBj4buZdCAiVmVnZXRhYmxlcyIgdsOgICJTbmFjayBGb29kcyIgbuG7lWkgYuG6rXQgduG7m2kgY2hp4buBdSBjYW8gdsaw4bujdCB0cuG7mWksIHRyb25nIGtoaSBuaGnhu4F1IGPhu5l0IGtow6FjIGfhuqduIG5oxrAga2jDtG5nIMSRw6FuZyBr4buDLCB4w6FjIG5o4bqtbiBz4buxIG5o4bqldCBxdcOhbiBnaeG7r2EgY8OhYyBow6xuaCB0aOG7qWMgdHLDrG5oIGLDoHkgZOG7ryBsaeG7h3UuICAgDQoNCiAgxJDhurdjIMSRaeG7g20gY2jDrW5oIHF1YW4gc8OhdCDEkcaw4bujYyBsw6Agc+G7sSBt4bqldCBjw6JuIGLhurFuZyBy4bqldCBs4bubbiBnaeG7r2EgY8OhYyBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSB0cm9uZyBi4buZIGThu68gbGnhu4d1LiBDw6FjIGjhuqFuZyBt4bulYyAiVmVnZXRhYmxlcyIgdsOgICJTbmFjayBGb29kcyIgY2hp4bq/bSDGsHUgdGjhur8gcsO1IHLhu4d0IHbhu4Egc+G7kSBsxrDhu6NuZyB2w6AgdOG7tyBs4buHLiBDw7Mgc+G7sSBjaMOqbmggbOG7h2NoIGPhu7FjIGvhu7MgbOG7m24gZ2nhu69hIGPDoWMgaOG6oW5nIG3hu6VjLCBraGkgaGFpIG5ow7NtIMSR4bupbmcgxJHhuqd1IGNoaeG6v20gdOG7tyB0cuG7jW5nIMSRw6FuZyBr4buDLCB0cm9uZyBraGkgbeG7mXQgbMaw4bujbmcgbOG7m24gY8OhYyBkYW5oIG3hu6VjIGtow6FjIChuaMawICJNaXNjZWxsYW5lb3VzIiwgIkNhbm5lZCBDbGFtcyIsICJDYW5kbGVzIikgY8OzIHPhu5EgbMaw4bujbmcgdsOgIHThu7cgbOG7hyBy4bqldCBuaOG7jywgdGjhuq1tIGNow60gY2jhu4kgY2hp4bq/bSBjaMawYSDEkeG6v24gMSUgdOG7lW5nIHPhu5EuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGThu68gbGnhu4d1IG11YSBz4bqvbSBob+G6t2MgdOG7k24ga2hvIMSRYW5nIHThuq1wIHRydW5nIG3huqFuaCB2w6BvIG3hu5l0IHPhu5Egw610IGRhbmggbeG7pWMgc+G6o24gcGjhuqltIG5o4bqldCDEkeG7i25oLCDEkWnhu4F1IG7DoHkgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBjw6FjIHBow6JuIHTDrWNoIHRo4buLIHRyxrDhu51uZywgY2hp4bq/biBsxrDhu6NjIHPhuqNuIHBo4bqpbSBob+G6t2MgZOG7sSBiw6FvIGRvYW5oIHPhu5EgbuG6v3Uga2jDtG5nIMSRxrDhu6NjIHhlbSB4w6l0IGvhu7kgbMaw4buhbmcuICAgICAgDQogIA0KKioqDQoNCiMjICoqQmnhur9uIFByb2R1Y3REZXBhcnRtZW50KiogICAgDQoqIELhuqNuZyB04bqnbiBz4buROiAgICANCmBgYHtyLGVjaG89VFJVRX0NCiB0YWJsZShkMSRQcm9kdWN0RGVwYXJ0bWVudCkNCmBgYA0KDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQpgYGB7cixlY2hvPVRSVUV9DQp2MiA8LSB0YWJsZShkMSRQcm9kdWN0RGVwYXJ0bWVudCkvc3VtKG5yb3coZDEpKQ0KcHJpbnQodjIpDQpgYGANCg0KDQoqIEJp4buDdSDEkeG7kzogICANCmBgYHtyLGVjaG89VFJVRX0NCnRhYmxlKGQxJFByb2R1Y3REZXBhcnRtZW50KSAlPiUgYXMuZGF0YS5mcmFtZSgpIC0+bzQNCmNvbG5hbWVzKG80KTwtYygidmFsdWUiLCJjb3VudCIpDQoNCmdncGxvdChvNCwgYWVzKHggPSB2YWx1ZSwgeSA9IGNvdW50LCBmaWxsID0gdmFsdWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSsgIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY291bnQpLCB2anVzdCA9IC0wLjMsIHNpemUgPSAyLjUpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgUHJvZHVjdERlcGFydG1lbnQgIiwgeCA9ICJQcm9kdWN0RGVwYXJ0bWVudCIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsgIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksICMg4bqobiBuaMOjbiBkxrDhu5tpIHRy4bulYyBYIG7hur91IGPhuqduDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgKSANCmBgYA0KDQogIFBow6JuIGLhu5EgY+G7p2EgY8OhYyBsb+G6oWkgc+G6o24gcGjhuqltIGtow7RuZyDEkeG7k25nIMSR4buBdS4gIlByb2R1Y2UiICgxOTk0IG3huqt1LCBjaGnhur9tIGtob+G6o25nIDE0LjI2JSkgdsOgICJTbmFjayBGb29kcyIgKDE2MDAgbeG6q3UsIGNoaeG6v20ga2hv4bqjbmcgMTEuNDQlKSBsw6AgaGFpIGxv4bqhaSBz4bqjbiBwaOG6qW0gY8OzIHPhu5EgbMaw4bujbmcgbeG6q3UgxJHGsOG7o2MgcGjDom4gdMOtY2ggbmhp4buBdSBuaOG6pXQsIGNobyB0aOG6pXkgxJHDonkgbMOgIG5o4buvbmcgbmfDoG5oIGjDoG5nIGNoaeG6v20gdOG7tyB0cuG7jW5nIGzhu5tuIHRyb25nIGThu68gbGnhu4d1LiBOZ8aw4bujYyBs4bqhaSwgY8OhYyBuZ8OgbmggaMOgbmcgbmjGsCAiQ2hlY2tvdXQiICg4MiBt4bqrdSwgY2hp4bq/bSBraG/huqNuZyAwLjU5JSksICJNZWF0IiAoODkgbeG6q3UsIGNoaeG6v20ga2hv4bqjbmcgMC42MyUpIHbDoCAiQ2FubmVkIFByb2R1Y3RzIiAoMTA5IG3huqt1LCBjaGnhur9tIGtob+G6o25nIDAuNzglKSBjw7Mgc+G7kSBsxrDhu6NuZyBt4bqrdSBy4bqldCB0aOG6pXAsIGPDsyB0aOG7gyBsw6Agbmjhu69uZyBuZ8OgbmggaMOgbmcgw610IHBo4buVIGJp4bq/biBoxqFuIGhv4bq3YyDDrXQgxJHGsOG7o2MgcXVhbiB0w6JtIHRyb25nIHF1w6EgdHLDrG5oIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IG7DoHkuICAgDQoNCiAgU+G7sSBjaMOqbmggbOG7h2NoIGzhu5tuIGdp4buvYSBjw6FjIG5nw6BuaCBow6BuZyBjaG8gdGjhuqV5IHLhurFuZyBkb2FuaCBuZ2hp4buHcCBob+G6t2MgdOG7lSBjaOG7qWMgxJFhbmcgdOG6rXAgdHJ1bmcgdsOgbyBt4buZdCBz4buRIGzEqW5oIHbhu7FjIHPhuqNuIHBo4bqpbSBuaOG6pXQgxJHhu4tuaCAoIlByb2R1Y2UiLCAiU25hY2sgRm9vZHMiLCAiSG91c2Vob2xkIiwgIkZyb3plbiBGb29kcyIpIHRyb25nIGtoaSBt4buZdCBz4buRIG5nw6BuaCBow6BuZyBraMOhYyDEkWFuZyBi4buLIGLhu48gbmfhu48gaG/hurdjIGtow7RuZyDEkcaw4bujYyDGsHUgdGnDqm4uIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGhp4buHdSBxdeG6oyBraW5oIGRvYW5oIHThu5VuZyB0aOG7gyBu4bq/dSBraMO0bmcgY8OzIHPhu7EgcGjDom4gYuG7lSBo4bujcCBsw70gaG/hurdjIG7hur91IGPDoWMgbmfDoG5oIGjDoG5nIMOtdCBwaOG7lSBiaeG6v24gY8OzIHRp4buBbSBuxINuZyB0xINuZyB0csaw4bufbmcgbmjGsG5nIGNoxrBhIMSRxrDhu6NjIGtoYWkgdGjDoWMuIMSQ4buDIGhp4buDdSByw7UgaMahbiB24buBIGzDvSBkbyBj4bunYSBz4buxIHBow6JuIGLhu5EgbsOgeSwgY+G6p24gY8OzIHRow6ptIHRow7RuZyB0aW4gduG7gSBi4buRaSBj4bqjbmggdGh1IHRo4bqtcCBk4buvIGxp4buHdSB2w6AgbeG7pWMgdGnDqnUgcGjDom4gdMOtY2guICAgDQogIA0KIyAqKlBo4bqnbiAzOiDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdsOgIEtp4buDbSDEkeG7i25oIEdpw6EgdGh1eeG6v3QgY2hvIFThu7cgbOG7hyoqICAgDQoNCiogQ8OhYyBiaeG6v24gxJHGsOG7o2MgbOG7sWEgY2jhu41uIGJhbyBn4buTbTogSG9tZW93bmVyOyBHZW5kZXI7IENvdW50cnkuICAgDQoNCiMjICoqQmnhur9uIEhvbWVvd25lcioqICAgDQoNCjEuKipYw6FjIMSR4buLbmggaOG6oW5nIG3hu6VjIHF1YW4gdMOibSoqOiBo4bqhbmcgbeG7pWMgTiAoa2jDtG5nIGPDsyBz4bufIGjhu691IG5ow6ApIGPhu6dhIGJp4bq/biBIb21lb3duZXIuICAgDQoNCjIuKirGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPDonk6KiogICANCiAgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSBjaG8gdOG7tyBs4buHIGPhu6dhIGjhuqFuZyBt4bulYyBOIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUuICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0KIyDEkOG6v20gc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgY+G7p2EgaOG6oW5nIG3hu6VjIE4NCmNvdW50X04gPC0gc3VtKGQxJEhvbWVvd25lciA9PSAiTiIpDQpwcmludCgiU+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgY+G7p2EgaOG6oW5nIG3hu6VjIE46IikNCmNvdW50X04NCg0KIyDEkOG6v20gc+G7kSB04buVbmcgcXVhbiBzw6F0Lg0KdG90YWwgPC0gbnJvdyhkMSkNCnByaW50KCJT4buRIHThu5VuZyBxdWFuIHPDoXQ6IikNCnRvdGFsDQoNCiMgVMOtbmgga2hv4bqjbmcgdGluIGPDonkNCnJlc3VsdCA8LSBwcm9wLnRlc3QoeCA9IGNvdW50X04sIG4gPSB0b3RhbCwgY29uZi5sZXZlbCA9IDAuOTUpDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjDQpwcmludCgiS2hv4bqjbmcgdGluIGPhuq15OiIpDQpyZXN1bHQNCg0KDQpgYGANCioqRGnhu4VuIGdp4bqjaSoqICAgDQoqIFThu7cgbOG7hyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IGzDoCAzOSw5NCUuICAgDQoqIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgICgnTicpIGzDoCB04burIDM5LDEzJSDEkeG6v24gNDAsNzUlLiAgICAgIA0KKiBU4bupYyBsw6A6IENow7puZyB0YSB04buxIHRpbiA5NSUgcuG6sW5nIHThu7cgbOG7hyB0aOG7sWMgc+G7sSBj4bunYSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgdHJvbmcgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMzksMTMlIMSR4bq/biA0MCw3NSUuICAgICAgDQogIA0KKipHaeG6o2kgdGjDrWNoKiogICANCiAgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSBjaG8gdOG7tyBs4buHIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgdHLDqm4gdOG7lW5nIHPhu5EgcXVhbiBzw6F0IHbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLDUuICAgDQogIA0KICBYLXNxdWFyZWQgPSA1NjguODYsIGRmID0gMTogZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaCAoQ2hpLSBzcXVhcmVkKSBsw6AgNTY4LDg2IHbhu5tpIDEgYuG6rWMgdOG7sSBkby4gICANCiAgDQogIEdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBuaOG7jyB2w6AgZ+G6p24gbmjGsCBi4bqxbmcgMCAocC12YWx1ZSA8IDIuMmUtMTYpLiBDaG8gdGjhuqV5IGLhurFuZyBjaOG7qW5nIHLhuqV0IG3huqFuaCDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQgKHLhurFuZyB04bu3IGzhu4cgYuG6sW5nIDAuNSkuICAgDQogIA0KICBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzOiBnaeG6oyB0aHV54bq/dCDEkeG7kWkgKHThu7cgbOG7hyB0aOG7sWMgc+G7sSBraMOhYyAwLjUpLiAgIA0KICANCiAgOTUgcGVyY2VudCBjb25maWRlbmNlIGludGVydmFsOiAwLjM5MTI4NTUgMC40MDc1NDYzOiBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbeG6q3UgbMOgIHThu6sgMzkuMTMlIMSR4bq/biA0MC43NSUuICAgDQogIA0KICBzYW1wbGUgZXN0aW1hdGUgcCA9IDAuMzk5Mzg4Mzogxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyB04burIG3huqt1IGzDoCAzOS45NCUuICAgDQogIA0KMy4qKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KiogICANCg0KKiDEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6ICAgDQpHaeG6oyB0aHV54bq/dCAkSF8wJDogVOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgdHJvbmcgdOG7lW5nIHRo4buDIGLhurFuZyAwLjc1ICgkSF8wOiBwPTAuNzUkLikgICANCkdp4bqjIHRodXnhur90ICRIXzEkOiBU4bu3IGzhu4cgdGjhu7FjIHPhu7EgY+G7p2Egbmjhu69uZyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHRyb25nIHThu5VuZyB0aOG7gyBraMOhYyAwLjc1ICgkSF8xOnBcbmVxIDAuNzUkKSAgIA0KDQoqIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3Q6ICAgDQogIFbhu5tpIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGPhu6dhIGjhuqFuZyBt4bulYyBOOiA1NjE1OyAgIA0KICBWw6AgdOG7lW5nIHPhu5EgcXVhbiBzw6F0OiAxNDA1OS4gICANCg0KYGBge3IsZWNobz1UUlVFfQ0KIyB0aOG7sWMgaGnhu4duIHByb3AudGVzdCB24bubaSBwPTAuNyAodOG7tyBs4buHIGdp4bqjIMSR4buLbmggZMaw4bubaSBIMCkNCnRlc3RfcmVzdWx0IDwtIHByb3AudGVzdCh4ID0gY291bnRfTiwgbiA9IHRvdGFsLCBwPTAuNzUsIGFsdGVybmF0aXZlPSJ0d28uc2lkZWQiKQ0KcHJpbnQoIkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90OiIpDQp0ZXN0X3Jlc3VsdA0KYGBgDQoqIELDoW8gY8OhbyBnacOhIHRy4buLIHAgdsOgIMSRxrBhIHJhIGvhur90IGx14bqtbiDhu58gbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQ6ICAgDQogIFThu7cgbOG7hyBt4bqrdSBwID0gMzksOTQlLiAgDQogIEdpw6EgdHLhu4sgcF92YWx1ZSA8IDIuMmUtMTYsIG3hu5l0IGNvbiBz4buRIGPhu7FjIGvhu7Mgbmjhu48gKGfhuqduIG5oxrAgYuG6sW5nIDApLiAgDQogIFbhu5tpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhJDogY2jDum5nIHRhIGNo4buNbiAkXGFscGhhPTAuMDUkLiAgIA0KICBTbyBzw6FuaCBwLXZhbHVlIHbhu5tpICRcYWxwaGE6IHAtdmFsdWUoPDIuMmUtMTYpPFxhbHBoYSgwLjA1KSQuICAgDQogIEvhur90IGx14bqtbjogdsOsIHAtdmFsdWUgbmjhu48gaMahbiBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYSQsIGNow7puZyB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuICAgDQogIFThu7cgbOG7hyBt4bqrdSAzOSw5NCUgY2jDqm5oIGzhu4djaCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHNvIHbhu5tpIGdp4bqjIHRodXnhur90IHThu7cgbOG7hyA1MCUsIGNobyB0aOG6pXkgY8OzIGLhurFuZyBjaOG7qW5nIMSR4buDIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcgdOG7tyBs4buHIHRo4buxYyBz4buxIHRyb25nIHThu5VuZyB0aOG7gyBraMO0bmcgcGjhuqNpIGzDoCA1MCUuICAgDQogIA0KKiBL4bq/dCBsdeG6rW46ICAgDQogIFZp4buHYyBiw6FjIGLhu48gJEhfMDpwPTAuNzUkIGPDsyBuZ2jEqWEgbMOgIGNow7puZyB0YSBraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgdOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCB0cm9uZyB04buVbmcgdGjhu4Mga2jDtG5nIGLhurFuZyA3MCUuICAgDQogIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIG7DoHksIGPDuW5nIHbhu5tpIMaw4bubYyBsxrDhu6NuZyDEkWnhu4NtIHThu6sgbeG6q3UgKDM5Ljk0JSkgdsOgIGtob+G6o25nIHRpbiBj4bqteSA5NSUgKDAuMzkxMjg1NSAwLjQwNzU0NjMpLCBjaG8gdGjhuqV5IHThu7cgbOG7hyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHRyw6puIHRo4buxYyB04bq/IGPDsyB24bq7IHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGNvbiBz4buRIDcwJSBtw6AgZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIMSRw6MgxJHhurd0IHJhLiDEkGnhu4F1IG7DoHkga2jhurNuZyDEkeG7i25oIHLhurFuZyBnaeG6oyDEkeG7i25oIGJhbiDEkeG6p3UgduG7gSB04bu3IGzhu4cgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBsw6AgNzAlIGzDoCBraMO0bmcgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdSBxdWFuIHPDoXQgxJHGsOG7o2MuICAgDQogIA0KIyMgKipCaeG6v24gR2VuZGVyKiogICANCg0KMS4qKljDoWMgxJHhu4tuaCBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtKio6IGjhuqFuZyBt4bulYyBO4buvIGPhu6dhIGJp4bq/biBHZW5kZXIuICAgDQoNCjIuKirGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPDonk6KiogICANCiAgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSBjaG8gdOG7tyBs4buHIGPhu6dhIGjhuqFuZyBt4bulYyBGIChO4buvKSB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlLiAgIA0KICANCmBgYHtyLGVjaG89VFJVRX0NCiMgxJDhur9tIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGPhu6dhIGjhuqFuZyBt4bulYyBODQpjb3VudF9GIDwtIHN1bShkMSRHZW5kZXIgPT0gIkYiKQ0KcHJpbnQoIlPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGPhu6dhIGjhuqFuZyBt4bulYyBGOiIpDQpjb3VudF9GDQoNCnByaW50KCJT4buRIHThu5VuZyBxdWFuIHPDoXQ6IikNCnRvdGFsDQoNCiMgVMOtbmgga2hv4bqjbmcgdGluIGPDonkNCnJlc3VsdDEgPC0gcHJvcC50ZXN0KHggPSBjb3VudF9GLCBuID0gdG90YWwsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KcHJpbnQoIktob+G6o25nIHRpbiBj4bqteToiKQ0KcmVzdWx0MQ0KDQpgYGANCiAgDQoqKkRp4buFbiBnaeG6o2kqKiAgIA0KKiBU4bu3IGzhu4cgbuG7ryB0cm9uZyBt4bqrdSBraOG6o28gc8OhdCBsw6AgNTElLiAgIA0KKiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCAoJ04nKSBsw6AgdOG7qyA1MC4xNyUgxJHhur9uIDUxLjgzJS4gICANCiogVOG7qWMgbMOgOiBDaMO6bmcgdGEgdOG7sSB0aW4gOTUlIHLhurFuZyB04bu3IGzhu4cgdGjhu7FjIHPhu7Egc+G7kSBuZ8aw4budaSBjw7MgZ2nhu5tpIHTDrW5oIG7hu68gdHJvbmcgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgNTAuMTclIMSR4bq/biA1MS44MyUuICAgDQogIA0KMy4qKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KiogICANCg0KKiDEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6ICAgDQpHaeG6oyB0aHV54bq/dCAkSF8wJDogVOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5nxrDhu51pIGPDsyBnaeG7m2kgdMOtbmggbuG7ryB0cm9uZyB04buVbmcgdGjhu4MgYuG6sW5nIDAuMyAoJEhfMDogcD0wLjMkLikgICANCkdp4bqjIHRodXnhur90ICRIXzEkOiBU4bu3IGzhu4cgdGjhu7FjIHPhu7EgY+G7p2EgbmfGsOG7nWkgY8OzIGdp4bubaSB0w61uaCBu4buvICB0cm9uZyB04buVbmcgdGjhu4Mga2jDoWMgMC4zICgkSF8xOnBcbmVxIDAuMyQpICAgDQoNCiogVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dDogICANCiAgVuG7m2kgc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgY+G7p2EgaOG6oW5nIG3hu6VjIEY6IDcxNzA7ICAgDQogIFbDoCB04buVbmcgc+G7kSBxdWFuIHPDoXQ6IDE0MDU5LiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQojIHRo4buxYyBoaeG7h24gcHJvcC50ZXN0IHbhu5tpIHA9MC4zICh04bu3IGzhu4cgZ2nhuqMgxJHhu4tuaCBkxrDhu5tpIEgwKQ0KdGVzdF9yZXN1bHQxIDwtIHByb3AudGVzdCh4ID0gY291bnRfRiwgbiA9IHRvdGFsLCBwPTAuMywgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIpDQpwcmludCgiS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3Q6IikNCnRlc3RfcmVzdWx0MQ0KYGBgDQoNCiogQsOhbyBjw6FvIGdpw6EgdHLhu4sgcCB2w6AgxJHGsGEgcmEga+G6v3QgbHXhuq1uIOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JDogICANCiAgVOG7tyBs4buHIG3huqt1IHAgPSA1MSUuICANCiAgR2nDoSB0cuG7iyBwX3ZhbHVlIDwgMi4yZS0xNiwgbeG7mXQgY29uIHPhu5EgY+G7sWMga+G7syBuaOG7jyAoZ+G6p24gbmjGsCBi4bqxbmcgMCkuICANCiAgVuG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGEkOiBjaMO6bmcgdGEgY2jhu41uICRcYWxwaGE9MC4wNSQuICAgDQogIFNvIHPDoW5oIHAtdmFsdWUgduG7m2kgJFxhbHBoYTogcC12YWx1ZSg8Mi4yZS0xNik8XGFscGhhKDAuMDUpJC4gICANCiAgS+G6v3QgbHXhuq1uOiB2w6wgcC12YWx1ZSBuaOG7jyBoxqFuIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhJCwgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gICANCiAgDQoqIEvhur90IGx14bqtbjogICANCiBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyB04bu3IGzhu4cgdGjhu7FjIHPhu7EgY+G7p2EgbmfGsOG7nWkgY8OzIGdp4bubaSB0w61uaCBu4buvIHRyb25nIHThu5VuZyB0aOG7gyBsw6Aga2jDoWMgMC4zLiAgICAgICANCiAgTsOzaSBjw6FjaCBraMOhYywgZOG7ryBsaeG7h3UgbeG6q3UgY+G7p2EgY2jDum5nIHRhIGNobyB0aOG6pXkgdOG7tyBs4buHIG7hu68gdHJvbmcgdOG7lW5nIHRo4buDIGtow7RuZyBwaOG6o2kgbMOgIDMwJS4gVHLDqm4gdGjhu7FjIHThur8sIHThu7cgbOG7hyDGsOG7m2MgdMOtbmggdHJvbmcgbeG6q3UgbMOgIDAuNTA5OTkzNiAoa2hv4bqjbmcgNTElKSwgdsOgIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyB0aOG7sWMgc+G7sSBsw6AgdOG7qyAwLjUwMTY5MzEgxJHhur9uIDAuNTE4Mjg4Niwga2jDtG5nIGNo4bupYSBnacOhIHRy4buLIDAuMy4gICANCiAgDQojIyAqKkJp4bq/biBDb3VudHJ5KiogICANCg0KMS4qKljDoWMgxJHhu4tuaCBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtKio6IGjhuqFuZyBt4bulYyBNZXhpY28gY+G7p2EgYmnhur9uIENvdW50cnkuICAgDQoNCjIuKirGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPDonk6KiogICANCiAgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSBjaG8gdOG7tyBs4buHIGPhu6dhIGjhuqFuZyBt4bulYyBNZXhpY28gduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JS4gICANCiAgDQpgYGB7cixlY2hvPVRSVUV9DQojIMSQ4bq/bSBz4buRIGzGsOG7o25nIHF1YW4gc8OhdCBj4bunYSBo4bqhbmcgbeG7pWMgTg0KY291bnRfTSA8LSBzdW0oZDEkQ291bnRyeSA9PSAiTWV4aWNvIikNCnByaW50KCJT4buRIGzGsOG7o25nIHF1YW4gc8OhdCBj4bunYSBo4bqhbmcgbeG7pWMgTWV4aWNvOiIpDQpjb3VudF9NDQoNCnByaW50KCJT4buRIHThu5VuZyBxdWFuIHPDoXQ6IikNCnRvdGFsDQoNCiMgVMOtbmgga2hv4bqjbmcgdGluIGPDonkNCnJlc3VsdDIgPC0gcHJvcC50ZXN0KHggPSBjb3VudF9NLCBuID0gdG90YWwsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KcHJpbnQoIktob+G6o25nIHRpbiBj4bqteToiKQ0KcmVzdWx0Mg0KDQpgYGANCiAgDQoqKkRp4buFbiBnaeG6o2kqKiAgIA0KKiBV4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgbmfGsOG7nWkg4bufIE1leGljbyB0cm9uZyBt4bqrdSBraOG6o28gc8OhdCBsw6AgMjYsMjMlLiAgIA0KKiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgdGjhu7FjIHPhu7EgY+G7p2EgaOG6oW5nIG3hu6VjIE1leGljbyB0cm9uZyB04buVbmcgdGjhu4MgbMOgIHThu6sgNTAuMTclIMSR4bq/biA1MS44MyUuICAgDQoqIFThu6ljIGzDoDogQ2jDum5nIHRhIHThu7EgdGluIDk1JSBy4bqxbmcgdOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIGjhuqFuZyBt4bulYyBNZXhpY28gdHJvbmcgdOG7lW5nIHRo4buDIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMjUuNTElIMSR4bq/biAyNi45NyUuICAgDQogIA0KMy4qKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KiogICANCg0KKiDEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6ICAgDQpHaeG6oyB0aHV54bq/dCAkSF8wJDogVOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5nxrDhu51pIGPDsyBnaeG7m2kgdMOtbmggbuG7ryB0cm9uZyB04buVbmcgdGjhu4MgYuG6sW5nIDAuOCAoJEhfMDogcD04JC4pICAgDQpHaeG6oyB0aHV54bq/dCAkSF8xJDogVOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5nxrDhu51pIGPDsyBnaeG7m2kgdMOtbmggbuG7ryAgdHJvbmcgdOG7lW5nIHRo4buDIGtow6FjIDAuOCAoJEhfMTpwXG5lcSAwLjgkKSAgIA0KDQoqIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3Q6ICAgDQogIFbhu5tpIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IGPhu6dhIGjhuqFuZyBt4bulYyBNZXhpY286IDM2ODg7ICAgDQogIFbDoCB04buVbmcgc+G7kSBxdWFuIHPDoXQ6IDE0MDU5LiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQojIHRo4buxYyBoaeG7h24gcHJvcC50ZXN0IHbhu5tpIHA9MC4zICh04bu3IGzhu4cgZ2nhuqMgxJHhu4tuaCBkxrDhu5tpIEgwKQ0KdGVzdF9yZXN1bHQyIDwtIHByb3AudGVzdCh4ID0gY291bnRfTSwgbiA9IHRvdGFsLCBwPTAuOCwgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIpDQpwcmludCgiS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3Q6IikNCnRlc3RfcmVzdWx0Mg0KYGBgDQoNCiogQsOhbyBjw6FvIGdpw6EgdHLhu4sgcCB2w6AgxJHGsGEgcmEga+G6v3QgbHXhuq1uIOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JDogICANCiAgVOG7tyBs4buHIG3huqt1IHAgPSAyNi4yMyUuICANCiAgR2nDoSB0cuG7iyBwX3ZhbHVlIDwgMi4yZS0xNiwgbeG7mXQgY29uIHPhu5EgY+G7sWMga+G7syBuaOG7jyAoZ+G6p24gbmjGsCBi4bqxbmcgMCkuICANCiAgVuG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGEkOiBjaMO6bmcgdGEgY2jhu41uICRcYWxwaGE9MC4wNSQuICAgDQogIFNvIHPDoW5oIHAtdmFsdWUgduG7m2kgJFxhbHBoYTogcC12YWx1ZSg8Mi4yZS0xNik8XGFscGhhKDAuMDUpJC4gICANCiAgS+G6v3QgbHXhuq1uOiB2w6wgcC12YWx1ZSBuaOG7jyBoxqFuIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhJCwgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gICANCiAgDQoqIEvhur90IGx14bqtbjogICANCiBL4bq/dCBsdeG6rW4gYsOhYyBi4buPIGdp4bqjIHRodXnhur90IFNIXzAkIGPDsyBuZ2jEqWEgbMOgIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyB0aOG7sWMgc+G7sSBj4bunYSBuZ8aw4budaSBjw7MgZ2nhu5tpIHTDrW5oIG7hu68gdHJvbmcgdOG7lW5nIHRo4buDIEtIw5RORyBwaOG6o2kgbMOgIDAuOCAgIA0KIA0KICBIxqFuIG7hu69hLCBk4buxYSB0csOqbiDGsOG7m2MgdMOtbmggbeG6q3UsIHThu7cgbOG7hyBuZ8aw4budaSBjw7MgZ2nhu5tpIHTDrW5oIG7hu68gdHJvbmcgbeG6q3UgbMOgIGtob+G6o25nIDAuMjYyIChob+G6t2MgMjYuMiUpLCB2w6Aga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHRo4buxYyBz4buxIHRyb25nIHThu5VuZyB0aOG7gyBsw6AgdOG7qyAwLjI1NSDEkeG6v24gMC4yNjkuIEdpw6EgdHLhu4sgMC44IGhvw6BuIHRvw6BuIG7hurFtIG5nb8OgaSBraG/huqNuZyB0aW4gY+G6rXkgbsOgeSwgY+G7p25nIGPhu5EgdGjDqm0ga+G6v3QgbHXhuq1uIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBudWxsLiAgIA0KICANCiMgKipQaOG6p24gNDogUGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBoYWkgYmnhur9uIMSR4buLbmggdMOtbmgqKiAgIA0KDQotIENo4buNbiBjw6FjIGPhurdwIGJp4bq/biDEkeG7i25oIHTDrW5oOiAgICANCiAgLSA8c3BhbiBzdHlsZT0iY29sb3I6IHB1cnBsZTsiPkdlbmRlcjwvc3Bhbj4gIHbDoCA8c3BhbiBzdHlsZT0iY29sb3I6IHB1cnBsZTsiPlByb2R1Y3RDYXRlZ29yeTwvc3Bhbj4uICAgDQogIC0gPHNwYW4gc3R5bGU9ImNvbG9yOiBwdXJwbGU7Ij5NYXJpdGFsU2F0dXM8L3NwYW4+ICB2w6AgPHNwYW4gc3R5bGU9ImNvbG9yOiBwdXJwbGU7Ij5Ib21ld25lcjwvc3Bhbj4uICAgDQogIC0gPHNwYW4gc3R5bGU9ImNvbG9yOiBwdXJwbGU7Ij5NYXJpdGFsU3RhdHVzPC9zcGFuPiAgdsOgIDxzcGFuIHN0eWxlPSJjb2xvcjogcHVycGxlOyI+UHJvZHVjdEZhbWlseTwvc3Bhbj4uICAgDQoNCiMjICoqR2VuZGVyIHbDoCBQcm9kdWN0Q2F0ZWdvcnkqKiAgIA0KDQojIyMgKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKiogICANCiogQ8OidSBo4buPaSDEkcaw4bujYyDEkeG6t3QgcmE6IFRow7NpIHF1YW4gbXVhIHPhuq9tIHRoZW8gZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY+G7p2EgbmFtIGdp4bubaSBjw7Mga2jDoWMgYmnhu4d0IHNvIHbhu5tpIG7hu68gZ2nhu5tpIGhheSBraMO0bmcuICAgDQoNCiogKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cixlY2hvPVRSVUV9DQojIHThuqFvIGLhuqNuZyB04bqnbiBz4buRIA0KczEgPC0gdGFibGUoIGQxJFByb2R1Y3RDYXRlZ29yeSwgZDEkR2VuZGVyKQ0KDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgaGnhu4NuIHRo4buLIGLhuqNuZyB04bqnbiBz4buRDQojIFThuqFvIGLhuqNuZyBjaMOpbyBk4bqhbmcgd2lkZQ0KZDIgPC0gYXMuZGF0YS5mcmFtZS5tYXRyaXgodGFibGUoIGQxJFByb2R1Y3RDYXRlZ29yeSwgZDEkR2VuZGVyKSkNCiMgVGjDqm0gY+G7mXQgUHJvZHVjdENhdGVnb3J5IHThu6sgcm93bmFtZXMNCg0KZDMgPC0gZDIgJT4lDQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJQcm9kdWN0Q2F0ZWdvcnkiKQ0KDQojIEhp4buDbiB0aOG7iyB24bubaSBkYXRhdGFibGUNCkRUOjpkYXRhdGFibGUoZDMsIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgYXV0b1dpZHRoID0gVFJVRSksY2FwdGlvbiA9ICJC4bqjbmcgc+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gdGhlbyB04burbmcgbG/huqFpIHbDoCBnaeG7m2kgdMOtbmgiKQ0KYGBgDQoNCiogQuG6o25nIHThuqduIHN14bqldDogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KaDEgPC0gcHJvcC50YWJsZShzMSwgbWFyZ2luID0gMikgKiAxMDANCmgxIDwtIHJvdW5kKGgxLDIpDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgaGnhu4NuIHRo4buLIGLhuqNuZyB04bqnbiBz4buRDQojIFThuqFvIGLhuqNuZyBjaMOpbyBk4bqhbmcgd2lkZQ0KcjEgPC0gYXMuZGF0YS5mcmFtZS5tYXRyaXgoaDEpDQojIFRow6ptIGPhu5l0IFByb2R1Y3RDYXRlZ29yeSB04burIHJvd25hbWVzDQpyMiA8LSByMSAlPiUNCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gIlByb2R1Y3RDYXRlZ29yeSIpDQoNCiMgSGnhu4NuIHRo4buLIHbhu5tpIGRhdGF0YWJsZQ0KRFQ6OmRhdGF0YWJsZShyMiwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBhdXRvV2lkdGggPSBUUlVFKSxjYXB0aW9uID0gIlThu7cgbOG7hyBwaMOibiBi4buRIGdp4bubaSB0w61uaCB0cm9uZyBt4buXaSBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSIpDQpgYGANCg0KKiBMw70gZG8gbOG7sWEgY2jhu41uIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IHRoZW8gdOG7tyBs4buHIHBo4bqnbiB0csSDbSB0aGVvIGPhu5l0ICB2w6wgbsOzIGdpw7pwIGNow7puZyB0YSBzbyBzw6FuaCBjxqEgY+G6pXUgbXVhIHPhuq9tIGhv4bq3YyBow6BuaCB2aSB0acOqdSBkw7luZyByacOqbmcgY+G7p2EgdOG7q25nIG5ow7NtIGdp4bubaSB0w61uaC4gICANCg0KICAqIFThu6ljIGzDoCBtdeG7kW4gYmnhur90IE5hbSBtdWEgbmjhu69uZyBnw6wsIHbDoCBO4buvIG11YSBuaOG7r25nIGfDrCwgdsOgIGxp4buHdSBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgdHJvbmcgZGFuaCBt4bulYyBow6BuZyBow7NhIG3DoCBt4buXaSBuaMOzbSBnaeG7m2kgdMOtbmggbsOgeSDGsHUgdGnDqm4gaGF5IGtow7RuZy4gIA0KICANCiAgKiBUw7NtIGzhuqFpOiBDaOG7jW4gdMOtbmggdGhlbyBj4buZdCBsw6AgxJHhu4MgaGnhu4N1IHLDtSBoxqFuIHbhu4EgdGjDs2kgcXVlbiB2w6AgxrB1IHRpw6puIG11YSBz4bqvbSBj4bunYSB04burbmcgZ2nhu5tpIHTDrW5oIG3hu5l0IGPDoWNoIHJpw6puZyBiaeG7h3QsIHNhdSDEkcOzIHNvIHPDoW5oIG5o4buvbmcgdGjDs2kgcXVlbiB2w6AgxrB1IHRpw6puIMSRw7MgZ2nhu69hIE5hbSB2w6AgTuG7ryDEkeG7gyB4w6FjIMSR4buLbmggeGVtIGPDsyBz4buxIGtow6FjIGJp4buHdCBoYXkga2jDtG5nLiAgIA0KICANCiMjIyAqKlRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cixlY2hvPVRSVUV9DQpnZ3Bsb3QoZDEsIGFlcyh4ID0gUHJvZHVjdENhdGVnb3J5LCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIEdp4bubaSB0w61uaCB0aGVvIERhbmggbeG7pWMgU+G6o24gcGjhuqltIiwNCiAgICAgICB4ID0gIkRhbmggbeG7pWMgU+G6o24gcGjhuqltIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmciLA0KICAgICAgIGZpbGwgPSAiR2nhu5tpIHTDrW5oIikgKyBjb29yZF9mbGlwKCkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyMgKipOaOG6rW4geMOpdDoqKiAgIA0KICAqIEPDsyB24bq7IG5oxrAgY8OzIHPhu7EgbGnDqm4ga+G6v3QgZ2nhu69hIGhhaSBiaeG6v24gbsOgeS4gxJBp4buBdSBuw6B5IMSRxrDhu6NjIHRo4buDIGhp4buHbiBxdWEgdmnhu4djIHBow6JuIGLhu5Ugc+G7kSBsxrDhu6NuZyBtdWEgc+G6o24gcGjhuqltIGPhu6dhIG5hbSB2w6AgbuG7ryBsw6Aga2jDoWMgbmhhdSDEkcOhbmcga+G7gyDhu58gbmhp4buBdSBkYW5oIG3hu6VjLCBjaOG7qSBraMO0bmcgcGjhuqNpIGzDoCDEkeG7k25nIMSR4buBdS4gICANCiAgKiDEkOG7kWkgduG7m2kgbeG7mXQgc+G7kSBkYW5oIG3hu6VjIG5oxrAgVmVnZXRhYmxlcyAoUmF1IGPhu6cpLCBTbmFjayBGb29kcyAoxJDhu5MgxINuIHbhurd0KSwgTWVhdCAoVGjhu4t0KSwgRnJvemVuIERlc3NlcnRzIChNw7NuIHRyw6FuZyBtaeG7h25nIMSRw7RuZyBs4bqhbmgpLCBEYWlyeSAoU+G6o24gcGjhuqltIHThu6sgc+G7r2EpLCBDYW5kbGVzIChO4bq/biksIGdp4bubaSB0w61uaCBO4buvIChGIC0gbcOgdSBjYW0pIGPDsyB4dSBoxrDhu5tuZyBtdWEgbmhp4buBdSBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGdp4bubaSB0w61uaCBOYW0gKE0gLSBtw6B1IHhhbmggbmfhu41jKS4gICAgICANCiAgDQogICogxJDhu5FpIHbhu5tpIG3hu5l0IHPhu5EgZGFuaCBt4bulYywgZ2nhu5tpIHTDrW5oIE5hbSAoTSAtIG3DoHUgeGFuaCBuZ+G7jWMpIGPDsyB4dSBoxrDhu5tuZyBtdWEgbmhp4buBdSBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGdp4bubaSB0w61uaCBO4buvIChGIC0gbcOgdSBjYW0pLiBEYW5oIG3hu6VjIG7hu5VpIGLhuq10IG5o4bqldCBsw6A6IERlY29uZ2VzdGFudHMgKFRodeG7kWMgdGjDtG5nIG3FqWkvdGh14buRYyBj4bqjbSkuIMSQw6J5IGzDoCBkYW5oIG3hu6VjIGPDsyBz4buxIGNow6puaCBs4buHY2ggcsO1IHLhu4d0IG5o4bqldCB24buBIHPhu5EgbMaw4bujbmcgbXVhLCB24bubaSBOYW0gbXVhIG5oaeG7gXUgaMahbiBO4buvIHLhuqV0IG5oaeG7gXUuICAgDQogIA0KICAqIEvhur90IGx14bqtbiBjaHVuZzogYmnhu4N1IMSR4buTIGNobyB0aOG6pXkgcsO1IHLDoG5nIHLhurFuZyBow6BuaCB2aSBtdWEgc+G6r20gY8OhYyBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGdp4bubaSB0w61uaCBOYW0gdsOgIE7hu68uIEPDsyBuaOG7r25nIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIMSRxrDhu6NjIG3hu5l0IGdp4bubaSB0w61uaCDGsGEgY2h14buZbmcgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBnaeG7m2kgdMOtbmggY8OybiBs4bqhaSwgdHJvbmcga2hpIOG7nyBt4buZdCBz4buRIGRhbmggbeG7pWMga2jDoWMsIHPhu7EgcGjDom4gYuG7lSBsw6AgdMawxqFuZyDEkeG7kWkgxJHhu5NuZyDEkeG7gXUuIMSQaeG7gXUgbsOgeSBn4bujaSDDvSBy4bqxbmcgZ2nhu5tpIHTDrW5oIGzDoCBt4buZdCB54bq/dSB04buRIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gbG/huqFpIHPhuqNuIHBo4bqpbSBtw6Aga2jDoWNoIGjDoG5nIGzhu7FhIGNo4buNbiBtdWEuICAgDQogDQojIyMgKipLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqioqICAgDQoNCiogKipQaMOhdCBiaeG7g3UgZ2nhuqMgdGh1eeG6v3Q6KiogICANCiAgKiBHaeG6oyB0aHV54bq/dCAkSF8wJDogSGFpIGJp4bq/biBHZW5kZXIgdsOgIFByb2R1Y3RDYXRlZ29yeSBsw6AgxJHhu5ljIGzhuq1wLiAgIA0KICAqIEdp4bqjIHRodXnhur90ICRIXzEkOiBIYWkgYmnhur9uIEdlbmRlciB2w6AgUHJvZHVjdENhdGVnb3J5IGzDoCBraMO0bmcgxJHhu5ljIGzhuq1wLiAgIA0KICANCmBgYHtyLGVjaG89VFJVRX0NCmNoaXNxLnRlc3QoczEpDQoNCmBgYA0KMS4qKkLDoW8gY8OhbyBnacOhIHRy4buLIENoaSAtIGLDrG5oIHBoxrDGoW5nLCBi4bqtYyB04buxIGRvIHbDoCBnacOhIHRy4buLIHA6KiogICAgICANCiAgKiBHacOhIHRy4buLIENoaSAtIGLDrG5oIHBoxrDGoW5nICh4LXNxdWFyZWQpOiA1MC40MDcuICAgIA0KICAqIELhuq1jIHThu7EgZG8gKGRmKTogNDQgICANCiAgKiBHacOhIHRy4buLIHAgKHAtdmFsdWUpOiAwLjIzNDkgICAgIA0KICANCjIuKipE4buxYSB2w6BvIGdpw6EgdHLhu4sgcCwgxJHGsGEgcmEga+G6v3QgbHXhuq1uIHbhu4EgdMOtbmggxJHhu5ljIGzhuq1wIGPhu6dhIGhhaSBiaeG6v24g4bufIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhPTAuMDUkOioqICAgDQogIA0KICAqIFNvIHPDoW5oIGdpw6EgdHLhu4sgcCAoMC4yMzQ5KSB24bubaSBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JC4gICANCiAgKiBWw6wgcC12YWx1ZSAoMC4yMzQ5KSA+ICRcYWxwaGEoMC4wNSkkLCBjaMO6bmcgdGEga2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nDoSB0aHV54bq/dCAkSF8wJC4gICANCiAgDQpL4bq/dCBsdeG6rW46IOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JCwga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7pyBt4bqhbmggxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSAuIEhhaSBiaeG6v24gbsOgeSBjw7MgdGjhu4MgxJHGsOG7o2MgZ+G7jWkgbMOgIMSR4buZYyBs4bqtcCB24buBIG3hurd0IHRo4buRbmcga8OqLiAgICAgDQoNCioqKg0KICANCiMjICoqTWFyaXRhbFNhdHVzIHbDoCBIb21ld25lcioqICAgDQoNCiogQ8OidSBo4buPaTogdHJvbmcgc+G7kSBuaOG7r25nIG5nxrDhu51pIGPDsyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gbMOgIMSRw6Mga+G6v3QgaMO0biB0aMOsIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY+G7p2EgaOG7jSBsw6AgYmFvIG5oacOqdT8gICAgDQoNCiMjIyAqKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qKiAgIA0KDQoNCmBgYHtyLGVjaG89VFJVRX0NCiMgdOG6oW8gYuG6o25nIHThuqduIHPhu5EgDQpzMiA8LSB0YWJsZSggZDEkTWFyaXRhbFN0YXR1cywgZDEkSG9tZW93bmVyKQ0KDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgaGnhu4NuIHRo4buLIGLhuqNuZyB04bqnbiBz4buRDQojIFThuqFvIGLhuqNuZyBjaMOpbyBk4bqhbmcgd2lkZQ0KZDIgPC0gYXMuZGF0YS5mcmFtZS5tYXRyaXgodGFibGUoIGQxJE1hcml0YWxTdGF0dXMsIGQxJEhvbWVvd25lcikpDQojIFRow6ptIGPhu5l0IE1hcml0YWxTdGF0dXMgdOG7qyByb3duYW1lcw0KDQpkMyA8LSBkMiAlPiUgDQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJNYXJpdGFsU3RhdHVzIikNCg0KIyBIaeG7g24gdGjhu4sgduG7m2kgZGF0YXRhYmxlDQpEVDo6ZGF0YXRhYmxlKGQzLCBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIGF1dG9XaWR0aCA9IFRSVUUpLGNhcHRpb24gPSAiQuG6o25nIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIHRoZW8gbmjDs20gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIikNCmBgYA0KDQoqIELhuqNuZyB04bqnbiBzdeG6pXQ6ICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCnIwIDwtIHByb3AudGFibGUoczIsIG1hcmdpbiA9IDEpICogMTAwDQpyMCA8LSByb3VuZChyMCwyKQ0KYGBgDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIGhp4buDbiB0aOG7iyBi4bqjbmcgdOG6p24gc+G7kQ0KIyBU4bqhbyBi4bqjbmcgY2jDqW8gZOG6oW5nIHdpZGUNCnIxIDwtIGFzLmRhdGEuZnJhbWUubWF0cml4KHIwKQ0KIyBUaMOqbSBj4buZdCBNYXJpdGFsU3RhdHVzIHThu6sgcm93bmFtZXMNCnIyIDwtIHIxICU+JQ0KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiTWFyaXRhbFN0YXR1cyIpDQoNCiMgSGnhu4NuIHRo4buLIHbhu5tpIGRhdGF0YWJsZQ0KRFQ6OmRhdGF0YWJsZShyMiwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBhdXRvV2lkdGggPSBUUlVFKSxjYXB0aW9uID0gIlThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgdHJvbmcgdOG7q25nIG5ow7NtIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiIpDQpgYGANCg0KICBN4bulYyB0acOqdSBj4bunYSBjw6J1IGjhu49pIGzDoCB0w6xtIGhp4buDdSBz4buxIHBow6JuIGLhu5UgY+G7p2Egdmnhu4djIHPhu58gaOG7r3UgbmjDoCB0cm9uZyBu4buZaSBi4buZIHThu6tuZyBuaMOzbSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4uIFThu7cgbOG7hyBwaOG6p24gdHLEg20gdGhlbyBow6BuZyBjdW5nIGPhuqVwIHRow7RuZyB0aW4gbsOgeSBt4buZdCBjw6FjaCB0cuG7sWMgdGnhur9wLCBjaG8gdGjhuqV5IMSR4buRaSB24bubaSBt4buXaSBuaMOzbSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4sIHThu7cgbOG7hyBiYW8gbmhpw6p1IHBo4bqnbiB0csSDbSBz4bufIGjhu691IG5ow6AgdsOgIGJhbyBuaGnDqnUgcGjhuqduIHRyxINtIGtow7RuZy4gICAgDQogIA0KICBUw61uaCB04bu3IGzhu4cgcGjhuqduIHRyxINtIHRoZW8gaMOgbmcgY2hvIHBow6lwIGLhuqFuIG5ow6xuIHbDoG8gdOG7tyBs4buHIGPhu6dhIG3hu5l0IHRodeG7mWMgdMOtbmggKHPhu58gaOG7r3UgbmjDoCkgdHJvbmcgbeG7mXQgbmjDs20gZMOibiBz4buRIGPhu6UgdGjhu4MgKG5o4buvbmcgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuKS4gICANCiAgDQojIyMgKipUcuG7pWMgcXVhbiBow7NhKiogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KZ2dwbG90KGQxLCBhZXMoeCA9IE1hcml0YWxTdGF0dXMsIGZpbGwgPSBIb21lb3duZXIpKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgVMOsbmggdHLhuqFuZyBIw7RuIG5ow6JuIHRoZW8gUXV54buBbiBT4bufIGjhu691IE5ow6AiLA0KICAgICAgIHggPSAiVMOsbmggdHLhuqFuZyBIw7RuIG5ow6JuIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmciLA0KICAgICAgIGZpbGwgPSAiQ2jhu6cgc+G7nyBo4buvdSBuaMOgIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCiAgDQpgYGANCg0KICANCiMjIyAqKk5o4bqtbiB4w6l0KiogICAgDQogICogQ8OzIHbhursgbmjGsCBjw7MgbeG7mXQgbeG7kWkgbGnDqm4ga+G6v3QgcsO1IHLDoG5nIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIHF1eeG7gW4gc+G7nyBo4buvdSBuaMOgLiBYdSBoxrDhu5tuZyBjaHVuZyBsw6Agbmjhu69uZyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSDEkeG7mWMgdGjDom4uICAgDQogIA0KICAqIMSQ4buRaSB24bubaSBuaMOzbSAixJDDoyBr4bq/dCBow7RuIiAoTSk6IHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIChZIC0gbcOgdSB4YW5oIG5n4buNYykgbOG7m24gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCAoTiAtIG3DoHUgY2FtKSwgY8OzIGjGoW4gNTAwMCBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gbMOgIGNo4bunIHPhu58gaOG7r3UgbmjDoCwgdHJvbmcga2hpIHPhu5EgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIG5oxrBuZyBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGNo4buJIGtob+G6o25nIDE3MDAtMTgwMC4gICANCiAgDQogICogxJDhu5FpIHbhu5tpIG5ow7NtICLEkOG7mWMgdGjDom4iIChTKTogc+G7kSBsxrDhu6NuZyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIChOIC0gbcOgdSBjYW0pIGzhuqFpIGNhbyBoxqFuIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIChZIC0gbcOgdSB4YW5oIG5n4buNYykuIEPDsyBraG/huqNuZyBn4bqnbiA0MDAwIG5nxrDhu51pIMSR4buZYyB0aMOibiBraMO0bmcgc+G7nyBo4buvdSBuaMOgLCB0cm9uZyBraGkgc+G7kSBuZ8aw4budaSDEkeG7mWMgdGjDom4gc+G7nyBo4buvdSBuaMOgIGzDoCBraG/huqNuZyAzMzAwLTM0MDAuICAgDQogIA0KICAqIEvhur90IGx14bqtbiBjaHVuZzogdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuICfEkMOjIGvhur90IGjDtG4nIMSRaSBrw6htIHbhu5tpIGto4bqjIG7Eg25nIGNhbyBoxqFuIG5oaeG7gXUgdHJvbmcgdmnhu4djIHPhu58gaOG7r3UgbmjDoCwgdHJvbmcga2hpIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAnxJDhu5ljIHRow6JuJyBs4bqhaSBjw7MgdOG7tyBs4buHIGtow7RuZyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4uIE3hu5FpIHF1YW4gaOG7hyBuw6B5IGzDoCBo4bujcCBsw70gdGhlbyBs4bq9IHRoxrDhu51uZywgdsOsIHZp4buHYyBr4bq/dCBow7RuIHRoxrDhu51uZyBsacOqbiBxdWFuIMSR4bq/biB2aeG7h2Mg4buVbiDEkeG7i25oIGN14buZYyBz4buRbmcsIGJhbyBn4buTbSBj4bqjIHZp4buHYyBtdWEgdsOgIHPhu58gaOG7r3UgdMOgaSBz4bqjbiBs4bubbiBuaMawIG5ow6Ag4bufLiAgICAgIA0KICANCiMjIyAqKktp4buDbSDEkeG7i25oIHRo4buRbmcga8OqKiogICANCg0KKiAqKlBow6F0IGJp4buDdSBnaeG6oyB0aHV54bq/dDoqKiAgIA0KICAqIEdp4bqjIHRodXnhur90ICRIXzAkOiBIYWkgYmnhur9uIE1hcml0YWxTYXR1cyB2w6AgSG9tZXduZXIgbMOgIMSR4buZYyBs4bqtcC4gICANCiAgKiBHaeG6oyB0aHV54bq/dCAkSF8xJDogSGFpIGJp4bq/biBNYXJpdGFsU2F0dXMgdsOgIEhvbWV3bmVyIGzDoCBraMO0bmcgxJHhu5ljIGzhuq1wLiAgIA0KICANCmBgYHtyLGVjaG89VFJVRX0NCmNoaXNxLnRlc3QoczIpDQoNCmBgYA0KMS4qKkLDoW8gY8OhbyBnacOhIHRy4buLIENoaSAtIGLDrG5oIHBoxrDGoW5nLCBi4bqtYyB04buxIGRvIHbDoCBnacOhIHRy4buLIHA6KiogICAgICANCiAgKiBHacOhIHRy4buLIENoaSAtIGLDrG5oIHBoxrDGoW5nICh4LXNxdWFyZWQpOiAxMjQxLjIuICAgDQogICogQuG6rWMgdOG7sSBkbyAoZGYpOiAxICANCiAgKiBHacOhIHRy4buLIHAgKHAtdmFsdWUpOiA8IDIuMmUtMTYNCiAgDQoyLioqROG7sWEgdsOgbyBnacOhIHRy4buLIHAsIMSRxrBhIHJhIGvhur90IGx14bqtbiB24buBIHTDrW5oIMSR4buZYyBs4bqtcCBj4bunYSBoYWkgYmnhur9uIOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JDoqKiAgIA0KICANCiAgKiBTbyBzw6FuaCBnacOhIHRy4buLIHAgKDwgMi4yZS0xNikgduG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQuICAgDQogICogVsOsIHAtdmFsdWUgKDwgMi4yZS0xNikgPCAkXGFscGhhKDAuMDUpJCwgY2jDum5nIHRhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nDoSB0aHV54bq/dCAkSF8wJC4gICANCiAgDQpL4bq/dCBsdeG6rW46IOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JCwgY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4bunIG3huqFuaCDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIC4gSGFpIGJp4bq/biBuw6B5IGPDsyB0aOG7gyDEkcaw4bujYyBn4buNaSBsw6AgIGtow7RuZyDEkeG7mWMgbOG6rXAgIHbhu4EgbeG6t3QgdGjhu5FuZyBrw6ouICAgICANCg0KMy4qKlRo4bqjbyBsdeG6rW4gduG7gSBi4bqjbiBjaOG6pXQgY+G7p2EgbeG7kWkgcXVhbiBo4buHKiogICANCg0KICBC4bqjbiBjaOG6pXQgY+G7p2EgbeG7kWkgcXVhbiBo4buHIG7DoHkgbMOgIG3hu5l0IHPhu7EgdMawxqFuZyBwaOG6o24gcsO1IG7DqXQ6IHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAixJDDoyBr4bq/dCBow7RuIiDEkWkga8OobSB24bubaSBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4gxJHDoW5nIGvhu4MsIHRyb25nIGtoaSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gIsSQ4buZYyB0aMOibiIgY8OzIHThu7cgbOG7hyBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuLiDEkGnhu4F1IG7DoHkgbmjhuqV0IHF1w6FuIHbhu5tpIGPDoWMgcXVhbiBzw6F0IHjDoyBo4buZaSB0aMO0bmcgdGjGsOG7nW5nLCBuxqFpIHZp4buHYyDhu5VuIMSR4buLbmggZ2lhIMSRw6xuaCB0aMaw4budbmcgZ+G6r24gbGnhu4FuIHbhu5tpIGPDoWMgcXV54bq/dCDEkeG7i25oIHTDoGkgY2jDrW5oIHF1YW4gdHLhu41uZyBuaMawIHZp4buHYyBtdWEgdsOgIHPhu58gaOG7r3UgbmjDoC4gICANCg0KDQojIyAqKk1hcml0YWxTdGF0dXMgdsOgIFByb2R1Y3RGYW1pbHkqKiAgIA0KDQojIyMgKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioNCg0KKiBDw6J1IGjhu49pOiBuaOG7r25nIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biB0aMaw4budbmcgbXVhIG5o4buvbmcgbmjDs20gc+G6o24gcGjhuqltIG7DoG8/ICAgICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCiMgdOG6oW8gYuG6o25nIHThuqduIHPhu5EgDQplIDwtIHRhYmxlKCBkMSRNYXJpdGFsU3RhdHVzLCBkMSRQcm9kdWN0RmFtaWx5KQ0KDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgaGnhu4NuIHRo4buLIGLhuqNuZyB04bqnbiBz4buRDQojIFThuqFvIGLhuqNuZyBjaMOpbyBk4bqhbmcgd2lkZQ0KZTIgPC0gYXMuZGF0YS5mcmFtZS5tYXRyaXgodGFibGUoIGQxJE1hcml0YWxTdGF0dXMsIGQxJFByb2R1Y3RGYW1pbHkpKQ0KIyBUaMOqbSBj4buZdCBNYXJpdGFsU3RhdHVzIHThu6sgcm93bmFtZXMNCg0KZTMgPC0gZTIgJT4lIA0KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiTWFyaXRhbFN0YXR1cyIpDQoNCiMgSGnhu4NuIHRo4buLIHbhu5tpIGRhdGF0YWJsZQ0KRFQ6OmRhdGF0YWJsZShlMywgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBhdXRvV2lkdGggPSBUUlVFKSxjYXB0aW9uID0gIkLhuqNuZyBz4buRIGzGsOG7o25nIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biB0aGVvIG5ow7NtIHPhuqNuIHBo4bqpbSIpDQpgYGANCg0KKiBC4bqjbmcgdOG6p24gc3XhuqV0OiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQplMCA8LSBwcm9wLnRhYmxlKGUsIG1hcmdpbiA9IDIpICogMTAwDQplMCA8LSByb3VuZChlMCwyKQ0KYGBgDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIGhp4buDbiB0aOG7iyBi4bqjbmcgdOG6p24gc+G7kQ0KIyBU4bqhbyBi4bqjbmcgY2jDqW8gZOG6oW5nIHdpZGUNCmUxIDwtIGFzLmRhdGEuZnJhbWUubWF0cml4KGUwKQ0KIyBUaMOqbSBj4buZdCBNYXJpdGFsU3RhdHVzIHThu6sgcm93bmFtZXMNCmU0IDwtIGUxICU+JQ0KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiTWFyaXRhbFN0YXR1cyIpDQoNCiMgSGnhu4NuIHRo4buLIHbhu5tpIGRhdGF0YWJsZQ0KRFQ6OmRhdGF0YWJsZShlNCwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBhdXRvV2lkdGggPSBUUlVFKSxjYXB0aW9uID0gIlThu7cgbOG7hyBwaOG6p24gdHLEg20gbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIHRoZW8gdOG7q25nIG5ow7NtIHPhuqNuIHBo4bqpbSIpDQpgYGANCg0KICBWaeG7h2MgdMOtbmggdG/DoW4gdOG7tyBs4buHIHBo4bqnbiB0csSDbSB0aGVvIGPhu5l0LCBt4buXaSDDtCBz4bq9IGNobyBiaeG6v3Q6ICJUcm9uZyB04buVbmcgc+G7kSBsxrDhu6N0IG11YSBj4bunYSBuaMOzbSBz4bqjbiBwaOG6qW0gWCAodsOtIGThu6U6IERyaW5rKSwgYmFvIG5oacOqdSBwaOG6p24gdHLEg20gxJHGsOG7o2MgdGjhu7FjIGhp4buHbiBi4bufaSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gKE0pIHbDoCBiYW8gbmhpw6p1IHBo4bqnbiB0csSDbSDEkcaw4bujYyB0aOG7sWMgaGnhu4duIGLhu59pIG5nxrDhu51pIMSR4buZYyB0aMOibiAoUykuIiAgIA0KICANCiMjIyoqVHLhu7FjIHF1YW4gaMOzYSoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCg0KZ2dwbG90KGQxLCBhZXMoeCA9IE1hcml0YWxTdGF0dXMsIGZpbGwgPSBQcm9kdWN0RmFtaWx5KSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIFTDrG5oIHRy4bqhbmcgSMO0biBuaMOibiB0aGVvIEjhu40gU+G6o24gcGjhuqltIiwNCiAgICAgICB4ID0gIlTDrG5oIHRy4bqhbmcgSMO0biBuaMOibiIsDQogICAgICAgeSA9ICJT4buRIGzGsOG7o25nIiwNCiAgICAgICBmaWxsID0gIkjhu40gU+G6o24gcGjhuqltIikgKw0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCg0KIyMjICoqTmjhuq1uIHjDqXQ6KiogICANCiAgKiBDw7MgduG6uyBuaMawIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgdHJvbmcgY8ahIGPhuqV1IG11YSBz4bqvbSBjw6FjIG5ow7NtIHPhuqNuIHBo4bqpbSBjaMOtbmggZ2nhu69hIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biAoTSkgdsOgIG5nxrDhu51pIMSR4buZYyB0aMOibiAoUykuIE3hu5FpIGxpw6puIGvhur90IGdp4buvYSBoYWkgYmnhur9uIG7DoHkgZMaw4budbmcgbmjGsCBraMO0bmcgbeG6oW5oIG3hur0sIGhv4bq3YyDDrXQgbmjhuqV0IGzDoCBraMO0bmcgY2hvIHRo4bqleSB4dSBoxrDhu5tuZyBtdWEgc+G6r20gcuG6pXQga2jDoWMgYmnhu4d0IGThu7FhIHRyw6puIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibi4gICANCiAgDQogICogxJDhu5FpIHbhu5tpIGPhuqMgaGFpIG5ow7NtIFTDrG5oIHRy4bqhbmcgSMO0biBuaMOibiAoTSB2w6AgUyk6DQogIA0KICAgICogTmjDs20gc+G6o24gcGjhuqltIEZvb2QgKFRo4buxYyBwaOG6qW0gLSBtw6B1IHhhbmggbMOhIGPDonkpIGNoaeG6v20gdOG7tyBs4buHIMOhcCDEkeG6o28gduG7gSBz4buRIGzGsOG7o25nIG11YS4gQ+G6oyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gdsOgIG5nxrDhu51pIMSR4buZYyB0aMOibiDEkeG7gXUgbXVhIGzGsOG7o25nIHRo4buxYyBwaOG6qW0gcuG6pXQgbOG7m24sIHbhu5tpIHPhu5EgbMaw4bujbmcgxJHhu4F1IHRyw6puIDUwMDAgxJHGoW4gduG7iy4gICANCiAgICANCiAgICAqIE5ow7NtIHPhuqNuIHBo4bqpbSBOb24tQ29uc3VtYWJsZSAoS2jDtG5nIHRpw6p1IHRo4bulIC0gbcOgdSB4YW5oIGTGsMahbmcpIMSR4bupbmcgdGjhu6kgaGFpIHbhu4Egc+G7kSBsxrDhu6NuZyBtdWEsIHbhu5tpIHPhu5EgbMaw4bujbmcgbXVhIGPhu6dhIGPhuqMgaGFpIG5ow7NtIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiDEkeG7gXUgZGFvIMSR4buZbmcgcXVhbmggbeG7qWMgMTMwMC4gICANCiAgICANCiAgICAqIE5ow7NtIHPhuqNuIHBo4bqpbSBEcmluayAoxJDhu5MgdeG7kW5nIC0gbcOgdSDEkeG7jykgY8OzIHPhu5EgbMaw4bujbmcgbXVhIMOtdCBuaOG6pXQgdHJvbmcgYmEgbmjDs20sIHbhu5tpIHPhu5EgbMaw4bujbmcgY+G7p2EgY+G6oyBoYWkgbmjDs20gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIMSR4buBdSDhu58gbeG7qWMga2hv4bqjbmcgNjAwLTcwMC4NCiAgDQogICogS+G6v3QgbHXhuq1uIGNodW5nOiBt4bq3YyBkw7kgY8OzIHRo4buDIGPDsyBt4buZdCBjaMO6dCBjaMOqbmggbOG7h2NoIG5o4buPIHbhu4Egc+G7kSBsxrDhu6NuZyB0dXnhu4d0IMSR4buRaSDhu58gbeG7mXQgc+G7kSBkYW5oIG3hu6VjLCBuaMawbmcgY8ahIGPhuqV1IG11YSBz4bqvbSBjaMOtbmggKHThu7cgdHLhu41uZyBj4bunYSB04burbmcgbG/huqFpIHPhuqNuIHBo4bqpbSB0cm9uZyB04buVbmcgZ2nhu48gaMOgbmcpIGTGsOG7nW5nIG5oxrAgcuG6pXQgZ2nhu5FuZyBuaGF1IGdp4buvYSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gdsOgIG5nxrDhu51pIMSR4buZYyB0aMOibi4gQ+G6oyBoYWkgbmjDs20gxJHhu4F1IHThuq1wIHRydW5nIG11YSBUaOG7sWMgcGjhuqltIGzDoCBjaMOtbmgsIHRp4bq/cCB0aGVvIGzDoCBOb24tQ29uc3VtYWJsZSwgdsOgIGN14buRaSBjw7luZyBsw6AgxJDhu5MgdeG7kW5nLiDEkGnhu4F1IG7DoHkgZ+G7o2kgw70gcuG6sW5nIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjw7MgdGjhu4Mga2jDtG5nIHBo4bqjaSBsw6AgeeG6v3UgdOG7kSBxdXnhur90IMSR4buLbmggbeG6oW5oIG3hur0gxJHhur9uIHZp4buHYyBs4buxYSBjaOG7jW4gY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gY2jDrW5oIG7DoHkuICAgDQogIA0KIyMjICoqS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6oqKiAgIA0KDQoqICoqUGjDoXQgYmnhu4N1IGdp4bqjIHRodXnhur90OioqICAgDQogICogR2nhuqMgdGh1eeG6v3QgJEhfMCQ6IEhhaSBiaeG6v24gTWFyaXRhbFN0YXR1cyB2w6AgUHJvZHVjdEZhbWlseSBsw6AgxJHhu5ljIGzhuq1wLiAgIA0KICAqIEdp4bqjIHRodXnhur90ICRIXzEkOiBIYWkgYmnhur9uIE1hcml0YWxTdGF0dXMgdsOgIFByb2R1Y3RGYW1pbHkgbMOgIGtow7RuZyDEkeG7mWMgbOG6rXAuICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0KY2hpc3EudGVzdChlKQ0KDQpgYGANCjEuKipCw6FvIGPDoW8gZ2nDoSB0cuG7iyBDaGkgLSBiw6xuaCBwaMawxqFuZywgYuG6rWMgdOG7sSBkbyB2w6AgZ2nDoSB0cuG7iyBwOioqICAgICAgDQogICogR2nDoSB0cuG7iyBDaGkgLSBiw6xuaCBwaMawxqFuZyAoeC1zcXVhcmVkKTogMS4xNjE3LiAgIA0KICAqIELhuq1jIHThu7EgZG8gKGRmKTogMiAgDQogICogR2nDoSB0cuG7iyBwIChwLXZhbHVlKTowLjU1OTQNCiAgDQoyLioqROG7sWEgdsOgbyBnacOhIHRy4buLIHAsIMSRxrBhIHJhIGvhur90IGx14bqtbiB24buBIHTDrW5oIMSR4buZYyBs4bqtcCBj4bunYSBoYWkgYmnhur9uIOG7nyBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JDoqKiAgIA0KICANCiAgKiBTbyBzw6FuaCBnacOhIHRy4buLIHAgKDAuNTU5NCkgduG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQuICAgDQogICogVsOsIHAtdmFsdWUgKDAuNTU5NCkgPCAkXGFscGhhKDAuMDUpJCwgY2jDum5nIGtow7RuZyB0YSBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdpw6EgdGh1eeG6v3QgJEhfMCQuICAgICAgDQogIA0KS+G6v3QgbHXhuq1uOiDhu58gbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQsIGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu6cgbeG6oW5oIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gLiBIYWkgYmnhur9uIG7DoHkgY8OzIHRo4buDIMSRxrDhu6NjIGfhu41pIGzDoCAgxJHhu5ljIGzhuq1wICB24buBIG3hurd0IHRo4buRbmcga8OqLiAgICAgDQoNCiMgKipQaOG6p24gNTogVOG7lW5nIGvhur90IHbDoCB0aOG6o28gbHXhuq1uKiogICANCg0KDQojIyAqKlTDs20gdOG6r3Qgbmjhu69uZyBwaMOhdCBoaeG7h24gY2jDrW5oKiogICANCg0KKiAqKsSQ4bq3YyDEkWnhu4NtIHBow6JuIGLhu5EgY+G7p2EgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaDoqKiAgIA0KICANCiAgKiBHZW5kZXI6IFThuq1wIGThu68gbGnhu4d1IGPDsyBz4buxIHBow6JuIGLhu5UgZ2nhu5tpIHTDrW5oIGtow6EgY8OibiBi4bqxbmcsIHbhu5tpIE7hu68gKEYpIGNoaeG6v20ga2hv4bqjbmcgNTElIHbDoCBOYW0gKE0pIGNoaeG6v20gNDklIHThu5VuZyBz4buRIHF1YW4gc8OhdC4gxJBp4buBdSBuw6B5IHRodeG6rW4gbOG7o2kgY2hvIHZp4buHYyBwaMOibiB0w61jaCwgxJHhuqNtIGLhuqNvIGtow7RuZyBjw7Mgc+G7sSBt4bqldCBjw6JuIGLhurFuZyDEkcOhbmcga+G7gyB24buBIGdp4bubaSB0w61uaCBsw6BtIHNhaSBs4buHY2gga+G6v3QgcXXhuqMuICAgDQogIA0KICAqIEhvbWVvd25lcjogQ8OzIHPhu7EgY2jDqm5oIGzhu4djaCByw7UgcuG7h3QgduG7gSBxdXnhu4FuIHPhu58gaOG7r3UgbmjDoC4gS2hv4bqjbmcgNjAuMDYlIGPDoSBuaMOibiB0cm9uZyBk4buvIGxp4buHdSBsw6AgY2jhu6cgc+G7nyBo4buvdSBuaMOgIChZKSwgdHJvbmcga2hpIDM5Ljk0JSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIChOKS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIGPDoWMgY8OhIG5ow6JuIMSRxrDhu6NjIGdoaSBuaOG6rW4gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgbsOgeSBsw6Agbmjhu69uZyBuZ8aw4budaSDEkcOjIGPDsyB0w6BpIHPhuqNuIG5ow6Ag4bufLiAgIA0KICANCiAgKiBNYXJpdGFsU3RhdHVzOiBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8WpbmcgY8OzIHPhu7EgY8OibiBi4bqxbmcgdMawxqFuZyDEkeG7kWkgZ2nhu69hIG5ow7NtIMSQw6Mga+G6v3QgaMO0biAoTSkgdsOgIMSQ4buZYyB0aMOibiAoUyksIHbhu5tpIMSQ4buZYyB0aMOibiBjaGnhur9tIGtob+G6o25nIDUxLjE3JSB2w6AgxJDDoyBr4bq/dCBow7RuIGNoaeG6v20gNDguODMlIHThu5VuZyBz4buRIHF1YW4gc8OhdC4gVOG7tyBs4buHIG7DoHkgZ+G6p24gMToxLCB0aHXhuq1uIGzhu6NpIGNobyB2aeG7h2MgcGjDom4gdMOtY2ggbeG7kWkgbGnDqm4gaOG7hy4gICANCiAgDQogICogQW5udWFsSW5jb21lOiBUaHUgbmjhuq1wIGjDoG5nIG7Eg20gY8OzIHPhu7EgcGjDom4gYuG7lSBs4buHY2ggduG7gSBwaMOtYSBjw6FjIGtob+G6o25nIHRodSBuaOG6rXAgdGjhuqVwIHbDoCB0cnVuZyBiw6xuaC4gS2hv4bqjbmcgJDMwSyAtICQ1MEsgY2hp4bq/bSB04bu3IGzhu4cgbOG7m24gbmjhuqV0IChraG/huqNuZyAzMi43MyUpLCB0aeG6v3AgdGhlbyBsw6AgJDEwSyAtICQzMEsgKGtob+G6o25nIDIxLjk4JSkuIEPDoWMga2hv4bqjbmcgdGh1IG5o4bqtcCBjYW8gaMahbiBuaMawICQxMTBLIC0gJDEzMEsgdsOgICQxNTBLKyBjaGnhur9tIHThu7cgbOG7hyBy4bqldCBuaOG7jy4gxJBp4buBdSBuw6B5IG5n4bulIMO9IHLhurFuZyDEkeG7kWkgdMaw4bujbmcga2jDoWNoIGjDoG5nIGNo4bunIHnhur91IHThuq1wIHRydW5nIHbDoG8gY8OhYyBjw6EgbmjDom4gY8OzIG3hu6ljIHRodSBuaOG6rXAgdGjhuqVwIHbDoCB0cnVuZyBiw6xuaC4gICANCiAgDQoqICoqTeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oOioqICAgDQoNCiAgKiBHZW5kZXIgdsOgIFByb2R1Y3RDYXRlZ29yeTogROG7sWEgdHLDqm4ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIChYLXNxdWFyZWQgPSA1MC40MDcsIGRmID0gNDQsIHAtdmFsdWUgPSAwLjIzNDkpLCB24bubaSBwLXZhbHVlIGzhu5tuIGjGoW4gzrE9MC4wNSwga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7pyBt4bqhbmggxJHhu4Mga+G6v3QgbHXhuq1uIGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIGRhbmggbeG7pWMgc+G6o24gcGjhuqltLiBIYWkgYmnhur9uIG7DoHkgY8OzIHRo4buDIMSRxrDhu6NjIGNvaSBsw6AgxJHhu5ljIGzhuq1wLiBN4bq3YyBkw7kgY8OzIG5o4buvbmcga2jDoWMgYmnhu4d0IHF1YW4gc8OhdCDEkcaw4bujYyB24buBIG3hurd0IHPhu5EgbMaw4bujbmcgbXVhIOG7nyBt4buZdCBz4buRIGRhbmggbeG7pWMgKHbDrSBk4bulIE7hu68gbXVhIHJhdSBj4bunLCDEkeG7kyDEg24gduG6t3Qgbmhp4buBdSBoxqFuLCBOYW0gbXVhIHRodeG7kWMgdGjDtG5nIG3FqWkgbmhp4buBdSBoxqFuKSwgbmjGsG5nIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkga2jDtG5nIMSR4bunIGzhu5tuIMSR4buDIMSRxrDhu6NjIGNvaSBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gICANCiAgDQogICogTWFyaXRhbFN0YXR1cyB2w6AgSG9tZW93bmVyOiBE4buxYSB0csOqbiBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKFgtc3F1YXJlZCA9IDEyNDEuMiwgZGYgPSAxLCBwLXZhbHVlIDwgMi4yZS0xNiksIHbhu5tpIHAtdmFsdWUgY+G7sWMga+G7syBuaOG7jyAoZ+G6p24gbmjGsCBi4bqxbmcgMCksIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBj4buxYyBr4buzIG3huqFuaCBt4bq9IMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCDEkeG7mWMgbOG6rXAuIMSQaeG7gXUgbsOgeSBraOG6s25nIMSR4buLbmggY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBxdXnhu4FuIHPhu58gaOG7r3UgbmjDoC4gQuG6o24gY2jhuqV0IGPhu6dhIG3hu5FpIHF1YW4gaOG7hyBuw6B5IGzDoCBuaOG7r25nIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw7MgeHUgaMaw4bubbmcgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgxJHhu5ljIHRow6JuLiAgIA0KICANCiAgKiBNYXJpdGFsU3RhdHVzIHbDoCBQcm9kdWN0RmFtaWx5OiBE4buxYSB0csOqbiBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKFgtc3F1YXJlZCA9IDEuMTYxNywgZGYgPSAyLCBwLXZhbHVlID0gMC41NTk0KSwgduG7m2kgcC12YWx1ZSBs4bubbiBoxqFuIM6xPTAuMDUsIGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu6cgbeG6oW5oIMSR4buDIGvhur90IGx14bqtbiBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBuaMOzbSBz4bqjbiBwaOG6qW0uIEhhaSBiaeG6v24gbsOgeSBjw7MgdGjhu4MgxJHGsOG7o2MgY29pIGzDoCDEkeG7mWMgbOG6rXAuIFF1YW4gc8OhdCB04burIGJp4buDdSDEkeG7kyBjxaluZyBjaG8gdGjhuqV5IGPhuqMgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIHbDoCBuZ8aw4budaSDEkeG7mWMgdGjDom4gxJHhu4F1IGPDsyBtw7QgaMOsbmggbXVhIHPhuq9tIHTGsMahbmcgdOG7sSBuaGF1LCB04bqtcCB0cnVuZyBjaOG7pyB54bq/dSB2w6BvIG5ow7NtIEZvb2QsIHNhdSDEkcOzIGzDoCBOb24tQ29uc3VtYWJsZSB2w6AgY3Xhu5FpIGPDuW5nIGzDoCBEcmluay4gICANCiAgDQojIyAqKkjhuqFuIGNo4bq/IGPhu6dhIHBow6JuIHTDrWNoKiogICANCg0KKiBHaeG7m2kgaOG6oW4gY+G7p2Egdmnhu4djIGNo4buJIHBow6JuIHTDrWNoIGJp4bq/biDEkeG7i25oIHTDrW5oOiBQaMOibiB0w61jaCBuw6B5IGNo4buJIHThuq1wIHRydW5nIHbDoG8gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCB2w6AgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjaMO6bmcuIFZp4buHYyBraMO0bmcga+G6v3QgaOG7o3AgY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyAodsOtIGThu6U6IHPhu5EgdGnhu4FuIGNoaSB0acOqdSwgc+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gbXVhIGPhu6UgdGjhu4MpIGPDsyB0aOG7gyBo4bqhbiBjaOG6vyBjaGnhu4F1IHPDonUgY+G7p2EgY8OhYyBwaMOhdCBoaeG7h24gduG7gSBow6BuaCB2aSBtdWEgc+G6r20uICAgDQoNCiogVGhp4bq/dSB0aMO0bmcgdGluIG5n4buvIGPhuqNuaDogUGjDom4gdMOtY2gga2jDtG5nIGPDsyB0aMO0bmcgdGluIHbhu4EgbeG7pWMgdGnDqnUga2luaCBkb2FuaCBj4bulIHRo4buDIGPhu6dhIGRvYW5oIG5naGnhu4dwLCBsb+G6oWkgaMOsbmggc+G6o24gcGjhuqltLCBoYXkgdGjhu4sgdHLGsOG7nW5nIG3hu6VjIHRpw6p1LCDEkWnhu4F1IG7DoHkgY8OzIHRo4buDIGjhuqFuIGNo4bq/IGto4bqjIG7Eg25nIMSRxrBhIHJhIGPDoWMgxJHhu4EgeHXhuqV0IGNoaeG6v24gbMaw4bujYyBjaGkgdGnhur90IHbDoCBwaMO5IGjhu6NwIG5o4bqldC4gICAgDQoNCiMjICoqxJDhu4EgeHXhuqV0KiogICANCg0KVuG7gSBjaGnhur9uIGzGsOG7o2MgbWFya2V0aW5nIHbDoCBwaMOibiBsb+G6oWkgc+G6o24gcGjhuqltOiAgIA0KDQoqIEdp4bubaSB0w61uaCB2w6AgRGFuaCBt4bulYyBz4bqjbiBwaOG6qW06IERvIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0sIGRvYW5oIG5naGnhu4dwIGPDsyB0aOG7gyBjw6JuIG5o4bqvYyBraMO0bmcgY+G6p24gcGjhuqNpIHTDuXkgY2jhu4luaCBxdcOhIHPDonUgY8OhYyBjaGnhur9uIGzGsOG7o2MgbWFya2V0aW5nIHPhuqNuIHBo4bqpbSB0aGVvIGdp4bubaSB0w61uaCBjaG8gY8OhYyBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBy4buZbmcgbsOgeS4gVGhheSB2w6BvIMSRw7MsIHThuq1wIHRydW5nIHbDoG8gxJHhurdjIMSRaeG7g20gY+G7p2EgYuG6o24gdGjDom4gc+G6o24gcGjhuqltIGhv4bq3YyBjw6FjIHnhur91IHThu5Ega2jDoWMuICAgDQoNCiogVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBT4bufIGjhu691IG5ow6A6IMSQw6J5IGzDoCBt4buZdCBt4buRaSBsacOqbiBo4buHIG3huqFuaCBt4bq9LiBEb2FuaCBuZ2hp4buHcCBraW5oIGRvYW5oIGPDoWMgc+G6o24gcGjhuqltL2Thu4tjaCB24bulIGxpw6puIHF1YW4gxJHhur9uIG5ow6Ag4bufICh2w60gZOG7pTogxJHhu5MgZ2lhIGThu6VuZywgbuG7mWkgdGjhuqV0LCBk4buLY2ggduG7pSBi4bqjbyB0csOsIG5ow6AgY+G7rWEsIHPhuqNuIHBo4bqpbSB0acOqdSBkw7luZyBnaWEgxJHDrG5oIHPhu5EgbMaw4bujbmcgbOG7m24pIGPDsyB0aOG7gyBuaOG6r20gbeG7pWMgdGnDqnUgbeG6oW5oIG3hur0gdsOgbyBuaMOzbSBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuLiBDw7MgdGjhu4MgdGhp4bq/dCBr4bq/IGPDoWMgZ8OzaSBz4bqjbiBwaOG6qW0sIGNoxrDGoW5nIHRyw6xuaCBraHV54bq/biBtw6NpIGTDoG5oIHJpw6puZyBjaG8gY8OhYyBnaWEgxJHDrG5oIGhv4bq3YyBjaOG7pyBuaMOgLiAgIA0KDQoqIFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6AgTmjDs20gc+G6o24gcGjhuqltOiBEbyBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIG5ow7NtIHPhuqNuIHBo4bqpbSAoRHJpbmssIEZvb2QsIE5vbi1Db25zdW1hYmxlKSwgY8OhYyBjaGnhur9uIGzGsOG7o2MgcGjDom4gbG/huqFpIHbDoCB0aeG6v3AgdGjhu4sgY2hvIGPDoWMgbmjDs20gc+G6o24gcGjhuqltIHLhu5luZyBuw6B5IGPDsyB0aOG7gyBraMO0bmcgY+G6p24gcGjhuqNpIHF1w6Ega2jDoWMgYmnhu4d0IGdp4buvYSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gdsOgIG5nxrDhu51pIMSR4buZYyB0aMOibi4gQ+G6oyBoYWkgbmjDs20gxJHhu4F1IGzDoCBraMOhY2ggaMOgbmcgdGnhu4FtIG7Eg25nIGzhu5tuIGNobyBGb29kIHbDoCBOb24tQ29uc3VtYWJsZS4gICANCg0KIyMgKipDw6J1IGjhu49pIG3hu58vSMaw4bubbmcgbmdoacOqbiBj4bupdSB0aeG6v3AgdGhlbyoqICAgDQoNCiogTeG7kWkgcXVhbiBo4buHIGdp4buvYSBUaHUgbmjhuq1wIHbDoCBow6BuaCB2aSBtdWEgc+G6r20vxJHhurdjIMSRaeG7g20ga2jDoWM6IEPDsyBt4buRaSBsacOqbiBo4buHIG7DoG8gZ2nhu69hIHRodSBuaOG6rXAgdsOgIGPDoWMgZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY+G7pSB0aOG7gyAoa2jDtG5nIGNo4buJIG5ow7NtIHPhuqNuIHBo4bqpbSBy4buZbmcpLCBob+G6t2MgdGh1IG5o4bqtcCB2w6AgcXV54buBbiBz4bufIGjhu691IG5ow6Aga2jDtG5nPyAgIA0KDQoqIFBow6JuIHTDrWNoIHPDonUgaMahbiB24buBIGPDoWMgZGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY+G7pSB0aOG7gzogTeG6t2MgZMO5IG5ow7NtIFByb2R1Y3RGYW1pbHkga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIHbhu5tpIE1hcml0YWxTdGF0dXMsIGxp4buHdSBjw7Mgbmjhu69uZyBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBj4bulIHRo4buDIGjGoW4gYsOqbiB0cm9uZyBjw6FjIG5ow7NtIMSRw7MgKHbDrSBk4bulOiBjw6FjIGxv4bqhaSB0aOG7sWMgcGjhuqltIGtow6FjIG5oYXUsIGPDoWMgbG/huqFpIMSR4buTIHXhu5FuZyBraMOhYyBuaGF1KSBtw6AgbOG6oWkgY8OzIG3hu5FpIGxpw6puIGjhu4cgduG7m2kgZ2nhu5tpIHTDrW5oIGhv4bq3YyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gaGF5IGtow7RuZz8gICANCg==