library(AER)
library(tidyverse)
library(DT)
library(DescTools)
library(ggplot2)
library(epitools)
data("CreditCard")
d <- CreditCard
datatable(d)
Giải thích biến định
tính
Biến đầu tiên là card đại diện cho việc đơn đăng ký thẻ
tín dụng của một cá nhân có được chấp nhận hay không. Nếu yes
là đăng ký được chấp nhận và no là không được chấp
nhận
Biến định tính thứ hai được chọn lựa là owner biến này
phản ánh tình trạng sở hữu nhà của cá nhân. Nó cho biết liệu một cá nhân
có sở hữu nhà hay không. Kết quả thu được là yes thì cá nhân có
sở hữu nhà và no thì không sở hữu
Dựa vào đó chúng ta sẽ kiểm tra liệu việc sở hữu nhà có ảnh hưởng
đến khả năng được chấp nhận thẻ tín dụng hay không.
Bảng tần số và đồ
thị
# Thay đổi giá trị của biến `card`và owner
d$card <- recode(d$card, "yes" = "chapnhan", "no" = "tuchoi")
d$owner <- recode(d$owner, "yes" = "conha", "no" = "khongconha")
Trước tiên chúng ta cần thay đổi các giá trị trong biến
card thay vì là kết quả là “yes” sẽ được biến đổi thành
“chapnhan” đại diện cho tình trạng đơn đăng ký thẻ tín dụng được chấp
nhận và ngược lại “no” tương ứng với “tuchoi”.
Tương tự với biến owner sẽ thay đổi “yes” thành
“conha” và ngược lại “no” sẽ là “khongconha”. Để khi phân tích giữa hai
biến tránh bị nhầm lẫn kết quả.
Biến card
table(d$card)%>% addmargins()
##
## tuchoi chapnhan Sum
## 296 1023 1319
c <- as.data.frame(table(d$card))
colnames(c) <- c("Card", "Count")
ggplot(c, aes(x = Card, y = Count, fill = Card)) +
geom_bar(stat = "identity") +
labs(title = "Biểu đồ cột", x = "Tình trạng đăng ký tín dụng", y = "Số lượng") +
theme_minimal()

Dựa vào kết quả bảng và đồ thị cột cho thấy Có 296 đơn đăng ký
thẻ tín dụng bị từ chối trên tổng số 1319 đơn đăng ký.
Ngoài ra có 1023 đơn đăng ký thẻ tín dụng được chấp nhận trên
tổng số 1319 đơn đăng ký.
prop.table(table(d$card)) %>% addmargins()
##
## tuchoi chapnhan Sum
## 0.2244124 0.7755876 1.0000000
# Tính tỷ lệ phần trăm
c1 <- prop.table(table(d$card)) * 100
# Vẽ biểu đồ tròn
pie(c1, labels = paste(names(c1), round(c1, 2), "%"),
main = "Đồ thị tròn đăng ký thẻ")

Dựa vào kết quả trên ta nhận thấy Có 296 đơn đăng ký thẻ tín dụng
bị từ chối (no), chiếm khoảng 22.45% tổng số đơn đăng ký.
Có 1023 đơn đăng ký thẻ tín dụng được chấp nhận (yes), chiếm
khoảng 77.55% tổng số đơn đăng ký.
Biến owner
table(d$owner) %>% as.data.frame() ->o
colnames(o)<-c("value","count")
o
## value count
## 1 khongconha 738
## 2 conha 581
ggplot(o, aes(x = value, y = count, fill = value)) +
geom_bar(stat = "identity") +
geom_text(aes(label = count), vjust = -0.3, size = 3.5) +
labs(title = "Biểu đồ cột", x = "Tình trạng", y = "Số lượng") +
theme_minimal()

- Dựa vào kết quả phân tích và độ thị cho thấy Có 738 cá nhân không sở
hữu nhà và 581 cá nhân sở hữu nhà.
table(d$owner) %>% prop.table() %>% addmargins()
##
## khongconha conha Sum
## 0.5595148 0.4404852 1.0000000
o1 <- prop.table(table(d$owner)) * 100
pie(o1, labels = paste(names(o1), round(o1, 2), "%"),
main = "biểu đồ tròn")
- Trong tổng số người được khảo sát thì 738 cá nhân không sở hữu nhà
chiếm khoảng 55.95% tổng số quan sát.
- Hơn thế, những cá nhân sở hữu nhà, chiếm khoảng 44.05% tổng số quan
sát.
Bảng tần số cho hai biến
d1 <- table(d$owner,d$card)
addmargins(d1)
##
## tuchoi chapnhan Sum
## khongconha 206 532 738
## conha 90 491 581
## Sum 296 1023 1319
barplot(d1, beside = TRUE, legend = TRUE,
col = c("skyblue", "lightgreen"),
main = "Biểu đồ tần suất giữa owner và card",
xlab = "Card",
ylab = "Tần suất",
names.arg = c("tuchoi", "chapnhan"))

Trong nhóm không sở hữu nhà, có 532 người được chấp nhận thẻ tín
dụng và 206 người bị từ chối.
Trong nhóm sở hữu nhà, có 491 người được chấp nhận thẻ tín dụng
và 90 người bị từ chối.
table(d$owner,d$card) %>% prop.table() %>% addmargins()
##
## tuchoi chapnhan Sum
## khongconha 0.15617892 0.40333586 0.55951478
## conha 0.06823351 0.37225171 0.44048522
## Sum 0.22441243 0.77558757 1.00000000
Tỷ lệ người không có nhà bị từ chối đơn tín dụng chiếm tỷ lệ là
15.62% trên tổng số đơn, cao hơn hơn so với tỷ lệ người có nhà bị từ
chối giấy đăng ký tín dụng vì tỷ lệ này chiếm khoảng 6.8% so với tổng số
đơn.
Tỷ lệ người không có nhà được chấp nhận đơn tín dụng chiếm tỷ lệ
là 40.33 so với tổng số. Ngược lại tỷ lệ người có nhà được chấp nhận đơn
tín dụng chiếm 37.2% trên tổng số đơn tín dụng đăng ký.
Ước lượng tỷ lệ
Ước lượng tỷ lệ đối với người sở hữu nhà
# lọc người có sở hữu nhà
owner_card_yes <- table(d[d$owner == "conha", ]$card)
owner_card_yes
##
## tuchoi chapnhan
## 90 491
- Trước tiên ta cần lọc kết quả về tình trạng đơn đăng ký tín dụng
theo nhóm người có sở hữu nhà. Kết quả thu được như trên.
# Ước lượng tỷ lệ đối với cá nhân được chấp nhận tín dụng
prop.test(owner_card_yes["chapnhan"], sum(owner_card_yes), p = 0.7)
##
## 1-sample proportions test with continuity correction
##
## data: owner_card_yes["chapnhan"] out of sum(owner_card_yes), null probability 0.7
## X-squared = 57.556, df = 1, p-value = 3.284e-14
## alternative hypothesis: true p is not equal to 0.7
## 95 percent confidence interval:
## 0.8124964 0.8730278
## sample estimates:
## p
## 0.8450947
Sau đó ước lượng tỷ lệ với giả thuyết không (H0): Tỷ lệ người
chấp nhận tín dụng (p) trong nhóm sở hữu nhà là 0.7 (70%).
Kết quả từ kiểm định cho thấy giá trị p-value là 3.284e-14, rất
gần với 0 và nhỏ hơn giá trị \(\alpha=0.05\). Điều này cho thấy có bằng
chứng mạnh mẽ để bác bỏ giả thuyết rằng tỷ lệ người sở hữu thẻ tín dụng
trong nhóm sở hữu nhà là 70%.
prop.test(owner_card_yes["tuchoi"], sum(owner_card_yes), p = 0.4)
##
## 1-sample proportions test with continuity correction
##
## data: owner_card_yes["tuchoi"] out of sum(owner_card_yes), null probability 0.4
## X-squared = 144.4, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
## 0.1269722 0.1875036
## sample estimates:
## p
## 0.1549053
Phần này ước lượng tỷ lệ với giả thuyết không (H0): Tỷ lệ người
không chấp nhận tín dụng (p) trong nhóm sở hữu nhà là 0.4
(40%).
Dựa trên giá trị p-value rất nhỏ so với giá trị \(\alpha=0.05\), chúng ta có đủ bằng chứng để
bác bỏ giả thuyết không và kết luận rằng tỷ lệ bị từ chối tín dụng của
nhóm người sở hữu nhà là khác nhau so với giả thuyết ban đầu
(40%).
Ước lượng tỷ lệ đối với cá nhân không sở hữu nhà
# lọc người có sở hữu nhà
owner_card_no <- table(d[d$owner == "khongconha", ]$card)
owner_card_no
##
## tuchoi chapnhan
## 206 532
- Lọc kết quả về tình trạng đơn đăng ký tín dụng theo nhóm người không
sở hữu nhà. Kết quả thu được như trên và đã được giải thích phần lập
bảng.
# Ước lượng tỷ lệ
prop.test(owner_card_no["chapnhan"], sum(owner_card_no), p = 0.4)
##
## 1-sample proportions test with continuity correction
##
## data: owner_card_no["chapnhan"] out of sum(owner_card_no), null probability 0.4
## X-squared = 315.25, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
## 0.6867260 0.7526733
## sample estimates:
## p
## 0.7208672
H0 (Giả thuyết không): Tỷ lệ chấp nhận tín dụng trong nhóm người
không sở hữu nhà là bằng 40%.
Dựa trên kết quả ta thấy giá trị p-value rất nhỏ so với giá trị
\(\alpha=0.05\), chúng ta có đủ bằng
chứng để bác bỏ giả thuyết không. Kết luận rằng tỷ lệ chấp nhận tín dụng
của nhóm người không sở hữu nhà là khác nhau so với giả thuyết ban đầu
(40%).
prop.test(owner_card_no["tuchoi"], sum(owner_card_no), p = 0.6)
##
## 1-sample proportions test with continuity correction
##
## data: owner_card_no["tuchoi"] out of sum(owner_card_no), null probability 0.6
## X-squared = 315.25, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
## 0.2473267 0.3132740
## sample estimates:
## p
## 0.2791328
Ta có giả thuyết H0: Tỷ lệ bị từ chối tín dụng trong nhóm người
không sở hữu nhà là bằng 60%.
Với giá trị p-value rất nhỏ, chúng ta bác bỏ giả thuyết không. Do
đó, chúng ta kết luận rằng tỷ lệ bị từ chối tín dụng trong nhóm người
không sở hữu nhà không bằng 60%.
Ước lượng chênh lệch tỷ lệ
d_tuchoi <- d[d$card == 'tuchoi',]
d_chapnhan <- d[d$card == 'chapnhan',]
tuchoi_conha <- d_tuchoi[d_tuchoi$owner == 'conha',]
chapnhan_conha <- d_chapnhan[d_chapnhan$owner == 'conha' ,]
a <- c(nrow(d_tuchoi), nrow(d_chapnhan))
a
## [1] 296 1023
b <- c(nrow(tuchoi_conha), nrow(chapnhan_conha))
b
## [1] 90 491
prop.test(b,a)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: b out of a
## X-squared = 28.114, df = 1, p-value = 1.144e-07
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.2387763 -0.1130374
## sample estimates:
## prop 1 prop 2
## 0.3040541 0.4799609
Giả thuyết của kiểm định là tỷ lệ người sở hữu nhà bị từ chối tín
dụng bằng với tỷ lệ người người sở hữu nhà được chấp nhận tín
dụng
Giá trị p-value rất gần với 0 nhỏ hơn mức ý nghĩa 0.05, cho thấy
có bằng chứng mạnh mẽ để bác bỏ giả thuyết không. Vì vậy tỷ lệ người sở
hữu nhà bị từ chối tín dụng khác với tỷ lệ người người sở hữu nhà được
chấp nhận tín dụng
Relative risk
Relative risk
addmargins(d1)
##
## tuchoi chapnhan Sum
## khongconha 206 532 738
## conha 90 491 581
## Sum 296 1023 1319
RelRisk(d1)
## [1] 1.801957
- RR > 1 trong trường hợp này cho thấy rằng người không sở hữu nhà
có mức độ rủi ro cao hơn so với những người sở hữu nhà đối với việc bị
từ chối thẻ tín dụng.
riskratio(d1)
## $data
##
## tuchoi chapnhan Total
## khongconha 206 532 738
## conha 90 491 581
## Total 296 1023 1319
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## khongconha 1.000000 NA NA
## conha 1.172331 1.107586 1.24086
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## khongconha NA NA NA
## conha 5.738991e-08 6.417142e-08 7.928759e-08
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Người không sở hữu nhà có tỷ số rủi ro là 1.000, người sở hữu nhà
có tỷ số rủi ro là 1.172331, với khoảng tin cậy 95% từ 1.107586 đến
1.24086.
Điều này có nghĩa là người sở hữu nhà có khả năng được chấp nhận
tín dụng cao hơn 17.23% so với người không sở hữu nhà.
Giá trị p nhỏ hơn 0.05, chúng ta bác bỏ giả thuyết không rằng
không có sự khác biệt về tỷ lệ chấp nhận tín dụng giữa hai
nhóm.
epitab(d1, method = 'riskratio', rev = 'c')
## $tab
##
## chapnhan p0 tuchoi p1 riskratio lower upper
## khongconha 532 0.7208672 206 0.2791328 1.0000000 NA NA
## conha 491 0.8450947 90 0.1549053 0.5549521 0.4442401 0.6932555
##
## p.value
## khongconha NA
## conha 6.417142e-08
##
## $measure
## [1] "wald"
##
## $conf.level
## [1] 0.95
##
## $pvalue
## [1] "fisher.exact"
riskratio(d1, rev = 'c')
## $data
##
## chapnhan tuchoi Total
## khongconha 532 206 738
## conha 491 90 581
## Total 1023 296 1319
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## khongconha 1.0000000 NA NA
## conha 0.5549521 0.4442401 0.6932555
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## khongconha NA NA NA
## conha 5.738991e-08 6.417142e-08 7.928759e-08
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Người sở hữu nhà có tỷ số rủi ro là 0.5549521, với khoảng tin cậy
95% từ 0.4442401 đến 0.6932555.
Điều này có nghĩa là người sở hữu nhà có nguy cơ bị từ chối tín
dụng thấp hơn 44.50% so với người không sở hữu nhà.
Giá trị p nhỏ hơn 0.05, chúng ta bác bỏ giả thuyết không rằng
không có sự khác biệt về tỷ lệ từ chối tín dụng giữa hai nhóm.
Khoảng ước lượng cho Relative risk
m <- matrix(c(206 ,90 ,532,491),nrow = 2)
RelRisk(m, conf.level = .95)
## rel. risk lwr.ci upr.ci
## 1.801957 1.445570 2.253737
Ước lượng cho Tỷ lệ Rủi ro Tương đối giữa nhóm không sở hữu nhà
và nhóm sở hữu nhà là khoảng 1.80.
Khoảng tin cậy 95% cho ước lượng này là từ khoảng 1.45 đến 2.25.
Điều này ngụ ý rằng có 95% khả năng rằng giá trị thực sự của Tỷ lệ Rủi
ro Tương đối nằm trong khoảng từ 1.45 đến 2.25.
Odd ratio
OddsRatio(d1)
## [1] 2.11249
oddsratio(d1)
## $data
##
## tuchoi chapnhan Total
## khongconha 206 532 738
## conha 90 491 581
## Total 296 1023 1319
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## khongconha 1.00000 NA NA
## conha 2.10957 1.60448 2.791356
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## khongconha NA NA NA
## conha 5.738991e-08 6.417142e-08 7.928759e-08
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Odds Ratio: Người sở hữu nhà có tỷ lệ chấp nhận tín dụng cao gấp
2.11 lần so với người không sở hữu nhà.
Ý nghĩa thống kê: Giá trị p rất nhỏ cho thấy sự khác biệt này là
có ý nghĩa thống kê.
Khoảng tin cậy: Khoảng tin cậy 95% (từ 1.60448 đến 2.791356)
không chứa giá trị 1, củng cố thêm sự tin cậy vào kết quả này.
oddsratio(d1, rev = 'c')
## $data
##
## chapnhan tuchoi Total
## khongconha 532 206 738
## conha 491 90 581
## Total 1023 296 1319
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## khongconha 1.0000000 NA NA
## conha 0.4740542 0.3582489 0.6232548
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## khongconha NA NA NA
## conha 5.738991e-08 6.417142e-08 7.928759e-08
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Người sở hữu nhà có odds ratio là 0.4740542, với khoảng tin cậy
95% từ 0.3582489 đến 0.6232548. Điều này có nghĩa là người sở hữu nhà có
tỷ lệ bị từ chối tín dụng thấp hơn so với người không sở hữu nhà. Khoảng
tin cậy không chứa giá trị 1, cho thấy sự khác biệt này là có ý nghĩa
thống kê.
Các giá trị p (p-values) cho người sở hữu nhà là rất nhỏ
5,74.10^-8, cho thấy sự khác biệt về tỷ lệ bị từ chối tín dụng giữa
người sở hữu nhà và người không sở hữu nhà là rất có ý nghĩa thống kê.
Giá trị p nhỏ hơn 0.05, chúng ta bác bỏ giả thuyết không rằng không có
sự khác biệt về tỷ lệ bị từ chối tín dụng giữa hai nhóm.
epitab(d1, method = 'oddsratio')
## $tab
##
## tuchoi p0 chapnhan p1 oddsratio lower upper
## khongconha 206 0.6959459 532 0.5200391 1.00000 NA NA
## conha 90 0.3040541 491 0.4799609 2.11249 1.602406 2.784944
##
## p.value
## khongconha NA
## conha 6.417142e-08
##
## $measure
## [1] "wald"
##
## $conf.level
## [1] 0.95
##
## $pvalue
## [1] "fisher.exact"
- Odds Ratio cho người sở hữu nhà là 2.11249. Điều này có nghĩa là
người sở hữu nhà có tỷ lệ bị chấp nhận tín dụng cao hơn 2.11249 lần so
với người không sở hữu nhà.
- Khoảng Tin Cậy 95% (95% Confidence Interval): từ 1.60 đến 2.78
Khoảng tin cậy này không chứa giá trị 1, cho thấy sự khác biệt về tỷ lệ
bị chấp nhận tín dụng giữa hai nhóm là có ý nghĩa thống kê.
LS0tDQp0aXRsZTogIkLDoGkgdOG6rXAiDQphdXRob3I6ICJMw6ogVGjDoG5oIMSQ4bq3bmctIDIxMjEwMTI5NDYiDQpkYXRlOiAiMjAyNC0wNi0wMSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2RlcHRoOiA1DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IHVuaXRlZA0KDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7Y3NzLGVjaG8gPSBGQUxTRX0NCmgxIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMzJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQNCiAgfQ0KDQpoMiB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDI4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KIA0KfQ0KDQpoMyB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXN0eWxlOiBpdGFsaWM7DQp9DQoNCmg0IHtmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LXN0eWxlOiBpdGFsaWN9DQoNCmJvZHkgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAxOHB4Ow0KICANCn0NCnA6bm90KGgxKTpub3QoaDIpOm5vdChoMyk6bm90KGg0KTpub3QoaDUpIHsNCiAgdGV4dC1pbmRlbnQ6IDJlbTt9DQpwIHsNCiAgdGV4dC1hbGlnbjoganVzdGlmeTsNCiAgfQ0KLnRvY2lmeS1oZWFkZXIgew0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KYGBgDQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KEFFUikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShlcGl0b29scykNCmRhdGEoIkNyZWRpdENhcmQiKQ0KZCA8LSBDcmVkaXRDYXJkDQpkYXRhdGFibGUoZCkNCmBgYA0KIyBHaeG6o2kgdGjDrWNoIGJp4bq/biDEkeG7i25oIHTDrW5oIA0KDQotIEJp4bq/biDEkeG6p3UgdGnDqm4gbMOgICpjYXJkKiDEkeG6oWkgZGnhu4duIGNobyB2aeG7h2MgxJHGoW4gxJHEg25nIGvDvSB0aOG6uyB0w61uIGThu6VuZyBj4bunYSBt4buZdCBjw6EgbmjDom4gY8OzIMSRxrDhu6NjIGNo4bqlcCBuaOG6rW4gaGF5IGtow7RuZy4gTuG6v3UgKnllcyogbMOgIMSRxINuZyBrw70gxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiB2w6AgKm5vKiBsw6Aga2jDtG5nIMSRxrDhu6NjIGNo4bqlcCBuaOG6rW4NCg0KLSBCaeG6v24gxJHhu4tuaCB0w61uaCB0aOG7qSBoYWkgxJHGsOG7o2MgY2jhu41uIGzhu7FhIGzDoCAqb3duZXIqIGJp4bq/biBuw6B5IHBo4bqjbiDDoW5oIHTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgIGPhu6dhIGPDoSBuaMOibi4gTsOzIGNobyBiaeG6v3QgbGnhu4d1IG3hu5l0IGPDoSBuaMOibiBjw7Mgc+G7nyBo4buvdSBuaMOgIGhheSBraMO0bmcuIEvhur90IHF14bqjIHRodSDEkcaw4bujYyBsw6AgKnllcyogdGjDrCBjw6EgbmjDom4gY8OzIHPhu58gaOG7r3UgbmjDoCB2w6AgKm5vKiB0aMOsIGtow7RuZyBz4bufIGjhu691IA0KDQotIEThu7FhIHbDoG8gxJHDsyBjaMO6bmcgdGEgc+G6vSBraeG7g20gdHJhIGxp4buHdSB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiB0aOG6uyB0w61uIGThu6VuZyBoYXkga2jDtG5nLg0KDQojIELhuqNuZyB04bqnbiBz4buRIHbDoCDEkeG7kyB0aOG7iw0KIA0KYGBge3J9IA0KIyBUaGF5IMSR4buVaSBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBgY2FyZGB2w6Agb3duZXINCmQkY2FyZCA8LSByZWNvZGUoZCRjYXJkLCAieWVzIiA9ICJjaGFwbmhhbiIsICJubyIgPSAidHVjaG9pIikNCmQkb3duZXIgPC0gcmVjb2RlKGQkb3duZXIsICJ5ZXMiID0gImNvbmhhIiwgIm5vIiA9ICJraG9uZ2NvbmhhIikNCmBgYA0KDQotIFRyxrDhu5tjIHRpw6puIGNow7puZyB0YSBj4bqnbiB0aGF5IMSR4buVaSBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgYmnhur9uIGBjYXJkYCB0aGF5IHbDrCBsw6Aga+G6v3QgcXXhuqMgbMOgICJ5ZXMiIHPhur0gxJHGsOG7o2MgYmnhur9uIMSR4buVaSB0aMOgbmggImNoYXBuaGFuIiDEkeG6oWkgZGnhu4duIGNobyB0w6xuaCB0cuG6oW5nIMSRxqFuIMSRxINuZyBrw70gdGjhursgdMOtbiBk4bulbmcgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiB2w6AgbmfGsOG7o2MgbOG6oWkgIm5vIiB0xrDGoW5nIOG7qW5nIHbhu5tpICJ0dWNob2kiLg0KDQotIFTGsMahbmcgdOG7sSB24bubaSBiaeG6v24gYG93bmVyYCBz4bq9IHRoYXkgxJHhu5VpICJ5ZXMiIHRow6BuaCAiY29uaGEiIHbDoCBuZ8aw4bujYyBs4bqhaSAibm8iIHPhur0gbMOgICJraG9uZ2NvbmhhIi4gxJDhu4Mga2hpIHBow6JuIHTDrWNoIGdp4buvYSBoYWkgYmnhur9uIHRyw6FuaCBi4buLIG5o4bqnbSBs4bqrbiBr4bq/dCBxdeG6oy4NCg0KKipCaeG6v24gY2FyZCoqDQoNCmBgYHtyfQ0KdGFibGUoZCRjYXJkKSU+JSBhZGRtYXJnaW5zKCkNCmMgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkJGNhcmQpKSANCmNvbG5hbWVzKGMpIDwtIGMoIkNhcmQiLCAiQ291bnQiKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChjLCBhZXMoeCA9IENhcmQsIHkgPSBDb3VudCwgZmlsbCA9IENhcmQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IiwgeCA9ICJUw6xuaCB0cuG6oW5nIMSRxINuZyBrw70gdMOtbiBk4bulbmciLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCi0gROG7sWEgdsOgbyBr4bq/dCBxdeG6oyBi4bqjbmcgdsOgIMSR4buTIHRo4buLIGPhu5l0IGNobyB0aOG6pXkgQ8OzIDI5NiDEkcahbiDEkcSDbmcga8O9IHRo4bq7IHTDrW4gZOG7pW5nIGLhu4sgdOG7qyBjaOG7kWkgdHLDqm4gdOG7lW5nIHPhu5EgMTMxOSDEkcahbiDEkcSDbmcga8O9LiAgDQoNCi0gTmdvw6BpIHJhIGPDsyAxMDIzIMSRxqFuIMSRxINuZyBrw70gdGjhursgdMOtbiBk4bulbmcgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiB0csOqbiB04buVbmcgc+G7kSAxMzE5IMSRxqFuIMSRxINuZyBrw70uIA0KDQpgYGB7cn0NCnByb3AudGFibGUodGFibGUoZCRjYXJkKSkgJT4lIGFkZG1hcmdpbnMoKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KIyBUw61uaCB04bu3IGzhu4cgcGjhuqduIHRyxINtDQpjMSA8LSBwcm9wLnRhYmxlKHRhYmxlKGQkY2FyZCkpICogMTAwDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCnBpZShjMSwgbGFiZWxzID0gcGFzdGUobmFtZXMoYzEpLCByb3VuZChjMSwgMiksICIlIiksDQogICAgbWFpbiA9ICLEkOG7kyB0aOG7iyB0csOybiDEkcSDbmcga8O9IHRo4bq7IikNCmBgYA0KDQotIEThu7FhIHbDoG8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgbmjhuq1uIHRo4bqleSBDw7MgMjk2IMSRxqFuIMSRxINuZyBrw70gdGjhursgdMOtbiBk4bulbmcgYuG7iyB04burIGNo4buRaSAobm8pLCBjaGnhur9tIGtob+G6o25nIDIyLjQ1JSB04buVbmcgc+G7kSDEkcahbiDEkcSDbmcga8O9Lg0KDQotIEPDsyAxMDIzIMSRxqFuIMSRxINuZyBrw70gdGjhursgdMOtbiBk4bulbmcgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiAoeWVzKSwgY2hp4bq/bSBraG/huqNuZyA3Ny41NSUgdOG7lW5nIHPhu5EgxJHGoW4gxJHEg25nIGvDvS4NCg0KKipCaeG6v24gb3duZXIqKg0KDQpgYGB7cn0NCnRhYmxlKGQkb3duZXIpICU+JSBhcy5kYXRhLmZyYW1lKCkgLT5vDQpjb2xuYW1lcyhvKTwtYygidmFsdWUiLCJjb3VudCIpDQpvDQpnZ3Bsb3QobywgYWVzKHggPSB2YWx1ZSwgeSA9IGNvdW50LCBmaWxsID0gdmFsdWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3VudCksIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDMuNSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCIsIHggPSAiVMOsbmggdHLhuqFuZyIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KLSBE4buxYSB2w6BvIGvhur90IHF14bqjIHBow6JuIHTDrWNoIHbDoCDEkeG7mSB0aOG7iyBjaG8gdGjhuqV5IEPDsyA3MzggY8OhIG5ow6JuIGtow7RuZyBz4bufIGjhu691IG5ow6AgdsOgIDU4MSBjw6EgbmjDom4gc+G7nyBo4buvdSBuaMOgLg0KDQpgYGB7cn0NCnRhYmxlKGQkb3duZXIpICAlPiUgcHJvcC50YWJsZSgpICU+JSBhZGRtYXJnaW5zKCkNCm8xIDwtIHByb3AudGFibGUodGFibGUoZCRvd25lcikpICogMTAwDQpwaWUobzEsIGxhYmVscyA9IHBhc3RlKG5hbWVzKG8xKSwgcm91bmQobzEsIDIpLCAiJSIpLA0KICAgIG1haW4gPSAiYmnhu4N1IMSR4buTIHRyw7JuIikNCg0KYGBgDQotIFRyb25nIHThu5VuZyBz4buRIG5nxrDhu51pIMSRxrDhu6NjIGto4bqjbyBzw6F0IHRow6wgNzM4IGPDoSBuaMOibiBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGNoaeG6v20ga2hv4bqjbmcgNTUuOTUlIHThu5VuZyBz4buRIHF1YW4gc8OhdC4NCg0KLSBIxqFuIHRo4bq/LCBuaOG7r25nIGPDoSBuaMOibiBz4bufIGjhu691IG5ow6AsIGNoaeG6v20ga2hv4bqjbmcgNDQuMDUlIHThu5VuZyBz4buRIHF1YW4gc8OhdC4NCg0KKipC4bqjbmcgdOG6p24gc+G7kSBjaG8gaGFpIGJp4bq/bioqDQoNCmBgYHtyfQ0KZDEgPC0gdGFibGUoZCRvd25lcixkJGNhcmQpDQphZGRtYXJnaW5zKGQxKQ0KYGBgDQpgYGB7cn0NCmJhcnBsb3QoZDEsIGJlc2lkZSA9IFRSVUUsIGxlZ2VuZCA9IFRSVUUsIA0KICAgICAgICBjb2wgPSBjKCJza3libHVlIiwgImxpZ2h0Z3JlZW4iKSwNCiAgICAgICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IGdp4buvYSBvd25lciB2w6AgY2FyZCIsDQogICAgICAgIHhsYWIgPSAiQ2FyZCIsDQogICAgICAgIHlsYWIgPSAiVOG6p24gc3XhuqV0IiwNCiAgICAgICAgbmFtZXMuYXJnID0gYygidHVjaG9pIiwgImNoYXBuaGFuIikpDQpgYGANCg0KLSBUcm9uZyBuaMOzbSBraMO0bmcgc+G7nyBo4buvdSBuaMOgLCBjw7MgNTMyIG5nxrDhu51pIMSRxrDhu6NjIGNo4bqlcCBuaOG6rW4gdGjhursgdMOtbiBk4bulbmcgdsOgIDIwNiBuZ8aw4budaSBi4buLIHThu6sgY2jhu5FpLg0KDQotIFRyb25nIG5ow7NtIHPhu58gaOG7r3UgbmjDoCwgY8OzIDQ5MSBuZ8aw4budaSDEkcaw4bujYyBjaOG6pXAgbmjhuq1uIHRo4bq7IHTDrW4gZOG7pW5nIHbDoCA5MCBuZ8aw4budaSBi4buLIHThu6sgY2jhu5FpLg0KDQpgYGB7cn0NCnRhYmxlKGQkb3duZXIsZCRjYXJkKSAlPiUgcHJvcC50YWJsZSgpICU+JSBhZGRtYXJnaW5zKCkNCmBgYA0KDQotIFThu7cgbOG7hyBuZ8aw4budaSBraMO0bmcgY8OzIG5ow6AgYuG7iyB04burIGNo4buRaSDEkcahbiB0w61uIGThu6VuZyBjaGnhur9tIHThu7cgbOG7hyBsw6AgMTUuNjIlIHRyw6puIHThu5VuZyBz4buRIMSRxqFuLCBjYW8gaMahbiBoxqFuIHNvIHbhu5tpIHThu7cgbOG7hyBuZ8aw4budaSBjw7MgbmjDoCBi4buLIHThu6sgY2jhu5FpIGdp4bqleSDEkcSDbmcga8O9IHTDrW4gZOG7pW5nIHbDrCB04bu3IGzhu4cgbsOgeSBjaGnhur9tIGtob+G6o25nIDYuOCUgc28gduG7m2kgdOG7lW5nIHPhu5EgxJHGoW4uICANCg0KLSBU4bu3IGzhu4cgbmfGsOG7nWkga2jDtG5nIGPDsyBuaMOgIMSRxrDhu6NjIGNo4bqlcCBuaOG6rW4gxJHGoW4gdMOtbiBk4bulbmcgY2hp4bq/bSB04bu3IGzhu4cgbMOgIDQwLjMzIHNvIHbhu5tpIHThu5VuZyBz4buRLiBOZ8aw4bujYyBs4bqhaSB04bu3IGzhu4cgbmfGsOG7nWkgY8OzIG5ow6AgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiDEkcahbiB0w61uIGThu6VuZyBjaGnhur9tIDM3LjIlIHRyw6puIHThu5VuZyBz4buRIMSRxqFuIHTDrW4gZOG7pW5nIMSRxINuZyBrw70uDQoNCiMgxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyANCg0KKirGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIMSR4buRaSB24bubaSBuZ8aw4budaSBz4bufIGjhu691IG5ow6AqKiANCmBgYHtyfQ0KIyBs4buNYyBuZ8aw4budaSBjw7Mgc+G7nyBo4buvdSBuaMOgIA0Kb3duZXJfY2FyZF95ZXMgPC0gdGFibGUoZFtkJG93bmVyID09ICJjb25oYSIsIF0kY2FyZCkNCm93bmVyX2NhcmRfeWVzDQpgYGANCg0KLSBUcsaw4bubYyB0acOqbiB0YSBj4bqnbiBs4buNYyBr4bq/dCBxdeG6oyB24buBIHTDrG5oIHRy4bqhbmcgxJHGoW4gxJHEg25nIGvDvSB0w61uIGThu6VuZyB0aGVvIG5ow7NtIG5nxrDhu51pIGPDsyBz4bufIGjhu691IG5ow6AuIEvhur90IHF14bqjIHRodSDEkcaw4bujYyBuaMawIHRyw6puLiANCg0KYGBge3J9DQojIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgxJHhu5FpIHbhu5tpIGPDoSBuaMOibiDEkcaw4bujYyBjaOG6pXAgbmjhuq1uIHTDrW4gZOG7pW5nIA0KcHJvcC50ZXN0KG93bmVyX2NhcmRfeWVzWyJjaGFwbmhhbiJdLCBzdW0ob3duZXJfY2FyZF95ZXMpLCBwID0gMC43KQ0KYGBgDQoNCi0gU2F1IMSRw7MgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hyB24bubaSBnaeG6oyB0aHV54bq/dCBraMO0bmcgKEgwKTogVOG7tyBs4buHIG5nxrDhu51pIGNo4bqlcCBuaOG6rW4gdMOtbiBk4bulbmcgKHApIHRyb25nIG5ow7NtIHPhu58gaOG7r3UgbmjDoCBsw6AgMC43ICg3MCUpLg0KDQotIEvhur90IHF14bqjIHThu6sga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBnacOhIHRy4buLIHAtdmFsdWUgbMOgIDMuMjg0ZS0xNCwgcuG6pXQgZ+G6p24gduG7m2kgMCB2w6Agbmjhu48gaMahbiBnacOhIHRy4buLICRcYWxwaGE9MC4wNSQuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDsyBi4bqxbmcgY2jhu6luZyBt4bqhbmggbeG6vSDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgcuG6sW5nIHThu7cgbOG7hyBuZ8aw4budaSBz4bufIGjhu691IHRo4bq7IHTDrW4gZOG7pW5nIHRyb25nIG5ow7NtIHPhu58gaOG7r3UgbmjDoCBsw6AgNzAlLg0KDQpgYGB7cn0NCnByb3AudGVzdChvd25lcl9jYXJkX3llc1sidHVjaG9pIl0sIHN1bShvd25lcl9jYXJkX3llcyksIHAgPSAwLjQpDQpgYGANCg0KLSBQaOG6p24gbsOgeSDGsOG7m2MgbMaw4bujbmcgdOG7tyBs4buHIHbhu5tpIGdp4bqjIHRodXnhur90IGtow7RuZyAoSDApOiBU4bu3IGzhu4cgbmfGsOG7nWkga2jDtG5nIGNo4bqlcCBuaOG6rW4gdMOtbiBk4bulbmcgKHApIHRyb25nIG5ow7NtIHPhu58gaOG7r3UgbmjDoCBsw6AgMC40ICg0MCUpLg0KDQotIEThu7FhIHRyw6puIGdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBuaOG7jyBzbyB24bubaSBnacOhIHRy4buLICRcYWxwaGE9MC4wNSQsIGNow7puZyB0YSBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyB2w6Aga+G6v3QgbHXhuq1uIHLhurFuZyB04bu3IGzhu4cgYuG7iyB04burIGNo4buRaSB0w61uIGThu6VuZyBj4bunYSBuaMOzbSBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgbMOgIGtow6FjIG5oYXUgc28gduG7m2kgZ2nhuqMgdGh1eeG6v3QgYmFuIMSR4bqndSAoNDAlKS4NCg0KDQoqKsav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgxJHhu5FpIHbhu5tpIGPDoSBuaMOibiBraMO0bmcgc+G7nyBo4buvdSBuaMOgKioNCg0KYGBge3J9DQojIGzhu41jIG5nxrDhu51pIGPDsyBz4bufIGjhu691IG5ow6AgDQpvd25lcl9jYXJkX25vIDwtIHRhYmxlKGRbZCRvd25lciA9PSAia2hvbmdjb25oYSIsIF0kY2FyZCkNCm93bmVyX2NhcmRfbm8NCmBgYA0KDQotIEzhu41jIGvhur90IHF14bqjIHbhu4EgdMOsbmggdHLhuqFuZyDEkcahbiDEkcSDbmcga8O9IHTDrW4gZOG7pW5nIHRoZW8gbmjDs20gbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoC4gS+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIG5oxrAgdHLDqm4gdsOgIMSRw6MgxJHGsOG7o2MgZ2nhuqNpIHRow61jaCBwaOG6p24gbOG6rXAgYuG6o25nLg0KDQpgYGB7cn0NCiMgxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyANCnByb3AudGVzdChvd25lcl9jYXJkX25vWyJjaGFwbmhhbiJdLCBzdW0ob3duZXJfY2FyZF9ubyksIHAgPSAwLjQpDQpgYGANCg0KLSBIMCAoR2nhuqMgdGh1eeG6v3Qga2jDtG5nKTogVOG7tyBs4buHIGNo4bqlcCBuaOG6rW4gdMOtbiBk4bulbmcgdHJvbmcgbmjDs20gbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBsw6AgYuG6sW5nIDQwJS4NCg0KLSBE4buxYSB0csOqbiBr4bq/dCBxdeG6oyB0YSB0aOG6pXkgZ2nDoSB0cuG7iyBwLXZhbHVlIHLhuqV0IG5o4buPIHNvIHbhu5tpIGdpw6EgdHLhu4sgJFxhbHBoYT0wLjA1JCwgY2jDum5nIHRhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nLiBL4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBjaOG6pXAgbmjhuq1uIHTDrW4gZOG7pW5nIGPhu6dhIG5ow7NtIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgbMOgIGtow6FjIG5oYXUgc28gduG7m2kgZ2nhuqMgdGh1eeG6v3QgYmFuIMSR4bqndSAoNDAlKS4NCg0KDQpgYGB7cn0NCnByb3AudGVzdChvd25lcl9jYXJkX25vWyJ0dWNob2kiXSwgc3VtKG93bmVyX2NhcmRfbm8pLCBwID0gMC42KQ0KYGBgDQoNCi0gVGEgY8OzIGdp4bqjIHRodXnhur90IEgwOiBU4bu3IGzhu4cgYuG7iyB04burIGNo4buRaSB0w61uIGThu6VuZyB0cm9uZyBuaMOzbSBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGzDoCBi4bqxbmcgNjAlLg0KDQotIFbhu5tpIGdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBuaOG7jywgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcuIERvIMSRw7MsIGNow7puZyB0YSBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBi4buLIHThu6sgY2jhu5FpIHTDrW4gZOG7pW5nIHRyb25nIG5ow7NtIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6Aga2jDtG5nIGLhurFuZyA2MCUuDQoNCg0KKirGr+G7m2MgbMaw4bujbmcgY2jDqm5oIGzhu4djaCB04bu3IGzhu4cgKiogDQoNCmBgYHtyfQ0KZF90dWNob2kgPC0gZFtkJGNhcmQgPT0gJ3R1Y2hvaScsXQ0KZF9jaGFwbmhhbiA8LSBkW2QkY2FyZCA9PSAnY2hhcG5oYW4nLF0NCg0KdHVjaG9pX2NvbmhhIDwtIGRfdHVjaG9pW2RfdHVjaG9pJG93bmVyID09ICdjb25oYScsXQ0KY2hhcG5oYW5fY29uaGEgPC0gZF9jaGFwbmhhbltkX2NoYXBuaGFuJG93bmVyID09ICdjb25oYScgLF0NCg0KYSA8LSBjKG5yb3coZF90dWNob2kpLCBucm93KGRfY2hhcG5oYW4pKQ0KYQ0KYiA8LSBjKG5yb3codHVjaG9pX2NvbmhhKSwgbnJvdyhjaGFwbmhhbl9jb25oYSkpDQpiDQpwcm9wLnRlc3QoYixhKQ0KYGBgDQoNCi0gR2nhuqMgdGh1eeG6v3QgY+G7p2Ega2nhu4NtIMSR4buLbmggbMOgIHThu7cgbOG7hyBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgYuG7iyB04burIGNo4buRaSB0w61uIGThu6VuZyBi4bqxbmcgduG7m2kgdOG7tyBs4buHIG5nxrDhu51pIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCDEkcaw4bujYyBjaOG6pXAgbmjhuq1uIHTDrW4gZOG7pW5nIA0KDQotIEdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBn4bqnbiB24bubaSAwIG5o4buPIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUsIGNobyB0aOG6pXkgY8OzIGLhurFuZyBjaOG7qW5nIG3huqFuaCBt4bq9IMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcuIFbDrCB24bqteSB04bu3IGzhu4cgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGLhu4sgdOG7qyBjaOG7kWkgdMOtbiBk4bulbmcga2jDoWMgduG7m2kgdOG7tyBs4buHIG5nxrDhu51pIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCDEkcaw4bujYyBjaOG6pXAgbmjhuq1uIHTDrW4gZOG7pW5nDQoNCiMgUmVsYXRpdmUgcmlzaw0KDQoqKlJlbGF0aXZlIHJpc2sqKg0KYGBge3J9DQphZGRtYXJnaW5zKGQxKQ0KUmVsUmlzayhkMSkNCg0KYGBgDQotIFJSID4gMSB0cm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGPDsyBt4bupYyDEkeG7mSBy4bunaSBybyBjYW8gaMahbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCDEkeG7kWkgduG7m2kgdmnhu4djIGLhu4sgdOG7qyBjaOG7kWkgdGjhursgdMOtbiBk4bulbmcuDQpgYGB7cn0NCnJpc2tyYXRpbyhkMSkNCmBgYA0KDQotIE5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgY8OzIHThu7cgc+G7kSBy4bunaSBybyBsw6AgMS4wMDAsIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjw7MgdOG7tyBz4buRIHLhu6dpIHJvIGzDoCAxLjE3MjMzMSwgduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JSB04burIDEuMTA3NTg2IMSR4bq/biAxLjI0MDg2Lg0KDQotIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgY8OzIGto4bqjIG7Eg25nIMSRxrDhu6NjIGNo4bqlcCBuaOG6rW4gdMOtbiBk4bulbmcgY2FvIGjGoW4gMTcuMjMlIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AuDQoNCi0gR2nDoSB0cuG7iyBwIG5o4buPIGjGoW4gMC4wNSwgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgcuG6sW5nIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgY2jhuqVwIG5o4bqtbiB0w61uIGThu6VuZyBnaeG7r2EgaGFpIG5ow7NtLg0KDQpgYGB7cn0NCmVwaXRhYihkMSwgbWV0aG9kID0gJ3Jpc2tyYXRpbycsIHJldiA9ICdjJykNCmBgYA0KDQpgYGB7cn0NCnJpc2tyYXRpbyhkMSwgcmV2ID0gJ2MnKQ0KYGBgDQoNCi0gTmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGPDsyB04bu3IHPhu5EgcuG7p2kgcm8gbMOgIDAuNTU0OTUyMSwgduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JSB04burIDAuNDQ0MjQwMSDEkeG6v24gMC42OTMyNTU1Lg0KDQotIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgY8OzIG5ndXkgY8ahIGLhu4sgdOG7qyBjaOG7kWkgdMOtbiBk4bulbmcgdGjhuqVwIGjGoW4gNDQuNTAlIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AuIA0KDQotIEdpw6EgdHLhu4sgcCBuaOG7jyBoxqFuIDAuMDUsIGNow7puZyB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIHLhurFuZyBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIHThu6sgY2jhu5FpIHTDrW4gZOG7pW5nIGdp4buvYSBoYWkgbmjDs20uDQoNCg0KDQoNCioqS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIGNobyBSZWxhdGl2ZSByaXNrKioNCmBgYHtyfQ0KbSA8LSBtYXRyaXgoYygyMDYgLDkwICw1MzIsNDkxKSxucm93ID0gMikNClJlbFJpc2sobSwgY29uZi5sZXZlbCA9IC45NSkNCmBgYA0KLSDGr+G7m2MgbMaw4bujbmcgY2hvIFThu7cgbOG7hyBS4bunaSBybyBUxrDGoW5nIMSR4buRaSBnaeG7r2EgbmjDs20ga2jDtG5nIHPhu58gaOG7r3UgbmjDoCB2w6AgbmjDs20gc+G7nyBo4buvdSBuaMOgIGzDoCBraG/huqNuZyAxLjgwLg0KDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIMaw4bubYyBsxrDhu6NuZyBuw6B5IGzDoCB04burIGtob+G6o25nIDEuNDUgxJHhur9uIDIuMjUuIMSQaeG7gXUgbsOgeSBuZ+G7pSDDvSBy4bqxbmcgY8OzIDk1JSBraOG6oyBuxINuZyBy4bqxbmcgZ2nDoSB0cuG7iyB0aOG7sWMgc+G7sSBj4bunYSBU4bu3IGzhu4cgUuG7p2kgcm8gVMawxqFuZyDEkeG7kWkgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAxLjQ1IMSR4bq/biAyLjI1Lg0KDQojIE9kZCByYXRpbyANCmBgYHtyfQ0KT2Rkc1JhdGlvKGQxKQ0KYGBgDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKGQxKQ0KYGBgDQotIE9kZHMgUmF0aW86IE5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjw7MgdOG7tyBs4buHIGNo4bqlcCBuaOG6rW4gdMOtbiBk4bulbmcgY2FvIGfhuqVwIDIuMTEgbOG6p24gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoC4NCg0KLSDDnSBuZ2jEqWEgdGjhu5FuZyBrw6o6IEdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15OiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlICh04burIDEuNjA0NDggxJHhur9uIDIuNzkxMzU2KSBraMO0bmcgY2jhu6lhIGdpw6EgdHLhu4sgMSwgY+G7p25nIGPhu5EgdGjDqm0gc+G7sSB0aW4gY+G6rXkgdsOgbyBr4bq/dCBxdeG6oyBuw6B5Lg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhkMSwgcmV2ID0gJ2MnKQ0KYGBgDQoNCi0gTmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGPDsyBvZGRzIHJhdGlvIGzDoCAwLjQ3NDA1NDIsIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAwLjM1ODI0ODkgxJHhur9uIDAuNjIzMjU0OC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjw7MgdOG7tyBs4buHIGLhu4sgdOG7qyBjaOG7kWkgdMOtbiBk4bulbmcgdGjhuqVwIGjGoW4gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoC4gS2hv4bqjbmcgdGluIGPhuq15IGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAxLCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCi0gQ8OhYyBnacOhIHRy4buLIHAgKHAtdmFsdWVzKSBjaG8gbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGzDoCBy4bqldCBuaOG7jyA1LDc0LjEwXi04LCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIGLhu4sgdOG7qyBjaOG7kWkgdMOtbiBk4bulbmcgZ2nhu69hIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCB2w6AgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBsw6AgcuG6pXQgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gR2nDoSB0cuG7iyBwIG5o4buPIGjGoW4gMC4wNSwgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgcuG6sW5nIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgYuG7iyB04burIGNo4buRaSB0w61uIGThu6VuZyBnaeG7r2EgaGFpIG5ow7NtLg0KDQpgYGB7cn0NCmVwaXRhYihkMSwgbWV0aG9kID0gJ29kZHNyYXRpbycpDQpgYGANCi0gT2RkcyBSYXRpbyBjaG8gbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGzDoCAyLjExMjQ5LiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGPDsyB04bu3IGzhu4cgYuG7iyBjaOG6pXAgbmjhuq1uIHTDrW4gZOG7pW5nIGNhbyBoxqFuIDIuMTEyNDkgbOG6p24gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UgbmjDoC4NCi0gS2hv4bqjbmcgVGluIEPhuq15IDk1JSAoOTUlIENvbmZpZGVuY2UgSW50ZXJ2YWwpOiB04burIDEuNjAgxJHhur9uIDIuNzgNCktob+G6o25nIHRpbiBj4bqteSBuw6B5IGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAxLCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIGLhu4sgY2jhuqVwIG5o4bqtbiB0w61uIGThu6VuZyBnaeG7r2EgaGFpIG5ow7NtIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0K