W6

Phần 1: Hồi quy đơn

df <-read.csv("C:/Users/DELL/Downloads/data (1).csv", header= T)
# Tách dữ liệu thành nhiều cột
data <- tidyr::separate(
  df,
  col = 1,
  into = c("type_school", "school_accreditation", "gender", "interest",
           "residence", "parent_age", "parent_salary", "house_area",
           "average_grades", "parent_was_in_college", "will_go_to_college"),
  sep = ";"
)

data <- data [,-6]
data$type_school <- as.factor(data$type_school)
data$school_accreditation <- as.factor(data$school_accreditation)
data$gender <- as.factor(data$gender)
data$interest <- as.factor(data$interest)
data$residence <- as.factor(data$residence)

data$parent_salary <- as.factor(data$parent_salary)
data$house_area <- as.factor(data$house_area)
data$average_grades <- as.factor(data$average_grades)
data$parent_was_in_college <- as.factor(data$parent_was_in_college)
data$will_go_to_college <- as.factor(data$will_go_to_college)

1.1 Mô hình xác suất tuyến tính

1.1.1 residence

# Chạy mô hình logistic
xstt.WR <- glm(will_go_to_college ~ residence, data = data, family = binomial)
summary(xstt.WR)
## 
## Call:
## glm(formula = will_go_to_college ~ residence, family = binomial, 
##     data = data)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)
## (Intercept)    -0.01302    0.09315   -0.14    0.889
## residenceUrban  0.02415    0.12688    0.19    0.849
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1386.3  on 999  degrees of freedom
## Residual deviance: 1386.3  on 998  degrees of freedom
## AIC: 1390.3
## 
## Number of Fisher Scoring iterations: 3

Hàm hồi quy có dạng:

\[ \log\left(\frac{\hat{\pi}}{1 - \hat{\pi}}\right) = -0.01302 + 0.02415 \cdot \text{residence}_{\text{Urban}} \]

Trong đó:

  • Hệ số chặn (Intercept) = -0.01302, thể hiện log-odds đi học đại học khi người đó sống ở vùng nông thôn (Rural).

  • Hệ số của residenceUrban = 0.02415, nghĩa là log-odds tăng nhẹ nếu người đó sống ở thành thị (Urban) so với Rural.

Ý nghĩa thống kê:

Biến Estimate p-value
(Intercept) -0.01302 0.889
residenceUrban 0.02415 0.849
  • Cả hai biến đều có p-value rất lớn (> 0.05), đặc biệt residenceUrban có p-value = 0.849 → không có ý nghĩa thống kê.
  • Do đó, không có bằng chứng cho thấy nơi cư trú (Urban hay Rural) ảnh hưởng đến khả năng đi học đại học.

Độ phù hợp của mô hình:

  • Null deviance = 1386.3, Residual deviance = 1386.3 → mô hình gần như không cải thiện gì so với mô hình không có biến giải thích.
  • AIC = 1390.3 cũng tương đối cao, cho thấy mô hình không hiệu quả.

Kết luận:

Biến residence không phải là một yếu tố giải thích tốt cho biến will_go_to_college. Không có bằng chứng thống kê nào cho thấy sống ở thành thị hay nông thôn ảnh hưởng đến khả năng đi học đại học trong dữ liệu này. Để cải thiện mô hình, nên xem xét đưa vào thêm các biến quan trọng khác như: thu nhập, trình độ cha mẹ, kết quả học tập, v.v.

1.1.2 parent_was_in_college

# Chạy mô hình logistic
xstt.WP <- glm(will_go_to_college ~ parent_was_in_college, data = data, family = binomial)
summary(xstt.WP)
## 
## Call:
## glm(formula = will_go_to_college ~ parent_was_in_college, family = binomial, 
##     data = data)
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)
## (Intercept)                -0.1001     0.0914  -1.095    0.274
## parent_was_in_collegeTRUE   0.1925     0.1267   1.519    0.129
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1386.3  on 999  degrees of freedom
## Residual deviance: 1384.0  on 998  degrees of freedom
## AIC: 1388
## 
## Number of Fisher Scoring iterations: 3

Hàm hồi quy có dạng:

\[ \log\left(\frac{\hat{\pi}}{1 - \hat{\pi}}\right) = -0.1001 + 0.1925 \cdot \text{parent\_was\_in\_college}_{\text{TRUE}} \]

Trong đó:

  • Hệ số chặn (Intercept) = -0.1001, là log-odds đi học đại học của những người có cha mẹ không học đại học (nhóm tham chiếu).

  • Hệ số của biến parent_was_in_collegeTRUE = 0.1925, nghĩa là log-odds đi học đại học của người có cha mẹ từng học đại học cao hơn một chút so với người không có.

Với p-value = 0.129 (> 0.05), biến parent_was_in_college không có ý nghĩa thống kê ở mức 5%.

Do đó, không có bằng chứng rõ ràng cho thấy cha mẹ từng học đại học ảnh hưởng đến việc con cái có đi học đại học trong mô hình này.

Độ phù hợp của mô hình:

  • Null deviance = 1386.3; Residual deviance = 1384.0 → mô hình chỉ cải thiện rất nhẹ so với mô hình không có biến giải thích.

  • AIC = 1388, không cải thiện đáng kể so với mô hình chỉ có Intercept.

Kết luận:

Biến parent_was_in_college chưa cho thấy ảnh hưởng rõ rệt đến xác suất đi học đại học của người tham gia khảo sát. Mặc dù hệ số dương cho thấy xu hướng “nếu cha mẹ từng học đại học thì con cái có xu hướng học đại học cao hơn”, nhưng kết quả không đạt mức ý nghĩa thống kê. Nên xem xét kết hợp thêm các biến khác như thành tích học tập, thu nhập, môi trường sống, v.v. để cải thiện mô hình dự đoán.

1.2 Mô hình Logit

1.2.1 school_accreditation

reglogit_SR <- glm( school_accreditation ~ residence, data = data, family = binomial(link = 'logit'))
summary(reglogit_SR)
## 
## Call:
## glm(formula = school_accreditation ~ residence, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)     0.67046    0.09843   6.811 9.67e-12 ***
## residenceUrban -1.08830    0.13206  -8.241  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1384.9  on 999  degrees of freedom
## Residual deviance: 1314.2  on 998  degrees of freedom
## AIC: 1318.2
## 
## Number of Fisher Scoring iterations: 4

Biến school_accreditation có hai mức: A (giá trị 1 – nhóm tham chiếu) và B (giá trị 0). Biến residence gồm Rural (nhóm tham chiếu) và Urban.

Hàm hồi quy có dạng:

\[ \log\left(\frac{\hat{\pi}}{1 - \hat{\pi}}\right) = 0.67046 - 1.08830 \cdot \text{residence}_{\text{Urban}} \]

Trong đó:

  • \(\hat{\pi}\) là xác suất học tại trường kiểm định loại A.

  • Nhóm cư trú Rural được dùng làm tham chiếu, nên hệ số của residenceUrban thể hiện sự khác biệt log-odds so với nhóm Rural.

Kết quả ước lượng:

Biến Estimate Std. Error z-value p-value
(Intercept) 0.67046 0.09843 6.811 9.67e-12 ***
residenceUrban -1.08830 0.13206 -8.241 < 2e-16 ***

Diễn giải:

  • Hệ số residenceUrban = -1.0883 nghĩa là người sống ở thành thị có log-odds giảm đáng kể về khả năng học trường kiểm định loại A so với nông thôn.

  • Cả hai hệ số đều có ý nghĩa thống kê rất cao (p-value gần 0).

Độ phù hợp mô hình:

  • Null deviance: 1384.9

  • Residual deviance: 1314.2

→ Mô hình giảm deviance đáng kể → phù hợp tốt. - AIC = 1318.2

Kết luận:

bằng chứng thống kê mạnh cho thấy người sống ở khu vực thành thị có xác suất thấp hơn để học trường kiểm định loại A. Điều này gợi ý mối liên hệ tiềm năng giữa điều kiện địa lý và tiếp cận giáo dục chất lượng.

1.2.2 school_accreditation

reglogit_SPS <- glm( school_accreditation ~ parent_was_in_college, data = data, family = binomial(link = 'logit'))
summary(reglogit_SPS)
## 
## Call:
## glm(formula = school_accreditation ~ parent_was_in_college, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                -1.1210     0.1060  -10.57   <2e-16 ***
## parent_was_in_collegeTRUE   2.3358     0.1488   15.70   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1384.9  on 999  degrees of freedom
## Residual deviance: 1094.8  on 998  degrees of freedom
## AIC: 1098.8
## 
## Number of Fisher Scoring iterations: 4

Hàm hồi quy có dạng:

\[ \log\left(\frac{\hat{\pi}}{1 - \hat{\pi}}\right) = -1.1210 + 2.3358 \cdot \text{parent\_was\_in\_college}_{\text{TRUE}} \]

Kết quả:

Biến Estimate Std. Error z-value p-value
(Intercept) -1.1210 0.1060 -10.57 < 2e-16 ***
parent_was_in_collegeTRUE 2.3358 0.1488 15.70 < 2e-16 ***

Diễn giải:

  • Hệ số dương cho thấy người có cha mẹ từng học đại học có xác suất cao hơn rõ rệt để học trường loại A.

  • Kết quả này có ý nghĩa thống kê rất mạnh (p-value < 0.001).

Độ phù hợp mô hình:

  • Null deviance: 1384.9

  • Residual deviance: 1094.8

  • AIC = 1098.8 → mô hình phù hợp tốt.

Kết luận:

Cha mẹ từng học đại học là một yếu tố quan trọng ảnh hưởng tích cực đến khả năng học tại trường kiểm định loại A.

1.3 Mô hình Probit

1.3.1 school_accreditation

regprobit_SR <- glm( school_accreditation ~ residence, data = data, family = binomial(link = 'probit'))
summary(regprobit_SR)
## 
## Call:
## glm(formula = school_accreditation ~ residence, family = binomial(link = "probit"), 
##     data = data)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)     0.41685    0.06025   6.918 4.57e-12 ***
## residenceUrban -0.67789    0.08135  -8.333  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1384.9  on 999  degrees of freedom
## Residual deviance: 1314.2  on 998  degrees of freedom
## AIC: 1318.2
## 
## Number of Fisher Scoring iterations: 4

Phần 2: Hồi quy bội

2.1 Mô hình Logit

logistic_model_mle <- glm(will_go_to_college ~ ., data = data, family = binomial(link = "logit"))
summary(logistic_model_mle)
## 
## Call:
## glm(formula = will_go_to_college ~ ., family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                4.78841    0.97830   4.895 9.85e-07 ***
## type_schoolVocational     -0.03753    0.21309  -0.176 0.860195    
## school_accreditationB     -0.70951    0.24318  -2.918 0.003527 ** 
## genderMale                -0.22348    0.19472  -1.148 0.251081    
## interestLess Interested    0.90309    0.42540   2.123 0.033762 *  
## interestNot Interested     2.29486    0.51450   4.460 8.18e-06 ***
## interestUncertain          1.88883    0.43584   4.334 1.47e-05 ***
## interestVery Interested    1.75214    0.41675   4.204 2.62e-05 ***
## residenceUrban             2.84110    0.31917   8.902  < 2e-16 ***
## parent_salaryaverage      -1.96130    0.22533  -8.704  < 2e-16 ***
## parent_salaryhigh          3.14573    0.90806   3.464 0.000532 ***
## parent_salarylow          -5.02718    0.65263  -7.703 1.33e-14 ***
## house_areaMedium          -1.61116    0.28296  -5.694 1.24e-08 ***
## house_areaSmall           -3.16206    0.32414  -9.755  < 2e-16 ***
## average_gradesFair        -5.72559    0.82581  -6.933 4.11e-12 ***
## average_gradesGood        -4.55926    0.81821  -5.572 2.51e-08 ***
## parent_was_in_collegeTRUE  0.69473    0.30259   2.296 0.021680 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1386.3  on 999  degrees of freedom
## Residual deviance:  688.9  on 983  degrees of freedom
## AIC: 722.9
## 
## Number of Fisher Scoring iterations: 7

1. Đánh giá Tổng thể Mô hình

  • Độ phù hợp: Mô hình vẫn rất tốt. Residual deviance (688.9) thấp hơn nhiều so với Null deviance (1386.3), cho thấy các biến độc lập giải thích được một phần lớn sự thay đổi trong quyết định vào đại học của sinh viên.

  • AIC: Giá trị AIC là 722.9. Đây là một chỉ số tốt để so sánh với các mô hình khác (ví dụ, nếu bạn thêm hoặc bớt biến).

  • Sự ổn định: Các giá trị Standard Error (Sai số chuẩn) của các hệ số giờ đây đều hợp lý, không còn các con số khổng lồ như trước. Điều này cho thấy các ước lượng (Estimate) đã ổn định và đáng tin cậy hơn.

2. Phân tích Chi tiết các Hệ số (Ước lượng MLE)

  • residenceUrban (Nơi ở: Đô thị):

Hệ số: +2.84. Đây vẫn là yếu tố dự báo cực kỳ mạnh. Phân tích: Sinh viên sống ở thành thị có khả năng vào đại học cao hơn rất nhiều so với sinh viên ở nông thôn. Tỷ lệ odds: exp(2.84) ≈ 17.1. Odds của một sinh viên thành thị vào đại học cao hơn gấp 17.1 lần so với sinh viên nông thôn, khi các yếu tố khác không đổi.

  • *** parent_salary (Lương của cha mẹ):*** Phân tích: So với mức lương “adequate” (đầy đủ), thu nhập của cha mẹ là yếu tố quyết định.

average (Trung bình): Hệ số -1.96. Odds vào đại học thấp hơn 1 - exp(-1.96) ≈ 86%.

high (Cao): Hệ số +3.15. Odds vào đại học cao hơn gấp exp(3.15) ≈ 23.3 lần.

low (Thấp): Hệ số -5.03. Odds vào đại học giảm cực mạnh, gần như bằng 0.

  • house_area (Diện tích nhà):

Phân tích: So với nhà “Large” (lớn), diện tích nhà nhỏ hơn làm giảm khả năng vào đại học.

Medium (Trung bình): Hệ số -1.61. Odds thấp hơn khoảng 80%.

Small (Nhỏ): Hệ số -3.16. Odds thấp hơn khoảng 95.7%. Điều này cho thấy diện tích nhà (có thể là một chỉ báo cho tình trạng kinh tế xã hội) là một yếu tố rất quan trọng.

  • average_grades (Điểm trung bình): Phân tích: So với điểm “Excellent” (xuất sắc), điểm thấp hơn là một rào cản lớn.

Fair (Khá): Hệ số -5.73.

Good (Tốt): Hệ số -4.56.

Cả hai đều làm giảm cơ hội vào đại học một cách đáng kể, cho thấy kết quả học tập là yếu tố tiên quyết.

  • interest (Mức độ quan tâm):

Phân tích: Vấn đề lạ vẫn còn tồn tại. So với mức cơ sở “Interested” (Quan tâm), các mức độ khác đều làm tăng khả năng vào đại học.

Not Interested (Không quan tâm): Hệ số +2.29.

Uncertain (Không chắc chắn): Hệ số +1.89.

Very Interested (Rất quan tâm): Hệ số +1.75.

  • school_accreditationB (Kiểm định trường: B): Hệ số: -0.71 (p-value = 0.0035 **).

Phân tích: So với trường loại A, học ở trường được kiểm định loại B làm giảm khả năng vào đại học.

Tỷ lệ odds: exp(-0.71) ≈ 0.49. Odds của sinh viên trường B chỉ bằng khoảng một nửa (49%) so với sinh viên trường A.

  • parent_was_in_collegeTRUE (Cha mẹ đã học đại học): Hệ số: +0.69 (p-value = 0.0217 *).

Phân tích: Yếu tố này vẫn có ý nghĩa. Nền tảng giáo dục của gia đình có ảnh hưởng tích cực.

Tỷ lệ odds: exp(0.69) ≈ 2.0. Odds vào đại học của sinh viên có cha mẹ từng học đại học cao hơn gấp đôi so với những người khác.

2.2 Mô hình Probit

logistic_model_probit <- glm(will_go_to_college ~ ., data = data, family = binomial(link = "probit"))
summary(logistic_model_probit)
## 
## Call:
## glm(formula = will_go_to_college ~ ., family = binomial(link = "probit"), 
##     data = data)
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                2.34325    0.44866   5.223 1.76e-07 ***
## type_schoolVocational     -0.01361    0.12013  -0.113 0.909786    
## school_accreditationB     -0.36251    0.13627  -2.660 0.007810 ** 
## genderMale                -0.12097    0.10997  -1.100 0.271331    
## interestLess Interested    0.54528    0.23399   2.330 0.019787 *  
## interestNot Interested     1.32091    0.28537   4.629 3.68e-06 ***
## interestUncertain          1.12993    0.24052   4.698 2.63e-06 ***
## interestVery Interested    1.04398    0.22950   4.549 5.39e-06 ***
## residenceUrban             1.62966    0.17454   9.337  < 2e-16 ***
## parent_salaryaverage      -1.13898    0.12528  -9.092  < 2e-16 ***
## parent_salaryhigh          1.86561    0.50130   3.722 0.000198 ***
## parent_salarylow          -2.82788    0.32938  -8.585  < 2e-16 ***
## house_areaMedium          -0.93671    0.15694  -5.969 2.39e-09 ***
## house_areaSmall           -1.81136    0.17681 -10.244  < 2e-16 ***
## average_gradesFair        -2.92418    0.33995  -8.602  < 2e-16 ***
## average_gradesGood        -2.25407    0.33609  -6.707 1.99e-11 ***
## parent_was_in_collegeTRUE  0.37162    0.16880   2.202 0.027700 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1386.29  on 999  degrees of freedom
## Residual deviance:  689.64  on 983  degrees of freedom
## AIC: 723.64
## 
## Number of Fisher Scoring iterations: 7

Các yếu tố có ảnh hưởng mạnh nhất (p-value ):

  • residenceUrban (Nơi ở: Đô thị):

Hệ số: +1.630. Hệ số dương rất lớn cho thấy sống ở thành thị làm tăng mạnh Z-score, và do đó làm tăng mạnh xác suất vào đại học so với ở nông thôn.

  • parent_salary (Lương cha mẹ): high (Cao): Hệ số +1.866. Tác động tích cực và mạnh nhất.

average (Trung bình): Hệ số -1.139. Tác động tiêu cực mạnh. low (Thấp): Hệ số -2.828. Tác động tiêu cực mạnh nhất, gần như loại bỏ cơ hội vào đại học.

  • house_area (Diện tích nhà):

Medium và Small: Cả hai đều có hệ số âm (-0.937 và -1.811), cho thấy chúng làm giảm đáng kể xác suất vào đại học so với nhà “Large”.

  • average_grades (Điểm trung bình): Fair và Good: Cả hai đều có hệ số âm rất lớn (-2.924 và -2.254), khẳng định rằng việc không đạt điểm “Excellent” là một rào cản cực lớn.

  • interest (Mức độ quan tâm): Vấn đề vẫn còn đó: Giống hệt mô hình Logit, tất cả các mức độ quan tâm khác đều có hệ số dương so với mức cơ sở “Interested”. Not Interested (+1.321) thậm chí còn có hệ số cao hơn Very Interested (+1.044). Điều này tiếp tục là một cảnh báo đỏ về biến này.

Các yếu tố có ảnh hưởng có ý nghĩa (p-value):

  • school_accreditationB (Kiểm định trường: B): Hệ số: -0.363 (p-value **). Việc học ở trường loại B làm giảm xác suất vào đại học so với trường loại A.

  • parent_was_in_collegeTRUE (Cha mẹ đã học đại học): Hệ số: +0.372 (p-value *). Nền tảng giáo dục gia đình có tác động tích cực.

2. 3 So sánh Trực quan hai Mô hình

# Lấy hiệu ứng dự đoán từ cả hai mô hình
library(ggeffects)
## Warning: package 'ggeffects' was built under R version 4.5.1
pred_logit <- ggpredict(logistic_model_mle, terms = "residence")
pred_probit <- ggpredict(logistic_model_probit, terms = "residence")

# Thêm cột để xác định mô hình
pred_logit$model <- "Logit"
pred_probit$model <- "Probit"


# Gộp dữ liệu và vẽ
combined_preds <- rbind(pred_logit, pred_probit)

# Tạo một biến position_dodge để dùng chung
library(ggplot2)
dodge <- position_dodge(width = 0.2) # Khoảng cách để tách các đường

ggplot(combined_preds, aes(x = x, y = predicted, colour = model, group = model)) +
  # Vẽ đường nối các điểm, áp dụng dodge
  geom_line(linewidth = 1.2, position = dodge) +
  # Vẽ điểm để nhấn mạnh, áp dụng dodge
  geom_point(size = 2, position = dodge) +
  # Vẽ dải tin cậy dưới dạng thanh lỗi (error bar) để dễ nhìn hơn khi dodge
  geom_errorbar(aes(ymin = conf.low, ymax = conf.high), width = 0.1, position = dodge) +
  labs(
    title = "So sánh Xác suất Dự đoán giữa Mô hình Logit và Probit",
    subtitle = "Hiệu ứng của Lương Cha Mẹ (đã tách nhẹ để dễ nhìn)",
    y = "Xác suất vào Đại học (Dự đoán)",
    x = "Nơi sinh sống",
    colour = "Mô hình"
  ) +
  theme_minimal() +
  ylim(0, 1) # Đảm bảo trục y chạy từ 0 đến 1

W5

PHẦN 1: will_go_to_college-parent_was_in_college

1.1 Bảng tuần số chéo

table_WP <- table(data$will_go_to_college,data$parent_was_in_college)

library(kableExtra)
kable(table_WP, format = "html", caption = "Bảng 1.1 Tần số theo quyết định theo học cao đẳng và người giám hộ theo học cao đẳng") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 1.1 Tần số theo quyết định theo học cao đẳng và người giám hộ theo học cao đẳng
FALSE TRUE
NO 252 248
YES 228 272

Bảng tần số cho thấy học sinh có người giám hộ từng học cao đẳng có xu hướng quyết định theo học cao đẳng cao hơn so với học sinh có người giám hộ không học cao đẳng. Điều này phản ánh vai trò quan trọng của nền tảng học vấn người giám hộ trong việc ảnh hưởng đến quyết định học tập của con em mình.

1.2 Trực quan hoá

library(ggplot2)
df_WP <- as.data.frame(table_WP)
colnames(df_WP) <- c("Decision", "ParentCollege", "Count")
ggplot(df_WP, aes(x = ParentCollege, y = Count, fill = Decision)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = Count),
            position = position_dodge(width = 0.9)) +
  labs(
    x = "Người giám hộ từng học cao đẳng",
    y = "Số lượng học sinh",
    fill = "Quyết định học cao đẳng",
    title = "Biểu đồ 1.1: Tần số học sinh theo quyết định học cao đẳng và người giám hộ học cao đẳng"
  ) +
  theme_minimal()

NHẬN XÉT:

  • Biểu đồ và Bảng 1.1 cho thấy ảnh hưởng rõ rệt của trình độ học vấn người giám hộ đến quyết định học cao đẳng của học sinh. Ở nhóm có người giám hộ từng học cao đẳng, số học sinh quyết định học tiếp (YES) là 272, cao hơn nhóm không học (NO) là 248. Ngược lại, với nhóm không có người giám hộ từng học cao đẳng, số học sinh không học cao đẳng lại cao hơn (252 so với 228).

  • Sự khác biệt này phản ánh xu hướng: học sinh có người giám hộ từng học cao đẳng có xu hướng chọn học tiếp cao hơn. Điều này cho thấy trình độ học vấn của người giám hộ có thể đóng vai trò tích cực trong việc định hướng học tập cho học sinh, là yếu tố đáng cân nhắc trong các chính sách khuyến học và hỗ trợ giáo dục.

1.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{trình độ học vấn của người giám hộ và quyết định học tiếp của học sinh độc lập với nhau } \\ H_1: \; \text{trình độ học vấn của người giám hộ và quyết định học tiếp của học sinh có liên quan đến nhau} \end{array} \right.\]

Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chiWP <- chisq.test(table_WP)
print(chiWP)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_WP
## X-squared = 2.1194, df = 1, p-value = 0.1454

NHẬN XÉT:

Với bài toán kiểm định mối liên hệ giữa trình độ học vấn của người giám hộ và quyết định học tiếp cao đẳng của học sinh, ta sử dụng kiểm định Chi-squared với hiệu chỉnh Yates. Kết quả cho thấy thống kê \(\chi^2 = 2.1194\) với 1 bậc tự do và p-value = 0.1454, lớn hơn mức ý nghĩa 5%.

Do đó, không có đủ bằng chứng để bác bỏ giả thuyết \(H_0\). Điều này đồng nghĩa với việc chưa thể khẳng định có mối liên hệ rõ ràng giữa trình độ học vấn của người giám hộ và quyết định học tiếp của học sinh trong tổng thể. Mặc dù có sự chênh lệch nhẹ về tần số trong bảng, nhưng xét trên khía cạnh thống kê, sự khác biệt này chưa đủ ý nghĩa để rút ra kết luận chắc chắn. Các yếu tố khác có thể đang đóng vai trò quan trọng hơn trong quyết định học tập của học sinh.

1.4 Hiệu hai tỷ lệ

Thiết lập tỷ lệ

Tỷ lệ học sinh quyết định học có người giám hộ học cao đẳng:

\[ p_1 = P(\text{parents_was_in_college} = TRUE \mid \text{will_go_to_college} = YES) \] Tỷ lệ học sinh không quyết định học có người giám hộ học cao đẳng:

\[ p_1 = P(\text{parents_was_in_college} = TRUE \mid \text{will_go_to_college} = NO) \] Hiệu chênh lệch giữa hai tỷ lệ:

\[ d = p_1 - p_2 \]

Giả thuyết kiểm định

  • Giả thuyết H₀: Không có sự khác biệt giữa hai tỷ lệ
    \[ H_0: p_1 - p_2 = 0\]

  • Giả thuyết H1): Tỷ lệ học sinh quyết định học có người giám hộ học cao đẳng thấp hơn Tỷ lệ học sinh không quyết định học có người giám hộ học cao đẳng: \(H_1: p_1 - p_2 < 0\)

# Kiểm định sự khác biệt trong quyết định học tiếp cao đẳng với bố mẹ theo học cao đẳng
library(stats)

testWP <- prop.test(x = c(table_WP["YES","TRUE"], table_WP["NO","TRUE"]),
                      n = c(sum(table_WP["YES",]), sum(table_WP["NO",])),
                      alternative = "less", correct = FALSE)
print(testWP)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(table_WP["YES", "TRUE"], table_WP["NO", "TRUE"]) out of c(sum(table_WP["YES", ]), sum(table_WP["NO", ]))
## X-squared = 2.3077, df = 1, p-value = 0.9356
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000  0.09991321
## sample estimates:
## prop 1 prop 2 
##  0.544  0.496

Kết quả kiểm định hai tỷ lệ cho thấy \(\chi^2 = 2.3077\), với p-value = 0.9356, lớn hơn nhiều so với mức ý nghĩa 0.05. Do đó, ta không bác bỏ giả thuyết \(H_0\), tức là không có đủ bằng chứng để kết luận rằng tỷ lệ học sinh quyết định học cao đẳng có người giám hộ từng học cao đẳng thấp hơn nhóm còn lại. Ngược lại, ước lượng mẫu lại cho thấy tỷ lệ này cao hơn một chút (0.544 > 0.496), dù không có ý nghĩa thống kê.

Khoảng tin cậy 95% cho hiệu số tỷ lệ \((p_1 - p_2)\) là từ –1.0000 đến 0.09991321 bao gồm 0, càng củng cố việc không có sự khác biệt đáng kể. Dù tỷ lệ ước lượng của nhóm học tiếp học cao đẳng là 0.544, cao hơn nhóm không học (0.496), nhưng chênh lệch này không có ý nghĩa thống kê.

Hiệu chênh lệch giữa hai tỷ lệ: \[ \hat{d} = 0.544 - 0.496 = 0.048 \]

1.5 Tỷ số Nguy cơ (Relative Risk - RR)

library(epitools)
rWP <- riskratio(table_WP, method = "wald")
print(rWP)
## $data
##        
##         FALSE TRUE Total
##   NO      252  248   500
##   YES     228  272   500
##   Total   480  520  1000
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate     lower    upper
##   NO  1.000000        NA       NA
##   YES 1.096774 0.9733737 1.235819
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   NO          NA           NA         NA
##   YES  0.1294593    0.1454068   0.128735
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Dựa trên bảng dữ liệu 2×2, tỷ số rủi ro (risk ratio) giữa nhóm học sinh có quyết định học cao đẳng và người giám hộ từng học cao đẳng là RR = 1.097, tức cao hơn khoảng 9.7% so với nhóm quyết định không học. Tuy nhiên, khoảng tin cậy 95% là (0.973; 1.236) bao gồm giá trị 1, nghĩa là chưa đủ bằng chứng thống kê để khẳng định có sự khác biệt thực sự.

Phương pháp kiểm định Giá trị p (two-sided)
Mid-p exact test 0.1295
Fisher exact test 0.1454
Chi-square test 0.1287
  • Tất cả các giá trị p đều lớn hơn mức ý nghĩa 0.05.

  • Điều này có nghĩa là ta không đủ bằng chứng để bác bỏ giả thuyết tức là không có sự khác biệt đáng kể về tỷ lệ quyết định học tiếp cao đẳng giữa học sinh có người giám hộ từng học cao đẳng và không học cao đẳng dựa trên dữ liệu này.

  • Kết luận: Dữ liệu chưa cho thấy mối liên hệ có ý nghĩa thống kê giữa trình độ người giám hộ và quyết định học tiếp của học sinh.

1.6 Tỷ số Chênh (Odds Ratio - OR):

library(DescTools)
orWP <- OddsRatio(table_WP, method="wald", conf.level = 0.95)
print(orWP)
## odds ratio     lwr.ci     upr.ci 
##  1.2122241  0.9455879  1.5540462
  • OR > 1 nghĩa là odds quyết định học tiếp cao đẳng của học sinh có người giám hộ từng học cao đẳng cao hơn odds của học sinh có người giám hộ không học cao đẳng.

  • Giá trị OR = 1.2122 cho thấy odds học tiếp cao đẳng của nhóm học sinh có người giám hộ từng học cao đẳng cao hơn khoảng 21.22% so với nhóm còn lại (1.2122 - 1 = 0.2122).

  • Khoảng tin cậy 95% cho OR là (0.9456, 1.5540) chứa giá trị 1.

  • Điều này cho thấy, về mặt thống kê, chúng ta không thể khẳng định chắc chắn sự khác biệt về odds giữa hai nhóm, tức có khả năng odds của hai nhóm là bằng nhau (OR = 1).

TỔNG KẾT

Kết quả phân tích cho thấy tỷ số rủi ro (RR = 1.097) và odds ratio (OR = 1.212) đều lớn hơn 1, chỉ ra nhóm học sinh có người giám hộ từng học cao đẳng có xu hướng quyết định học tiếp cao đẳng cao hơn nhóm còn lại, tương ứng tăng khoảng 9.7% về tỷ lệ và 21.2% về odds. Tuy nhiên, các khoảng tin cậy 95% của RR (0.973–1.236) và OR (0.946–1.554) đều chứa giá trị 1, cùng với các giá trị p kiểm định chi-square, Fisher, và mid-p đều lớn hơn 0.05, cho thấy sự khác biệt này chưa đủ ý nghĩa thống kê. Như vậy, chưa có bằng chứng rõ ràng khẳng định mối liên hệ giữa trình độ người giám hộ và quyết định học tiếp của học sinh.

PHẦN 2: will_go_to_college-gender

2.1 Bảng tuần số chéo

table_WG <- table(data$will_go_to_college,data$gender)

library(kableExtra)
kable(table_WG, format = "html", caption = "Bảng 2.1 Tần số theo quyết định theo học cao đẳng bởi giới tính của học sinh") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 2.1 Tần số theo quyết định theo học cao đẳng bởi giới tính của học sinh
Female Male
NO 234 266
YES 251 249

Bảng 2.1 trình bày phân phối tần số lựa chọn học cao đẳng của học sinh theo giới tính. Kết quả cho thấy trong tổng số nữ sinh, có 251 em quyết định học cao đẳng (chiếm khoảng 51,8%), trong khi 234 em không theo học. Đối với nam sinh, 249 em chọn học cao đẳng (chiếm xấp xỉ 48,4%) và 266 em không theo học. Mặc dù tỷ lệ lựa chọn học cao đẳng giữa nam và nữ khá tương đương, nữ sinh có xu hướng lựa chọn học cao đẳng cao hơn một chút so với nam sinh. Điều này có thể gợi ý về sự khác biệt hành vi theo giới trong việc ra quyết định giáo dục sau trung học.

2.2 Trực quan hoá

library(ggplot2)
df_WG <- as.data.frame(table_WG)
colnames(df_WG) <- c("Decision", "Gender", "Count")
ggplot(df_WG, aes(x = Gender, y = Count, fill = Decision)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = Count),
            position = position_dodge(width = 0.9)) +
  labs(
    x = "Giới tính",
    y = "Số lượng học sinh",
    fill = "Quyết định học cao đẳng",
    title = "Biểu đồ 2.1: Tần số theo quyết định học cao đẳng và giới tính của học sinh"
  ) +
  theme_minimal()

NHẬN XÉT:

Biểu đồ 2.1 minh họa phân bố số lượng học sinh theo giới tính và quyết định học cao đẳng. Trong nhóm nữ sinh, số lượng chọn học cao đẳng (251) nhỉnh hơn số không học (234), trong khi ở nhóm nam, số học sinh không học cao đẳng (266) lại cao hơn số chọn học (249). Điều này cho thấy nữ sinh có xu hướng lựa chọn học tiếp cao đẳng cao hơn nam sinh. Tuy nhiên, sự chênh lệch giữa hai nhóm giới tính là không lớn.

2.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{Giới tính và quyết định học tiếp của học sinh độc lập với nhau } \\ H_1: \; \text{Giới tính và quyết định học tiếp của học sinh có liên quan đến nhau} \end{array} \right.\]

Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chiWG <- chisq.test(table_WG)
print(chiWG)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_WG
## X-squared = 1.0249, df = 1, p-value = 0.3114

NHẬN XÉT:

Kết quả kiểm định Chi bình phương với hiệu chỉnh Yates cho thấy thống kê kiểm định có giá trị \(\chi^2 = 1.02\) với 1 bậc tự do và giá trị p-value = 0.3114. Vì p-value lớn hơn mức ý nghĩa thông thường (0.05), ta không bác bỏ giả thuyết \(H_0\). Do đó, không có đủ bằng chứng thống kê để kết luận rằng giới tính và quyết định học cao đẳng của học sinh có mối liên hệ. Nói cách khác, dữ liệu hiện tại cho thấy hai biến này có thể độc lập với nhau trong tổng thể.

2.4 Hiệu hai tỷ lệ

Thiết lập tỷ lệ

Tỷ lệ học sinh quyết định học cao đẳng là nữ:

\[ p_1 = P(\text{gender} = \text{Female} \mid \text{will_go_to_college} = \text{YES}) \] Tỷ lệ học sinh không quyết định học cao đẳng là nữ:

\[ p_2 = P(\text{gender} = \text{Female} \mid \text{will_go_to_college} = \text{NO}) \]

Hiệu chênh lệch giữa hai tỷ lệ:

\[ d = p_1 - p_2 \]

Giả thuyết kiểm định

  • Giả thuyết H₀: Không có sự khác biệt giữa hai tỷ lệ
    \[ H_0: p_1 - p_2 = 0\]

  • Giả thuyết H1): Tỷ lệ học sinh nữ quyết định họccao đẳng thấp hơn Tỷ lệ học sinh nữ không quyết định học cao đẳng: \(H_1: p_1 - p_2 < 0\)

# Kiểm định sự khác biệt trong quyết định học tiếp cao đẳng với bố mẹ theo học cao đẳng
library(stats)

testWG <- prop.test(x = c(table_WG["YES","Female"], table_WG["NO","Female"]),
                      n = c(sum(table_WG["YES",]), sum(table_WG["NO",])),
                      alternative = "less", correct = FALSE)
print(testWG)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(table_WG["YES", "Female"], table_WG["NO", "Female"]) out of c(sum(table_WG["YES", ]), sum(table_WG["NO", ]))
## X-squared = 1.157, df = 1, p-value = 0.859
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000  0.08596134
## sample estimates:
## prop 1 prop 2 
##  0.502  0.468

Nhận xét:
Kết quả kiểm định hai tỷ lệ độc lập cho thấy giá trị thống kê kiểm định là \(\chi^2 = 1.157\), với một bậc tự do và giá trị p-value = 0.859 (không hiệu chỉnh liên tục). Giả thuyết đối là tỷ lệ nữ trong nhóm học sinh quyết định học cao đẳng nhỏ hơn tỷ lệ nữ trong nhóm không học cao đẳng. Tuy nhiên, với p-value lớn hơn mức ý nghĩa 5%, ta không bác bỏ giả thuyết \(H_0\) rằng hai tỷ lệ này bằng nhau.

Ngoài ra, khoảng tin cậy 95% cho hiệu số hai tỷ lệ bao gồm 0 ([-1; 0.086]), củng cố kết luận rằng không có bằng chứng thống kê rõ ràng về sự khác biệt giữa hai tỷ lệ nữ trong hai nhóm. Điều này cho thấy giới tính (nữ) không ảnh hưởng đáng kể đến quyết định học cao đẳng trong mẫu dữ liệu này.

2.5 Tỷ số Nguy cơ (Relative Risk - RR)

library(epitools)
rWG <- riskratio(table_WG, method = "wald")
print(rWG)
## $data
##        
##         Female Male Total
##   NO       234  266   500
##   YES      251  249   500
##   Total    485  515  1000
## 
## $measure
##      risk ratio with 95% C.I.
##        estimate    lower    upper
##   NO  1.0000000       NA       NA
##   YES 0.9360902 0.829881 1.055892
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   NO          NA           NA         NA
##   YES  0.2830366    0.3113535    0.28208
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:
Kết quả thống kê cho thấy tỷ suất rủi ro (risk ratio) giữa nữ và nam trong quyết định học cao đẳng là 0.936, với khoảng tin cậy 95% là \([0.830;\ 1.056]\), điều này cho thấy không có bằng chứng thống kê rõ ràng về sự khác biệt trong xác suất học cao đẳng giữa hai giới tính.

P-value tương ứng từ các phương pháp khác nhau đều lớn hơn 0.05 (ví dụ: Fisher’s exact = 0.311, Chi-square = 0.282), nên không đủ cơ sở bác bỏ giả thuyết \(H_0\) rằng giới tính và quyết định học cao đẳng là độc lập.

Tóm lại,giới tính không phải là yếu tố ảnh hưởng đáng kể đến xác suất học sinh quyết định học cao đẳng trong mẫu này.

2.6 Tỷ số Chênh (Odds Ratio - OR):

library(DescTools)
orWG <- OddsRatio(table_WG, method="wald", conf.level = 0.95)
print(orWG)
## odds ratio     lwr.ci     upr.ci 
##  0.8726897  0.6808937  1.1185112

Nhận xét:
- OR < 1 nghĩa là odds (tỷ lệ cược) học sinh nam quyết định học cao đẳng thấp hơn so với học sinh nữ.
- Cụ thể, odds ratio ước lượng được là 0.873, cho thấy học sinh nam có odds quyết định học cao đẳng chỉ bằng khoảng 87.3% so với học sinh nữ.

Cụ thể, odds ratio nhỏ hơn 1 cho thấy học sinh nam có xu hướng ít quyết định học cao đẳng hơn nữ, nhưng sự khác biệt này không có ý nghĩa thống kê do khoảng tin cậy chứa giá trị trung lập (1).

Do đó, với dữ liệu hiện tại, ta có thể kết luận rằng giới tính không phải là yếu tố có ảnh hưởng rõ rệt đến hành vi quyết định học tiếp của học sinh.

PHẦN 3: residence-typeschool

3.1 Bảng tuần số chéo

table_typere <- table(data$type_school,data$residence)

library(kableExtra)
kable(table_typere, format = "html", caption = "Bảng 3.1 Tần số theo loại trường và nơi sịnh sống của học sinh") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 3.1 Tần số theo loại trường và nơi sịnh sống của học sinh
Rural Urban
Academic 221 388
Vocational 240 151

Nhận xét:

Bảng 3.1 cho thấy mối quan hệ giữa loại trường học sinh theo học (Academic và Vocational) với nơi sinh sống (Rural và Urban). Trong nhóm học sinh học trường Academic, phần lớn đến từ khu vực Urban (388 em), cao gần gấp đôi so với khu vực Rural (221 em). Ngược lại, trong nhóm học sinh học trường Vocational, tỷ lệ từ Rural (240 em) lại chiếm ưu thế so với Urban (151 em).

Sự phân bố này gợi ý rằng nơi sinh sống có thể ảnh hưởng đến xu hướng lựa chọn loại hình giáo dục. Cụ thể, học sinh sống ở đô thị có xu hướng theo học các trường học thuật (Academic), trong khi học sinh nông thôn có xu hướng theo học các trường nghề (Vocational).

3.2 Trực quan hoá

library(ggplot2)
df_typere <- as.data.frame(table_typere)
colnames(df_typere) <- c("Residence", "SchoolType", "Count")
ggplot(df_typere, aes(x = SchoolType, y = Count, fill = Residence)) +
  geom_bar(stat = "identity", position = "dodge") +
   geom_text(aes(label = Count),position = position_dodge(width = 0.9)) +
  labs(
    x = "Loại trường",
    y = "Số lượng học sinh",
    fill = "Nơi sinh sống",
    title = "Biểu đồ 4.2: Tần số học sinh theo loại trường và nơi sinh sống"
  ) +
  theme_minimal()

NHẬN XÉT:

Biểu đồ thể hiện sự phân bố học sinh theo loại trường (Academic, Vocational) và nơi sinh sống (Rural, Urban). Dễ thấy, trong nhóm học sinh theo học trường học thuật (Academic), số lượng học sinh Urban (388) vượt trội so với Rural (221). Ngược lại, đối với trường nghề (Vocational), học sinh Rural (240) chiếm ưu thế hơn Urban (151).

3.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{Nơi sinh sống và loại trường theo học của học sinh độc lập với nhau } \\ H_1: \; \text{Nơi sinh sống và loại trường theo học của học sinh có liên quan đến nhau} \end{array} \right.\]

Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chitypere <- chisq.test(table_typere)
print(chitypere)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_typere
## X-squared = 59.331, df = 1, p-value = 1.333e-14

Nhận xét:

Giá trị thống kê kiểm định là \(\chi^2 = 59.33\) với 1 bậc tự do và giá trị p-value rất nhỏ (≈ \(1.33 \times 10^{-14}\)). Vì p-value < 0.05, ta có đủ cơ sở bác bỏ giả thuyết \(H_0\) tại mức ý nghĩa 5%.

Điều này cho thấy có bằng chứng thống kê mạnh mẽ rằng nơi sinh sống và loại trường theo học của học sinh có liên quan đến nhau. Nói cách khác, lựa chọn học trường academic hay vocational có thể phụ thuộc vào nơi sinh sống (rural/urban) của học sinh.

3.4 Hiệu hai tỷ lệ

Thiết lập tỷ lệ

Tỷ lệ học sinh sống ở nông thôn (Rural) theo học trường học thuật (Academic):

\[ p_1 = P(\text{residence} = \text{Rural} \mid \text{schoo_type} = \text{Academic}) \]

Tỷ lệ học sinh sống ở nông thôn (Rural) theo học trường nghề (Vocational):

\[ p_2 = P(\text{residence} = \text{Rural} \mid \text{school\_type} = \text{Vocational}) \]

Hiệu chênh lệch giữa hai tỷ lệ:

\[ d = p_1 - p_2 \]

Giả thuyết kiểm định

  • Giả thuyết H₀: Không có sự khác biệt giữa hai tỷ lệ
    \[ H_0: p_1 - p_2 = 0 \]

  • Giả thuyết H₁: Tỷ lệ học sinh học trường học thuật sống ở nông thôn thấp hơn tỷ lệ học sinh học trường nghề sống ở nông thôn
    \[ H_1: p_1 - p_2 < 0 \]

library(stats)

testtypere <- prop.test(x = c(table_typere ["Academic","Rural"], table_typere ["Vocational","Rural"]),
                      n = c(sum(table_typere ["Academic",]), sum(table_typere ["Vocational",])),
                      alternative = "less", correct = FALSE)
print(testtypere )
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(table_typere["Academic", "Rural"], table_typere["Vocational", "Rural"]) out of c(sum(table_typere["Academic", ]), sum(table_typere["Vocational", ]))
## X-squared = 60.336, df = 1, p-value = 3.998e-15
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.000000 -0.199274
## sample estimates:
##    prop 1    prop 2 
## 0.3628900 0.6138107

Nhận xét:

Kết quả kiểm định hiệu hai tỷ lệ cho thấy giá trị thống kê kiểm định là 60.336 với p-value ≈ 3.998×10⁻¹⁵ (rất nhỏ). Vì p-value nhỏ hơn mức ý nghĩa thông thường (0.05), ta có đủ cơ sở bác bỏ giả thuyết H₀.

Điều này có nghĩa là tỷ lệ học sinh học trường học thuật sống ở nông thôn thấp hơn đáng kể so với tỷ lệ học sinh học trường nghề sống ở nông thôn. Nói cách khác, dữ liệu cho thấy học sinh nông thôn có xu hướng chọn trường nghề nhiều hơn so với trường học thuật.

3.5 Tỷ số Nguy cơ (Relative Risk - RR)

library(epitools)
rtypere <- riskratio(table_typere, method = "wald")
print(rtypere)
## $data
##             
##              Rural Urban Total
##   Academic     221   388   609
##   Vocational   240   151   391
##   Total        461   539  1000
## 
## $measure
##             risk ratio with 95% C.I.
##               estimate     lower     upper
##   Academic   1.0000000        NA        NA
##   Vocational 0.6061579 0.5277098 0.6962678
## 
## $p.value
##             two-sided
##                midp.exact fisher.exact   chi.square
##   Academic             NA           NA           NA
##   Vocational 7.549517e-15 7.757187e-15 7.996554e-15
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét

Giá trị RR = 0.6061579 cho biết học sinh sống ở thành thị trong nhóm theo học trường nghề (Vocational) thấp hơn khoảng 40% so với nhóm học sinh theo học trường học thuật (Academic).

Kết quả kiểm định từ nhiều phương pháp đều cho thấy p-value rất nhỏ, cụ thể:

  • Chi-square: p = 7.997 × 10⁻¹⁵
  • Mid-p exact: p = 7.550 × 10⁻¹⁵
  • Fisher exact: p = 7.757 × 10⁻¹⁵

3.6 Tỷ số Chênh (Odds Ratio - OR):

library(DescTools)
ortypere <- OddsRatio(table_typere, method="wald", conf.level = 0.95)
print(ortypere)
## odds ratio     lwr.ci     upr.ci 
##  0.3583655  0.2757215  0.4657811

Giá trị Odds Ratio (OR) = 0.3584 cho biết odds (tỷ lệ chênh) học sinh sống ở thành thị trong nhóm theo học trường học thuật (Academic) chỉ bằng khoảng 35.8% so với odds của học sinh thành thị theo học trường nghề (Vocational).

Khoảng tin cậy 95% cho OR là (0.2757; 0.4658), không bao gồm giá trị 1, cho thấy sự khác biệt là có ý nghĩa thống kê.

Các kiểm định thống kê cũng cho kết quả p-value rất nhỏ:

  • Chi-square: p = 7.997 × 10⁻¹⁵
  • Mid-p exact: p = 7.550 × 10⁻¹⁵
  • Fisher exact: p = 7.757 × 10⁻¹⁵

PHẦN 4: residence-typeschool

4.1 Bảng tuần số chéo

table_typepaw <- table(data$type_school,data$parent_was_in_college)

library(kableExtra)
kable(table_typepaw, format = "html", caption = "Bảng 4.1 Tần số theo loại trường và trình độ học vấn người giám hộ") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 4.1 Tần số theo loại trường và trình độ học vấn người giám hộ
FALSE TRUE
Academic 328 281
Vocational 152 239

Dựa vào Bảng 4.1, ta thấy rằng học sinh có người giám hộ không học cao đẳng (FALSE) chủ yếu theo học trường học thuật (328 học sinh) nhiều hơn so với trường nghề (152 học sinh). Ngược lại, trong nhóm học sinh có người giám hộ đã học cao đẳng (TRUE), số học sinh theo học trường nghề (239 học sinh) lại gần tương đương, thậm chí vượt so với số học sinh theo học trường học thuật (281 học sinh). Như vậy, có dấu hiệu cho thấy trình độ học vấn của người giám hộ có thể ảnh hưởng đến loại trường mà học sinh lựa chọn, khi học sinh có người giám hộ học cao đẳng có xu hướng chọn trường nghề nhiều hơn.

4.2 Trực quan hoá

library(ggplot2)
df_typepaw <- as.data.frame(table_typepaw)
colnames(df_typepaw) <- c("ParentsCollege", "SchoolType", "Count")
ggplot(df_typepaw, aes(x = SchoolType, y = Count, fill = ParentsCollege)) +
  geom_bar(stat = "identity", position = "dodge") +
   geom_text(aes(label = Count),position = position_dodge(width = 0.9)) +
  labs(
    x = "Loại trường",
    y = "Số lượng học sinh",
    fill = "Nơi sinh sống",
    title = "Biểu đồ 4.1: Tần số học sinh theo loại trường và trình độ học vấn người giám hộ"
  ) +
  theme_minimal()

Biểu đồ 4.1 cho thấy sự phân bố học sinh theo loại trường và trình độ học vấn của người giám hộ. Trong nhóm học sinh có người giám hộ không học cao đẳng (FALSE), số học sinh chọn trường học thuật (Academic) (328) cao hơn rõ rệt so với trường nghề (Vocational) (152). Ngược lại, ở nhóm có người giám hộ đã học cao đẳng (TRUE), số học sinh chọn trường nghề (239) tăng lên đáng kể và gần tiệm cận số học sinh chọn trường học thuật (281). Điều này cho thấy trình độ học vấn của người giám hộ có thể ảnh hưởng đến định hướng chọn loại trường của học sinh.

4.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{trình độ học vấn của người giám hộ và loại trường theo học của học sinh độc lập với nhau } \\ H_1: \; \text{trình độ học vấn của người giám hộ và loại trường theo học của học sinh có liên quan đến nhau} \end{array} \right.\]

Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chitypepaw <- chisq.test(table_typepaw)
print(chitypepaw)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_typepaw
## X-squared = 20.823, df = 1, p-value = 5.036e-06

Nhận xét: Với p-value rất nhỏ (p < 0.05), ta bác bỏ giả thuyết H₀. Điều này cho thấy có mối liên hệ có ý nghĩa thống kê giữa trình độ học vấn của người giám hộ và loại trường học sinh theo học

4.4 Hiệu hai tỷ lệ

Thiết lập tỷ lệ

Tỷ lệ học sinh có người giám hộ không học đại học theo học trường học thuật (Academic):

\[ p_1 = P(\text{parents\_was\_in\_college} = \text{FALSE} \mid \text{school\_type} = \text{Academic}) \]

Tỷ lệ học sinh có người giám hộ không học đại học theo học trường nghề (Vocational):

\[ p_2 = P(\text{parents\_was\_in\_college} = \text{FALSE} \mid \text{school\_type} = \text{Vocational}) \]

Hiệu chênh lệch giữa hai tỷ lệ:

\[ d = p_1 - p_2 \]

Giả thuyết kiểm định

  • Giả thuyết H₀: Không có sự khác biệt giữa hai tỷ lệ
    \[ H_0: p_1 - p_2 = 0 \]

  • Giả thuyết H₁: Tỷ lệ học sinh học trường học thuật có người giám hộ không học đại học cao hơn so với học sinh học trường nghề
    \[ H_1: p_1 - p_2 > 0 \]

chitypepaw <- chisq.test(table_typepaw)
print(chitypepaw)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_typepaw
## X-squared = 20.823, df = 1, p-value = 5.036e-06

Kết quả kiểm định Chi bình phương với hiệu chỉnh Yates cho bảng chéo giữa loại trường theo học và trình độ học vấn của người giám hộ cho thấy: giá trị thống kê \(\chi^2 = 20{,}823\) với 1 bậc tự do và p-value = 5.036e-06. Vì p-value nhỏ hơn mức ý nghĩa 0.05, ta có đủ cơ sở bác bỏ giả thuyết \(H_0\). Điều này cho thấy có mối liên hệ có ý nghĩa thống kê giữa loại trường học sinh theo học và trình độ học vấn của người giám hộ. Nói cách khác, việc học sinh chọn học trường học thuật hay trường nghề có liên quan đến việc người giám hộ của các em có học đại học hay không.

4.5 Tỷ số Nguy cơ (Relative Risk - RR)

library(epitools)
rtypepaw <- riskratio(table_typepaw, method = "wald")
print(rtypepaw)
## $data
##             
##              FALSE TRUE Total
##   Academic     328  281   609
##   Vocational   152  239   391
##   Total        480  520  1000
## 
## $measure
##             risk ratio with 95% C.I.
##              estimate    lower    upper
##   Academic   1.000000       NA       NA
##   Vocational 1.324744 1.178865 1.488675
## 
## $p.value
##             two-sided
##                midp.exact fisher.exact   chi.square
##   Academic             NA           NA           NA
##   Vocational 3.622682e-06 4.009747e-06 3.689827e-06
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Kết quả phân tích tỷ lệ rủi ro (risk ratio) giữa loại trường học sinh theo học và trình độ học vấn của người giám hộ cho thấy: học sinh học trường nghề có xác suất có người giám hộ không học đại học cao hơn khoảng 32% so với học sinh học trường học thuật (RR = 1.3247). Khoảng tin cậy 95% cho ước lượng này là từ 1.179 đến 1.489, điều này cho thấy sự khác biệt có ý nghĩa thống kê. Đồng thời, p-value rất nhỏ (≈ 3.6e-06), nhỏ hơn nhiều so với mức ý nghĩa 0.05, nên ta bác bỏ giả thuyết không có sự khác biệt. Như vậy, có bằng chứng thống kê cho thấy học sinh có người giám hộ không học đại học có xu hướng theo học trường nghề cao hơn đáng kể so với các học sinh có người giám hộ từng học đại học. Điều này phản ánh vai trò quan trọng của trình độ học vấn phụ huynh trong định hướng học tập của học sinh.

4.6 Tỷ số Chênh (Odds Ratio - OR):

library(DescTools)
ortypepaw <- OddsRatio(table_typepaw, method="wald", conf.level = 0.95)
print(ortypepaw)
## odds ratio     lwr.ci     upr.ci 
##   1.835362   1.417541   2.376337

Giá trị odds ratio = 1.8354 cho biết tỷ lệ chênh (odds) học sinh có người giám hộ không học đại học theo học trường nghề (Vocational) cao hơn khoảng 83.5% so với học sinh theo học trường học thuật (Academic). Khoảng tin cậy 95% cho odds ratio là từ 1.418 đến 2.376, không chứa giá trị 1, nên sự khác biệt này có ý nghĩa thống kê. Điều đó cho thấy có mối liên hệ rõ rệt giữa trình độ học vấn của người giám hộ và loại trường học sinh theo học. Việc người giám hộ chưa từng học đại học có thể ảnh hưởng đến xu hướng chọn trường nghề của học sinh, có thể do định hướng nghề nghiệp thực tiễn hoặc điều kiện gia đình.

PHẦN 5. PHƯƠNG PHÁP ƯỚC LƯỢNG MAXIMUM LIKEHOOD

5.1. Tổng quan khái niệm

Phương pháp ước lượng hợp lý tối đa (Maximum Likelihood Estimation - MLE) là một kỹ thuật thống kê phổ quát dùng để xác định giá trị của các tham số trong một mô hình sao cho xác suất xuất hiện của dữ liệu quan sát được là lớn nhất. Về bản chất, MLE là cầu nối giữa dữ liệu thực tế và mô hình lý thuyết, cho phép các nhà phân tích định lượng hóa hiện tượng ngẫu nhiên bằng cách tối đa hóa “độ phù hợp” giữa mô hình và dữ liệu.

Trong các bài toán phân tích dữ liệu định tính hoặc nhị phân, MLE được xem là phương pháp ước lượng chuẩn, thường được áp dụng trong các mô hình phân phối rời rạc như Bernoulli, Binomial hay Multinomial, cũng như trong mô hình hồi quy logistic.

5.2 Nguyên lý cốt lõi: Hàm Hợp lý và Tối đa hóa

5.2.1 Phân biệt xác suất và độ hợp lý

Xác suất và Hàm hợp lý trong thống kê

  • Xác suất \(P(\text{Data} \mid \theta)\): đại diện cho khả năng xảy ra của dữ liệu quan sát được khi tham số \(\theta\) đã biết. Đây là khái niệm thường dùng trong mô hình suy diễn.

  • Độ hợp lý (Likelihood) \(L(\theta \mid \text{Data})\): đánh giá mức độ phù hợp của tham số \(\theta\) với dữ liệu đã quan sát. Đây là nền tảng của phương pháp ước lượng hợp lý tối đa (Maximum Likelihood Estimation - MLE).

Trường hợp các quan sát độc lập

Khi các quan sát \(y_1, y_2, ..., y_n\)độc lập, hàm hợp lý có thể được viết dưới dạng tích của xác suất có điều kiện:

\[ L(\theta \mid y_1, y_2, \ldots, y_n) = \prod_{i=1}^{n} P(y_i \mid \theta) \]

Trong đó:

  • \(\theta\): tham số chưa biết của mô hình,
  • \(y_i\): giá trị quan sát được từ mẫu dữ liệu.

5.2.2 Tối đa hóa hàm hợp lý

Mục tiêu của Maximum Likelihood Estimation (MLE)

Mục tiêu của phương pháp ước lượng hợp lý tối đa là tìm giá trị ước lượng \(\hat{\theta}\) sao cho:

\[ \hat{\theta} = \arg\max_{\theta} L(\theta) \]

Tức là tìm giá trị tham số \(\theta\) làm tối đa hóa hàm hợp lý \(L(\theta)\), với dữ liệu đã cho.

Hàm log-likelihood

Để đơn giản hóa việc tính toán, người ta thường sử dụng hàm log-likelihood, vì logarit của hàm tích sẽ trở thành tổng, dễ xử lý hơn trong phân tích giải tích:

\[ \log L(\theta) = \sum_{i=1}^{n} \log P(y_i \mid \theta) \]

Việc tối đa hóa \(\log L(\theta)\) thường được ưa chuộng hơn vì:

  • Biến tích thành tổng, thuận tiện hơn khi lấy đạo hàm,
  • Tránh sai số làm tròn khi tính tích các xác suất rất nhỏ,
  • Giảm độ phức tạp tính toán trong các mô hình lớn.

Do đó, hầu hết các thuật toán MLE thực tế đều sử dụng log-likelihood thay vì trực tiếp làm việc với hàm hợp lý ban đầu.

5.3 Quy trình triển khai MLE

Các bước thực hiện phương pháp ước lượng hợp lý tối đa (MLE)

Bước 1: Xác định mô hình phân phối xác suất

Lựa chọn mô hình phân phối phù hợp với bản chất của biến phụ thuộc (biến đầu ra):

  • Bernoulli: Dùng cho biến nhị phân (0/1),
  • Binomial: Dùng khi mô hình hóa tổng số lần thành công trong nhiều lần thử,
  • Multinomial: Dùng cho biến định tính có nhiều mức (categorical nhiều hơn 2 nhóm).

Bước 2: Thiết lập hàm hợp lý (Likelihood Function)

Dựa vào mô hình xác suất đã chọn, biểu thức hàm hợp lý được thiết lập bằng cách nhân các xác suất có điều kiện ứng với từng quan sát:

\[ L(\theta) = \prod_{i=1}^{n} P(y_i \mid \theta) \]

Bước 3: Tính log-likelihood

Sử dụng logarit tự nhiên để biến đổi tích thành tổng, thuận tiện cho việc tối ưu:

\[ \log L(\theta) = \sum_{i=1}^{n} \log P(y_i \mid \theta) \]

Bước 4: Tối đa hóa log-likelihood

  • Tính đạo hàm riêng theo tham số \(\theta\):

\[ \frac{d}{d\theta} \log L(\theta) \]

  • Giải phương trình đạo hàm bậc nhất:

\[ \frac{d}{d\theta} \log L(\theta) = 0 \]

  • Kiểm tra điều kiện cực đại:
    • Đạo hàm bậc hai phải âm: \(\frac{d^2}{d\theta^2} \log L(\theta) < 0\),
    • Hoặc sử dụng các phương pháp số (như Newton-Raphson) để tìm cực trị.

5.4 Ứng dụng MLE trong Hồi quy Logistic

Trong các mô hình hồi quy logistic – nơi biến phản hồi \(Y\)nhị phân (0/1) – phương pháp ước lượng hợp lý tối đa (MLE) được sử dụng để ước lượng các hệ số hồi quy \(\beta\) sao cho xác suất dự đoán:

\[ P(Y = 1 \mid X) = \frac{1}{1 + \exp[-(\beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k)]} \]

phù hợp nhất với dữ liệu quan sát.

Hàm log-likelihood trong hồi quy logistic

Với \(p_i = P(Y_i = 1 \mid X_i)\), hàm log-likelihood có dạng:

\[ LL(\boldsymbol{\beta}) = \sum_{i=1}^{n} \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right] \]

Hàm log-likelihood này đánh giá độ phù hợp giữa mô hình logistic và dữ liệu quan sát.

Ước lượng \(\hat{\beta}\)

Các hệ số hồi quy \(\hat{\beta}\) được tìm bằng cách tối đa hóa hàm log-likelihood, thông qua các thuật toán tối ưu số như:

  • Newton-Raphson
  • Fisher Scoring
  • Gradient Descent, v.v.

W4

PHẦN 1: TÌM HIỂU VÀ CHUẨN BỊ DỮ LIỆU

1.1 Đọc dữ liệu

df <-read.csv("C:/Users/DELL/Downloads/data (1).csv", header= T)
# Tách dữ liệu thành nhiều cột
data <- tidyr::separate(
  df,
  col = 1,
  into = c("type_school", "school_accreditation", "gender", "interest",
           "residence", "parent_age", "parent_salary", "house_area",
           "average_grades", "parent_was_in_college", "will_go_to_college"),
  sep = ";"
)

Bộ dữ liệu Go-to-College được tổng hợp phục vụ cho một dự án ở trường đại học.Thông qua việphân tích, các cố vấn học đường có thể hỗ trợ những học sinh có nguy cơ không học tiếp bằng cách xác định các yếu tố liên quan và đưa ra hỗ trợ phù hợp.

1.2 Làm quen dữ liệu

str(data)
## 'data.frame':    1000 obs. of  11 variables:
##  $ type_school          : chr  "Academic" "Academic" "Academic" "Vocational" ...
##  $ school_accreditation : chr  "A" "A" "B" "B" ...
##  $ gender               : chr  "Male" "Male" "Female" "Male" ...
##  $ interest             : chr  "Less Interested" "Less Interested" "Very Interested" "Very Interested" ...
##  $ residence            : chr  "Urban" "Urban" "Urban" "Rural" ...
##  $ parent_age           : chr  "56" "57" "50" "49" ...
##  $ parent_salary        : chr  "adequate" "average" "adequate" "adequate" ...
##  $ house_area           : chr  "Medium" "Medium" "Medium" "Medium" ...
##  $ average_grades       : chr  "Fair" "Good" "Good" "Fair" ...
##  $ parent_was_in_college: chr  "FALSE" "FALSE" "FALSE" "TRUE" ...
##  $ will_go_to_college   : chr  "YES" "YES" "YES" "YES" ...

Bộ dữ liệu bao gồm 11 biến , phản ánh đặc điểm cá nhân và gia đình của học sinh:

Tên biến Mô tả
type_school Loại trường học: “Academic” hoặc “Vocational”
school_accreditation Xếp hạng kiểm định của trường: “A”, “B”, …
gender Giới tính: “Male”, “Female”
interest Mức độ hứng thú với việc học: “Less Interested”, “Very Interested”, …
residence Nơi cư trú: “Urban” hoặc “Rural”
parent_age Tuổi của cha mẹ
parent_salary Thu nhập của cha mẹ
house_area Diện tích nhà ở
average_grades Điểm trung bình học tập của học sinh
parent_was_in_college Cha mẹ có từng học đại học hay không: “True”/“False”
will_go_to_college học sinh có học tiếp đại học hay không: “True”/“False”

Với 1.000 quan sát và 11 biến, bộ dữ liệu Go-to-College có quy mô phù hợp để thực hiện các phân tích thống kê, xây dựng mô hình dự đoán, cũng như phân nhóm học sinh theo các đặc điểm khác nhau.

Dữ liệu đa dạng và phong phú: bao gồm các biến như type_school, school_accreditation, gender, interest, residence, parent_age, parent_salary, house_area, average_grades, parent_was_in_college, cung cấp nhiều thông tin nhân khẩu học, kinh tế - xã hội và học tập, rất hữu ích cho việc phân tích các yếu tố ảnh hưởng đến quyết định học đại học.

Bên cạnh đó, biến mục tiêu will_go_to_college giúp thuận tiện trong việc xây dựng các mô hình phân loại nhằm dự đoán khả năng học sinh tiếp tục học lên đại học, từ đó hỗ trợ tư vấn và can thiệp kịp thời.

Hiển thị 10 dòng đầu bộ dữ liệu

head(data,10)
##    type_school school_accreditation gender        interest residence parent_age
## 1     Academic                    A   Male Less Interested     Urban         56
## 2     Academic                    A   Male Less Interested     Urban         57
## 3     Academic                    B Female Very Interested     Urban         50
## 4   Vocational                    B   Male Very Interested     Rural         49
## 5     Academic                    A Female Very Interested     Urban         57
## 6   Vocational                    B Female Less Interested     Rural         48
## 7     Academic                    A   Male Very Interested     Rural         52
## 8     Academic                    B   Male Very Interested     Rural         53
## 9     Academic                    B Female       Uncertain     Rural         52
## 10    Academic                    B Female Very Interested     Rural         47
##    parent_salary house_area average_grades parent_was_in_college
## 1       adequate     Medium           Fair                 FALSE
## 2        average     Medium           Good                 FALSE
## 3       adequate     Medium           Good                 FALSE
## 4       adequate     Medium           Fair                  TRUE
## 5        average     Medium           Good                 FALSE
## 6        average      Small           Good                  TRUE
## 7       adequate     Medium      Excellent                  TRUE
## 8       adequate     Medium           Fair                  TRUE
## 9       adequate     Medium           Good                  TRUE
## 10       average      Small           Good                  TRUE
##    will_go_to_college
## 1                 YES
## 2                 YES
## 3                 YES
## 4                 YES
## 5                  NO
## 6                  NO
## 7                 YES
## 8                  NO
## 9                 YES
## 10                 NO

Hiển thị 10 dòng cuối bộ dữ liệu

tail(data,10)
##      type_school school_accreditation gender        interest residence
## 991     Academic                    A Female Less Interested     Urban
## 992     Academic                    B Female Very Interested     Rural
## 993     Academic                    B Female Less Interested     Urban
## 994     Academic                    B   Male Very Interested     Rural
## 995     Academic                    B Female Less Interested     Urban
## 996   Vocational                    A Female Very Interested     Rural
## 997     Academic                    B Female Less Interested     Rural
## 998   Vocational                    A   Male Less Interested     Urban
## 999     Academic                    B   Male       Uncertain     Rural
## 1000    Academic                    B   Male      Interested     Urban
##      parent_age parent_salary house_area average_grades parent_was_in_college
## 991          54      adequate      Large           Good                 FALSE
## 992          51      adequate     Medium           Good                  TRUE
## 993          53       average      Small           Good                  TRUE
## 994          53       average      Small           Fair                  TRUE
## 995          52       average      Small           Good                 FALSE
## 996          49      adequate      Small           Good                  TRUE
## 997          51      adequate     Medium           Good                  TRUE
## 998          49      adequate     Medium           Fair                 FALSE
## 999          53      adequate      Large           Good                  TRUE
## 1000         50           low      Small           Good                  TRUE
##      will_go_to_college
## 991                 YES
## 992                 YES
## 993                  NO
## 994                  NO
## 995                  NO
## 996                 YES
## 997                 YES
## 998                 YES
## 999                 YES
## 1000                 NO

1.3 Kiểm tra giá trị NA

datana <- sum(is.na(data))
print(datana)
## [1] 0

Vậy khi kiểm tra tổng số giá trị NA toàn bộ data bằng câu lệnh sum(is.na(data)), kết quả nhận được là KHÔNG CÓ GIÁ TRỊ NA nên ta tiến hành phân tích tiếp.

1.4 Chuyển đổi thành biến định tính

Việc chuyển các biến như type_school, school_accreditation, gender, interest, residence, parent_was_in_college sang kiểu factor là bước tiền xử lý quan trọng trong phân tích dữ liệu. Điều này giúp R nhận diện đúng bản chất phân loại của các biến này, từ đó hỗ trợ tốt hơn cho việc phân tích thống kê và xây dựng mô hình. Vì vậy, ta tiến hành chuyển đổi các biến định tính này:

isf <- names(data)[sapply(data, function(x) is.factor(x) || is.character(x))]
print(isf)
##  [1] "type_school"           "school_accreditation"  "gender"               
##  [4] "interest"              "residence"             "parent_age"           
##  [7] "parent_salary"         "house_area"            "average_grades"       
## [10] "parent_was_in_college" "will_go_to_college"

Kết quả cho thấy có 11 biến trong tập dữ liệu đang ở dạng factor hoặc character, chủ yếu là các biến định tính như loại trường, giới tính, mức độ quan tâm, nơi cư trú,

data$type_school <- as.factor(data$type_school)
data$school_accreditation <- as.factor(data$school_accreditation)
data$gender <- as.factor(data$gender)
data$interest <- as.factor(data$interest)
data$residence <- as.factor(data$residence)
data$parent_age <- as.factor(data$parent_age)
data$parent_salary <- as.factor(data$parent_salary)
data$house_area <- as.factor(data$house_area)
data$average_grades <- as.factor(data$average_grades)
data$parent_was_in_college <- as.factor(data$parent_was_in_college)
data$will_go_to_college <- as.factor(data$will_go_to_college)

Các biến như type_school, school_accreditation, gender, interest và residence đã được chuyển sang kiểu factor để R hiểu đó là các biến phân loại. Việc này rất quan trọng nhằm đảm bảo R không xem chúng là dữ liệu liên tục. Việc xử lý đúng loại biến giúp cải thiện độ chính xác trong phân tích thống kê và mô hình hóa dự báo học sinh có tiếp tục học đại học hay không.

PHẦN 2: PHÂN TÍCH MÔ TẢ MỘT BIẾN ĐỊNH TÍNH - UNIVARIATE DESCRIPTIVE ANALYSIS

2.1 TYPE SCHOOL

2.1.1 Thống kê Tần suất

typeschool_freq <- table(data$type_school)
typeschoolpc <- table(data$type_school)/nrow(data)*100
typeschool_table <- data.frame(
  typeschool = names(typeschool_freq),
  Frequency = as.integer(typeschool_freq),
  Percentage = round(typeschoolpc, 3)
)
colnames(typeschool_table) <- c("Type of school", "Frequency", "Type of school", "Percentage (%)")
library(kableExtra)
# Hiển thị bảng đẹp
typeschool_table %>%
  kable("html", caption = "Bảng 2.1 Phân phối loại trường - typeschool") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.1 Phân phối loại trường - typeschool
Type of school Frequency Type of school Percentage (%)
Academic 609 Academic 60.9
Vocational 391 Vocational 39.1

Vậy trong data này có NA% họ sinh theo học môi trường học thuật và NA% học sinh học trường nghề.

2.1.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(typeschool_freq,
    main   = "Biểu đồ 2.1: Phân bố loại trường (typeschool)",
    labels = paste0(names(typeschool_freq),
                    " (", round(typeschoolpc, 3), "%)"),
    col    = c("#DCB0C3", "#596CAD"))

Nhận xét:

Dựa vào Bảng 2.1 và Biểu đồ 2.1: Phân bố loại trường (typeschool), ta thấy rằng học sinh chủ yếu theo học tại các trường Academic (học thuật) với tần suất 609 học sinh, chiếm 60.9% tổng số. Trong khi đó, Vocational (dạy nghề) chỉ chiếm 39.1% với 391 học sinh. Biểu đồ tròn trực quan hóa rõ sự chênh lệch này qua diện tích các lát cắt, cho thấy xu hướng học sinh nghiêng về con đường học thuật hơn là nghề nghiệp. Điều này có thể phản ánh định hướng xã hội, kỳ vọng học vấn hoặc nhận thức về cơ hội nghề nghiệp giữa hai loại hình giáo dục. Tuy nhiên, tỷ lệ học sinh chọn học nghề cũng không nhỏ, cho thấy sự đa dạng trong lựa chọn con đường học tập.

2.2 School_accreditation

2.2.1 Thống kê Tần suất

school_accreditation_freq <- table(data$school_accreditation)

school_accreditation_pct <- table(data$school_accreditation)/sum(nrow(data))*100

school_accreditation_table <- data.frame(
  school_accreditation = names(school_accreditation_freq),
  Frequency = as.integer(school_accreditation_freq),
  Percentage = round(school_accreditation_pct, 3)
)
colnames(school_accreditation_table) <- c("school_accreditation", "Frequency", "school_accreditation", "Percentage (%)")

# Hiển thị bảng đẹp
school_accreditation_table %>%
  kable("html", caption = "Bảng 2.2 Phân phối xếp hạng trường  - school_accreditation") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.2 Phân phối xếp hạng trường - school_accreditation
school_accreditation Frequency school_accreditation Percentage (%)
A 481 A 48.1
B 519 B 51.9

2.2.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(school_accreditation_freq,
    main   = "Biểu đồ 2.2: Phân phối xếp hạng trường - school_accreditation",
    labels = paste0(names(school_accreditation_freq),
                    " (", round(school_accreditation_pct, 3), "%)"),
    col    = c("#FEF9DB", "#4C689B"))

Nhận xét:

Dựa vào Bảng 2.2 và biểu đồ tròn minh họa phân phối số học sinh theo xếp hạng trường (school_accreditation), ta thấy rằng số học sinh theo học tại trường xếp hạng B chiếm tỷ lệ nhỉnh hơn (51.9%) so với trường xếp hạng A (48.1%). Biểu đồ tròn thể hiện sự phân bố khá cân đối giữa hai loại xếp hạng, với lát cắt không chênh lệch nhiều. Điều này cho thấy trong thực tế, học sinh không chỉ tập trung vào các trường đạt chuẩn cao nhất (A), mà vẫn có xu hướng lựa chọn cả trường xếp hạng B, có thể do yếu tố vị trí địa lý, điều kiện gia đình hoặc nhận thức về chất lượng giảng dạy.

2.3 Gender

2.3.1 Thống kê Tần suất

gr_freq <- table(data$gender)

gr_pct <- table(data$gender)/sum(nrow(data))*100

gr_table <- data.frame(
  Gender = names(gr_freq),
  Frequency = as.integer(gr_freq),
  Percentage = round(gr_pct, 3)
)
colnames(gr_table) <- c("Gender", "Frequency", "Gender", "Percentage (%)")
library(kableExtra)
# Hiển thị bảng đẹp
gr_table %>%
  kable("html", caption = "Bảng 2.3 Phân phối giới tính học sinh - GENDER") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.3 Phân phối giới tính học sinh - GENDER
Gender Frequency Gender Percentage (%)
Female 485 Female 48.5
Male 515 Male 51.5

2.3.2 Trực quan hóa

pie(gr_freq,
    main   = "Biểu đồ 2.3: Phân phối giới tính học sinh - gender",
    labels = paste0(names(gr_freq),
                    " (", round(gr_pct, 3), "%)"),
    col    = c("#F7E4E2", "#63847D")) 

Nhận xét:

Dựa vào Bảng 2.3 và biểu đồ tròn minh họa phân phối giới tính học sinh (GENDER), có thể thấy tỷ lệ học sinh nam chiếm ưu thế nhẹ với 515 học sinh (51.5%), trong khi nữ chiếm 48.5% với 485 học sinh. Biểu đồ tròn thể hiện hai lát cắt gần như bằng nhau, phản ánh sự cân bằng giới tính tương đối trong mẫu khảo sát. Tuy nam có số lượng nhiều hơn một chút, nhưng mức chênh lệch không đáng kể. Điều này cho thấy không có sự thiên lệch rõ rệt về giới tính trong tiếp cận giáo dục phổ thông, và có thể coi đây là một dấu hiệu tích cực về bình đẳng giới trong học tập.

2.4 interest

2.4.1 Thống kê Tần suất

interest_freq <- table(data$interest)

interest_pct <- table(data$interest)/sum(nrow(data))*100

interest_table <- data.frame(
  interest = names(interest_freq),
  Frequency = as.integer(interest_freq),
  Percentage = round(interest_pct, 3)
)
colnames(interest_table) <- c("interest", "Frequency", "interest", "Percentage (%)")

# Hiển thị bảng đẹp
interest_table %>%
  kable("html", caption = "Bảng 2.4 Phân phối mức độ thích thú trong học tập - interest") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.4 Phân phối mức độ thích thú trong học tập - interest
interest Frequency interest Percentage (%)
Interested 100 Interested 10.0
Less Interested 229 Less Interested 22.9
Not Interested 86 Not Interested 8.6
Uncertain 261 Uncertain 26.1
Very Interested 324 Very Interested 32.4

2.4.2 Trực quan hóa

library(ggplot2)

interest_df <- as.data.frame(interest_pct)
colnames(interest_df) <- c("interest", "Percentage")

ggplot(interest_df, aes(x = reorder(interest, -Percentage), y = Percentage, fill = interest)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ 2.4: Phân phối mức độ thích thú trong học tập",
       x = "Độ thích thú", y = "Tỷ lệ %") +
  theme_light() +
  theme(axis.text.x = element_text(angle = 0, hjust = 1))

NHẬN XÉT:

Dựa vào Bảng 2.4 và biểu đồ tròn minh họa phân phối mức độ thích thú trong học tập (interest), có thể thấy mức độ hứng thú của học sinh khá đa dạng. Trong đó, nhóm “Very Interested” chiếm tỷ lệ cao nhất với 32.4% (324 học sinh), cho thấy một bộ phận lớn học sinh có động lực học tập rõ rệt. Tuy nhiên, đáng chú ý là có tới 26.1% (261 học sinh) nằm trong nhóm “Uncertain”, phản ánh sự thiếu chắc chắn hoặc không rõ ràng về thái độ học tập. Ngoài ra, gần 1/3 số học sinh còn lại thuộc nhóm “Less Interested” hoặc “Not Interested”, chiếm tổng cộng 31.5%, cho thấy vẫn còn một tỷ lệ đáng kể học sinh thiếu sự gắn bó với việc học.

2.5 residence

2.5.1 Thống kê Tần suất

residence_freq <- table(data$residence)

residence_pct <- table(data$residence)/sum(nrow(data))*100

residence_table <- data.frame(
  residence = names(residence_freq),
  Frequency = as.integer(residence_freq),
  Percentage = round(residence_pct, 3)
)
colnames(residence_table) <- c("residence", "Frequency", "residence", "Percentage (%)")

# Hiển thị bảng đẹp
residence_table %>%
  kable("html", caption = "Bảng 2.5 Phân phối định cư của học sinh - residence") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.5 Phân phối định cư của học sinh - residence
residence Frequency residence Percentage (%)
Rural 461 Rural 46.1
Urban 539 Urban 53.9

2.5.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(residence_freq,
    main   = "Biểu đồ 2.5: Phân bố định cư của học sinh (residence)",
    labels = paste0(names(residence_freq),
                    " (", round(residence_pct, 3), "%)"),
    col    = c("#DCB0C3", "#596CAD"))

NHẬN XÉT:

Dựa vào Bảng 2.5 và biểu đồ tròn minh họa phân phối nơi cư trú của học sinh (residence), ta thấy rằng học sinh đến từ khu vực đô thị (Urban) chiếm tỷ lệ cao hơn với 539 học sinh (53.9%), trong khi học sinh từ nông thôn (Rural) là 461 học sinh (46.1%). Biểu đồ tròn thể hiện hai lát cắt gần tương đương, phản ánh sự phân bố dân cư khá đồng đều trong mẫu khảo sát. Tuy nhiên, sự nhỉnh hơn từ phía đô thị có thể gợi ý về khả năng tiếp cận giáo dục cao hơn ở khu vực thành thị, nhờ điều kiện kinh tế – xã hội thuận lợi hơn. Đồng thời, điều này cũng cho thấy vẫn có tỷ lệ lớn học sinh nông thôn đang tham gia học tập, thể hiện nỗ lực mở rộng cơ hội giáo dục ở mọi vùng miền.

2.7 parent_salary

2.7.1 Thống kê Tần suất

parent_salary_freq <- table(data$parent_salary)

parent_salary_pct <- table(data$parent_salary)/sum(nrow(data))*100

parent_salary_table <- data.frame(
  parent_salary = names(parent_salary_freq),
  Frequency = as.integer(parent_salary_freq),
  Percentage = round(parent_salary_pct, 3)
)
colnames(parent_salary_table) <- c("parent_salary", "Frequency", "parent_salary", "Percentage (%)")

# Hiển thị bảng đẹp
parent_salary_table %>%
  kable("html", caption = "Bảng 2.7 Phân phối theo theo thu nhập của người giám hộ - parent_salary") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.7 Phân phối theo theo thu nhập của người giám hộ - parent_salary
parent_salary Frequency parent_salary Percentage (%)
adequate 448 adequate 44.8
average 446 average 44.6
high 39 high 3.9
low 67 low 6.7

2.7.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(parent_salary_freq,
    main   = "Biểu đồ 2.7: Phân phối theo thu nhập của người giám hộ - parent_salary",
    labels = paste0(names(parent_salary_freq),
                    " (", round(parent_salary_pct, 3), "%)"),
    col    = c("#ABBEE0", "#F4C0C2", "#B2EEDA", "#FFECAF")) 

NHẬN XÉT:

Phân phối thu nhập người giám hộ cho thấy sự tương đồng rõ rệt giữa nhóm có thu nhập “adequate” (44.8%) và “average” (44.6%), chiếm gần 90% tổng số học sinh. Điều này phản ánh rằng đa số học sinh xuất thân từ các gia đình có mức sống ổn định, không quá giàu cũng không quá khó khăn. So với các nhóm này, nhóm thu nhập “high” chỉ chiếm rất nhỏ (3.9%), cho thấy các gia đình khá giả không nhiều trong mẫu khảo sát. Nhóm thu nhập “low” chiếm 6.7%, thấp hơn khá nhiều so với hai nhóm trung bình, nhưng vẫn là một tỷ lệ không nhỏ, phản ánh rằng còn nhiều học sinh đến từ gia đình có điều kiện kinh tế hạn chế. So sánh với các phân phối khác như độ tuổi giám hộ hay nơi cư trú, thu nhập có sự phân hóa rõ hơn, có thể ảnh hưởng đến cơ hội và điều kiện học tập của học sinh.

2.8 house_area

2.8.1 Thống kê Tần suất

house_area_freq <- table(data$house_area)

house_area_pct <- table(data$house_area)/sum(nrow(data))*100

house_area_table <- data.frame(
  house_area = names(house_area_freq),
  Frequency = as.integer(house_area_freq),
  Percentage = round(house_area_pct, 3)
)
colnames(house_area_table) <- c("house_area", "Frequency", "house_area", "Percentage (%)")

# Hiển thị bảng đẹp
house_area_table %>%
  kable("html", caption = "Bảng 2.8 Phân phối theo diện tích nhà ở - house_area") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.8 Phân phối theo diện tích nhà ở - house_area
house_area Frequency house_area Percentage (%)
Large 200 Large 20.0
Medium 424 Medium 42.4
Small 376 Small 37.6

2.8.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(house_area_freq,
    main   = "Biểu đồ 2.8: Phân phối theo theo diện tích nhà ở - house_area",
    labels = paste0(names(house_area_freq),
                    " (", round(house_area_pct, 3), "%)"),
    col    = c("#96BFBC", "#E8EDDA", "#D4A2A6")) 

NHẬN XÉT:

Phân phối diện tích nhà ở cho thấy gần 80% học sinh sống trong nhà có diện tích nhỏ đến trung bình (37.6% diện tích nhỏ, 42.4% diện tích trung bình), chỉ có 20% sống trong nhà diện tích lớn. Kết hợp với dữ liệu về thu nhập người giám hộ chủ yếu ở mức adequate và average (gần 90%), cũng như độ tuổi người giám hộ tập trung từ 50 đến 55, cho thấy phần lớn học sinh thuộc gia đình có điều kiện kinh tế ổn định nhưng không quá dư giả. Điều này phản ánh môi trường sinh hoạt và học tập chủ yếu thuộc tầng lớp trung lưu, ảnh hưởng đến khả năng tiếp cận và chất lượng giáo dục của học sinh.

2.9 Biến average_grades

2.9.1 Thống kê Tần suất

average_grades_freq <- table(data$average_grades)

average_grades_pct <- table(data$average_grades)/sum(nrow(data))*100

average_grades_table <- data.frame(
  average_grades = names(average_grades_freq),
  Frequency = as.integer(average_grades_freq),
  Percentage = round(average_grades_pct, 3)
)
colnames(average_grades_table) <- c("average_grades", "Frequency", "average_grades", "Percentage (%)")

# Hiển thị bảng đẹp
average_grades_table %>%
  kable("html", caption = "Bảng 2.9 Phân phối theo kết quả học tập của học sinh - average_grades") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.9 Phân phối theo kết quả học tập của học sinh - average_grades
average_grades Frequency average_grades Percentage (%)
Excellent 133 Excellent 13.3
Fair 424 Fair 42.4
Good 443 Good 44.3

2.9.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(average_grades_freq,
    main   = "Biểu đồ 2.9: Phân phối kết quả học tập của học sinh (average_grades)",
    labels = paste0(names(average_grades_freq),
                    " (", round(average_grades_pct, 3), "%)"),
    col    = c("#C4C1E1", "#EEDdB6", "#DCA2A7")) 

Dựa vào Bảng 2.9 về phân phối kết quả học tập của học sinh, ta thấy nhóm có thành tích Good chiếm tỷ lệ cao nhất với 44.3% (443 học sinh), tiếp theo là nhóm Fair chiếm 42.4% (424 học sinh), và nhóm Excellent chiếm tỷ lệ thấp nhất với 13.3% (133 học sinh).

Nhận xét: Phần lớn học sinh đạt kết quả học tập từ mức Fair đến Good, thể hiện chất lượng học tập trung bình đến khá phổ biến trong mẫu khảo sát. Tỷ lệ học sinh xuất sắc còn khá khiêm tốn, chỉ khoảng 1/8 tổng số. Điều này có thể phản ánh cả năng lực học tập và các điều kiện hỗ trợ học tập hiện tại, từ đó gợi ý cần các biện pháp nâng cao chất lượng giáo dục để giúp nhiều học sinh đạt kết quả cao hơn.

2.10 parent_was_in_college

2.10.1 Thống kê Tần suất

parent_was_in_college_freq <- table(data$parent_was_in_college)

parent_was_in_college_pct <- table(data$parent_was_in_college)/sum(nrow(data))*100

parent_was_in_college_table <- data.frame(
  parent_was_in_college = names(parent_was_in_college_freq),
  Frequency = as.integer(parent_was_in_college_freq),
  Percentage = round(parent_was_in_college_pct, 3)
)
colnames(parent_was_in_college_table) <- c("parent_was_in_college", "Frequency", "parent_was_in_college", "Percentage (%)")

# Hiển thị bảng đẹp
parent_was_in_college_table%>%
  kable("html", caption = "Bảng 2.10 Phân phối theo khả năng người giám hộ theo học cao đẳng - parent_was_in_college") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.10 Phân phối theo khả năng người giám hộ theo học cao đẳng - parent_was_in_college
parent_was_in_college Frequency parent_was_in_college Percentage (%)
FALSE 480 FALSE 48
TRUE 520 TRUE 52

2.10.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(parent_was_in_college_freq,
    main   = "Biểu đồ 2.10: Phân phối khả năng người giám hộ theo học cao đẳng - parent_was_in_college",
    labels = paste0(names(parent_was_in_college_freq),
                    " (", round(parent_was_in_college_pct, 3), "%)"),
    col    = c("#C4C1E1", "#EEDdB6", "#DCA2A7")) 

NHẬN XÉT:

Dữ liệu cho thấy 52% học sinh có người giám hộ từng học cao đẳng trở lên, trong khi 48% không có. Trình độ học vấn của người giám hộ khá cân bằng nhưng nghiêng nhẹ về phía có học vấn cao, điều này phần nào lý giải vì sao phần lớn học sinh đạt kết quả học tập ở mức Fair (42.4%) và Good (44.3%). Bên cạnh đó, đa số học sinh đến từ gia đình có thu nhập trung bình và nhà ở diện tích vừa phải, cho thấy môi trường học tập tuy không quá thuận lợi về vật chất nhưng được hỗ trợ tốt từ yếu tố văn hóa và nhận thức giáo dục của phụ huynh.

2.11 will_go_to_college

2.11.1 Thống kê Tần suất

will_go_to_college_freq <- table(data$will_go_to_college)

will_go_to_college_pct <- table(data$will_go_to_college)/sum(nrow(data))*100

will_go_to_college_table <- data.frame(
  will_go_to_college = names(will_go_to_college_freq),
  Frequency = as.integer(will_go_to_college_freq),
  Percentage = round(will_go_to_college_pct, 3)
)
colnames(will_go_to_college_table) <- c("will_go_to_college", "Frequency", "will_go_to_college", "Percentage (%)")

# Hiển thị bảng đẹp
will_go_to_college_table%>%
  kable("html", caption = "Bảng 2.11 Phân phối theo khả năng quyết định theo học cao đẳng của học sinh  - will_go_to_college") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.11 Phân phối theo khả năng quyết định theo học cao đẳng của học sinh - will_go_to_college
will_go_to_college Frequency will_go_to_college Percentage (%)
NO 500 NO 50
YES 500 YES 50

2.11.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(will_go_to_college_freq,
    main   = "Biểu đồ 2.11: Phân phốitheo khả năng quyết định theo học cao đẳng của học sinh  - will_go_to_college",
    labels = paste0(names(will_go_to_college_freq),
                    " (", round(will_go_to_college_pct, 3), "%)"),
    col    = c("#C4C1E1", "#EEDdB6", "#DCA2A7")) 

NHẬN XÉT:

Kết quả từ Bảng 2.11 cho thấy học sinh được chia đều về khả năng quyết định theo học cao đẳng, với 50% trả lời có và 50% trả lời không, phản ánh sự phân hóa rõ nét trong định hướng học tập tương lai. Mặc dù dữ liệu ở Bảng 2.10 cho thấy 52% người giám hộ đã từng học cao đẳng trở lên, điều này không đồng nghĩa với việc học sinh sẽ tiếp nối định hướng học tập đó. Quyết định theo học cao đẳng có thể bị ảnh hưởng bởi nhiều yếu tố khác nhau như kết quả học tập (chỉ 13.3% đạt loại giỏi), thu nhập của gia đình (đa số ở mức adequate hoặc average), và diện tích nhà ở (phần lớn là nhỏ và vừa), cho thấy nhiều học sinh vẫn còn gặp hạn chế về điều kiện vật chất hoặc thiếu động lực. Ngoài ra, dữ liệu từ Bảng 2.4 về mức độ hứng thú học tập cũng phản ánh sự thiếu chắc chắn, khi có đến 26.1% học sinh cảm thấy không rõ ràng về hứng thú học, điều này có thể khiến nhiều em không đưa ra được quyết định rõ ràng về việc học tiếp sau phổ thông. Như vậy, mặc dù môi trường gia đình có phần hỗ trợ, thì quyết định học tiếp lên cao đẳng vẫn là một vấn đề phức tạp, đòi hỏi sự tư vấn, định hướng và hỗ trợ mạnh mẽ hơn từ phía nhà trường và xã hội.

PHẦN 3:ƯỚC LƯỢNG KHOẢNG VÀ KIỂM ĐỊNH GIẢ THUYẾT CHO TỶ LỆ (MỘT BIẾN)

Khoảng tin cậy cho tỷ lệ (proportion):

# Function
prop1.interval <- function(x,n,conf.level) # function of 1-proportion CI for p
{
p <- x/n
z.crit <- -1*qnorm((1-conf.level)/2)
margin.error <- z.crit*sqrt(p*(1-p)/n)
ci.lower <- p - margin.error
ci.upper <- p + margin.error
dat <- c(p, z.crit, margin.error, ci.lower, ci.upper)
names(dat) <- c("Mean", "Critical Value", "Margin of Error", "CI lower", "CI upper")
return(dat)
}

3.1 average_grades-Fair

3.1.1 Ước lượng Khoảng Tin cậy:

# Số lượng học sinh có kết quả học tập thuộc nhóm "Fair"
xFair <- sum(data$average_grades == "Fair")
# Ước lượng khoảng tin cậy 95%
prop1.interval(xFair,nrow(data),0.95) # 1-proportion 95% CI for p
##            Mean  Critical Value Margin of Error        CI lower        CI upper 
##      0.42400000      1.95996398      0.03062967      0.39337033      0.45462967

Nhận xét:

  • Kết quả phân tích cho thấy tỷ lệ học sinh có học lực “Fair” trong mẫu là 42.4% (Mean = 0.424). Đây là ước lượng tốt cho tỷ lệ thực tế trong quần thể. Giá trị tới hạn (Critical Value = 1.96) được lấy từ phân phối chuẩn ứng với mức tin cậy 95%, dùng để tính sai số biên.

  • Sai số biên (Margin of Error = 0.0306) cho thấy mức độ không chắc chắn khi dùng trung bình mẫu để ước lượng tỷ lệ tổng thể. Nhờ cỡ mẫu đủ lớn, sai số nhỏ giúp khoảng tin cậy chính xác hơn.

  • Từ đó, khoảng tin cậy 95% dao động từ 39.34% đến 45.46% (CI lower = 0.3934, CI upper = 0.4546). Điều này nghĩa là với độ tin cậy 95%, tỷ lệ thực sự học sinh loại “Fair” nằm trong khoảng này. Kết quả cho thấy cần có chính sách hỗ trợ nhóm học sinh trung bình để nâng cao chất lượng giáo dục.

3.1.2 Kiểm định Giả thuyết:

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; p = 0.4 \quad \text{(Tỷ lệ học sinh học lực Fair trong tổng thể là đúng 40%)} \\ H_1: \; p \ne 0.4 \quad \text{(Tỷ lệ học sinh học lực Fair khác 40%, có thể cao hơn hoặc thấp hơn)} \end{array} \right.\]

prop.test(x=xFair, n=nrow(data), p=0.4, correct=FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  xFair out of nrow(data), null probability 0.4
## X-squared = 2.4, df = 1, p-value = 0.1213
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
##  0.3937184 0.4548632
## sample estimates:
##     p 
## 0.424
  • Với p-value = 0.1213 lớn hơn mức ý nghĩa \(\alpha = 5%\), ta không có đủ bằng chứng để bác bỏ giả thuyết \(H_0: p = 0.4\). Nói cách khác, chưa thể khẳng định rằng tỷ lệ học sinh có học lực loại “Fair” khác 40% trong tổng thể. Tuy giá trị ước lượng từ mẫu là 42.4% (p = 0.424), nhưng sự chênh lệch này chưa đủ ý nghĩa thống kê.

  • Khoảng tin cậy 95% cho tỷ lệ thực tế dao động từ 39.37% đến 45.49%, nghĩa là 40% vẫn nằm trong khoảng tin cậy nên giả thuyết \(H_0\) là phù hợp. Kết quả này cho thấy tỷ lệ học sinh “Fair” có thể gần với giả định ban đầu (40%), và chưa có bằng chứng rõ ràng để kết luận rằng nó cao hơn hoặc thấp hơn đáng kể.

3.2 parent_salary-low

3.2.1 Ước lượng Khoảng Tin cậy:

# Số lượng người giám hộ của học sinh có thu nhập nhóm "low"
xlow <- sum(data$parent_salary == "low")
# Ước lượng khoảng tin cậy 95%
prop1.interval(xlow,nrow(data),0.95) # 1-proportion 95% CI for p
##            Mean  Critical Value Margin of Error        CI lower        CI upper 
##      0.06700000      1.95996398      0.01549624      0.05150376      0.08249624

NHẬN XÉT:

  • Tỷ lệ người giám hộ có thu nhập thuộc nhóm “low” trong mẫu là 6.7% (Mean = 0.067). Đây là con số tương đối nhỏ, cho thấy phần lớn người giám hộ có thu nhập cao hơn mức này. Giá trị tới hạn (Critical Value = 1.96) được sử dụng từ phân phối chuẩn với mức ý nghĩa 5%, nhằm tính sai số biên.

  • Sai số biên (Margin of Error = 0.0155) phản ánh độ không chắc chắn khi dùng tỷ lệ mẫu để ước lượng tỷ lệ tổng thể. Với sai số tương đối nhỏ, ước lượng được xem là đáng tin cậy. Khoảng tin cậy 95% cho tỷ lệ thực tế nằm trong khoảng từ 5.15% đến 8.25% (CI lower = 0.0515, CI upper = 0.0825).

  • Điều này cho thấy tỷ lệ người giám hộ thu nhập thấp là tương đối ít, giúp nhà quản lý hiểu rõ hơn về đặc điểm kinh tế của đối tượng được khảo sát và từ đó đưa ra chính sách hỗ trợ phù hợp hơn nếu cần thiết.

3.2.2 Kiểm định Giả thuyết:

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; p = 0.05 \quad \text{(Tỷ lệ người giám hộ có thu nhập thuộc nhóm "low" là 5%)} \\ H_1: \; p > 0.05 \quad \text{(Tỷ lệ người giám hộ có thu nhập thuộc nhóm "low" cao hơn 5%)} \end{array} \right.\]

prop.test(x=xlow, n=nrow(data), p=0.05,alternative = "greater", correct=FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  xlow out of nrow(data), null probability 0.05
## X-squared = 6.0842, df = 1, p-value = 0.00682
## alternative hypothesis: true p is greater than 0.05
## 95 percent confidence interval:
##  0.0551286 1.0000000
## sample estimates:
##     p 
## 0.067

Kết quả kiểm định tỉ lệ một mẫu không sử dụng hiệu chỉnh liên tục cho giá trị thống kê \(\chi^2 = 6.08\) với 1 bậc tự do và p-value = 0.00682, nhỏ hơn mức ý nghĩa 5%. Do đó, ta có đủ bằng chứng để bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết \(H_1\), tức là tỷ lệ thực tế người giám hộ thu nhập nhóm “low” cao hơn 5%.

Điều này cho thấy trong mẫu khảo sát, nhóm người giám hộ có thu nhập nhóm “low” chiếm tỷ lệ đáng kể hơn so với giả định trước đó, từ đó cảnh báo rằng các chính sách hỗ trợ và can thiệp tài chính dành cho nhóm này là cần thiết để đảm bảo sự công bằng và nâng cao điều kiện sống của đối tượng có hoàn cảnh khó khăn.

3.3 interest-Uncertain

3.3.1 Ước lượng Khoảng Tin cậy:

# Số lượng học sinh không rõ về độ thích thú trong học tập
xUncertain <- sum(data$interest == "Uncertain")
# Ước lượng khoảng tin cậy 95%
prop1.interval(xUncertain,nrow(data),0.95) # 1-proportion 95% CI for p
##            Mean  Critical Value Margin of Error        CI lower        CI upper 
##      0.26100000      1.95996398      0.02722015      0.23377985      0.28822015

NHẬN XÉT:

  • Tỷ lệ học sinh không rõ về độ thích thú trong học tập trong mẫu là 26.1% (Mean = 0.261). Đây là một tỷ lệ khá đáng kể, phản ánh một nhóm học sinh còn do dự hoặc chưa xác định được mức độ quan tâm của mình đối với việc học.

  • Giá trị tới hạn (Critical Value = 1.96) được sử dụng từ phân phối chuẩn với mức ý nghĩa 5%, nhằm tính sai số biên. Sai số biên (Margin of Error = 0.0272) cho biết độ chính xác của ước lượng tỷ lệ này.

  • Dựa trên đó, khoảng tin cậy 95% cho tỷ lệ thực tế dao động từ 23.38% đến 28.82% (CI lower = 0.2338, CI upper = 0.2882). Điều này cho thấy với độ tin cậy 95%, tỷ lệ học sinh không xác định được độ thích thú trong học tập thực tế nằm trong khoảng trên.

  • Kết quả này nhấn mạnh sự cần thiết của các biện pháp hỗ trợ giúp học sinh hiểu rõ và xác định được sở thích học tập, từ đó nâng cao động lực và hiệu quả học tập của nhóm học sinh này.

3.3.2 Kiểm định Giả thuyết:

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; p = 0.11 \quad \text{(Tỷ lệ học sinh không rõ về độ thích thú trong học tập là 11%)} \\ H_1: \; p > 0.11 \quad \text{(Tỷ lệ học sinh không rõ về độ thích thú trong học tập là 11%)} \end{array} \right.\]

prop.test(xUncertain,nrow(data), p=0.11,alternative = "greater", correct=FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  xUncertain out of nrow(data), null probability 0.11
## X-squared = 232.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is greater than 0.11
## 95 percent confidence interval:
##  0.2388227 1.0000000
## sample estimates:
##     p 
## 0.261
  • Kết quả kiểm định tỉ lệ một mẫu không sử dụng hiệu chỉnh liên tục cho thấy giá trị thống kê \(\chi^2 = 232.9\) với 1 bậc tự do và p-value < 2.2 ^{-16}$, nhỏ hơn rất nhiều mức ý nghĩa 5%. Vì vậy, ta có đủ bằng chứng để bác bỏ giả thuyết \(H_0\) và chấp nhận giả thuyết thay thế \(H_1\).

  • Tỷ lệ mẫu ước lượng là 26.1% (p = 0.261), cao hơn nhiều so với tỷ lệ giả định 11%. Khoảng tin cậy 95% một phía cho tỷ lệ thực tế nằm trong khoảng từ 23.88% đến 100%, khẳng định tỷ lệ học sinh không rõ về độ thích thú trong học tập thực sự lớn hơn mức giả định.

  • Kết quả này cho thấy một tỷ lệ đáng kể học sinh còn do dự về sự hứng thú trong học tập, từ đó nhấn mạnh sự cần thiết của các biện pháp hỗ trợ để tăng động lực và sự quan tâm của các em đối với quá trình học tập.

3.4 parent_was_in_college-TRUE

3.4.1 Ước lượng Khoảng Tin cậy:

# Số lượng  học sinh có người giám hộ theo học cao đẳng 
xTRUEp <- sum(data$parent_was_in_college == "TRUE")
# Ước lượng khoảng tin cậy 95%
prop1.interval(xTRUEp,nrow(data),0.95) # 1-proportion 95% CI for p
##            Mean  Critical Value Margin of Error        CI lower        CI upper 
##      0.52000000      1.95996398      0.03096495      0.48903505      0.55096495

NHẬN XÉT:

  • Tỷ lệ học sinh có người giám hộ từng theo học cao đẳng trong mẫu là 52.0% (Mean = 0.52), chiếm tỷ lệ khá lớn trong tổng số học sinh khảo sát.

  • Với giá trị tới hạn (Critical Value) là 1.96 ở mức ý nghĩa 5%, sai số biên (Margin of Error) được tính là 3.1% (0.03096), thể hiện độ chính xác của ước lượng tỷ lệ này.

  • Do đó, khoảng tin cậy 95% cho tỷ lệ thực tế nằm trong khoảng từ 48.9% đến 55.1% (CI lower = 0.489, CI upper = 0.551), cho thấy với độ tin cậy cao, tỷ lệ học sinh có người giám hộ từng học cao đẳng dao động trong khoảng này.

  • Kết quả này cho thấy hơn một nửa số học sinh có người giám hộ có trình độ học vấn ở mức cao đẳng trở lên, điều này có thể ảnh hưởng tích cực đến quá trình học tập và phát triển của học sinh thông qua sự hỗ trợ và tư vấn từ gia đình.

3.4.2 Kiểm định Giả thuyết:

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; p = 0.6 \quad \text{(Tỷ lệ học sinh có người giám hộ từng theo học cao đẳng là 60%)} \\ H_1: \; p \ne 0.6 \quad \text{(Tỷ lệ học sinh có người giám hộ từng theo học cao đẳng khác 60%)} \end{array} \right.\]

prop.test(x=xTRUEp, n=nrow(data), p=0.6, correct=FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  xTRUEp out of nrow(data), null probability 0.6
## X-squared = 26.667, df = 1, p-value = 2.418e-07
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
##  0.4890177 0.5508292
## sample estimates:
##    p 
## 0.52
  • Kết quả kiểm định tỉ lệ một mẫu không sử dụng hiệu chỉnh liên tục cho giá trị thống kê \(\chi^2 = 26.667\) với 1 bậc tự do và p-value = 2.418 ^{-7}$, nhỏ hơn nhiều mức ý nghĩa 5%. Do đó, ta có đủ bằng chứng để bác bỏ giả thuyết \(H_0\).

  • Tỷ lệ mẫu được ước lượng là 52% (p = 0.52), thấp hơn đáng kể so với tỷ lệ giả định 60%. Khoảng tin cậy 95% cho tỷ lệ thực tế nằm trong khoảng từ 48.9% đến 55.1%, khẳng định tỷ lệ thực tế học sinh có người giám hộ từng học cao đẳng thấp hơn mức 60%.

  • Kết quả này cho thấy tỷ lệ học sinh có người giám hộ từng theo học cao đẳng thực tế không đạt mức 60% như giả định trước đó, điều này có thể tác động đến các yếu tố liên quan đến hỗ trợ học tập và phát triển của học sinh, từ đó gợi ý cho việc xem xét lại các chính sách và chương trình hỗ trợ phù hợp.

PHẦN 4: PHÂN TÍCH MỐI QUAN HỆ GIỮA HAI BIẾN ĐỊNH TÍNH (BIVARIATE ANALYSIS)

4.1 will_go_to_college-parent_was_in_college

4.1.1 Bảng tuần số chéo

table_WP <- table(data$will_go_to_college,data$parent_was_in_college)

library(kableExtra)
kable(table_WP, format = "html", caption = "Bảng 4.1 Tần số theo quyết định theo học cao đẳng và người giám hộ theo học cao đẳng") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 4.1 Tần số theo quyết định theo học cao đẳng và người giám hộ theo học cao đẳng
FALSE TRUE
NO 252 248
YES 228 272

Bảng tần số cho thấy học sinh có người giám hộ từng học cao đẳng có xu hướng quyết định theo học cao đẳng cao hơn so với học sinh có người giám hộ không học cao đẳng. Điều này phản ánh vai trò quan trọng của nền tảng học vấn người giám hộ trong việc ảnh hưởng đến quyết định học tập của con em mình.

4.1.2 Trực quan hoá

library(ggplot2)
df_WP <- as.data.frame(table_WP)
colnames(df_WP) <- c("Decision", "ParentCollege", "Count")
ggplot(df_WP, aes(x = ParentCollege, y = Count, fill = Decision)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = Count),
            position = position_dodge(width = 0.9)) +
  labs(
    x = "Người giám hộ từng học cao đẳng",
    y = "Số lượng học sinh",
    fill = "Quyết định học cao đẳng",
    title = "Biểu đồ 4.2: Tần số học sinh theo quyết định học cao đẳng và người giám hộ học cao đẳng"
  ) +
  theme_minimal()

NHẬN XÉT:

  • Biểu đồ và Bảng 4.1 cho thấy ảnh hưởng rõ rệt của trình độ học vấn người giám hộ đến quyết định học cao đẳng của học sinh. Ở nhóm có người giám hộ từng học cao đẳng, số học sinh quyết định học tiếp (YES) là 272, cao hơn nhóm không học (NO) là 248. Ngược lại, với nhóm không có người giám hộ từng học cao đẳng, số học sinh không học cao đẳng lại cao hơn (252 so với 228).

  • Sự khác biệt này phản ánh xu hướng: học sinh có người giám hộ từng học cao đẳng có xu hướng chọn học tiếp cao hơn. Điều này cho thấy trình độ học vấn của người giám hộ có thể đóng vai trò tích cực trong việc định hướng học tập cho học sinh, là yếu tố đáng cân nhắc trong các chính sách khuyến học và hỗ trợ giáo dục.

4.1.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{trình độ học vấn của người giám hộ và quyết định học tiếp của học sinh độc lập với nhau } \\ H_1: \; \text{trình độ học vấn của người giám hộ và quyết định học tiếp của học sinh có liên quan đến nhau} \end{array} \right.\]

Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chiWP <- chisq.test(table_WP)
print(chiWP)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_WP
## X-squared = 2.1194, df = 1, p-value = 0.1454

NHẬN XÉT:

Với bài toán kiểm định mối liên hệ giữa trình độ học vấn của người giám hộ và quyết định học tiếp cao đẳng của học sinh, ta sử dụng kiểm định Chi-squared với hiệu chỉnh Yates. Kết quả cho thấy thống kê \(\chi^2 = 2.1194\) với 1 bậc tự do và p-value = 0.1454, lớn hơn mức ý nghĩa 5%.

Do đó, không có đủ bằng chứng để bác bỏ giả thuyết \(H_0\). Điều này đồng nghĩa với việc chưa thể khẳng định có mối liên hệ rõ ràng giữa trình độ học vấn của người giám hộ và quyết định học tiếp của học sinh trong tổng thể. Mặc dù có sự chênh lệch nhẹ về tần số trong bảng, nhưng xét trên khía cạnh thống kê, sự khác biệt này chưa đủ ý nghĩa để rút ra kết luận chắc chắn. Các yếu tố khác có thể đang đóng vai trò quan trọng hơn trong quyết định học tập của học sinh.

4.1.4 Hiệu hai tỷ lệ

Thiết lập tỷ lệ

Tỷ lệ học sinh quyết định học có người giám hộ học cao đẳng:

\[ p_1 = P(\text{parents_was_in_college} = TRUE \mid \text{will_go_to_college} = YES) \]

Tỷ lệ học sinh không quyết định học có người giám hộ học cao đẳng:

\[ p_1 = P(\text{parents_was_in_college} = TRUE \mid \text{will_go_to_college} = NO) \]

Hiệu chênh lệch giữa hai tỷ lệ:

\[ d = p_1 - p_2 \]

Giả thuyết kiểm định

  • Giả thuyết H₀: Không có sự khác biệt giữa hai tỷ lệ
    \[ H_0: p_1 - p_2 = 0\]

  • Giả thuyết H1): Tỷ lệ học sinh quyết định học có người giám hộ học cao đẳng thấp hơn Tỷ lệ học sinh không quyết định học có người giám hộ học cao đẳng: \(H_1: p_1 - p_2 < 0\)

# Kiểm định sự khác biệt trong quyết định học tiếp cao đẳng với bố mẹ theo học cao đẳng
library(stats)

testWP <- prop.test(x = c(table_WP["YES","TRUE"], table_WP["NO","TRUE"]),
                      n = c(sum(table_WP["YES",]), sum(table_WP["NO",])),
                      alternative = "less", correct = FALSE)
print(testWP)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(table_WP["YES", "TRUE"], table_WP["NO", "TRUE"]) out of c(sum(table_WP["YES", ]), sum(table_WP["NO", ]))
## X-squared = 2.3077, df = 1, p-value = 0.9356
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000  0.09991321
## sample estimates:
## prop 1 prop 2 
##  0.544  0.496

Kết quả kiểm định hai tỷ lệ cho thấy \(\chi^2 = 2.3077\), với p-value = 0.9356, lớn hơn nhiều so với mức ý nghĩa 0.05. Do đó, ta không bác bỏ giả thuyết \(H_0\), tức là không có đủ bằng chứng để kết luận rằng tỷ lệ học sinh quyết định học cao đẳng có người giám hộ từng học cao đẳng thấp hơn nhóm còn lại. Ngược lại, ước lượng mẫu lại cho thấy tỷ lệ này cao hơn một chút (0.544 > 0.496), dù không có ý nghĩa thống kê.

Khoảng tin cậy 95% cho hiệu số tỷ lệ \((p_1 - p_2)\) là từ –1.0000 đến 0.09991321 bao gồm 0, càng củng cố việc không có sự khác biệt đáng kể. Dù tỷ lệ ước lượng của nhóm học tiếp học cao đẳng là 0.544, cao hơn nhóm không học (0.496), nhưng chênh lệch này không có ý nghĩa thống kê.

Hiệu chênh lệch giữa hai tỷ lệ: \[ \hat{d} = 0.544 - 0.496 = 0.048 \]

4.1.5 Tỷ số Nguy cơ (Relative Risk - RR)

library(epitools)
rWP <- riskratio(table_WP, method = "wald")
print(rWP)
## $data
##        
##         FALSE TRUE Total
##   NO      252  248   500
##   YES     228  272   500
##   Total   480  520  1000
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate     lower    upper
##   NO  1.000000        NA       NA
##   YES 1.096774 0.9733737 1.235819
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   NO          NA           NA         NA
##   YES  0.1294593    0.1454068   0.128735
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Dựa trên bảng dữ liệu 2×2, tỷ số rủi ro (risk ratio) giữa nhóm học sinh có quyết định học cao đẳng và người giám hộ từng học cao đẳng là RR = 1.097, tức cao hơn khoảng 9.7% so với nhóm quyết định không học. Tuy nhiên, khoảng tin cậy 95% là (0.973; 1.236) bao gồm giá trị 1, nghĩa là chưa đủ bằng chứng thống kê để khẳng định có sự khác biệt thực sự.

Phương pháp kiểm định Giá trị p (two-sided)
Mid-p exact test 0.1295
Fisher exact test 0.1454
Chi-square test 0.1287
  • Tất cả các giá trị p đều lớn hơn mức ý nghĩa 0.05.

  • Điều này có nghĩa là ta không đủ bằng chứng để bác bỏ giả thuyết tức là không có sự khác biệt đáng kể về tỷ lệ quyết định học tiếp cao đẳng giữa học sinh có người giám hộ từng học cao đẳng và không học cao đẳng dựa trên dữ liệu này.

  • Kết luận: Dữ liệu chưa cho thấy mối liên hệ có ý nghĩa thống kê giữa trình độ người giám hộ và quyết định học tiếp của học sinh.

4.1.6 Tỷ số Chênh (Odds Ratio - OR):

library(DescTools)
orWP <- OddsRatio(table_WP, method="wald", conf.level = 0.95)
print(orWP)
## odds ratio     lwr.ci     upr.ci 
##  1.2122241  0.9455879  1.5540462
  • OR > 1 nghĩa là odds quyết định học tiếp cao đẳng của học sinh có người giám hộ từng học cao đẳng cao hơn odds của học sinh có người giám hộ không học cao đẳng.

  • Giá trị OR = 1.2122 cho thấy odds học tiếp cao đẳng của nhóm học sinh có người giám hộ từng học cao đẳng cao hơn khoảng 21.22% so với nhóm còn lại (1.2122 - 1 = 0.2122).

  • Khoảng tin cậy 95% cho OR là (0.9456, 1.5540) chứa giá trị 1.

  • Điều này cho thấy, về mặt thống kê, chúng ta không thể khẳng định chắc chắn sự khác biệt về odds giữa hai nhóm, tức có khả năng odds của hai nhóm là bằng nhau (OR = 1).

TỔNG KẾT

Kết quả phân tích cho thấy tỷ số rủi ro (RR = 1.097) và odds ratio (OR = 1.212) đều lớn hơn 1, chỉ ra nhóm học sinh có người giám hộ từng học cao đẳng có xu hướng quyết định học tiếp cao đẳng cao hơn nhóm còn lại, tương ứng tăng khoảng 9.7% về tỷ lệ và 21.2% về odds. Tuy nhiên, các khoảng tin cậy 95% của RR (0.973–1.236) và OR (0.946–1.554) đều chứa giá trị 1, cùng với các giá trị p kiểm định chi-square, Fisher, và mid-p đều lớn hơn 0.05, cho thấy sự khác biệt này chưa đủ ý nghĩa thống kê. Như vậy, chưa có bằng chứng rõ ràng khẳng định mối liên hệ giữa trình độ người giám hộ và quyết định học tiếp của học sinh.

4.2 typeschool-gender

4.2.1 Bảng tần số chéo

table_typegender <- table(data$type_school,data$gender)

library(kableExtra)
kable(table_typegender, format = "html", caption = "Bảng 4.2 Tần số theo loại trường và giới tính của học sinh") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 4.2 Tần số theo loại trường và giới tính của học sinh
Female Male
Academic 302 307
Vocational 183 208

NHẬN XÉT:

Bảng 4.2 trình bày tần số học sinh theo loại trường và giới tính, cho thấy sự phân bố khá đồng đều giữa nam và nữ trong từng loại hình đào tạo. Cụ thể, trong nhóm trường Academic, số học sinh nam (307) và nữ (302) gần như tương đương, phản ánh không có sự thiên lệch giới rõ rệt. Ngược lại, ở nhóm Vocational, số học sinh nam (208) nhỉnh hơn nữ (183), cho thấy nam có xu hướng lựa chọn hướng nghề nhiều hơn.

4.2.2 Trực quan hoá

library(ggplot2)
df_typegender <- as.data.frame(table_typegender)
colnames(df_typegender) <- c("Gender", "SchoolType", "Count")
ggplot(df_typegender, aes(x = SchoolType, y = Count, fill = Gender)) +
  geom_bar(stat = "identity", position = "dodge") +
   geom_text(aes(label = Count),position = position_dodge(width = 0.9)) +
  labs(
    x = "Loại trường",
    y = "Số lượng học sinh",
    fill = "Quyết định học cao đẳng",
    title = "Biểu đồ 4.2: Tần số học sinh theo loại trường và giới tính"
  ) +
  theme_minimal()

NHẬN XÉT:

  • Biểu đồ 4.1 minh họa tần số học sinh theo hai yếu tố: loại trường (Academic – học thuật và Vocational – dạy nghề) và giới tính (Nam và Nữ). Qua biểu đồ, ta nhận thấy số lượng học sinh học trường học thuật (Academic) áp đảo so với trường dạy nghề (Vocational) ở cả hai giới. Cụ thể, trong loại trường Academic, số học sinh nữ là 302 và nam là 307 – cho thấy sự phân bố khá đồng đều giữa hai giới. Trong khi đó, ở loại trường Vocational, số học sinh nam (208) lại cao hơn nữ (183), phản ánh một sự lệch nhẹ về giới tính trong xu hướng chọn học nghề.

  • Biểu đồ giúp làm rõ rằng học sinh – bất kể giới tính – có xu hướng chọn trường học thuật nhiều hơn. Tuy nhiên, tỉ lệ học sinh nam chọn học nghề cao hơn nữ, điều này có thể phản ánh sự khác biệt trong định hướng nghề nghiệp hoặc ảnh hưởng văn hóa xã hội đối với giới. Biểu đồ 4.2 không chỉ thể hiện số liệu một cách trực quan mà còn giúp người xem dễ dàng so sánh và phân tích sự khác biệt giữa các nhóm, từ đó hỗ trợ việc đưa ra nhận định khách quan hơn về xu hướng giáo dục theo giới tính hiện nay.

4.2.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{Giới tính và loại trường theo học độc lập với nhau } \\ H_1: \; \text{Giới tính và loại trường theo học có liên quan đến nhau} \end{array} \right.\] Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chitypegender <- chisq.test(table_typegender)
print(chitypegender)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_typegender
## X-squared = 0.63283, df = 1, p-value = 0.4263

Kiểm định Chi-bình phương độc lập với hiệu chỉnh liên tục của Yates được thực hiện để xem xét mối liên hệ giữa giới tính và loại trường học sinh theo học. Kết quả cho thấy:

  • Giá trị thống kê Chi-squared = 0.63283

  • Bậc tự do (df) = 1

  • Giá trị p-value = 0.4263

Với p-value = 0.4263 > 0.05, ta không bác bỏ giả thuyết H₀ tại mức ý nghĩa 5%. Điều này cho thấy không có bằng chứng thống kê đủ mạnh để khẳng định rằng giới tính và loại trường học sinh theo học có mối liên hệ. Nói cách khác, sự khác biệt số lượng nam và nữ giữa trường Academic và Vocational không có ý nghĩa thống kê, và có thể xảy ra do ngẫu nhiên. Kết quả này củng cố nhận định từ Biểu đồ 4.2 rằng sự phân bố giới tính giữa các loại trường là tương đối đồng đều.

4.2.4 Hiệu hai tỷ lệ

Thiết lập tỷ lệ

Tỷ lệ học sinh nữ học tại trường nghề:

\[ p_1 = P(\text{typeschool} = Vacational \mid \text{gender} = Female) \] Tỷ lệ học sinh nam học tại trường nghề:

\[ p_2 = P(\text{typeschool} = Vacational \mid \text{gender} = Male) \]

Hiệu chênh lệch giữa hai tỷ lệ:

\[ d = p_1 - p_2 \]

Giả thuyết kiểm định

  • Giả thuyết H₀: Không có sự khác biệt giữa hai tỷ lệ
    \[ H_0: p_1 - p_2 = 0\]

  • Giả thuyết H1): Tỷ lệ học sinh nữ theo học trường nghềthấp hơn Tỷ lệ học sinh nam theo học trường nghề : \(H_1: p_1 - p_2 < 0\)

# Kiểm định tỷ lệ nam nữ học tại trường nghề
library(stats)

# Số học sinh nữ học nghề
x_female_voc <- table_typegender["Vocational", "Female"]  # 183
# Tổng số học sinh nữ
n_female <- sum(table_typegender[, "Female"])             # 302 + 183 = 485

# Số học sinh nam học nghề
x_male_voc <- table_typegender["Vocational", "Male"]      # 208
# Tổng số học sinh nam
n_male <- sum(table_typegender[, "Male"])                 # 307 + 208 = 515

# Kiểm định tỉ lệ (so sánh tỷ lệ nữ học nghề và tỷ lệ nam học nghề)
testtypegender <- prop.test(
  x = c(x_female_voc, x_male_voc),
  n = c(n_female, n_male),
  alternative = "less",    # giả thuyết tỷ lệ nữ học nghề thấp hơn tỷ lệ nam
  correct = FALSE
)
print(testtypegender)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(x_female_voc, x_male_voc) out of c(n_female, n_male)
## X-squared = 0.74018, df = 1, p-value = 0.1948
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000  0.02418537
## sample estimates:
##    prop 1    prop 2 
## 0.3773196 0.4038835
  • Giá trị thống kê \(\chi^2 =\) 0.7402
  • p-value = 0.1948

Với mức ý nghĩa 0.05, p-value = 0.1948 > 0.05 nên chúng ta không đủ cơ sở để bác bỏ giả thuyết không rằng tỷ lệ nữ học nghề thấp hơn tỷ lệ nam.

Quan sát tỷ lệ học nghề trong mẫu, nữ chiếm khoảng 37.73% (183/485), trong khi nam chiếm khoảng 40.39% (208/515). Mặc dù tỷ lệ nữ học nghề thấp hơn nam, nhưng sự chênh lệch này không mang ý nghĩa thống kê.

Như vậy, kết quả kiểm định cho thấy giới tính không ảnh hưởng đáng kể đến việc lựa chọn học trường nghề trong mẫu nghiên cứu này. Kết luận này phù hợp với kiểm định Chi-bình phương độc lập giữa giới tính và loại trường, cho thấy phân bố học sinh theo giới tính ở các loại trường không khác biệt rõ ràng.

Tóm lại, dựa trên dữ liệu và kiểm định thống kê, không có sự khác biệt có ý nghĩa giữa tỷ lệ học nghề của học sinh nam và nữ.

4.2.5 Tỷ số Nguy cơ (Relative Risk - RR)

library(epitools)
rtypegender <- riskratio(table_typegender, method = "wald")
print(rtypegender)
## $data
##             
##              Female Male Total
##   Academic      302  307   609
##   Vocational    183  208   391
##   Total         485  515  1000
## 
## $measure
##             risk ratio with 95% C.I.
##              estimate    lower    upper
##   Academic   1.000000       NA       NA
##   Vocational 1.055275 0.934209 1.192029
## 
## $p.value
##             two-sided
##              midp.exact fisher.exact chi.square
##   Academic           NA           NA         NA
##   Vocational  0.3906309    0.3998703  0.3896024
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

NHẬN XÉT:

Dựa trên bảng dữ liệu 2×2, tỷ số rủi ro (risk ratio) giữa nhóm học sinh NAM theo học trường nghề (Vocational) so với học trường học thuật (Academic) là RR = 1.0553, tức cao hơn khoảng 5.53%. Tuy nhiên, khoảng tin cậy 95% là (0.9342; 1.1920) bao gồm giá trị 1, nghĩa là chưa đủ bằng chứng thống kê để khẳng định có sự khác biệt thực sự giữa hai nhóm.

Phương pháp kiểm định Giá trị p (two-sided)
Mid-p exact test 0.3906
Fisher exact test 0.3999
Chi-square test 0.3896
  • Tất cả các giá trị p đều lớn hơn mức ý nghĩa 0.05.
  • Điều này có nghĩa là ta không đủ bằng chứng để bác bỏ giả thuyết không, tức không có sự khác biệt đáng kể về tỷ lệ học sinh NAM theo học trường nghề trường học thuật dựa trên dữ liệu này.

4.2.6 Tỷ số Chênh (Odds Ratio - OR):

library(DescTools)
ortypegender <- OddsRatio(table_typegender, method="wald", conf.level = 0.95)
print(ortypegender)
## odds ratio     lwr.ci     upr.ci 
##  1.1181004  0.8669993  1.4419258

Kết quả phân tích Odds Ratio (OR) cho thấy:

  • OR = 1.1181,

  • Khoảng tin cậy 95%: (0.8670; 1.4419).

Giá trị OR = 1.1181 cho biết odds (tỷ lệ chênh) của việc là nam ở nhóm học sinh theo học trường nghề (Vocational) cao hơn khoảng 11.8% so với nhóm học sinh theo học trường học thuật (Academic). Tuy nhiên, khoảng tin cậy 95% bao gồm giá trị 1, điều này cho thấy sự khác biệt không có ý nghĩa thống kê.

Như vậy, dựa trên dữ liệu và kết quả OR, không đủ bằng chứng để kết luận có sự khác biệt đáng kể về tỷ lệ học sinh nam và nữ giữa hai loại trường Vocational và Academic.

Kết luận: Giới tính không ảnh hưởng đáng kể đến việc lựa chọn loại trường học trong mẫu nghiên cứu này.

4.3 schoolaccreditation-residence

4.3.1 Bảng tần số chéo

table_sare <- table(data$school_accreditation,data$residence)

library(kableExtra)
kable(table_sare, format = "html", caption = "Bảng 4.3 Tần số theo tiêu chuẩn trường học và nơi định cư của học sinh") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 4.3 Tần số theo tiêu chuẩn trường học và nơi định cư của học sinh
Rural Urban
A 156 325
B 305 214

Bảng trên cho thấy phân bố số lượng học sinh theo tiêu chuẩn trường học (A và B) ở hai khu vực nơi định cư: nông thôn (Rural) và thành thị (Urban).

  • Ở khu vực nông thôn, số học sinh học tại trường tiêu chuẩn B (305 học sinh) nhiều hơn đáng kể so với trường tiêu chuẩn A (156 học sinh).
  • Ngược lại, ở khu vực thành thị, số học sinh học tại trường tiêu chuẩn A (325 học sinh) vượt trội so với trường tiêu chuẩn B (214 học sinh).

Nhận xét sơ bộ này gợi ý rằng học sinh ở thành thị có xu hướng theo học trường tiêu chuẩn A nhiều hơn, trong khi học sinh ở nông thôn lại tập trung nhiều hơn vào trường tiêu chuẩn B.

4.3.2 Trực quan hoá

library(ggplot2)
df_sare <- as.data.frame(table_sare)
colnames(df_sare) <- c("School_Accreditation", "Residence", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(df_sare, aes(x = Residence, y = Count, fill = School_Accreditation)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = Count),
            position = position_dodge(width = 0.9), vjust = -0.25) +
  labs(
    x = "Nơi định cư",
    y = "Số lượng học sinh",
    fill = "Tiêu chuẩn trường",
    title = "Biểu đồ 4.3: Tần số học sinh theo tiêu chuẩn trường và nơi định cư"
  ) +
  theme_minimal()

Nhận xét:

  • Biểu đồ thể hiện tần số học sinh phân theo tiêu chuẩn trường học (A và B) và nơi định cư (Rural - nông thôn, Urban - thành thị). Có thể thấy rõ:

  • Ở khu vực thành thị (Urban), số học sinh theo học trường tiêu chuẩn A (325 học sinh) lớn hơn đáng kể so với trường tiêu chuẩn B (214 học sinh).

  • Ngược lại, ở khu vực nông thôn (Rural), trường tiêu chuẩn B có số học sinh nhiều hơn (305 học sinh), trong khi trường A chỉ có 156 học sinh.

  • Mô hình phân bố này phản ánh xu hướng lựa chọn trường học dựa trên nơi sinh sống: học sinh thành thị có xu hướng học các trường tiêu chuẩn A, còn học sinh nông thôn có tỷ lệ cao hơn học trường tiêu chuẩn B.

  • Nhận xét này phù hợp với giả thuyết phổ biến rằng các trường tiêu chuẩn cao hơn thường tập trung tại các thành phố lớn, trong khi các khu vực nông thôn có nhiều học sinh theo học các trường tiêu chuẩn thấp hơn.

4.3.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{Nơi định cư và tiêu chuẩn trường theo học của học sinh độc lập với nhau } \\ H_1: \; \text{Nơi định cư và tiêu chuẩn trường theo học của học sinh có liên quan đến nhau} \end{array} \right.\] Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chisare <- chisq.test(table_sare)
print(chisare)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_sare
## X-squared = 68.618, df = 1, p-value < 2.2e-16

Kết quả kiểm định Chi-squared Pearson với điều chỉnh liên tục Yates cho bảng phân bố học sinh theo tiêu chuẩn trường và nơi định cư như sau:

  • Giá trị thống kê chi-squared (X-squared) = 68.618 với 1 bậc tự do (df = 1).
  • Giá trị p-value rất nhỏ, nhỏ hơn 2.2e-16, tức gần như bằng 0.

Nhận xét:
Với mức ý nghĩa thông thường 0.05, giá trị p-value < 0.05 cho thấy có bằng chứng rất mạnh để bác bỏ giả thuyết không (H0) về sự độc lập giữa nơi định cư và tiêu chuẩn trường học của học sinh.

Nói cách khác, dữ liệu cho thấy có mối liên hệ có ý nghĩa thống kê giữa nơi định cư và tiêu chuẩn trường mà học sinh theo học. Điều này đồng nghĩa với việc học sinh ở khu vực thành thị và nông thôn có xu hướng chọn trường học khác nhau, phù hợp với nhận xét trên biểu đồ tần số.

Kết luận:
Nơi định cư ảnh hưởng đáng kể đến lựa chọn tiêu chuẩn trường học của học sinh trong mẫu khảo sát.

4.3.4 Hiệu hai tỷ lệ

Thiết lập tỷ lệ

Tỷ lệ học sinh đến từ thành thị học trường tiêu chuẩn A:

\[ p_1 = P(\text{school_accreditation} = A \mid \text{residence} = Urban) \]

Tỷ lệ học sinh đến từ nông thôn học trường tiêu chuẩn A:

\[ p_2 = P(\text{school_accreditation} = A \mid \text{residence} = Urban) \]

Hiệu chênh lệch giữa hai tỷ lệ:

\[ d = p_1 - p_2 \]

Giả thuyết kiểm định

  • Giả thuyết H₀: Không có sự khác biệt giữa hai tỷ lệ
    \[ H_0: p_1 - p_2 = 0\]

  • Giả thuyết H1): Tỷ lệ học sinh đến từ thành thị học trường tiêu chuẩn A cao hơn Tỷ lệ học sinh đến từ nông thôn học trường tiêu chuẩn A: \(H_1: p_1 - p_2 > 0\)

library(stats)

testsare <- prop.test(
  x = c(table_sare["A", "Urban"], table_sare["A", "Rural"]),
  n = c(sum(table_sare[, "Urban"]), sum(table_sare[, "Rural"])),
  alternative = "greater",
  correct = FALSE
)
print(testsare)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(table_sare["A", "Urban"], table_sare["A", "Rural"]) out of c(sum(table_sare[, "Urban"]), sum(table_sare[, "Rural"]))
## X-squared = 69.674, df = 1, p-value < 2.2e-16
## alternative hypothesis: greater
## 95 percent confidence interval:
##  0.2144178 1.0000000
## sample estimates:
##    prop 1    prop 2 
## 0.6029685 0.3383948

Tỷ lệ học sinh học trường A ở Urban là 60.3% (325/540), cao hơn đáng kể so với 33.8% (156/461) ở Rural. - Thống kê chi-squared = 69.674, bậc tự do = 1. - Giá trị p-value < 2.2e-16, cực kỳ nhỏ, cho thấy bằng chứng rất mạnh để bác bỏ giả thuyết không. - Khoảng tin cậy 95% cho hiệu số tỷ lệ là (0.2144; 1.0000), hoàn toàn nằm phía dương, xác nhận sự chênh lệch có ý nghĩa.

Kết luận: Dữ liệu cho thấy tỷ lệ học sinh ở khu vực thành thị học trường loại A cao hơn đáng kể so với học sinh ở khu vực nông thôn. Mối liên hệ giữa nơi định cư và loại trường học theo học là có ý nghĩa thống kê.

4.3.5 Tỷ số Nguy cơ (Relative Risk - RR)

library(epitools)
rsare <- riskratio(table_sare, method = "wald")
print(rsare)
## $data
##        
##         Rural Urban Total
##   A       156   325   481
##   B       305   214   519
##   Total   461   539  1000
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate    lower     upper
##   A 1.0000000       NA        NA
##   B 0.6102505 0.541283 0.6880055
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact   chi.square
##   A         NA           NA           NA
##   B          0 6.113342e-17 6.996373e-17
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

ựa trên phân tích Risk Ratio (RR) giữa nơi cư trú và loại trường học, kết quả cho thấy:

  • Risk Ratio của nhóm trường loại B là 0.610 (khoảng tin cậy 95%: [0.541; 0.688]).

  • Điều này có nghĩa là học sinh ở khu vực Urban có nguy cơ theo học trường loại B thấp hơn 39% so với học sinh ở khu vực Rural, khi so với chuẩn là trường loại A (RR = 1).

  • Khoảng tin cậy không chứa 1, cho thấy sự khác biệt này có ý nghĩa thống kê.

  • Đồng thời, giá trị p từ các kiểm định (mid-p exact, Fisher, chi-square) đều xấp xỉ 0, củng cố thêm bằng chứng rằng nơi cư trú có liên quan chặt chẽ đến loại trường học mà học sinh theo học.

Kết luận: Học sinh ở khu vực thành thị có khả năng theo học trường loại A cao hơn đáng kể so với học sinh nông thôn. Risk Ratio giúp định lượng rõ mức chênh lệch rủi ro này và cho thấy đây là một khác biệt có ý nghĩa rõ rệt về mặt thống kê.

4.3.6 Tỷ số Chênh (Odds Ratio - OR):

library(DescTools)
orsare <- OddsRatio(table_sare, method="wald", conf.level = 0.95)
print(orsare)
## odds ratio     lwr.ci     upr.ci 
##  0.3367869  0.2599854  0.4362760

Kết quả phân tích Odds Ratio cho thấy:

  • Odds Ratio = 0.337 với khoảng tin cậy 95% là [0.260; 0.436].

  • Điều này nghĩa là xác suất học sinh nông thôn (rural) theo học trường loại A so với loại B chỉ bằng khoảng 33.7% so với học sinh thành thị (urban).

  • Vì khoảng tin cậy không chứa 1, nên sự khác biệt này có ý nghĩa thống kê.

Kết luận: Có sự khác biệt đáng kể về loại trường học giữa học sinh nông thôn và thành thị. Học sinh ở thành thị có xu hướng theo học trường loại A nhiều hơn rõ rệt so với học sinh ở nông thôn. Điều này gợi ý rằng nơi cư trú có thể là một yếu tố ảnh hưởng đến khả năng tiếp cận hoặc lựa chọn loại trường học.

4.4 residence - will_go_to_college

4.4.1 Bảng tần số chéo

table_rew <- table(data$parent_was_in_college, data$school_accreditation)

library(kableExtra)
kable(table_rew, format = "html", caption = "Bảng 4.4 Tần số họ sinh theo học tại trường xét theo tiêu chuẩn và người giám hộ từng học cao đẳng") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 4.4 Tần số họ sinh theo học tại trường xét theo tiêu chuẩn và người giám hộ từng học cao đẳng
A B
FALSE 362 118
TRUE 119 401

Bảng 4.4 thể hiện tần số học sinh theo học tại trường loại A hoặc B, phân theo việc người giám hộ có từng học cao đẳng hay chưa. Cụ thể, trong số 480 học sinh có người giám hộ chưa từng học cao đẳng, phần lớn (362 em) theo học tại trường loại A, chỉ có 118 em chọn trường loại B. Ngược lại, trong nhóm 520 học sinh có người giám hộ từng học cao đẳng, có tới 401 em theo học trường loại B, trong khi chỉ 119 em chọn trường loại A.

Điều này cho thấy xu hướng khá rõ ràng: học sinh có người giám hộ từng học cao đẳng thường chọn trường loại B nhiều hơn, trong khi học sinh không có người giám hộ học cao đẳng thì chủ yếu chọn trường loại A. Sự khác biệt này gợi ý rằng trình độ học vấn của người giám hộ có thể ảnh hưởng đến lựa chọn trường học của học sinh, có thể thông qua nhận thức, kỳ vọng hoặc khả năng định hướng học tập.

4.4.2 Trực quan hoá

library(ggplot2)
df_rew <- as.data.frame(table_rew)
colnames(df_rew) <- c("ParentCollege", "School_Accreditation", "Count")

# Vẽ biểu đồ
ggplot(df_rew, aes(x = ParentCollege, y = Count, fill = School_Accreditation)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = Count),
            position = position_dodge(width = 0.9), vjust = -0.25) +
  labs(
    x = "Người giám hộ từng học cao đẳng",
    y = "Số lượng học sinh",
    fill = "Tiêu chuẩn trường",
    title = "Biểu đồ 4.4: Tần số học sinh theo tiêu chuẩn trường và người giám hộ học cao đẳng"
  ) +
  theme_minimal()

Biểu đồ 4.4 cho thấy học sinh có người giám hộ từng học cao đẳng (TRUE) chủ yếu học tại trường loại B (401 em), trong khi nhóm không có người giám hộ học cao đẳng (FALSE) lại tập trung nhiều hơn ở trường loại A (362 em). Điều này gợi ý rằng trình độ học vấn của người giám hộ có thể ảnh hưởng đến lựa chọn tiêu chuẩn trường của học sinh. Cụ thể, học sinh với người giám hộ từng học cao đẳng có xu hướng chọn trường có tiêu chuẩn cao hơn (B), trong khi nhóm còn lại ưu tiên trường loại A.

4.3.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \text{Tiêu chuẩn trường và người giám hộ từng học cao đẳng là độc lập với nhau} \\[6pt] H_1: \text{Tiêu chuẩn trường và người giám hộ từng học cao đẳng có liên quan với nhau} \end{array} \right.\] Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chirew <- chisq.test(table_rew)
print(chirew)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_rew
## X-squared = 273.82, df = 1, p-value < 2.2e-16

Kết quả kiểm định Chi bình phương với hiệu chỉnh Yates cho thấy:

  • Giá trị thống kê \(\chi^2 = 273.82\) với bậc tự do \(df = 1\),

  • Giá trị p-value rất nhỏ, nhỏ hơn 2.2e-16 (p-value < 0.0001),

  • Điều này cho thấy sự khác biệt rất có ý nghĩa thống kê giữa phân phối tiêu chuẩn trường theo học của học sinh với việc người giám hộ có từng học cao đẳng hay không.

Như vậy, ta có đủ bằng chứng để bác bỏ giả thuyết độc lập ban đầu, khẳng định rằng tiêu chuẩn trường và việc người giám hộ từng học cao đẳng có mối quan hệ phụ thuộc có ý nghĩa thống kê trong mẫu dữ liệu này.

4.4.4 Hiệu hai tỷ lệ

Thiết lập tỷ lệ

Tỷ lệ học sinh có người giám hộ không từng học cao đẳng học trường tiêu chuẩn A:

\[ p_1 = P(\text{school_accreditation} = A \mid \text{parent_was_in_college} = \text{FALSE}) \]

Tỷ lệ học sinh có người giám hộ từng học cao đẳng học trường tiêu chuẩn A:

\[ p_2 = P(\text{school_accreditation} = A \mid \text{parent_was_in_college} = \text{TRUE}) \]

Hiệu chênh lệch giữa hai tỷ lệ:

\[ d = p_1 - p_2 \]

Giả thuyết kiểm định

  • Giả thuyết \(H_0\): Không có sự khác biệt giữa hai tỷ lệ
    \[ H_0: p_1 - p_2 = 0 \]

  • Giả thuyết \(H_1\): Tỷ lệ học sinh có người giám hộ không từng học cao đẳng học trường A cao hơn so với học sinh có người giám hộ từng học cao đẳng, tức:

    \[ H_1: p_1 - p_2 > 0 \]

library(stats)

tests_rew <- prop.test(
  x = c(table_rew["FALSE", "A"], table_rew["TRUE", "A"]),
  n = c(sum(table_rew["FALSE", ]), sum(table_rew["TRUE", ])),
  alternative = "greater",  # Giả thuyết tỷ lệ FALSE học A cao hơn TRUE
  correct = FALSE
)
print(tests_rew)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(table_rew["FALSE", "A"], table_rew["TRUE", "A"]) out of c(sum(table_rew["FALSE", ]), sum(table_rew["TRUE", ]))
## X-squared = 275.92, df = 1, p-value < 2.2e-16
## alternative hypothesis: greater
## 95 percent confidence interval:
##  0.4810124 1.0000000
## sample estimates:
##    prop 1    prop 2 
## 0.7541667 0.2288462
  • Tỷ lệ học sinh theo học trường tiêu chuẩn A ở nhóm học sinh có người giám hộ không từng học cao đẳng (FALSE) là 75.4%, trong khi tỷ lệ này ở nhóm học sinh có người giám hộ từng học cao đẳng (TRUE) chỉ là 22.9%. Sự khác biệt này rất lớn về mặt tỷ lệ phần trăm.

  • Kết quả kiểm định hai tỷ lệ cho thấy giá trị thống kê chi-square là 275.92 với 1 bậc tự do, p-value nhỏ hơn 2.2e-16, tức là rất nhỏ, cho thấy sự khác biệt về tỷ lệ này là có ý nghĩa thống kê rất mạnh.

  • Khoảng tin cậy 95% cho hiệu giữa hai tỷ lệ nằm trong khoảng từ 0.481 đến 1.000, hoàn toàn nằm trên 0, khẳng định rằng tỷ lệ học sinh học trường tiêu chuẩn A ở nhóm không có người giám hộ từng học cao đẳng cao hơn nhóm có người giám hộ từng học cao đẳng.

  • Như vậy, dữ liệu cho thấy có sự liên quan rõ rệt giữa việc người giám hộ từng học cao đẳng và tỷ lệ học sinh học trường tiêu chuẩn A: nhóm học sinh có người giám hộ không từng học cao đẳng có tỷ lệ học trường A cao hơn đáng kể so với nhóm còn lại.

  • Kết luận: Chúng ta bác bỏ giả thuyết H₀ về sự độc lập và chấp nhận H₁, rằngkhả năng người giám hộ từng học cao đẳng và tiêu chuẩn trường học có liên quan đến nhau trong mẫu này.

4.4.5 Tỷ số Nguy cơ (Relative Risk - RR)

library(epitools)
rrew <- riskratio(table_rew, method = "wald")
print(rrew)
## $data
##        
##           A   B Total
##   FALSE 362 118   480
##   TRUE  119 401   520
##   Total 481 519  1000
## 
## $measure
##        risk ratio with 95% C.I.
##         estimate    lower    upper
##   FALSE 1.000000       NA       NA
##   TRUE  3.136897 2.663652 3.694222
## 
## $p.value
##        two-sided
##         midp.exact fisher.exact chi.square
##   FALSE         NA           NA         NA
##   TRUE           0 8.859502e-65 5.8216e-62
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Tỷ số rủi ro (Risk Ratio) của nhóm học sinh có người giám hộ từng học cao đẳng (TRUE) so với nhóm không từng học (FALSE) là khoảng 3.136897, với khoảng tin cậy 95% từ 2.663652 đến 3.694222.

  • Điều này có nghĩa là nhóm học sinh có người giám hộ từng học cao đẳng có khả năng học trường tiêu chuẩn B cao gấp hơn khoảng 3 lần so với nhóm không có người giám hộ từng học cao đẳng.

  • Kết quả kiểm định với p-value rất nhỏ (gần bằng 0) từ các phương pháp mid-p exact, Fisher exact và Chi-square cho thấy sự khác biệt này là có ý nghĩa thống kê rất mạnh.

  • Như vậy, có thể kết luận rằng tồn tại mối liên hệ rõ ràng và mạnh mẽ giữa việc người giám hộ từng học cao đẳng và khả năng học sinh theo học trường tiêu chuẩn B.

  • Kết luận: Dữ liệu cung cấp bằng chứng mạnh mẽ để bác bỏ giả thuyết độc lập giữa trình độ người giám hộ và tiêu chuẩn trường học, đồng thời xác nhận mối liên hệ tích cực giữa hai yếu tố này.

4.4.6 Tỷ số Chênh (Odds Ratio - OR):

library(DescTools)
orrew <- OddsRatio(table_rew, method="wald", conf.level = 0.95)
print(orrew)
## odds ratio     lwr.ci     upr.ci 
##  10.337701   7.723001  13.837635
  • Tỷ số chênh (Odds Ratio) giữa nhóm học sinh có người giám hộ từng học cao đẳng và nhóm không có người giám hộ từng học cao đẳng là khoảng 10.337701 với khoảng tin cậy 95% từ 7.723001 đến 13.837635 .

  • Điều này cho thấy nhóm học sinh có người giám hộ từng học cao đẳng có khả năng học trường tiêu chuẩn B cao gấp hơn khoảng 10 lần so với nhóm không có người giám hộ từng học cao đẳng.

  • Khoảng tin cậy hẹp và nằm hoàn toàn trên 1 chứng tỏ kết quả này có ý nghĩa thống kê rất mạnh và chắc chắn.

  • Kết quả này củng cố thêm nhận định rằng trình độ người giám hộ có ảnh hưởng rất lớn đến quyết định học trường tiêu chuẩn của học sinh.

  • Tổng kết: Có mối liên hệ tích cực, rất mạnh và có ý nghĩa thống kê giữa việc người giám hộ từng học cao đẳng và việc học sinh theo học trường tiêu chuẩn B.

PHẦN 5: TỔNG KẾT

5.1 TÓM TẮT

Mối quan hệ Kiểm định Chi-squared p-value Risk Ratio (95% CI) Odds Ratio (95% CI) Nhận xét chính
4.1 will_go_to_college - parent_was_in_college X² = 2.1194, df = 1, p = 0.1454 0.1454 1.10 (0.97 – 1.24) 1.21 (0.95 – 1.55) Không có bằng chứng đủ mạnh để kết luận sự liên quan giữa quyết định học cao đẳng và việc người giám hộ từng học cao đẳng.
4.2 typeschool - gender X² = 0.63283, df = 1, p = 0.4263 0.4263 1.06 (0.93 – 1.19) 1.12 (0.87 – 1.44) Không có khác biệt đáng kể về tỷ lệ chọn loại trường giữa học sinh nam và nữ.
4.3 schoolaccreditation - residence X² = 68.618, df = 1, p < 2.2e-16 < 2.2e-16 0.61 (0.54 – 0.69) 0.34 (0.26 – 0.44) Có sự khác biệt rõ rệt về tiêu chuẩn trường theo nơi định cư; học sinh ở thành thị có tỷ lệ học trường tiêu chuẩn A cao hơn so với nông thôn.
4.4 residence - will_go_to_college X² = 273.82, df = 1, p < 2.2e-16 < 2.2e-16 3.14 (2.66 – 3.69) 10.34 (7.72 – 13.84) Học sinh có người giám hộ từng học cao đẳng có khả năng học trường tiêu chuẩn B cao gấp hơn 10 lần so với nhóm không có người giám hộ học cao đẳng (ý nghĩa rất mạnh).

5.2 HẠN CHẾ

  • Kích thước mẫu và tính đại diện: 1000 học sinh có thể chưa đủ lớn và chưa đại diện toàn diện, đặc biệt nếu mẫu không ngẫu nhiên, dẫn đến sai số hệ thống.

  • Thông tin hạn chế: Thiếu các biến quan trọng như thu nhập gia đình, trình độ học vấn cha mẹ chi tiết, chất lượng giáo dục, và yếu tố xã hội - tâm lý ảnh hưởng đến quyết định will_go_to_college.

  • Giới hạn biến phân loại: Các biến như school_accreditation, residence, parent_was_in_college phân loại đơn giản, chưa phản ánh mức độ hay chất lượng thực tế.

  • Phân tích bảng 2x2 và kiểm định Chi-square: Việc sử dụng bảng 2x2 và kiểm định Chi-square chỉ cho thấy mối liên hệ song phương giữa biến phân loại và will_go_to_college, chưa kiểm soát được các yếu tố đồng biến khác.

  • Phân tích đa biến cần thiết: Cần áp dụng hồi quy logistic đa biến để đồng thời xem xét nhiều yếu tố ảnh hưởng đến quyết định will_go_to_college.

  • Hạn chế về thời gian và dữ liệu: Dữ liệu không theo dõi dài hạn, có thể thiếu sót hoặc không chính xác, ảnh hưởng đến độ tin cậy kết quả.

W2

PHẦN 1: TÌM HIỂU VÀ CHUẨN BỊ DỮ LIỆU

1.1 Đọc dữ liệu

d<-read.csv("C:/Users/DELL/Downloads/Supermarket Transactions.csv", header= T)
str(d)
## 'data.frame':    14059 obs. of  16 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" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ 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" ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...

1.2 Làm quen dữ liệu

str(d)
## 'data.frame':    14059 obs. of  16 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" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ 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" ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...
  • Với hơn 14,000 quan sát, dữ liệu đủ lớn để thực hiện các phân tích thống kê, mô hình dự đoán hoặc phân khúc khách hàng.

  • Dữ liệu khách hàng phong phú: Các biến như Gender, MaritalStatus, Homeowner, Children, AnnualIncome… cung cấp thông tin nhân khẩu học hữu ích cho việc phân tích hành vi tiêu dùng.

  • Có đủ các biến quan trọng như PurchaseDate, UnitsSold, Revenue, và chi tiết sản phẩm (ProductFamily, AnnualIncome…), thuận tiện để phân tích doanh thu theo thời gian, loại sản phẩm,…

Hiển thị 10 dòng đầu bộ dữ liệu

head(d,10)
##     X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 1   1   2007-12-18       7223      F             S         Y        2
## 2   2   2007-12-20       7841      M             M         Y        5
## 3   3   2007-12-21       8374      F             M         N        2
## 4   4   2007-12-21       9619      M             M         Y        3
## 5   5   2007-12-22       1900      F             S         Y        3
## 6   6   2007-12-22       6696      F             M         Y        3
## 7   7   2007-12-23       9673      M             S         Y        2
## 8   8   2007-12-25        354      F             M         Y        2
## 9   9   2007-12-25       1293      M             M         Y        3
## 10 10   2007-12-25       7938      M             S         N        1
##     AnnualIncome          City StateorProvince Country  ProductFamily
## 1    $30K - $50K   Los Angeles              CA     USA           Food
## 2    $70K - $90K   Los Angeles              CA     USA           Food
## 3    $50K - $70K     Bremerton              WA     USA           Food
## 4    $30K - $50K      Portland              OR     USA           Food
## 5  $130K - $150K Beverly Hills              CA     USA          Drink
## 6    $10K - $30K Beverly Hills              CA     USA           Food
## 7    $30K - $50K         Salem              OR     USA           Food
## 8        $150K +        Yakima              WA     USA           Food
## 9    $10K - $30K    Bellingham              WA     USA Non-Consumable
## 10   $50K - $70K     San Diego              CA     USA Non-Consumable
##     ProductDepartment      ProductCategory UnitsSold Revenue
## 1         Snack Foods          Snack Foods         5   27.38
## 2             Produce           Vegetables         5   14.90
## 3         Snack Foods          Snack Foods         3    5.52
## 4              Snacks                Candy         4    4.44
## 5           Beverages Carbonated Beverages         4   14.00
## 6                Deli          Side Dishes         3    4.37
## 7        Frozen Foods      Breakfast Foods         4   13.78
## 8        Canned Foods          Canned Soup         6    7.34
## 9           Household    Cleaning Supplies         1    2.41
## 10 Health and Hygiene       Pain Relievers         2    8.96

Hiển thị 10 dòng cuối bộ dữ liệu

tail(d,10)
##           X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 14050 14050   2009-12-28       1394      M             M         Y        0
## 14051 14051   2009-12-28       6251      M             S         N        4
## 14052 14052   2009-12-28        378      M             S         Y        1
## 14053 14053   2009-12-28       7234      F             M         Y        4
## 14054 14054   2009-12-29       2032      F             M         N        3
## 14055 14055   2009-12-29       9102      F             M         Y        2
## 14056 14056   2009-12-29       4822      F             M         Y        3
## 14057 14057   2009-12-31        250      M             S         Y        1
## 14058 14058   2009-12-31       6153      F             S         N        4
## 14059 14059   2009-12-31       3656      M             S         N        3
##       AnnualIncome        City StateorProvince Country  ProductFamily
## 14050  $30K - $50K  San Andres              DF  Mexico           Food
## 14051  $50K - $70K   Vancouver              BC  Canada           Food
## 14052  $30K - $50K     Spokane              WA     USA           Food
## 14053  $30K - $50K     Spokane              WA     USA           Food
## 14054  $10K - $30K      Yakima              WA     USA Non-Consumable
## 14055  $10K - $30K   Bremerton              WA     USA           Food
## 14056  $10K - $30K Walla Walla              WA     USA           Food
## 14057  $30K - $50K    Portland              OR     USA          Drink
## 14058  $50K - $70K     Spokane              WA     USA          Drink
## 14059  $50K - $70K    Portland              OR     USA Non-Consumable
##       ProductDepartment      ProductCategory UnitsSold Revenue
## 14050              Deli                 Meat         4    7.15
## 14051             Dairy                Dairy         5   19.95
## 14052             Dairy                Dairy         5   28.08
## 14053              Deli          Side Dishes         5    6.80
## 14054         Household       Paper Products         5   14.50
## 14055      Baking Goods         Baking Goods         3    9.64
## 14056      Frozen Foods           Vegetables         3    7.45
## 14057         Beverages Pure Juice Beverages         4    3.24
## 14058             Dairy                Dairy         2    4.00
## 14059         Household           Electrical         5   25.53

1.3 Kiểm tra giá trị NA

dna <- sum(is.na(d))
print(dna)
## [1] 0

Vậy khi kiểm tra tổng số giá trị NA toàn bộ data bằng câu lệnh sum(is.na(d)), kết quả nhận được là KHÔNG CÓ GIÁ TRỊ NA nên ta tiến hành phân tích tiếp.

1.4 Chuyển đổi thành biến định tính

Việc chuyển các biến như Gender, MaritalStatus, Homeowner, AnnualIncome và các biến liên quan đến sản phẩm, địa lý sang kiểu factor là bước tiền xử lý quan trọng trong phân tích dữ liệu. Điều này giúp R nhận diện đúng bản chất phân loại của các biến này,nên ta tiến hành chuyển đổi các biến định tính:

categorical_vars <- names(d)[sapply(d, function(x) is.factor(x) || is.character(x))]
print(categorical_vars)
##  [1] "PurchaseDate"      "Gender"            "MaritalStatus"    
##  [4] "Homeowner"         "AnnualIncome"      "City"             
##  [7] "StateorProvince"   "Country"           "ProductFamily"    
## [10] "ProductDepartment" "ProductCategory"

Từ kết quả đã được in ra, ta có tổng cộng 10 biến định tính ( loại trừ biến PurchaseDate vì nó chứa thông tin liên tục theo thời gian) như trên, tiếp tục tiến hành chuyển đổi thành factor:

d$Gender <- as.factor(d$Gender)
d$MaritalStatus <- as.factor(d$MaritalStatus)
d$Homeowner <- as.factor(d$Homeowner)
d$AnnualIncome <- as.factor(d$AnnualIncome)

d$ProductFamily <- as.factor(d$ProductFamily)
d$ProductDepartment <- as.factor(d$ProductDepartment)
d$AnnualIncome <- as.factor(d$AnnualIncome)

d$City <- as.factor(d$City)
d$StateorProvince <- as.factor(d$StateorProvince)
d$Country <- as.factor(d$Country)
  • Các biến như Gender, MaritalStatus, Homeowner, AnnualIncome giờ đã được xử lý đúng chuẩn để R hiểu rõ đây là các nhóm phân loại, giúp phân tích và mô hình hóa chính xác hơn.

  • Việc chuyển đổi các biến liên quan đến sản phẩm (ProductFamily, ProductDepartment, ProductCategory) và địa lý (City, StateorProvince, Country) sang factor cũng rất cần thiết vì chúng cũng là các biến phân loại, không phải dữ liệu số hay liên tục.

PHẦN 2: PHÂN TÍCH MÔ TẢ MỘT BIẾN ĐỊNH TÍNH - UNIVARIATE DESCRIPTIVE ANALYSIS

2.1 Gender

2.1.1 Thống kê Tần suất

## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
Bảng 2.1 Phân phối giới tính - GENDER
Gender Frequency Gender Percentage (%)
F 7170 F 50.999
M 6889 M 49.001

Vậy trong data này có 50.9993598% nữ và 49.0006402% nam. Tỷ lệ nam và nữ trong data gần như cân bằng, chỉ chênh lệch nhẹ khoảng 1%.

2.1.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(gender_freq,
    main   = "Biểu đồ 2.1: Phân bố giới tính (Gender)",
    labels = paste0(names(gender_freq),
                    " (", round(gender_pct, 3), "%)"),
    col    = c("#DCB0C3", "#596CAD"))   

Nhận xét: Dựa trên bảng tần suất và Trực quan hoá tròn phân bố giới tính, nhóm nữ chiếm ưu thế nhẹ với tỷ lệ khoảng 51%, trong khi nhóm nam chiếm khoảng 49%. Mức chênh lệch nhỏ này cho thấy mẫu dữ liệu có sự cân bằng giới tính tương đối tốt, đảm bảo tính đại diện cho cả hai giới trong các phân tích tiếp theo. Trực quan hoá tròn minh họa rõ ràng sự phân bổ này với màu sắc và nhãn phần trăm trực quan, giúp người đọc dễ dàng nắm bắt thông tin. Do đó, không cần điều chỉnh mẫu theo giới tính khi thực hiện các phân tích liên quan.

2.2 Homeowner

2.2.1 Thống kê Tần suất

homeowner_freq <- table(d$Homeowner)

homeowner_pct <- table(d$Homeowner)/sum(nrow(d))*100

homeowner_table <- data.frame(
  Homeowner = names(homeowner_freq),
  Frequency = as.integer(homeowner_freq),
  Percentage = round(homeowner_pct, 3)
)
colnames(homeowner_table) <- c("Homeowner", "Frequency", "Homeowner", "Percentage (%)")

# Hiển thị bảng đẹp
homeowner_table %>%
  kable("html", caption = "Bảng 2.2 Phân phối cá nhân sở hữu nhà - HOMEOWNER") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.2 Phân phối cá nhân sở hữu nhà - HOMEOWNER
Homeowner Frequency Homeowner Percentage (%)
N 5615 N 39.939
Y 8444 Y 60.061

Vậy trong data này có 39.9388292% không sở hữu căn nhà nào và 60.0611708% có sở hữu nhà.

2.2.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(homeowner_freq,
    main   = "Biểu đồ 2.2: Phân phối cá nhân sở hữu nhà - HOMEOWNER",
    labels = paste0(names(homeowner_freq),
                    " (", round(homeowner_pct, 3), "%)"),
    col    = c("#FEF9DB", "#4C689B"))   

Nhận xét:

  • Trực quan hoá tròn cho thấy nhóm người có sở hữu nhà (“Y”) chiếm đa số với 60.1%, trong khi nhóm không sở hữu nhà (“N”) chỉ chiếm 39.9%. Điều này phản ánh rằng phần lớn người trong mẫu khảo sát có tài sản nhà ở, có thể gợi ý về mức độ ổn định tài chính trong cộng đồng này.

  • Chênh lệch là: 8444 - 5615 = 2829 người, tức là số người có nhà cao hơn gần 50% so với người không có nhà.

2.3 MaritalStatus

2.3.1 Thống kê Tần suất

Bảng 2.3 Phân phối tình trạng hôn nhân - MaritalStatus
MaritalStatus Frequency MaritalStatus Percentage (%)
M 6866 M 48.837
S 7193 S 51.163

Vậy trong data này có 48.8370439% kết hôn và 51.1629561% độc thân.

2.3.2 Trực quan hóa

pie(MaritalStatus_freq,
    main   = "Biểu đồ 2.3: Phân phối tình trạng hôn nhân - MaritalStatus",
    labels = paste0(names(MaritalStatus_freq),
                    " (", round(MaritalStatus_pct, 3), "%)"),
    col    = c("#F7E4E2", "#63847D")) 

NHẬN XÉT:

  • Phân bố gần cân bằng: Tỷ lệ người độc thân (51.16%) và người đã kết hôn (48.84%) rất gần nhau, cho thấy mẫu khảo sát không thiên lệch mạnh về một nhóm.

  • Nhóm độc thân chiếm ưu thế nhẹ: Với tỷ lệ cao hơn 2.3%, nhóm độc thân chiếm ưu thế nhẹ trong mẫu.

  • Dễ dàng nhận thấy nhóm độc thân chiếm phần lớn nhẹ so với nhóm đã kết hôn khi quan sát Trực quan hoá.

2.4 City

2.4.1 Thống kê Tần suất

Bảng 2.4 Phân phối định cư các thành phố - City
City Frequency City Percentage (%)
Acapulco 383 Acapulco 2.724
Bellingham 143 Bellingham 1.017
Beverly Hills 811 Beverly Hills 5.769
Bremerton 834 Bremerton 5.932
Camacho 452 Camacho 3.215
Guadalajara 75 Guadalajara 0.533
Hidalgo 845 Hidalgo 6.010
Los Angeles 926 Los Angeles 6.587
Merida 654 Merida 4.652
Mexico City 194 Mexico City 1.380
Orizaba 464 Orizaba 3.300
Portland 876 Portland 6.231
Salem 1386 Salem 9.858
San Andres 621 San Andres 4.417
San Diego 866 San Diego 6.160
San Francisco 130 San Francisco 0.925
Seattle 922 Seattle 6.558
Spokane 875 Spokane 6.224
Tacoma 1257 Tacoma 8.941
Vancouver 633 Vancouver 4.502
Victoria 176 Victoria 1.252
Walla Walla 160 Walla Walla 1.138
Yakima 376 Yakima 2.674

Vậy trong data này có 2.7242336% sống ở Acapulco và 1.017142% sống ở Bellingham.

Tiếp theo, có 5.77% sống ở Beverly Hills, 5.93% ở Bremerton, và 3.22% ở Camacho.

Trong khi đó, chỉ 0.5334661% cư dân sống ở Guadalajara và 6.0103848% ở Hidalgo. Los Angeles có tỷ lệ cao hơn với 6.5865282%.

Mexico City chiếm 1.379899%, thấp hơn so với Portland (6.2308841%) và Salem (9.8584537%).

Các thành phố tại Washington như Seattle (6.5580767%), Spokane (6.2237712%), và Tacoma (8.940892%) có tỷ lệ đáng kể.

Cuối cùng, các khu vực nhỏ như Victoria (1.2518671%), Walla Walla (1.138061%) và Yakima (2.6744434%) chỉ chiếm phần nhỏ.

2.4.2 Trực quan hóa

library(ggplot2)

City_df <- as.data.frame(City_pct)
colnames(City_df) <- c("City", "Percentage")

ggplot(City_df, aes(x = reorder(City, -Percentage), y = Percentage, fill = City)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ 2.4: Phân phối định cư theo thành phố",
       x = "Thành phố", y = "Tỷ lệ %") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

NHẬN XÉT

  • Đáng chú ý nhất là thành phố Salem, nơi chiếm tỷ lệ cao nhất với 9.858% tổng dân số. Tiếp theo là Tacoma với 8.941%, và Los Angeles, Seattle, San Diego – đều dao động quanh mức 6%–6.5%. Điều này cho thấy một xu hướng dân số quan trọng: người dân có xu hướng tập trung sống tại các thành phố lớn, nơi có nhiều cơ hội việc làm, cơ sở hạ tầng tốt và điều kiện sống thuận lợi.

  • Ngược lại, ở phía dưới của bảng và Trực quan hoá là các thành phố có tỷ lệ dân cư rất thấp. Chẳng hạn như Guadalajara (0.533%), San Francisco (0.925%), Victoria (1.252%) và Walla Walla (1.138%). Những thành phố này có thể là những khu vực vùng ven, địa bàn nhỏ, hoặc đơn giản là không phải là nơi cư trú phổ biến trong mẫu khảo sát.

  • Một điều không thể bỏ qua là sự chênh lệch rõ rệt giữa nhóm thành phố đông dân và nhóm còn lại. Nếu như Salem chiếm gần 10% tổng cư dân, thì hơn một nửa số thành phố trong danh sách chỉ chiếm dưới 3%, cho thấy mức độ phân bố dân cư không đồng đều

2.5 StateorProvince

2.5.1 Thống kê Tần suất

Bảng 2.5 Phân phối định cư các Bang - StateorProvince
StateorProvince Frequency StateorProvince Percentage (%)
BC 809 BC 5.754
CA 2733 CA 19.440
DF 815 DF 5.797
Guerrero 383 Guerrero 2.724
Jalisco 75 Jalisco 0.533
OR 2262 OR 16.089
Veracruz 464 Veracruz 3.300
WA 4567 WA 32.485
Yucatan 654 Yucatan 4.652
Zacatecas 1297 Zacatecas 9.225

Trong dữ liệu này, bang Washington (WA) chiếm 32.4845295%, cao nhất trong các bang.

Theo sau là California (CA) với 19.4395049% và Oregon (OR) với 16.0893378%.

Một số bang khác có tỷ lệ thấp hơn như:

  • BC: 5.7543211%

  • DF: 5.7969984%

  • Guerrero: 2.7242336%

  • Jalisco: 0.5334661%

  • Veracruz: 3.300377%

  • Yucatan: 4.6518245%

  • Zacatecas: 9.2254072%

2.5.2 Trực quan hóa

library(ggplot2)

StateorProvince_df <- as.data.frame(StateorProvince_pct)
colnames(StateorProvince_df) <- c("StateorProvince", "Percentage")

ggplot(StateorProvince_df, aes(x = reorder(StateorProvince, -Percentage), y = Percentage, fill = StateorProvince)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ 2.5: Phân phối định cư theo Bang",
       x = "Bang", y = "Tỷ lệ %") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

NHẬN XÉT: Dựa vào bảng tần suất và Trực quan hoá cột minh họa, ta thấy sự phân bố dân cư giữa các bang/tỉnh là rất không đồng đều:

  • WA nổi bật rõ rệt, với cột cao vượt trội so với phần còn lại, với 4.567 người (32.49%) – cao gần gấp đôi so với bang đứng thứ hai là California (CA), chỉ có 2.733 người (19.44%). Chênh lệch giữa WA và CA là 13.05 % – một khoảng cách rất lớn, cao gấp ~61 lần so với Jalisco, và cao hơn ~12 lần Guerrero. cho thấy WA là điểm định cư ưu tiên hàng đầu.

  • Bang Oregon (OR) cũng có số lượng cư dân đáng kể, với 2.262 người (16.09%), chỉ kém CA khoảng 3.35 điểm phần trăm. Điều này phản ánh mức độ thu hút dân cư cao ở các bang ven Thái Bình Dương (WA, CA, OR)

  • Ngược lại, các tỉnh như Jalisco (0.53%), Guerrero (2.72%) và Veracruz (3.30%) có số lượng cư dân rất thấp.

  • Zacatecas (9.23%) là tỉnh ngoài top 3 nhưng vẫn đáng chú ý, vượt qua các khu vực như BC (5.75%) và DF (5.80%).

2.6 Country

2.6.1 Thống kê Tần suất

Bảng 2.6 Phân phối định cư tại các nước - Country
Country Frequency Country Percentage (%)
Canada 809 Canada 5.754
Mexico 3688 Mexico 26.232
USA 9562 USA 68.013

Vậy trong data này có 5.7543211% từ Canada, 26.2323067% từ Mexico và 68.0133722% từ USA.

2.6.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(Country_freq,
    main   = "Biểu đồ 2.6: Phân phối định cư tại các nước (Country)",
    labels = paste0(names(Country_freq),
                    " (", round(Country_pct, 3), "%)"),
    col    = c("#C4C1E1", "#EEDdB6", "#DCA2A7")) 

NHẬN XÉT:

  • Hoa Kỳ (USA) chiếm tỷ lệ cao nhất, với 9.562 người, tương ứng 68.01% tổng số cư dân trong mẫu khảo sát. Đây là quốc gia có số lượng người định cư vượt trội — cao gấp gần 2.6 lần so với Mexico và hơn 11 lần so với Canada.

  • Mexico đứng thứ hai với 3.688 người (26.23%). Canada có số cư dân thấp nhất, chỉ 809 người (5.75%), cho thấy mức độ định cư thấp hơn đáng kể so với hai quốc gia còn lại. USA có tỷ lệ cư dân cao hơn ~62.26 % so với Canada.

  • Trực quan hoá tròn sẽ thể hiện rõ sự áp đảo của USA, chiếm hơn 2/3 hình tròn, trong khi phần của Canada là rất nhỏ, dễ dàng nhận thấy bằng trực quan.

2.7 ProductFamily

2.7.1 Thống kê Tần suất

Bảng 2.7 Phân phối theo sảm phẩm tiêu dùng cho gia đình - ProductFamily
ProductFamily Frequency ProductFamily Percentage (%)
Drink 1250 Drink 8.891
Food 10153 Food 72.217
Non-Consumable 2656 Non-Consumable 18.892

Vậy trong data này có 8.8911018% từ Drink, 72.2170851% từ Food và 18.8918131% từ Non-Consumable.

2.7.2 Trực quan hóa

# Vẽ Trực quan hoá tròn
pie(ProductFamily_freq,
    main   = "Biểu đồ 2.7: Phân phối thep sản phẩm tiêu dùng cho gia đình - ProductFamily",
    labels = paste0(names(ProductFamily_freq),
                    " (", round(ProductFamily_pct, 3), "%)"),
    col    = c("#F1F0F7", "#AAE0C2", "#B9CDF1")) 

NHẬN XÉT: Bảng 2.7 thể hiện rõ sự chênh lệch đáng kể trong việc phân phối các loại sản phẩm tiêu dùng trong gia đình giữa ba nhóm chính: Food, Drink, và Non-Consumable.

  • Nhóm sản phẩm Food (Thực phẩm) chiếm ưu thế tuyệt đối với 10.153 sản phẩm, tương ứng với 72.22%,chiếm gần 3/4 tổng số sản phẩm, vượt trội so với các nhóm còn lại.

  • Nhóm Non-Consumable (Không tiêu dùng thường xuyên) đứng thứ hai với 2.656 sản phẩm, chiếm 18.89% và nhóm Drink (Đồ uống), chỉ chiếm 8.89% tương đương 1.250 sản phẩm.

  • Trực quan hoá tròn thể hiện rõ sự chênh lệch với phần Food lớn áp đảo, chiếm phần lớn diện tích hình tròn, còn Drink gần như là một phần nhỏ.

2.8 ProductDepartment

2.8.1 Thống kê Tần suất

Bảng 2.8 Phân phối theo sảm phẩm tiêu dùng cho căn hộ - ProductDepartment
ProductDepartment Frequency ProductDepartment Percentage (%)
Alcoholic Beverages 356 Alcoholic Beverages 2.532
Baked Goods 425 Baked Goods 3.023
Baking Goods 1072 Baking Goods 7.625
Beverages 680 Beverages 4.837
Breakfast Foods 188 Breakfast Foods 1.337
Canned Foods 977 Canned Foods 6.949
Canned Products 109 Canned Products 0.775
Carousel 59 Carousel 0.420
Checkout 82 Checkout 0.583
Dairy 903 Dairy 6.423
Deli 699 Deli 4.972
Eggs 198 Eggs 1.408
Frozen Foods 1382 Frozen Foods 9.830
Health and Hygiene 893 Health and Hygiene 6.352
Household 1420 Household 10.100
Meat 89 Meat 0.633
Periodicals 202 Periodicals 1.437
Produce 1994 Produce 14.183
Seafood 102 Seafood 0.726
Snack Foods 1600 Snack Foods 11.381
Snacks 352 Snacks 2.504
Starchy Foods 277 Starchy Foods 1.970

Vậy trong data này có: - 2.5321858% từ Alcoholic Beverages

  • 3.0229746% từ Baked Goods

  • 7.6250089% từ Baking Goods

  • 4.8367594% từ Beverages

  • 1.3372217% từ Breakfast Foods

  • 6.9492852% từ Canned Foods

  • 0.7753041% từ Canned Products

  • 0.41966% từ Carousel

  • 0.5832563% từ Checkout

  • 6.4229319% từ Dairy

  • 4.9719041% từ Deli

  • 1.4083505% từ Eggs

  • 9.8300021% từ Frozen Foods

  • 6.3518031% từ Health and Hygiene

  • 10.1002916% từ Household

  • 0.6330464% từ Meat

  • 1.436802% từ Periodicals

  • 14.1830856% từ Produce

  • 0.7255139% từ Seafood

  • 11.3806103% từ Snack Foods

  • 2.5037343% từ Snacks

  • 1.9702682% từ Starchy Foods

2.8.2 Trực quan hóa

library(ggplot2)

ProductDepartment_df <- as.data.frame(ProductDepartment_pct)
colnames(ProductDepartment_df) <- c("ProductDepartment", "Percentage")

ggplot(ProductDepartment_df, aes(x = reorder(ProductDepartment, -Percentage), y = Percentage, fill = ProductDepartment)) +
  geom_bar(stat = "identity") +
  labs(
    title = "BIểu đồ 2.8: Phân phối sản phẩm tiêu dùng trong hộ gia đình",
    x = "Product Department",
    y = "Tỷ lệ (%)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

NHẬN XÉT: Bảng 2.8 cung cấp cái nhìn tổng thể về cách các sản phẩm được phân phối theo các bộ phận sản phẩm trong hộ gia đình. Có thể thấy rõ sự chênh lệch lớn giữa các nhóm hàng, phản ánh sự ưu tiên tiêu dùng cũng như cơ cấu sản phẩm phổ biến trong hệ thống bán lẻ.

  • Produce (Rau quả tươi) đứng đầu với 1.994 lượt, chiếm 14.183% tổng số sản phẩm, cho thấy xu hướng tiêu dùng thực phẩm tươi sống chiếm ưu thế trong các hộ gia đình.

  • Snack Foods (Đồ ăn vặt) đứng thứ hai với 1.600 sản phẩm, chiếm 11.381%, phản ánh mức độ phổ biến của đồ ăn tiện lợi trong đời sống hiện đại.

  • Household (Đồ gia dụng) cũng có tỷ lệ cao với 1.420 sản phẩm (10.100%), cho thấy mức độ quan tâm đến các sản phẩm phục vụ sinh hoạt hàng ngày.

  • Frozen Foods (Thực phẩm đông lạnh) chiếm 9.830%, tiếp tục nhấn mạnh xu hướng tiêu dùng tiện lợi.

  • Produce (14.18%) cao gấp ~34 lần so với Carousel (0.42%), cho thấy mức độ không đồng đều rất rõ giữa các nhóm sản phẩm.

  • Nhóm Snack Foods (11.38%) cao gần 18 lần so với Meat (0.63%) — điều này đặt ra câu hỏi về nhu cầu thực phẩm chế biến sẵn thay vì tươi sống trong nhóm thịt.

2.9 Biến ProductCategory

2.9.1 Thống kê Tần suất

Bảng 2.9 Phân phối theo danh mục sản phẩm - ProductCategory
ProductCategory Frequency ProductCategory Percentage (%)
Baking Goods 484 Baking Goods 3.443
Bathroom Products 365 Bathroom Products 2.596
Beer and Wine 356 Beer and Wine 2.532
Bread 425 Bread 3.023
Breakfast Foods 417 Breakfast Foods 2.966
Candles 45 Candles 0.320
Candy 352 Candy 2.504
Canned Anchovies 44 Canned Anchovies 0.313
Canned Clams 53 Canned Clams 0.377
Canned Oysters 35 Canned Oysters 0.249
Canned Sardines 40 Canned Sardines 0.285
Canned Shrimp 38 Canned Shrimp 0.270
Canned Soup 404 Canned Soup 2.874
Canned Tuna 87 Canned Tuna 0.619
Carbonated Beverages 154 Carbonated Beverages 1.095
Cleaning Supplies 189 Cleaning Supplies 1.344
Cold Remedies 93 Cold Remedies 0.661
Dairy 903 Dairy 6.423
Decongestants 85 Decongestants 0.605
Drinks 135 Drinks 0.960
Eggs 198 Eggs 1.408
Electrical 355 Electrical 2.525
Frozen Desserts 323 Frozen Desserts 2.297
Frozen Entrees 118 Frozen Entrees 0.839
Fruit 765 Fruit 5.441
Hardware 129 Hardware 0.918
Hot Beverages 226 Hot Beverages 1.608
Hygiene 197 Hygiene 1.401
Jams and Jellies 588 Jams and Jellies 4.182
Kitchen Products 217 Kitchen Products 1.543
Magazines 202 Magazines 1.437
Meat 761 Meat 5.413
Miscellaneous 42 Miscellaneous 0.299
Packaged Vegetables 48 Packaged Vegetables 0.341
Pain Relievers 192 Pain Relievers 1.366
Paper Products 345 Paper Products 2.454
Pizza 194 Pizza 1.380
Plastic Products 141 Plastic Products 1.003
Pure Juice Beverages 165 Pure Juice Beverages 1.174
Seafood 102 Seafood 0.726
Side Dishes 153 Side Dishes 1.088
Snack Foods 1600 Snack Foods 11.381
Specialty 289 Specialty 2.056
Starchy Foods 277 Starchy Foods 1.970
Vegetables 1728 Vegetables 12.291

Vậy trong data này có: - 3.4426346% từ Baking Goods

  • 2.5962017% từ Bathroom Products

  • 2.5321858% từ Beer and Wine

  • 3.0229746% từ Bread

  • 2.9660716% từ Breakfast Foods

  • 0.3200797% từ Candles

  • 2.5037343% từ Candy

  • 0.3129668% từ Canned Anchovies

  • 0.3769827% từ Canned Clams

  • 0.2489508% từ Canned Oysters

  • 0.2845153% từ Canned Sardines

  • 0.2702895% từ Canned Shrimp

  • 2.8736041% từ Canned Soup

  • 0.6188207% từ Canned Tuna

  • 1.0953837% từ Carbonated Beverages

  • 1.3443346% từ Cleaning Supplies

  • 0.661498% từ Cold Remedies

  • 6.4229319% từ Dairy

  • 0.6045949% từ Decongestants

  • 0.960239% từ Drinks

  • 1.4083505% từ Eggs

  • 2.5250729% từ Electrical

  • 2.2974607% từ Frozen Desserts

  • 0.83932% từ Frozen Entrees

  • 5.4413543% từ Fruit

  • 0.9175617% từ Hardware

  • 1.6075112% từ Hot Beverages

  • Và các sản phẩm còn lại……

2.9.2 Trực quan hóa

library(ggplot2)

ProductCategory_df <- as.data.frame(ProductCategory_pct)
colnames(ProductCategory_df) <- c("ProductCategory", "Percentage")

ggplot(ProductCategory_df, aes(x = reorder(ProductCategory, -Percentage), y = Percentage, fill = ProductCategory)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(
    title = "Biểu đồ 2.9: Phân phối mục sản phẩm tiêu dùng phổ biến",
    x = "Product Category",
    y = "Percentage (%)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

NHẬN XÉT:

  • Vegetables (Rau củ) là danh mục chiếm tỷ trọng cao nhất, với 1.728 lượt mua, tương đương 12.291% tổng số sản phẩm. Snack Foods (Đồ ăn vặt) đứng thứ hai với 1.600 lượt, chiếm 11.381%.

  • Dairy (Sản phẩm từ sữa) với 903 lượt, tương ứng 6.423%, cho thấy đây là nhóm thiết yếu và được mua thường xuyên. Fruit (Trái cây) và Meat (Thịt) lần lượt chiếm 5.441% và 5.413%, tiếp tục khẳng định vai trò quan trọng của thực phẩm tươi trong chi tiêu của các hộ.

  • Các nhóm như Candles (Nến), Miscellaneous (Khác), và các loại thủy hải sản đóng hộp như Canned Anchovies, Oysters, Shrimp, chỉ chiếm dưới 0.35% mỗi loại.

  • Canned Sardines, Clams, và các sản phẩm phụ khác cũng có tần suất rất thấp, cho thấy mức độ ưu tiên tiêu dùng không cao, có thể là vì nhu cầu sử dụng thấp hoặc không phổ biến trong thói quen tiêu dùng.

2.10 AnnualIncome

2.10.1 Thống kê Tần suất

AnnualIncome_freq <- table(d$AnnualIncome)

AnnualIncome_pct <- table(d$AnnualIncome)/sum(nrow(d))*100

AnnualIncome_table <- data.frame(
  AnnualIncome = names(AnnualIncome_freq),
  Frequency = as.integer(AnnualIncome_freq),
  Percentage = round(AnnualIncome_pct, 3)
)
colnames(AnnualIncome_table) <- c("AnnualIncome", "Frequency", "AnnualIncome", "Percentage (%)")

# Hiển thị bảng đẹp
AnnualIncome_table%>%
  kable("html", caption = "Bảng 2.10 Phân phối theo khoảng thu nhập - AnnualIncome") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Bảng 2.10 Phân phối theo khoảng thu nhập - AnnualIncome
AnnualIncome Frequency AnnualIncome Percentage (%)
$10K - $30K 3090 $10K - $30K 21.979
$110K - $130K 643 $110K - $130K 4.574
$130K - $150K 760 $130K - $150K 5.406
$150K + 273 $150K + 1.942
$30K - $50K 4601 $30K - $50K 32.726
$50K - $70K 2370 $50K - $70K 16.858
$70K - $90K 1709 $70K - $90K 12.156
$90K - $110K 613 $90K - $110K 4.360

2.10.2 Trực quan hóa

library(ggplot2)

AnnualIncome_df <- as.data.frame(AnnualIncome_pct)
colnames(AnnualIncome_df) <- c("AnnualIncome", "Percentage")

ggplot(AnnualIncome_df, aes(x = reorder(AnnualIncome, -Percentage), y = Percentage, fill = AnnualIncome)) +
  geom_bar(stat = "identity") +
  labs(
    title = "Biểu đồ 2.10: Phân phối các nhóm thu nhập trung bình",
    x = "Annual Income",
    y = "Percentage (%)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

NHẬN XÉT:

  • Khoảng cách lớn nhất là giữa nhóm thu nhập phổ biến nhất (30K−50K) và nhóm thu nhập cao nhất ($150K+) với chênh lệch lên đến gần 31% điểm phần trăm.

  • Các nhóm thu nhập cao hơn 90K (bao gồm 90K−110K, 110K−130K, 130K−150K, và $150K+) đều có tỷ lệ thấp hơn nhóm trung bình 30K−50K ít nhất khoảng 27% điểm phần trăm.

  • Sự khác biệt giữa nhóm thu nhập thấp (10K−30K) và nhóm trung bình (30K−50K) là khoảng 10.7%, cũng đáng kể nhưng nhỏ hơn nhiều so với khoảng cách giữa nhóm trung bình và nhóm cao.

  • Khoảng cách chênh lệch này thể hiện một bức tranh khá rõ về sự phân hóa thu nhập trong cộng đồng: phần đông người dân tập trung ở nhóm thu nhập trung bình thấp, trong khi số người có thu nhập rất cao là rất ít, tạo ra một sự phân bố không đồng đều, với sự khác biệt rất lớn giữa các nhóm thu nhập.

PHẦN 3:ƯỚC LƯỢNG KHOẢNG VÀ KIỂM ĐỊNH GIẢ THUYẾT CHO TỶ LỆ (MỘT BIẾN)

Giả sử \(Z \sim N(0,1)\) (biến ngẫu nhiên chuẩn tắc chuẩn), và \(p\) là một số nằm trong khoảng từ 0 đến 1.

Giá trị tới hạn z (critical z-value) \(z_p\) là số thỏa mãn:

\[ P(Z > z_p) = 1 - \Phi(z_p) = p \]

Trong đó, \(\Phi(z_p)\) là hàm phân phối tích lũy (CDF) của phân phối chuẩn.

Khoảng tin cậy cho tỷ lệ (proportion):

# Function
prop1.interval <- function(x,n,conf.level) # function of 1-proportion CI for p
{
p <- x/n
z.crit <- -1*qnorm((1-conf.level)/2)
margin.error <- z.crit*sqrt(p*(1-p)/n)
ci.lower <- p - margin.error
ci.upper <- p + margin.error
dat <- c(p, z.crit, margin.error, ci.lower, ci.upper)
names(dat) <- c("Mean", "Critical Value", "Margin of Error", "CI lower", "CI upper")
return(dat)
}

Giả sử:

  • \(x\): số lần thành công trong \(n\) lần thử nghiệm Bernoulli (có xác suất thành công chưa biết là \(p\)),
  • \(\hat{p} = \frac{x}{n}\): tỷ lệ mẫu (sample proportion),
  • \(\alpha \in (0,1)\): mức ý nghĩa (significance level), ví dụ \(\alpha = 0.05\) cho khoảng tin cậy 95%.

Khoảng tin cậy 100(1−α)% cho tỷ lệ \(p\) là:

\[ \hat{p} \pm z_{\alpha/2} \cdot \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \]

Tức là:

\[ \left[ \hat{p} - z_{\alpha/2} \cdot \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}, \quad \hat{p} + z_{\alpha/2} \cdot \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \right] \]

Trong đó:

  • \(E = z_{\alpha/2} \cdot \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\): là biên sai số (margin of error),
  • \(\sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\): là độ lệch chuẩn của tỷ lệ mẫu (standard deviation of the proportion).

Các dạng kiểm định giả thuyết cho tỷ lệ

Kiểu kiểm định Giả thuyết không (H₀) Giả thuyết đối (Hₐ) Tên kiểm định Ý nghĩa kinh tế lượng
Hai phía (Two-sided) \(p = p_0\) \(p \ne p_0\) Kiểm định hai phía Kiểm tra xem tỷ lệ quan sát có khác biệt có ý nghĩa thống kê so với giá trị giả định \(p_0\).
Một phía, phía trên \(p = p_0\) \(p > p_0\) Kiểm định một phía (phần đuôi trên) Kiểm tra xem tỷ lệ quan sát có lớn hơn một cách có ý nghĩa thống kê so với \(p_0\).
Một phía, phía dưới \(p = p_0\) \(p < p_0\) Kiểm định một phía (phần đuôi dưới) Kiểm tra xem tỷ lệ quan sát có thấp hơn đáng kể so với giá trị kỳ vọng \(p_0\).

3.1 ProductFamily-Food

3.1.1 Ước lượng Khoảng Tin cậy:

# Số lượng sản phẩm thuộc nhóm "Food"
xFood <- sum(d$ProductFamily == "Food")
# Ước lượng khoảng tin cậy 95%
prop1.interval(xFood,nrow(d),0.95) # 1-proportion 95% CI for p
##            Mean  Critical Value Margin of Error        CI lower        CI upper 
##     0.722170851     1.959963985     0.007404228     0.714766624     0.729575079

Nhận xét:

  • Khoảng 72.22% các sản phẩm trong tổng thể thuộc nhóm Food.

  • Khoảng tin cậy được tính cho tỷ lệ thực sự của nhóm Food trong tổng thể dao động từ khoảng 71.48% đến 72.96%. Điều này có nghĩa là nếu ta lấy nhiều mẫu ngẫu nhiên từ tổng thể này, thì khoảng 95% các khoảng tin cậy được xây dựng từ các mẫu đó sẽ chứa tỷ lệ thực sự của nhóm Food.

  • Biên sai số khoảng 0.74% rất nhỏ, cho thấy ước lượng tỷ lệ này rất chính xác.

3.1.2 Kiểm định Giả thuyết:

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; p = 0.7 \quad \text{(Tỷ lệ sản phẩm thuộc danh mục Food trong tổng thể là đúng 70%)} \\ H_1: \; p \ne 0.7 \quad \text{(Tỷ lệ sản phẩm Food khác 70%, có thể cao hơn hoặc thấp hơn)} \end{array} \right.\]

prop.test(x=xFood, n=nrow(d), p=0.7, correct=FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  xFood out of nrow(d), null probability 0.7
## X-squared = 32.908, df = 1, p-value = 9.663e-09
## alternative hypothesis: true p is not equal to 0.7
## 95 percent confidence interval:
##  0.7147067 0.7295136
## sample estimates:
##         p 
## 0.7221709

Với p-value = 9.663e-09 nhỏ hơn mức ý nghĩa \(\alpha = 5\)% , ta có đủ bằng chứng để bác bỏ giả thuyết \(H_0: p = 0.7\). Có thể kết luận rằng tỉ lệ sản phẩm thuộc danh mục Food trong tổng thể không phải chính xác 70% mà thực tế cao hơn một chút, khoảng từ 71.47% đến 72.95%. Điều này giúp doanh nghiệp hiểu rõ hơn về phân bố sản phẩm trong danh mục Food, từ đó có thể điều chỉnh chiến lược kinh doanh hoặc quản lý hàng hóa phù hợp với thực tế hơn.

3.2 Country-USA

3.2.1 Ước lượng Khoảng Tin cậy:

# Số lượng  nhóm "USA"
xUSA <- sum(d$Country == "USA")
# Ước lượng khoảng tin cậy 95%
prop1.interval(xUSA,nrow(d),0.95) # 1-proportion 95% CI for p
##            Mean  Critical Value Margin of Error        CI lower        CI upper 
##     0.680133722     1.959963985     0.007709962     0.672423760     0.687843685

Kết quả phân tích tỷ lệ mẫu cho biến Country = USA cho thấy:

  • Tỷ lệ mẫu (Mean) là 0.6801, tức khoảng 68.01% trong mẫu thuộc về nước Mỹ.
  • Khoảng tin cậy 95% cho tỷ lệ này là từ 67.24% đến 68.78% (CI lower = 0.6724, CI upper = 0.6878).
  • Giá trị tới hạn (Critical Value) dùng trong tính toán khoảng tin cậy là 1.96.
  • Biên sai số (Margin of Error) là 0.0077.

Ý nghĩa kinh tế lượng:
Khoảng tin cậy cho thấy tỷ lệ thực sự của các quan sát thuộc quốc gia Mỹ trong tổng thể rất có thể nằm trong khoảng từ 67.24% đến 68.78% với độ tin cậy 95%. Điều này giúp chúng ta hiểu rõ hơn về đặc điểm phân bố mẫu theo quốc gia và hỗ trợ việc ra quyết định hoặc phân tích sâu hơn về đặc trưng của từng nhóm trong dữ liệu.

3.2.2 Kiểm định Giả thuyết:

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; p = 0.675 \quad \text{(Tỷ lệ người dân định cư tại Mỹ là 67.5%)} \\ H_1: \; p > 0.675 \quad \text{(Tỷ lệ người dân định cư tại Mỹ c ao hơn 67.5%)} \end{array} \right.\]

prop.test(x=xUSA, n=nrow(d), p=0.675,alternative = "greater", correct=FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  xUSA out of nrow(d), null probability 0.675
## X-squared = 1.689, df = 1, p-value = 0.09687
## alternative hypothesis: true p is greater than 0.675
## 95 percent confidence interval:
##  0.6736292 1.0000000
## sample estimates:
##         p 
## 0.6801337

Với mức ý nghĩa \(\alpha = 0.05\), ta thấy \(p\text{-value} = 0.09687 > 0.05\), nên không đủ bằng chứng để bác bỏ giả thuyết không \(H_0: p = 0.675\).

Điều này có nghĩa là dữ liệu cho thấy tỉ lệ sản phẩm thuộc mục “USA” trong tổng thể là 67.5% một cách có ý nghĩa thống kê.

Kết quả kiểm định cho thấy, dù tỷ lệ mẫu là khoảng 68%, chúng ta có thể chắc chắn rằng tỷ lệ thực sự trong tổng thể xấp xỉ 67.5%. Điều này gợi ý rằng các quyết định hoặc chính sách dựa trên giả định tỷ lệ này cao hơn mức 67.5% cần được xem xét lại hoặc thu thập thêm dữ liệu để có kết luận chắc chắn hơn.

3.3 AnnualIncome-$70K - $90K

3.3.1 Ước lượng Khoảng Tin cậy:

# Số lượng  nhóm thhu nhập "$70K - $90K"
x7090 <- sum(d$AnnualIncome == "$70K - $90K")
# Ước lượng khoảng tin cậy 95%
prop1.interval(x7090,nrow(d),0.95) # 1-proportion 95% CI for p
##            Mean  Critical Value Margin of Error        CI lower        CI upper 
##     0.121559144     1.959963985     0.005401582     0.116157562     0.126960725
  • Tỷ lệ mẫu 12.16% cho thấy khoảng hơn 12% dân số trong mẫu khảo sát thuộc nhóm thu nhập từ $70K đến $90K. Đây là nhóm thu nhập trung bình khá trong phân bố thu nhập của mẫu.

  • Khoảng tin cậy 95% [11.62%, 12.70%] thể hiện rằng nếu thực hiện nhiều lần khảo sát tương tự, thì khoảng 95% các khoảng tin cậy ước lượng sẽ chứa giá trị tỷ lệ thực sự của nhóm thu nhập này trong tổng thể. Khoảng tin cậy hẹp cho thấy sự chính xác và độ tin cậy cao của ước lượng.

  • Biên sai số ±0.54% cho thấy mức dao động có thể có của tỷ lệ mẫu so với tỷ lệ thực, tương đối nhỏ, chứng tỏ mẫu đủ lớn và đại diện tốt.

3.3.2 Kiểm định Giả thuyết:

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; p = 0.11 \quad \text{(Tỷ lệ cá nhân có thu nhập từ khoảng 70K-90K là 11%)} \\ H_1: \; p > 0.11 \quad \text{(Tỷ lệ cá nhân có thu nhập cao hơn khoảng 70K-90K là11%)} \end{array} \right.\]

prop.test(x=x7090, n=nrow(d), p=0.11,alternative = "greater", correct=FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  x7090 out of nrow(d), null probability 0.11
## X-squared = 19.188, df = 1, p-value = 5.924e-06
## alternative hypothesis: true p is greater than 0.11
## 95 percent confidence interval:
##  0.1170987 1.0000000
## sample estimates:
##         p 
## 0.1215591
  • Với mức ý nghĩa \(\alpha = 0.05\), giá trị \(p\)-value rất nhỏ (0.000005924) nhỏ hơn mức \(\alpha\), nên chúng ta có bằng chứng đầy đủ để bác bỏ giả thuyết không \(H_0: p = 0.11\).

  • Điều này có nghĩa là tỷ lệ cá nhân có thu nhập từ khoảng $70K - $90K trong tổng thể cao hơn 11% một cách có ý nghĩa thống kê. Khoảng tin cậy cũng cho thấy tỷ lệ thực tế nằm trong khoảng từ khoảng 11.7% trở lên.

  • Kết quả này cho thấy nhóm cá nhân có thu nhập từ $70K đến $90K chiếm tỷ lệ thực sự cao hơn giả định ban đầu 11%, phản ánh sự phân bố thu nhập tập trung nhiều hơn ở nhóm thu nhập này.

  • Thông tin này có thể được sử dụng trong các mô hình phân tích ảnh hưởng của thu nhập đến các biến kinh tế - xã hội khác, hay trong chính sách phát triển kinh tế nhằm hỗ trợ nhóm thu nhập trung bình khá.

3.4 StateorProvince-WA

3.4.1 Ước lượng Khoảng Tin cậy:

# Số lượng  định cư tại  "WA"
xWA <- sum(d$StateorProvince == "WA")
# Ước lượng khoảng tin cậy 95%
prop1.interval(xWA,nrow(d),0.95) # 1-proportion 95% CI for p
##            Mean  Critical Value Margin of Error        CI lower        CI upper 
##     0.324845295     1.959963985     0.007741245     0.317104050     0.332586540
  • Tỷ lệ mẫu của nhóm WA trong tổng thể là khoảng 32.48%.

  • Với biên sai số 0.00774, khoảng tin cậy 95% cho tỷ lệ nhóm WA nằm trong khoảng từ 31.71% đến 33.26%.

  • Điều này có nghĩa là, nếu ta lấy nhiều mẫu khác nhau từ tổng thể, khoảng 95% các khoảng tin cậy thu được sẽ chứa tỷ lệ thực sự của nhóm WA trong tổng thể.

  • Kết quả cho thấy nhóm WA chiếm khoảng một phần ba tổng số trong biến StateorProvince với độ tin cậy cao.

3.4.2 Kiểm định Giả thuyết:

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; p = 0.32 \quad \text{(Tỷ lệ định cư tại WA là 32%)} \\ H_1: \; p \ne 0.32 \quad \text{(Tỷ lệ định cư tại WA khác 32)} \end{array} \right.\]

prop.test(x=xWA, n=nrow(d), p=0.32, correct=FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  xWA out of nrow(d), null probability 0.32
## X-squared = 1.5168, df = 1, p-value = 0.2181
## alternative hypothesis: true p is not equal to 0.32
## 95 percent confidence interval:
##  0.3171528 0.3326335
## sample estimates:
##         p 
## 0.3248453
  • Với mức ý nghĩa \(\alpha = 0.05\), ta thấy rằng: \(p\text{-value} = 0.2181 > 0.05\)

=> Không đủ bằng chứng để bác bỏ giả thuyết không \(H_0\).

  • Nếu mục tiêu là đánh giá mức độ tập trung dân cư tại WA để đưa ra chính sách marketing, phân phối sản phẩm hay dịch vụ — thì kết quả này cho thấy không có sự lệch đáng kể so với mức chuẩn đã giả định.

-Chính phủ hoặc doanh nghiệp không nhất thiết phải ưu tiên WA như một khu vực có tỷ lệ cư dân cao bất thường, vì tỷ lệ này phù hợp với kỳ vọng ban đầu.

PHẦN 4: PHÂN TÍCH MỐI QUAN HỆ GIỮA HAI BIẾN ĐỊNH TÍNH (BIVARIATE ANALYSIS)

4.1 AnnualIncome-ProductDepartment

4.1.1 Bảng tuần suất chéo

table_AP <- table(d$AnnualIncome,d$ProductDepartment)

table_APpc <- as.data.frame.matrix(round(100 * prop.table(table_AP, margin = 1), 2)) 
library(kableExtra)
kable(table_APpc, format = "html", caption = "Bảng 4.1Tỷ lệ phần trăm theo mức thu nhập và bộ phận sản phẩm") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 4.1Tỷ lệ phần trăm theo mức thu nhập và bộ phận sản phẩm
Alcoholic Beverages Baked Goods Baking Goods Beverages Breakfast Foods Canned Foods Canned Products Carousel Checkout Dairy Deli Eggs Frozen Foods Health and Hygiene Household Meat Periodicals Produce Seafood Snack Foods Snacks Starchy Foods
$10K - $30K 2.59 3.50 8.28 4.79 1.75 6.57 0.94 0.26 0.65 5.63 4.76 1.20 10.58 6.50 10.13 0.78 1.59 13.59 0.55 10.65 2.46 2.27
$110K - $130K 2.18 3.58 7.62 5.44 0.47 7.62 0.62 0.16 0.31 5.91 5.13 1.40 10.26 5.13 9.80 0.78 2.64 11.98 0.47 13.22 2.49 2.80
$130K - $150K 1.97 3.16 7.11 3.29 1.45 6.05 0.79 0.39 1.18 6.45 5.92 1.97 11.05 6.71 10.00 0.53 1.18 14.34 1.05 10.92 2.50 1.97
$150K + 1.10 3.66 6.96 7.33 1.10 7.69 0.00 0.37 0.37 6.23 4.76 1.47 9.52 6.96 9.89 0.73 0.37 12.09 1.83 12.82 2.93 1.83
$30K - $50K 2.63 2.91 7.30 4.96 1.37 7.28 0.80 0.65 0.46 6.50 5.06 1.46 9.61 6.35 9.39 0.59 1.41 14.13 0.96 11.58 2.76 1.85
$50K - $70K 2.57 2.66 7.97 4.09 1.31 7.17 0.76 0.34 0.93 6.75 4.51 1.52 8.95 5.65 11.48 0.72 1.52 14.51 0.46 11.56 2.53 2.03
$70K - $90K 2.28 2.93 7.61 5.32 1.11 7.02 0.64 0.41 0.29 7.37 5.62 1.17 8.84 7.02 10.65 0.41 1.05 15.45 0.70 10.77 1.70 1.64
$90K - $110K 3.75 2.12 6.36 5.87 0.65 5.38 0.65 0.16 0.33 6.53 4.08 1.63 12.07 7.01 8.97 0.49 1.14 15.82 0.33 12.56 2.77 1.31

Bảng tần số chéo “Tỷ lệ phần trăm theo mức thunhập và bộ phận sản phẩm” được lập nên vì nó cung cấp cái nhìn rõ ràng về mối quan hệ giữa mức thu nhập và loại sản phẩm được chi tiêu nhiều nhất. Nhờ bảng này, ta có thể xác định được nhóm thu nhập nào ưu tiên chi tiêu cho sản phẩm nào, từ đó trả lời trực tiếp câu hỏi đặt ra.

4.1.2 Trực quan hoá

Nhóm thu nhập chi tiêu nhiều nhất cho sảm phẩm nào?

# Đưa bảng từ dạng rộng sang dạng dài (long format)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.0.4     ✔ tidyr     1.3.1
## ✔ readr     2.1.5     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter()     masks stats::filter()
## ✖ dplyr::group_rows() masks kableExtra::group_rows()
## ✖ dplyr::lag()        masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggthemes)
table_APpc_long <- table_APpc %>%
  rownames_to_column("AnnualIncome") %>%
  pivot_longer(-AnnualIncome, names_to = "ProductDepartment", values_to = "Percentage")

top5_per_income <- table_APpc_long %>%
  group_by(AnnualIncome) %>%
  slice_max(order_by = Percentage, n = 5) %>%
  ungroup()


ggplot(top5_per_income, aes(x = ProductDepartment, y = Percentage, fill = ProductDepartment)) +
  geom_col(show.legend = FALSE) +
   geom_text(aes(label = paste0(Percentage, "%")), 
            hjust = -0.1, size = 3) +
  coord_flip() +  
  facet_wrap(~ AnnualIncome, scales = "free_y") +  
  labs(
    title = "Biểu đồ 4.1 Top 5 sản phẩm chi tiêu nhiều nhất theo nhóm thu nhập",
    x = " sản phẩm",
    y = "Tỷ lệ chi tiêu (%)"
  ) +
  theme_tufte() +
  theme(axis.text.x = element_text(angle = 0, hjust = 1))

Nhóm thu nhập chi tiêu nhiều nhất cho sảm phẩm nào?

  • Dựa vào biểu đồ “Top 5 sản phẩm chi tiêu nhiều nhất theo nhóm thu nhập”, có thể thấy rõ sự khác biệt trong ưu tiên chi tiêu giữa các nhóm thu nhập. Với những người có thu nhập từ thấp đến trung bình (từ $10K đến $90K), sản phẩm được chi tiêu nhiều nhất là Produce (rau quả tươi) – đây là nhu cầu thiết yếu phục vụ cuộc sống hàng ngày, phản ánh xu hướng ưu tiên thực phẩm tươi sống ở các hộ gia đình có ngân sách hạn chế. Tỷ lệ chi tiêu cho Produce thậm chí đạt đến 14.51% ở nhóm $70K–$90K.

  • Ngược lại, ở các nhóm thu nhập cao hơn, xu hướng chi tiêu có sự thay đổi rõ rệt. Những người có thu nhập từ $90K trở lên bắt đầu ưu tiên hơn cho các sản phẩm tiện lợi như Snack Foods (đồ ăn nhẹ) và Frozen Foods (thực phẩm đông lạnh). Điều này cho thấy nhóm thu nhập cao có khả năng tài chính để chi tiêu cho sự tiện lợi, đa dạng thực phẩm và chất lượng cuộc sống. Ngoài ra, ở nhóm $90K–$110K, nhóm sản phẩm Health and Hygiene (sức khỏe & vệ sinh) cũng lọt vào top 5, cho thấy mức độ quan tâm đến sức khỏe cá nhân bắt đầu gia tăng khi thu nhập cải thiện.

  • Tổng thể, biểu đồ cho thấy mối liên hệ tương đối rõ ràng giữa mức thu nhập và loại sản phẩm chi tiêu nhiều nhất. Nhóm thu nhập thấp và trung bình tập trung vào nhu cầu thiết yếu, trong khi nhóm thu nhập cao có xu hướng mở rộng sang các sản phẩm tiện lợi và chăm sóc bản thân. Đây là một xu hướng hợp lý phản ánh thay đổi trong hành vi tiêu dùng theo điều kiện kinh tế.

4.1.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{Mức thu nhập và bộ phận sản phẩm độc lập với nhau } \\ H_1: \; \text{Mức thu nhập và bộ phận sản phẩm có liên quan đến nhau} \end{array} \right.\]

Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chiAP <- chisq.test(table_AP)
## Warning in chisq.test(table_AP): Chi-squared approximation may be incorrect
print(chiAP)
## 
##  Pearson's Chi-squared test
## 
## data:  table_AP
## X-squared = 170.16, df = 147, p-value = 0.09276
  • Giá trị Chi-squared: 170.16

  • Bậc tự do: 147

  • Giá trị p: 0.09276 > mức ý nghĩa \(\alpha\) = 5% → Không đủ bằng chứng để bác bỏ giả thuyết không (H₀) tức hai biến được coi là độc lập tại mức ý nghĩa 5%.

  • Mặc dù kết quả kiểm định không cho thấy mối liên hệ có ý nghĩa thống kê ở mức \(\alpha\) = 5%, nhưng giá trị p cũng không quá lớn (≈ 0.093). Điều này có thể gợi ý rằng có thể tồn tại xu hướng, thấy rõ nhất là phần lớn các nhóm thu nhập đều có xu hướng ưu tiên chi tiêu cho sản phẩm Produce.

4.2 AnnualIncome-City

4.2.1 Bảng tuần suất chéo

table_AC <- table(d$AnnualIncome,d$City)

table_ACpc <- as.data.frame.matrix(round(100 * prop.table(table_AC, margin = 1), 2)) 
library(kableExtra)
kable(table_ACpc, format = "html", caption = "Bảng 4.2 Tỷ lệ phần trăm theo mức thu nhập và định cư tại thành phố") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 4.2 Tỷ lệ phần trăm theo mức thu nhập và định cư tại thành phố
Acapulco Bellingham Beverly Hills Bremerton Camacho Guadalajara Hidalgo Los Angeles Merida Mexico City Orizaba Portland Salem San Andres San Diego San Francisco Seattle Spokane Tacoma Vancouver Victoria Walla Walla Yakima
$10K - $30K 3.95 0.81 5.70 5.89 2.85 0.94 6.02 6.31 3.66 1.52 2.75 6.67 9.97 4.21 6.80 0.58 6.50 6.41 9.45 4.56 1.00 1.52 1.94
$110K - $130K 2.33 1.09 7.47 1.71 5.29 0.31 5.75 5.75 3.58 1.24 5.29 4.67 9.80 3.89 6.07 0.93 9.18 2.64 10.73 6.22 1.40 1.56 3.11
$130K - $150K 1.97 1.05 5.00 3.82 2.37 0.39 5.66 5.66 4.74 2.63 4.61 6.45 10.92 5.26 3.95 1.71 5.66 9.74 7.24 3.95 1.97 2.63 2.63
$150K + 3.66 2.56 8.42 12.82 0.00 0.00 5.13 7.33 5.49 1.10 1.83 5.13 4.76 2.93 6.59 1.10 8.79 7.33 4.76 4.76 1.10 0.37 4.03
$30K - $50K 2.26 1.11 5.76 6.52 2.43 0.37 6.52 6.76 5.00 1.43 3.09 6.22 9.52 4.78 5.74 1.04 6.04 6.67 8.95 5.28 1.15 0.89 2.46
$50K - $70K 2.53 0.93 6.16 6.33 5.44 0.55 3.63 7.00 3.59 1.01 4.39 6.20 9.75 4.47 6.58 0.97 8.19 4.47 8.14 3.80 1.52 0.93 3.42
$70K - $90K 2.46 0.94 4.86 5.50 3.69 0.53 7.61 6.55 6.14 1.11 2.69 6.26 9.77 4.04 6.20 0.59 5.44 7.14 10.06 3.69 0.99 0.59 3.16
$90K - $110K 2.45 1.14 5.22 5.38 1.31 0.33 7.99 6.85 7.67 1.14 2.12 6.04 13.54 3.75 7.01 1.47 4.89 5.06 8.32 2.12 1.96 1.47 2.77

Bảng tần số chéo ” Tỷ lệ phần trăm theo mức thu nhập và định cư tại thành phố” được lập nên vì nó cung cấp cái nhìn rõ ràng về mối quan hệ giữa mức thu nhập và thành phố được ưu tiên sinh sống nhiều nhất. Nhờ bảng này, ta có thể xác định được nhóm thu nhập nào tập trung định cư tại thành phố nào, từ đó trả lời trực tiếp câu hỏi đặt ra.

4.2.2 Trực quan hoá

Nhóm thu nhập tập trung định cư cho 5 thành phố nào đông nhất?

# Đưa bảng từ dạng rộng sang dạng dài (long format)
library(tidyverse)
library(ggthemes)
table_ACpc_long <- table_ACpc %>%
  rownames_to_column("AnnualIncome") %>%
  pivot_longer(-AnnualIncome, names_to = "City", values_to = "Percentage")

top5_per_city <- table_ACpc_long %>%
  group_by(AnnualIncome) %>%
  slice_max(order_by = Percentage, n = 5) %>%
  ungroup()


ggplot(top5_per_city, aes(x = reorder(City, -Percentage), y = Percentage, fill = City)) +
  geom_col(show.legend = FALSE) +
   geom_text(aes(label = paste0(Percentage, "%")), 
            hjust = -0.1, size = 3) +
  coord_flip() +  
  facet_wrap(~ AnnualIncome, scales = "free_y") +  
  labs(
    title = "Biểu đồ 4.2 Top 5 thành phố tập trung định cư đông đúc nhất theo nhóm thu nhập",
    x = " Thành phố",
    y = "Tỷ lệ định cư (%)"
  ) +
  theme_solarized() +
  theme(axis.text.x = element_text(angle = 0, hjust = 1))

  • có thể thấy sự khác biệt rõ rệt trong phân bố dân cư theo từng nhóm thu nhập. Với nhóm thu nhập thấp (10K–30K), cư dân chủ yếu tập trung tại các thành phố như Salem (9.97%), Tacoma (9.45%), Seattle (6.50%), Los Angeles (6.31%) và San Diego (6.80%). Đây đều là những thành phố có mức sống không quá cao hoặc có các khu dân cư phù hợp với thu nhập thấp, cho phép cư dân có ngân sách hạn chế tiếp cận được với cơ sở hạ tầng cơ bản và chi phí sinh hoạt vừa phải. Việc Salem và Tacoma chiếm gần 10% cư dân trong nhóm thu nhập thấp cho thấy đây là điểm đến phổ biến của người thu nhập thấp.

  • Khi thu nhập tăng lên, xu hướng phân bố dân cư cũng có sự thay đổi đáng kể. Ở nhóm thu nhập từ 90K–110K, 5 thành phố có tỷ lệ cư dân cao nhất là Salem (13.54%), Los Angeles (6.85%), San Diego (7.01%), Tacoma (8.32%) và Seattle (4.89%). Nhóm này bắt đầu chuyển hướng sang các thành phố lớn, sôi động và phát triển hơn. Đặc biệt, ở nhóm thu nhập rất cao ($150K+), 5 thành phố có tỷ lệ cao nhất lần lượt là Bremerton (12.82%), Beverly Hills (8.42%), Seattle (8.79%), Los Angeles (7.33%) và Spokane (7.33%). Các thành phố này thường có chất lượng sống cao, dịch vụ hiện đại, nhiều cơ hội việc làm chất lượng và các tiện ích phục vụ cho lối sống cao cấp.

  • Dựa trên biểu đồ “Top 5 thành phố tập trung định cư đông đúc nhất theo nhóm thu nhập”,có thể quan sát được một xu hướng rõ rệt giữa mức thu nhập và thành phố cư trú. Nhóm thu nhập thấp có xu hướng sống tại các khu vực ngoại ô, chi phí thấp hoặc vừa phải. Trong khi đó, nhóm thu nhập cao lại tập trung ở các thành phố phát triển, hiện đại – phản ánh mức độ tiếp cận và lựa chọn không gian sống theo năng lực tài chính.

4.2.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{Mức thu nhập và thành phố định cư độc lập với nhau } \\ H_1: \; \text{Mức thu nhập và thành phố định cư có liên quan đến nhau} \end{array} \right.\]

Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chiAC <- chisq.test(table_AC)
## Warning in chisq.test(table_AC): Chi-squared approximation may be incorrect
print(chiAC)
## 
##  Pearson's Chi-squared test
## 
## data:  table_AC
## X-squared = 520.61, df = 154, p-value < 2.2e-16
  • Giá trị Chi-squared: 520.61

  • Bậc tự do: 154

  • Giá trị p: 2.517^{-41} < mức ý nghĩa \(\alpha\) = 5% → Đủ bằng chứng để bác bỏ giả thuyết không (H₀) tức hai biến được coi là có mối liên hệ tại mức ý nghĩa 5%. Nói cách khác, việc một người cư trú ở thành phố nào có liên quan đến mức thu nhập của họ.

  • Có thể thấy sự khác biệt rõ rệt trong phân bố dân cư theo từng nhóm thu nhập. Với nhóm thu nhập thấp (10K–30K), cư dân chủ yếu tập trung tại các thành phố như Salem (9.97%), Tacoma (9.45%), Seattle (6.50%), Los Angeles (6.31%) và San Diego (6.80%). Đây đều là những thành phố có mức sống không quá cao hoặc có các khu dân cư phù hợp với thu nhập thấp, cho phép cư dân có ngân sách hạn chế tiếp cận được với cơ sở hạ tầng cơ bản và chi phí sinh hoạt vừa phải. Việc Salem và Tacoma chiếm gần 10% cư dân trong nhóm thu nhập thấp cho thấy đây là điểm đến phổ biến của người thu nhập thấp. → Nhóm thu nhập thấp có xu hướng chọn thành phố có chi phí sinh hoạt thấp, dễ tiếp cận nhà ở hoặc dịch vụ công cộng cơ bản.

  • Khi thu nhập tăng lên, xu hướng phân bố dân cư cũng có sự thay đổi đáng kể. Ở nhóm thu nhập từ 90K–110K, 5 thành phố có tỷ lệ cư dân cao nhất là Salem (13.54%), Los Angeles (6.85%), San Diego (7.01%), Tacoma (8.32%) và Seattle (4.89%). Nhóm này bắt đầu chuyển hướng sang các thành phố lớn, sôi động và phát triển hơn. Đặc biệt, ở nhóm thu nhập rất cao ($150K+), 5 thành phố có tỷ lệ cao nhất lần lượt là Bremerton (12.82%), Beverly Hills (8.42%), Seattle (8.79%), Los Angeles (7.33%) và Spokane (7.33%). Các thành phố này thường có chất lượng sống cao, dịch vụ hiện đại, nhiều cơ hội việc làm chất lượng và các tiện ích phục vụ cho lối sống cao cấp. → Nhóm thu nhập cao có xu hướng chọn khu vực phát triển, hiện đại, và giàu tiện ích sống.

  • Nhóm thu nhập trung bình (từ 50K đến 90K) có phân bố tương đối rộng và đa dạng, nhưng các thành phố như Los Angeles, San Diego, Tacoma, Seattle, và Salem vẫn duy trì vị trí nổi bật. Điều này cho thấy nhóm này có sự linh hoạt cao hơn trong lựa chọn nơi cư trú.

Mối quan hệ giữa mức thu nhập và thành phố cư trú phản ánh sự phân tầng kinh tế–xã hội trong không gian đô thị. Các nhóm thu nhập thấp bị giới hạn trong lựa chọn và thường chọn những nơi chi phí rẻ, trong khi các nhóm thu nhập cao có khả năng tiếp cận các khu vực phát triển hơn. Kết quả kiểm định thống kê đã xác nhận rằng sự phân bố này không phải ngẫu nhiên, mà có liên hệ rõ ràng giữa thu nhập và nơi sống.

4.3 MaritalStatus-SateorProvince

4.3.1 Bảng tuần suất chéo

table_CoPC <- table(d$MaritalStatus,d$StateorProvince)

table_CoPCpc <- as.data.frame.matrix(round(100 * prop.table(table_CoPC, margin = 1), 2)) 
library(kableExtra)
kable(table_CoPCpc, format = "html", caption = "Bảng 4.3 Tỷ lệ tình trạng hôn nhân và định cự tại các Bang") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 4.3 Tỷ lệ tình trạng hôn nhân và định cự tại các Bang
BC CA DF Guerrero Jalisco OR Veracruz WA Yucatan Zacatecas
M 5.64 19.37 5.8 2.49 0.29 14.91 3.64 33.88 4.79 9.19
S 5.87 19.51 5.8 2.95 0.76 17.21 2.98 31.16 4.52 9.26
  • Bảng tỷ lệ cho thấy tình trạng hôn nhân “Married (M)” và “Single (S)” phân bố khá tương đồng tại các bang, đặc biệt là ở WA (Washington) và CA (California) – hai bang có tỷ lệ dân cư cao nhất trong cả hai nhóm. WA dẫn đầu với tỷ lệ kết hôn 33.88% và độc thân 31.16%, cho thấy nơi đây tập trung dân cư đông và đa dạng về tình trạng hôn nhân. Ngược lại, các bang như Jalisco và Guerrero có tỷ lệ rất thấp, phản ánh mật độ dân cư hoặc mức độ di cư thấp hơn. Sự phân bố gần tương đồng giữa M và S trong từng bang cũng gợi ý rằng tình trạng hôn nhân không quá thiên lệch theo vùng.

4.3.2 Trực quan hoá

Tình trạng hôn nhân tập trung tại Bang nào đông nhất?

library(tidyverse)
library(ggthemes)
table_CoPCpc_long <- table_CoPCpc %>%
  rownames_to_column("MaritalStatus") %>%
  pivot_longer(-MaritalStatus, names_to ="StateorProvince", values_to = "Percentage")

top5_per_PC <- table_CoPCpc_long %>%
  group_by(MaritalStatus) %>%
  slice_max(order_by = Percentage, n = 7) %>%
  ungroup()


ggplot(top5_per_PC, aes(x = reorder(StateorProvince, -Percentage), y = Percentage, fill = StateorProvince)) +
  geom_col(show.legend = FALSE) +
   geom_text(aes(label = paste0(Percentage, "%")), 
            hjust = -0.2, size = 3) +
    coord_flip() +
  facet_wrap(~ MaritalStatus, scales = "free_y") +  
  labs(
    title = "Biểu đồ 4.3 Top 7 Bang tập trung dân cư kết hôn và độc thân đông nhất ",
    x = " Bang",
    y = "Tỷ lệ tình trạng hôn nhân (%)"
  ) +
  theme_clean() +
  theme(axis.text.x = element_text(angle = 0, hjust = 1))

  • Biểu đồ thể hiện rõ rằng một số bang như Washington (WA), California (CA), và Oregon (OR) có tỷ lệ dân cư cao trong cả hai tình trạng hôn nhân — vừa kết hôn vừa độc thân. Điều này phản ánh mật độ dân số cao hoặc quy mô dân cư lớn, dẫn đến số lượng cả hai nhóm đều vượt trội.

  • Các bang như Zacatecas, DF, BC và Yucatan có tỷ lệ nhỏ hơn và tương đối cân bằng giữa hai tình trạng hôn nhân.

  • Washington (WA) là bang có dân cư đông nhất trong cả hai nhóm (Married & Single), cho thấy nơi đây tập trung đông dân và đa dạng về tình trạng hôn nhân.

4.3.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{Tình trạng hôn nhân và Bang định cư độc lập với nhau } \\ H_1: \; \text{Tình trạng hôn nhân và Bang định cư có liên quan đến nhau} \end{array} \right.\]

Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chiSoP <- chisq.test(table_CoPC)
print(chiSoP)
## 
##  Pearson's Chi-squared test
## 
## data:  table_CoPC
## X-squared = 42.637, df = 9, p-value = 2.513e-06
  • Giá trị Chi-squared: 42.64

  • Bậc tự do: 9

  • Giá trị p: 2.513^{-6} < mức ý nghĩa \(\alpha\) = 5% → Đủ bằng chứng để bác bỏ giả thuyết không (H₀) tức hai biến được coi là có mối liên hệ tại mức ý nghĩa 5%. Nói cách khác, việc một người cư trú ở thành phố nào có liên quan đến tình trạng hôn nhân của họ.

  • Điều này được củng cố rõ qua biểu đồ “Top 7 bang tập trung dân cư kết hôn và độc thân đông nhất” và bảng dữ liệu đi kèm. Trong bảng tỷ lệ, Washington (WA) dẫn đầu về tỷ lệ dân cư kết hôn (33.88%) và cũng rất cao ở nhóm độc thân (31.16%). California (CA) cũng tương tự, lần lượt chiếm 19.37% (M) và 19.51% (S). Điều này cho thấy hai bang này thu hút đông đảo cả người đã kết hôn và người độc thân, có thể do đặc điểm kinh tế, cơ hội nghề nghiệp hoặc mức độ đô thị hóa cao. Ngược lại, các bang như Jalisco và Guerrero có tỷ lệ thấp hơn đáng kể ở cả hai nhóm (Jalisco chỉ chiếm 0.29% M và 0.76% S).

Từ các số liệu này, có thể thấy rõ xu hướng phân bố không đồng đều về tình trạng hôn nhân giữa các bang. Một số bang có vẻ là trung tâm thu hút dân số trong độ tuổi kết hôn, trong khi một số bang khác lại có mật độ dân cư thấp hoặc ít người trẻ tuổi. Tóm lại, có mối liên hệ chặt chẽ giữa nơi cư trú và tình trạng hôn nhân, phản ánh những yếu tố xã hội và kinh tế tiềm ẩn ảnh hưởng đến lựa chọn hôn nhân và nơi sống của cư dân.

4.4 Homeowner-Country

4.4.1 Bảng tuần suất chéo

table_HC <- table(d$Homeowner,d$ProductDepartment)

table_HCpc <- as.data.frame.matrix(round(100 * prop.table(table_HC, margin = 1), 2)) 
library(kableExtra)
kable(table_HCpc, format = "html", caption = "Bảng 4.4 Tỷ lệ cá nhân sở hữu nhà ở và sản phẩm chi tiêu") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 4.4 Tỷ lệ cá nhân sở hữu nhà ở và sản phẩm chi tiêu
Alcoholic Beverages Baked Goods Baking Goods Beverages Breakfast Foods Canned Foods Canned Products Carousel Checkout Dairy Deli Eggs Frozen Foods Health and Hygiene Household Meat Periodicals Produce Seafood Snack Foods Snacks Starchy Foods
N 2.32 2.99 7.78 5.22 1.55 6.91 0.82 0.39 0.46 6.29 4.58 1.23 9.97 6.48 10.49 0.75 1.55 14.92 0.69 10.45 2.24 1.91
Y 2.68 3.04 7.52 4.58 1.20 6.98 0.75 0.44 0.66 6.51 5.23 1.53 9.73 6.26 9.84 0.56 1.36 13.69 0.75 12.00 2.68 2.01
  • Người sở hữu nhà có xu hướng tiêu thụ nhiều sản phẩm tiện lợi và cao cấp hơn, ví dụ như đồ uống có cồn, các sản phẩm deli, trứng và snack.

  • Người không sở hữu nhà có thể ưu tiên các sản phẩm tươi và nguyên liệu thô, ví dụ rau quả (Produce) và các sản phẩm làm bánh (Baking Goods) nhiều hơn, có thể vì họ thích tự nấu nướng tại nhà hoặc tiết kiệm hơn.

  • Sự khác biệt trong nhóm sản phẩm Household (gia dụng) có thể do người không sở hữu nhà có nhu cầu trang bị thiết yếu cho cuộc sống thuê trọ hoặc tạm thời.

4.4.2 Trực quan hoá

Sản phẩm được mua nhiều nhất giữa đối tương có nhà ở và không có

library(tidyverse)
library(ggthemes)
table_HCpc_long <- table_HCpc %>%
  rownames_to_column("Homeowner") %>%
  pivot_longer(-Homeowner, names_to ="ProductCategory", values_to = "Percentage")

top5_per_HC <- table_HCpc_long %>%
  group_by(Homeowner) %>%
  slice_max(order_by = Percentage, n = 10) %>%
  ungroup()


ggplot(top5_per_HC, aes(x = reorder(ProductCategory, -Percentage), y = Percentage, fill = ProductCategory)) +
  geom_col(show.legend = FALSE) +
   geom_text(aes(label = paste0(Percentage, "%")), 
            hjust = -0.2, size = 3) +
    coord_flip() +
  facet_wrap(~ Homeowner, scales = "free_y") +  
  labs(
    title = "Biểu đồ 4.4 Top 10 sản phẩm được mua nhiều nhất qua hai tình trạng sở hữu nhà ở phổ biến ",
    x = " Sản phẩm",
    y = "Tỷ lệ chi tiêu (%)"
  ) +
  theme_clean() +
  theme(axis.text.x = element_text(angle = 0, hjust = 1))

  • Biểu đồ thể hiện Top 10 sản phẩm được mua nhiều nhất theo hai tình trạng hôn nhân phổ biến: đã kết hôn (Y) và chưa kết hôn (N). Cả hai nhóm đều có xu hướng chi tiêu cao nhất cho rau củ quả (Produce), với tỷ lệ lần lượt là 14.1% (chưa kết hôn) và 13.69% (đã kết hôn). Điều này cho thấy rằng thực phẩm tươi sống là ưu tiên hàng đầu trong hành vi tiêu dùng chung, bất kể tình trạng hôn nhân. Ngoài ra, các nhóm sản phẩm như Frozen Foods (thực phẩm đông lạnh), Baking Goods (đồ làm bánh), và Canned Foods (đồ hộp) cũng được tiêu thụ khá tương đồng ở cả hai nhóm, phản ánh nhu cầu cơ bản trong việc nấu nướng và sinh hoạt hàng ngày.

  • Tuy nhiên, một số khác biệt đáng chú ý đã xuất hiện. Nhóm đã kết hôn (Y) có mức chi tiêu cao hơn rõ rệt ở các nhóm sản phẩm như Snack Foods (12% so với 10.45%) và Household (9.84% so với 10.49%). Điều này có thể được lý giải bởi việc người đã kết hôn thường sống trong hộ gia đình có nhiều thành viên hơn, từ đó phát sinh nhu cầu sử dụng nhiều sản phẩm ăn nhẹ hoặc đồ gia dụng phục vụ cho gia đình. Ngược lại, nhóm chưa kết hôn (N) có tỷ lệ chi tiêu cao hơn cho Produce và Frozen Foods, cho thấy có thể họ ưu tiên các sản phẩm tiện lợi và lành mạnh phục vụ nhu cầu cá nhân.

  • Từ biểu đồ, ta có thể rút ra rằng có mối liên hệ nhất định giữa tình trạng hôn nhân và hành vi tiêu dùng. Người đã kết hôn có xu hướng chi tiêu nhiều hơn cho các sản phẩm phục vụ gia đình hoặc tiêu dùng chung, trong khi người chưa kết hôn có xu hướng tập trung vào các mặt hàng phục vụ cá nhân hoặc bữa ăn nhanh, đơn giản. Mặc dù sự khác biệt không quá lớn, nhưng các xu hướng này có thể cung cấp thông tin hữu ích cho các nhà bán lẻ và nhà tiếp thị khi xây dựng chiến lược phân khúc khách hàng theo tình trạng hôn nhân.

4.4.3 Kiểm định thống kê

Bài toán có giả thuyết như sau: \[ \left\{ \begin{array}{l} H_0: \; \text{Khả năng sở hữu nhà ở và sản phẩm tiêu dùng độc lập với nhau} \\ H_1: \; \text{Khả năng sở hữu nhà ở và sản phẩm tiêu dùngcó liên quan đến nhau} \end{array} \right.\]

Ta thực hiện kiểm định Chi bình phương và được kết quả như sau:

chiHC <- chisq.test(table_HC)
print(chiHC)
## 
##  Pearson's Chi-squared test
## 
## data:  table_HC
## X-squared = 34.257, df = 21, p-value = 0.03401
  • Giá trị Chi-squared: 34.26

  • Bậc tự do: 21

  • Giá trị p: 0.03401 < mức ý nghĩa \(\alpha\) = 5% → Đủ bằng chứng để bác bỏ giả thuyết không (H₀) tức hai biến được coi là có mối liên hệ tại mức ý nghĩa 5%. . Nói cách khác, việc một người sở hữu hay không sở hữu nhà ở có ảnh hưởng đến loại sản phẩm họ thường mua.

  • Tình trạng sở hữu nhà ở không chỉ phản ánh khía cạnh tài sản mà còn liên quan đến phong cách sống, mức độ ổn định và quy mô hộ gia đình. Nhóm người có nhà ở (Homeowner = Y) thường đại diện cho các hộ gia đình ổn định, sống cố định lâu dài, có thể bao gồm nhiều thành viên. Do đó, họ có xu hướng mua các sản phẩm phục vụ cho sinh hoạt gia đình như Snack Foods (12.00%), Household (9.84%), Deli (5.23%), và Dairy (6.51%), cao hơn so với nhóm không có nhà. Các sản phẩm này thường được tiêu dùng trong gia đình, phục vụ nhu cầu tiện lợi và tích trữ.

  • Ngược lại, nhóm không sở hữu nhà ở (Homeowner = N) có thể bao gồm sinh viên, người độc thân, hoặc người thuê nhà – những người có xu hướng di chuyển, sống một mình hoặc ít thành viên hơn. Do đó, họ chi tiêu cao hơn cho các sản phẩm như Produce (14.92%), Frozen Foods (9.97%), và Beverages (5.22%), vốn dễ chế biến, tiện lợi và phù hợp với các bữa ăn cá nhân. Họ cũng có xu hướng chi ít hơn cho các danh mục có tính ổn định hoặc phục vụ quy mô lớn như Household hay Snack Foods.

Tóm lại, sở hữu nhà ở ảnh hưởng đến loại sản phẩm mua do liên quan đến mức độ ổn định, quy mô hộ gia đình và phong cách sống. Những người có nhà thường đầu tư vào các sản phẩm phục vụ gia đình lâu dài và sinh hoạt nhóm, trong khi người không có nhà ưu tiên sự tiện lợi, nhanh chóng và linh hoạt trong tiêu dùng. Điều này giải thích vì sao kiểm định thống kê cho thấy mối quan hệ có ý nghĩa giữa hai biến.

PHẦN 5: TỔNG KẾT VÀ THẢO LUẬN

5.1 Tóm tắt

Tổng hợp từ tất cả các phân tích trên, chúng ta rút ra những hiểu biết sâu sắc và giá trị về chân dung khách hàng và thói quen mua sắm của họ thông qua các biến định tính. Cụ thể, các yếu tố như tình trạng sở hữu nhà ở hay tình trạng hôn nhân không chỉ đơn thuần là thông tin cá nhân – mà còn phản ánh rõ rệt phong cách sống, nhu cầu tiêu dùng, và ưu tiên sản phẩm của từng nhóm khách hàng. Những khác biệt tinh tế nhưng đáng kể này chính là chìa khóa để các nhà bán lẻ thấu hiểu hành vi khách hàng và xây dựng các chiến lược tiếp thị, phân phối sản phẩm hiệu quả và sát thực tế hơn.

  • Ở nhóm thu nhập thấp đến trung bình ($10K–$90K), sản phẩm chi tiêu nhiều nhất là rau quả tươi (Produce), chiếm từ 13.59% đến 15.45%, phản ánh nhu cầu thiết yếu và ưu tiên thực phẩm tươi sống phục vụ cuộc sống hàng ngày. Các sản phẩm như sữa (Dairy), thực phẩm đông lạnh (Frozen Foods) và đồ ăn nhẹ (Snack Foods) cũng chiếm tỷ lệ đáng kể trong chi tiêu, do nhóm này ưu tiên tiết kiệm và lựa chọn thực phẩm có giá trị dinh dưỡng cao với chi phí hợp lý. Ngược lại, nhóm thu nhập cao hơn ($90K trở lên) có xu hướng chi tiêu nhiều hơn vào các sản phẩm tiện lợi như Frozen Foods và Snack Foods, chiếm khoảng 12–13%, cùng với sức khỏe và vệ sinh cá nhân (Health and Hygiene) chiếm từ 5% đến 7%. Điều này phản ánh khả năng tài chính tốt hơn, giúp họ đầu tư vào sự tiện lợi, đa dạng thực phẩm và chăm sóc sức khỏe. Bên cạnh đó, áp lực công việc và lối sống bận rộn cũng thúc đẩy nhóm thu nhập cao lựa chọn các sản phẩm giúp tiết kiệm thời gian mà vẫn đảm bảo chất lượng cuộc sống.

-> Nhóm thu nhập thấp đến trung bình ưu tiên chi tiêu vào các sản phẩm thiết yếu và có giá trị dinh dưỡng cao với chi phí hợp lý như rau quả tươi, trong khi nhóm thu nhập cao ưu tiên các sản phẩm tiện lợi và chăm sóc sức khỏe do khả năng tài chính tốt hơn và lối sống bận rộn.

  • Phân bố dân cư theo nhóm thu nhập cho thấy sự khác biệt rõ rệt. Ở nhóm thu nhập thấp (10K–30K), cư dân chủ yếu tập trung tại các thành phố như Salem (9.97%), Tacoma (9.45%), Seattle (6.50%), Los Angeles (6.31%) và San Diego (6.80%). Những thành phố này có mức sống phù hợp với ngân sách hạn chế, cung cấp cơ sở hạ tầng cơ bản và chi phí sinh hoạt vừa phải, giúp người thu nhập thấp dễ dàng tiếp cận. Salem và Tacoma đặc biệt thu hút gần 10% cư dân thu nhập thấp, cho thấy đây là những điểm đến phổ biến. Khi thu nhập tăng lên, cư dân chuyển dịch sang các thành phố lớn, phát triển hơn. Nhóm thu nhập 90K–110K vẫn tập trung ở Salem (13.54%) và các thành phố lớn khác như Los Angeles, San Diego, Tacoma và Seattle, nhưng tỷ lệ ở các thành phố này thay đổi, phản ánh xu hướng chọn nơi có nhiều cơ hội việc làm và tiện ích hơn. Nhóm thu nhập rất cao (150K+) phân bố chủ yếu tại các thành phố chất lượng sống cao như Bremerton (12.82%), Beverly Hills (8.42%), Seattle (8.79%) và Los Angeles (7.33%), nơi có dịch vụ hiện đại, môi trường sống sang trọng và nhiều tiện ích phục vụ lối sống cao cấp.

-> Thu nhập ảnh hưởng trực tiếp đến khả năng chi trả chi phí sinh hoạt và lựa chọn môi trường sống; nhóm thu nhập cao có điều kiện tài chính và nhu cầu hưởng thụ cuộc sống tốt hơn nên thường ưu tiên các khu vực sang trọng, tiện nghi, còn nhóm thu nhập thấp ưu tiên các khu vực phù hợp với ngân sách và nhu cầu cơ bản.

  • Một số bang như Washington (WA), California (CA), và Oregon (OR) có tỷ lệ dân cư cao trong cả hai nhóm tình trạng hôn nhân: kết hôn (Married) và độc thân (Single). Cụ thể, Washington chiếm tỷ lệ lớn nhất với 33.88% dân cư kết hôn và 31.16% độc thân, California cũng có tỷ lệ cao tương ứng là 19.37% và 19.51%, trong khi Oregon đứng ở mức 14.91% và 17.21%. Điều này phản ánh quy mô dân số lớn và mật độ dân cư cao tại những bang này, dẫn đến sự đa dạng về tình trạng hôn nhân. Ngược lại, các bang như Zacatecas, DF, BC và Yucatan có tỷ lệ dân cư thấp hơn và sự phân bố cân bằng giữa hai nhóm, ví dụ Zacatecas là 9.19% (kết hôn) và 9.26% (độc thân). Sự cân bằng này có thể phản ánh đặc điểm dân số ít đông và đồng đều hơn trong các tình trạng hôn nhân.

-> Quy mô dân số và mật độ cư trú ảnh hưởng đến số lượng và đa dạng tình trạng hôn nhân tại từng bang; bang đông dân sẽ có số lượng lớn người trong mọi tình trạng hôn nhân, còn bang ít dân thường có sự phân bố cân bằng và tỷ lệ thấp hơn.

  • Cả hai nhóm chưa kết hôn (N) và đã kết hôn (Y) đều ưu tiên chi tiêu cho rau củ quả tươi (Produce) với tỷ lệ cao, lần lượt là 14.92% (chưa kết hôn) và 13.69% (đã kết hôn), cho thấy thực phẩm tươi sống là mặt hàng thiết yếu chung cho mọi người. Các nhóm sản phẩm như Frozen Foods (thực phẩm đông lạnh) cũng được tiêu dùng tương đồng, chiếm 9.97% ở nhóm chưa kết hôn và 9.73% ở nhóm đã kết hôn. Tuy nhiên, nhóm đã kết hôn chi tiêu nhiều hơn cho Snack Foods (12% so với 10.45%) và Household (9.84% so với 10.49%), phản ánh nhu cầu dùng nhiều sản phẩm ăn nhẹ và đồ gia dụng phục vụ cho gia đình đông thành viên. Ngược lại, nhóm chưa kết hôn ưu tiên hơn cho Produce và Frozen Foods, cho thấy xu hướng lựa chọn các sản phẩm tiện lợi và lành mạnh phù hợp với nhu cầu cá nhân.

-> Tình trạng hôn nhân ảnh hưởng đến quy mô và đặc điểm nhu cầu tiêu dùng, khi hộ gia đình nhiều người cần đa dạng và số lượng sản phẩm lớn hơn, còn cá nhân ưu tiên sự tiện lợi và dinh dưỡng phù hợp cho bản thân. Vì vậy, sự khác biệt này phản ánh đặc điểm sinh hoạt và nhu cầu tiêu dùng dựa trên tình trạng hôn nhân và quy mô hộ gia đình.

5.2 Hạn chế của phân tích:

  • Dữ liệu có thể không đồng đều về độ tin cậy, một số nhóm nhỏ (ví dụ nhóm thu nhập rất cao hoặc các thành phố nhỏ) có kích thước mẫu hạn chế, dẫn đến kết quả có thể không đại diện hoàn toàn.

  • Phân tích chỉ dựa trên biến định tính mà không xét đến các biến định lượng hoặc các yếu tố như tuổi tác, trình độ học vấn, nghề nghiệp, hoặc thói quen mua sắm chi tiết, làm hạn chế độ sâu sắc của hiểu biết về khách hàng.

  • Các biến như MaritalStatus, Homeowner, AnnualIncome và City có thể tương quan với nhau, gây khó khăn trong việc phân tách chính xác ảnh hưởng riêng biệt của từng yếu tố lên thói quen tiêu dùng.

  • Phân tích chủ yếu dựa trên các biến định tính như MaritalStatus, Homeowner, AnnualIncome (phân nhóm thu nhập theo khoảng), City, StateorProvince, ProductFamily và các biến liên quan đến sản phẩm. Việc thiếu các biến định lượng chi tiết như tuổi tác, trình độ học vấn, nghề nghiệp, mức chi tiêu cụ thể hay thói quen mua sắm từng loại sản phẩm làm hạn chế khả năng phân tích sâu sắc về động lực tiêu dùng.

  • Không xét yếu tố giới tính (Gender) có thể làm mất đi các khác biệt quan trọng trong hành vi tiêu dùng giữa nam và nữ. Các yếu tố xã hội, văn hóa như trình độ học vấn, nghề nghiệp, thành phần hộ gia đình không được xét đến, làm hạn chế khả năng dự đoán và phân tích đặc điểm khách hàng chính xác hơn.

5.3 Đề xuất

  • Dựa trên phân tích hành vi tiêu dùng theo thu nhập và tình trạng hôn nhân, doanh nghiệp nên phân khúc khách hàng rõ ràng để tối ưu hóa chiến lược marketing. Nhóm thu nhập thấp đến trung bình ưu tiên sản phẩm thiết yếu, giá hợp lý như rau quả tươi, sữa và thực phẩm đông lạnh, vì vậy cần tập trung khuyến mãi, quảng cáo nhấn mạnh giá trị dinh dưỡng và tiết kiệm. Nhóm thu nhập cao có xu hướng chi tiêu cho các sản phẩm tiện lợi, đa dạng và chăm sóc sức khỏe hơn, nên tập trung phát triển sản phẩm cao cấp, dịch vụ giao hàng nhanh và trải nghiệm mua sắm thuận tiện. Tình trạng hôn nhân cũng ảnh hưởng đến nhu cầu: hộ gia đình đã kết hôn cần sản phẩm đa dạng, số lượng lớn, trong khi khách hàng độc thân ưu tiên các sản phẩm cá nhân, tiện lợi và lành mạnh.

  • Về phân phối, doanh nghiệp nên tập trung phát triển hệ thống tại các thành phố có mật độ dân cư cao và đa dạng thu nhập như Washington, California và Oregon, đồng thời xây dựng các cửa hàng phù hợp với đặc điểm từng nhóm thu nhập tại các khu vực khác nhau. Cần phát triển thêm các dòng sản phẩm rau quả tươi, thực phẩm đông lạnh, snack và sản phẩm chăm sóc sức khỏe phù hợp với từng phân khúc. Song song đó, doanh nghiệp nên ứng dụng công nghệ và hệ thống CRM để cá nhân hóa chiến dịch marketing, theo dõi hành vi khách hàng và nâng cao trải nghiệm mua sắm, từ đó tăng hiệu quả kinh doanh và giữ chân khách hàng lâu dài.

5.4 Hướng nghiên cứu tiếp theo

  • Nhóm người đã kết hôn, có nhà và thu nhập cao có đặc điểm chi tiêu khác nhóm độc thân và chưa sở hữu nhà không?

  • Thu nhập và tình trạng sở hữu nhà ảnh hưởng ra sao đến việc ưu tiên các nhóm sản phẩm thiết yếu so với sản phẩm tiện lợi?

  • Có sự khác biệt trong hành vi tiêu dùng theo giới tính khi kết hợp với các biến như tình trạng hôn nhân và thu nhập không?

  • Nhóm người đã kết hôn, có nhà và thu nhập cao có đặc điểm chi tiêu khác nhóm độc thân và chưa sở hữu nhà không?

  • Mức độ ảnh hưởng của thu nhập kết hợp với tình trạng sở hữu nhà đến ưu tiên mua các sản phẩm thiết yếu (rau củ quả, sữa,…) so với sản phẩm tiện lợi (thực phẩm đông lạnh, đồ ăn nhẹ) nhằm xác định rõ động lực chi tiêu theo phân khúc khách hàng.

W3

PHẦN 6: LÍ THUYẾT

6.1 RELATIVE RISK

Nguy cơ tương đối (RR) là một tỷ số giữa hai tỷ lệ (proportions).

\[ RR = \frac{EER}{CER} \]

Trong đó:

  • EER (Experimental Event Rate): Tỷ lệ xảy ra sự kiện ở nhóm can thiệp
  • CER (Control Event Rate): Tỷ lệ xảy ra sự kiện ở nhóm đối chứng

RR < 1 nếu nhóm nằm ở tử số có nguy cơ xảy ra sự kiện thấp hơn.
👉 Đây là điều mong muốn nếu sự kiện là kết cục xấu (ví dụ: tử vong).

  • RR > 1 nếu nhóm nằm ở tử số có nguy cơ xảy ra sự kiện cao hơn.
    👉 Đây là điều mong muốn nếu sự kiện là kết cục tốt (ví dụ: bỏ thuốc lá thành công).

6.2 Cấu trúc xác suất của bảng ngẫu nhiên:

Trong phân tích bảng tần số (contingency table), hai loại phân phối xác suất thường được sử dụng để mô hình hóa cách bảng ngẫu nhiên được sinh ra là phân phối đa thức (Multinomial)phân phối Poisson.

6.2.1. Phân phối Đa thức (Multinomial Distribution)

Đặc điểm:

  • Là phần mở rộng của phân phối nhị thức (binomial) cho trường hợp nhiều danh mục.
  • Tổng số quan sát \(n\) là cố định.
  • Mỗi quan sát rơi vào đúng một danh mục (ô trong bảng).

Mô hình:

Giả sử bảng có \(k\) ô, thì số đếm trong từng ô \((X_1, X_2, \ldots, X_k)\) tuân theo:

\[ (X_1, X_2, \ldots, X_k) \sim \text{Multinomial}(n; p_1, p_2, \ldots, p_k) \]

Trong đó:

  • \(n\): tổng số quan sát
  • \(p_i\): xác suất rơi vào ô thứ \(i\), với \(\sum_{i=1}^k p_i = 1\)
  • \(\sum_{i=1}^k X_i = n\)

Ứng dụng:

  • Dùng khi thực hiện khảo sát hoặc thí nghiệm với tổng số mẫu cố định.
  • Phân loại đối tượng theo nhóm.

Ví dụ:

Khảo sát 200 người về loại đồ uống yêu thích (cà phê, trà, nước lọc), số người chọn từng loại được mô hình hóa theo phân phối đa thức.

6.2.3 Phân phối Poisson (Poisson Distribution)

Đặc điểm:

  • Mô hình hóa số lần xảy ra của một sự kiện ngẫu nhiên trong không gian, thời gian hoặc đơn vị nhất định.
  • Các số đếm trong từng ô được coi là độc lập.
  • Không có ràng buộc về tổng số quan sát.

Mô hình:

Số đếm trong mỗi ô \(X_i\) tuân theo:

\[ X_i \sim \text{Poisson}(\mu_i) \]

Trong đó:

  • \(\mu_i\): kỳ vọng (trung bình) số đếm ở ô thứ \(i\)
  • Các \(X_i\) là độc lập

Ứng dụng:

  • Phân tích số sự kiện ngẫu nhiên như: ca bệnh, sự cố kỹ thuật, tai nạn, v.v.
  • Dữ liệu không có tổng số mẫu cố định.

Ví dụ:

Số ca mắc bệnh theo từng tỉnh hoặc số cuộc gọi đến trung tâm dịch vụ trong mỗi giờ được mô hình hóa theo phân phối Poisson.

6.2.4 So sánh phân phối Multinomial và Poisson

Tiêu chí Multinomial Poisson
Tổng số đếm \(n\) Cố định Không cố định
Phụ thuộc giữa các ô Có (vì \(\sum X_i = n\)) Không (các ô độc lập)
Loại dữ liệu thường gặp Khảo sát, phân loại Dữ liệu đếm, quan sát sự kiện
Mục tiêu phân tích Phân phối xác suất giữa các danh mục Sự kiện xảy ra ngẫu nhiên, hiếm gặp

Kết luận

Hai loại phân phối phổ biến sinh ra bảng ngẫu nhiên là:

  • Multinomial: Dùng khi tổng số quan sát cố định và các quan sát rơi vào các danh mục rời rạc.
  • Poisson: Dùng khi các số đếm là độc lập và tổng số quan sát không bị ràng buộc.

Tùy theo cách dữ liệu được thu thập, ta chọn mô hình phù hợp để phân tích bảng tần số, kiểm định giả thuyết hoặc ước lượng tham số.

table_HoC <- table(d$Gender,d$Homeowner)

table_HoC_with_total <- cbind(table_HoC, Total = rowSums(table_HoC))
library(kableExtra)
kable(table_HoC_with_total, format = "html", caption = "Bảng 4.1 Số lượng có nhà giữa các giới tính") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 4.1 Số lượng có nhà giữa các giới tính
N Y Total
F 2826 4344 7170
M 2789 4100 6889

6.3. Hiệu hai tỷ lệ

Tỷ lệ sự kiện ở mỗi nhóm:

  • Nhóm Nữ: \(p_1 = \dfrac{a}{a + b}=\dfrac{4344}{2826 + 4344}= 0.606\)

  • Nhóm Nam: \(p_2 = \dfrac{c}{c + d}=\dfrac{4100}{4100 + 2789}=0.595\)

\[ \Delta p = p_1 - p_2 = \dfrac{a}{a + b} - \dfrac{c}{c + d}=0.606-0.595=0.011 \]

Ý nghĩa: - Đo mức chênh lệch tuyệt đối giữa hai tỷ lệ. - Nếu \(\Delta p = 0\): không có sự khác biệt. - Đơn vị: phần trăm hoặc tỷ lệ (0 đến 1).

6.4 Tỷ số nguy cơ (Relative Risk - RR)

\[ \text{RR} = \dfrac{p_1}{p_2} = \dfrac{a / (a + b)}{c / (c + d)} \]

Ý nghĩa: - Đo tỷ lệ xảy ra sự kiện ở Nhóm 1 so với Nhóm 2. - Nếu RR = 1: nguy cơ bằng nhau. - Nếu RR > 1: nguy cơ ở Nhóm 1 cao hơn Nhóm 2. - Nếu RR < 1: nguy cơ ở Nhóm 1 thấp hơn Nhóm 2.

Ứng dụng: - Phân tích rủi ro trong nghiên cứu đoàn hệ (cohort study). - Ví dụ: tỷ lệ mắc bệnh ở nhóm dùng thuốc so với nhóm không dùng.

6.5 Tỷ số chênh (Odds Ratio - OR)

Tính odds ở mỗi nhóm:

  • Nhóm 1: \(\text{odds}_1 = \dfrac{a}{b}\)
  • Nhóm 2: \(\text{odds}_2 = \dfrac{c}{d}\)

Tỷ số chênh (OR):

\[ \text{OR} = \dfrac{a / b}{c / d} = \dfrac{a \cdot d}{b \cdot c} \]

Ý nghĩa: - So sánh “cơ may xảy ra sự kiện” giữa hai nhóm. - Nếu OR = 1: không có sự khác biệt. - Nếu OR > 1: Nhóm 1 có cơ may xảy ra sự kiện cao hơn. - Nếu OR < 1: Nhóm 1 có cơ may xảy ra sự kiện thấp hơn.

Ứng dụng: - Nghiên cứu bệnh chứng (case-control study). - Phù hợp khi không biết tổng số đối tượng ở từng nhóm.

So sánh RR và OR

Đặc điểm Relative Risk (RR) Odds Ratio (OR)
Dễ hiểu Ít trực quan hơn
Dùng trong Nghiên cứu đoàn hệ Nghiên cứu bệnh chứng
Có thể > 1
Có thể dùng logistic Không Có (logistic regression)

Kết luận

  • Hiệu tỷ lệ phản ánh sự chênh lệch tuyệt đối giữa hai nhóm.
  • Tỷ số nguy cơ (RR) phản ánh sự chênh lệch tương đối về xác suất xảy ra sự kiện.
  • Tỷ số chênh (OR) so sánh “cơ hội xảy ra sự kiện” và rất phổ biến trong các phân tích hồi quy logistic.

Khi phân tích bảng 2x2, việc chọn chỉ số nào tùy thuộc vào mục tiêu nghiên cứu, kiểu dữ liệu, và thiết kế nghiên cứu.

6.6 Khoảng tin cậy cho các tham số đo mối liên hệ (Đặc biệt là Odds Ratio)

6.6.1 Tổng quan

Trong phân tích các mối liên hệ giữa hai biến nhị phân, các tham số đo mối liên hệ phổ biến bao gồm:

  • Hiệu tỷ lệ (Risk Difference)
  • Tỷ số nguy cơ (Relative Risk, RR)
  • Tỷ số chênh (Odds Ratio, OR)

Để đánh giá độ chính xác của các tham số này, người ta sử dụng khoảng tin cậy (Confidence Interval - CI). Khoảng tin cậy cho biết dải giá trị mà tham số thực tế của quần thể rất có thể nằm trong đó với một mức độ tin cậy nhất định (thường là 95%).

6.6.2. Khoảng tin cậy cho Odds Ratio (OR)

6.6.2.1 Định nghĩa Odds Ratio (OR)

Cho bảng phân phối 2x2:

Có sự kiện (1) Không có sự kiện (0)
Nhóm có sự kiện (Event=1) \(a\) \(b\)
Nhóm không có sự kiện (Event=0) \(c\) \(d\)

Odds Ratio được tính như sau:

\[ \text{OR} = \frac{a / b}{c / d} = \frac{a \times d}{b \times c} \]

OR đo lường tỷ lệ odds xảy ra sự kiện ở nhóm có sự kiện so với nhóm không có sự kiện.

6.6.2.2 Lý do sử dụng log(OR) để xây dựng khoảng tin cậy
  • Phân phối của OR không đối xứng và không chuẩn.
  • Logarithm tự nhiên của OR, tức \(\log(\text{OR})\), có phân phối gần chuẩn (đặc biệt khi kích thước mẫu lớn).
  • Do đó, xây dựng khoảng tin cậy trên thang log(OR) giúp sử dụng các phương pháp thống kê chuẩn.
6.6.2.3 Công thức tính khoảng tin cậy 95% cho OR

Bước 1: Tính log-OR

\[ \hat{\theta} = \log(\widehat{\text{OR}}) = \log\left(\frac{a d}{b c}\right) \]

Bước 2: Tính sai số chuẩn (Standard Error - SE) của log-OR

\[ SE = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}} \]

Bước 3: Tính khoảng tin cậy trên log-OR

\[ \hat{\theta} \pm z_{1-\alpha/2} \times SE \]

Trong đó:

  • \(z_{1-\alpha/2}\) là giá trị tới hạn phân phối chuẩn (ví dụ, \(z_{0.975} \approx 1.96\) với mức tin cậy 95%).

Bước 4: Chuyển về khoảng tin cậy cho OR bằng cách lấy mũ

\[ \left[ \exp\left(\hat{\theta} - z_{1-\alpha/2} \times SE \right),\quad \exp\left(\hat{\theta} + z_{1-\alpha/2} \times SE \right) \right] \]

6.6.3 Ý nghĩa và ứng dụng

  • Khoảng tin cậy 95% cho OR cung cấp một phạm vi các giá trị hợp lý nhất cho OR thực trong quần thể.
  • Nếu khoảng tin cậy không chứa giá trị 1, ta có thể kết luận mối liên hệ giữa biến có sự kiện và biến kết quả là có ý nghĩa thống kê ở mức 5%.
  • Khoảng tin cậy càng hẹp cho thấy ước lượng OR càng chính xác.
  • Phương pháp này áp dụng phổ biến trong nghiên cứu y học, dịch tễ, kinh tế học và các ngành xã hội.

6.7 Báo cáo “GENDER DISPARITIESIN FINANCIAL WELL-BEING”

của Fernandez và Tranfaglia từ Ngân hàng Dự trữ Liên bang Philadelphia (tháng 10 năm 2020). Báo cáo này phân tích dữ liệu từ Khảo sát Kinh tế Hộ gia đình và Ra quyết định (SHED) năm 2018 để tìm hiểu sự khác biệt giới trong các lĩnh vực tài chính chính: ngân hàng, tiếp cận tín dụng và kế hoạch nghỉ hưu, đồng thời đặc biệt xem xét vai trò của kiến thức tài chính.

Kết quả Chính (Tập trung vào Tỷ lệ Chênh - OR từ Mô hình Đầy đủ):

1. Ngân hàng: - Fully Banked (Mô hình 4, Bảng 1, Phụ lục B): Phụ nữ: OR = 1.0511 (Không có ý nghĩa thống kê - KYYTK). Sau khi kiểm soát kiến thức tài chính và các yếu tố khác, không có sự khác biệt đáng kể về giới trong việc “fully banked”.

  • Kiến thức tài chính cao (so với thấp): OR = 1.9937** (p<0.01), cho thấy những người có kiến thức tài chính cao có khả năng “fully banked” cao gần gấp đôi.

Sử dụng Dịch vụ Tài chính Thay thế - AFS (Mô hình 8, Bảng 1, Phụ lục B): Phụ nữ: OR = 1.0305. Không có sự khác biệt đáng kể về giới trong việc sử dụng AFS sau khi kiểm soát đầy đủKiến thức tài chính cao: OR = 0.6768** (p<0.01), cho thấy những người có kiến thức tài chính cao ít có khả năng sử dụng AFS hơn (chỉ bằng 0.67 lần).

2. Tín dụng:

-Sở hữu Ít nhất Một Thẻ Tín dụng (Mô hình 12, Bảng 2, Phụ lục B): Phụ nữ: OR = 1.4322 (p<0.01). Đây là một kết quả quan trọng. Ngay cả sau khi kiểm soát tất cả các yếu tố, phụ nữ có khả năng sở hữu ít nhất một thẻ tín dụng cao hơn 43% so với nam giới. Kiến thức tài chính cao: OR = 2.2509** (p<0.01), người có kiến thức tài chính cao có khả năng sở hữu thẻ tín dụng cao hơn 2.25 lần.

  • Bị Từ chối Tín dụng (trong 12 tháng qua) (Mô hình 16, Bảng 2, Phụ lục B): Phụ nữ: OR = 1.0691 (KYYTK). Không có sự khác biệt đáng kể về giới sau khi kiểm soát. Kiến thức tài chính cao: OR = 0.5926** (p<0.01), người có kiến thức tài chính cao ít có khả năng bị từ chối tín dụng hơn.

  • Tự tin khi Đăng ký Thẻ Tín dụng Mới (Mô hình 20, Bảng 2, Phụ lục B): Phụ nữ: OR = 0.9856 (KYYTK). Không có sự khác biệt đáng kể về giới sau khi kiểm soát. Kiến thức tài chính cao: OR = 1.8885** (p<0.01), người có kiến thức tài chính cao tự tin hơn gần gấp đôi.

3.Kế hoạch Nghỉ hưu (chỉ những người chưa nghỉ hưu):

  • Thoải mái khi Đưa ra Quyết định Đầu tư Hưu trí (Mô hình 24, Bảng 3, Phụ lục B): Phụ nữ: OR = 0.4713 (p<0.01). Đây là một kết quả quan trọng khác. Phụ nữ có khả năng cảm thấy thoải mái khi đưa ra quyết định đầu tư hưu trí chỉ bằng 47% so với nam giới, ngay cả sau khi kiểm soát kiến thức tài chính và các yếu tố khác. Đây là chênh lệch lớn nhất và tồn tại dai dẳng nhất. Kiến thức tài chính cao: OR = 1.3994** (p<0.01), người có kiến thức tài chính cao thoải mái hơn 1.4 lần.

  • Tin rằng Kế hoạch Tiết kiệm Hưu trí Đang Đi Đúng Hướng (Mô hình 28, Bảng 3, Phụ lục B): Phụ nữ: OR = 0.9098 (KYYTK). Không có sự khác biệt đáng kể về giới sau khi kiểm soát.Kiến thức tài chính cao: OR = 1.6107** (p<0.01), người có kiến thức tài chính cao có khả năng tin rằng kế hoạch của họ đúng hướng cao hơn 1.6 lần.

6.8 Phân tích: Liệu việc là Nữ (so với Nam) có làm tăng odds sở hữu nhà?

1. Tóm tắt bảng dữ liệu

Giới tính Không có nhà (N) Có nhà (Y) Tổng
Nữ (F) 2826 4344 7170
Nam (M) 2789 4100 6889

2. Tính Odds và Odds Ratio

  • Odds (tỷ số chênh) sở hữu nhà ở nữ:

\[ \text{Odds}_{\text{Nữ}} = \frac{4344}{2826} \approx 1.5376 \]

  • Odds sở hữu nhà ở nam:

\[ \text{Odds}_{\text{Nam}} = \frac{4100}{2789} \approx 1.4709 \]

  • Tỷ số chênh (Odds Ratio, OR) của nữ so với nam:

\[ \text{OR} = \frac{\text{Odds}_{\text{Nữ}}}{\text{Odds}_{\text{Nam}}} = \frac{1.5376}{1.4709} \approx 1.0454 \]

3. Diễn giải kết quả

Tỷ số chênh \(\text{OR} \approx 1.0454\) > 1 cho thấy phụ nữ có odds sở hữu nhà cao hơn một chút so với nam giới.

Tuy nhiên, mức chênh lệch là nhỏ (~4.5%), và để khẳng định có sự khác biệt có ý nghĩa thống kê hay không, cần tính khoảng tin cậy cho OR hoặc tiến hành kiểm định thống kê.

4. Kết luận sơ bộ (mô tả)

Dựa trên số liệu từ bộ dữ liệu Supermarket Transactions, phụ nữ có tỷ số chênh (odds) sở hữu nhà cao hơn nam giới một chút. Cụ thể:

  • Odds sở hữu nhà ở phụ nữ cao hơn khoảng 4.5% so với nam giới (\(\text{OR} \approx 1.045\)).
  • Tuy nhiên, sự khác biệt là nhỏ, và cần thêm phân tích thống kê (ví dụ: khoảng tin cậy 95% cho OR hoặc kiểm định Wald) để kết luận về ý nghĩa thực tiễn.

PHẦN 7: THỰC HÀNH ƯỚC LƯỢNG

7.1 Hiệu hai tỷ lệ

Bảng chéo giữa Gender và Homeowner

table_HoC <- table(d$Gender,d$Homeowner)

table_HoC_with_total <- cbind(table_HoC, Total = rowSums(table_HoC))
library(kableExtra)
kable(table_HoC_with_total, format = "html", caption = "Bảng 7.1 Bảng chéo giữa biến Gender và Homeowner") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F)
Bảng 7.1 Bảng chéo giữa biến Gender và Homeowner
N Y Total
F 2826 4344 7170
M 2789 4100 6889

Mục tiêu kiểm định

Xác định xem phụ nữ có sở hữu nhà ít hơn nam giới hay không.

Thiết lập tỷ lệ

Tỷ lệ nữ sở hữu nhà:

\[ p_1 = P(\text{Homeowner} = Y \mid \text{Gender} = F) \]

Tỷ lệ nam sở hữu nhà:

\[ p_2 = P(\text{Homeowner} = Y \mid \text{Gender} = M) \]

Hiệu chênh lệch giữa hai tỷ lệ:

\[ d = p_1 - p_2 \]

Giả thuyết kiểm định

  • Giả thuyết H₀: Không có sự khác biệt giữa hai tỷ lệ
    \[ H_0: p_1 - p_2 = 0\]

  • Giả thuyết H1): Tỷ lệ nữ sở hữu nhà thấp hơn nam: \(H_1: p_1 - p_2 < 0\)

# Kiểm định sự khác biệt tỷ lệ sở hữu nhà giữa nữ và nam
library(stats)
geho <- table(d$Gender,d$Homeowner)
testgeho <- prop.test(x = c(geho["F","Y"], geho["M","Y"]),
                      n = c(sum(geho["F",]), sum(geho["M",])),
                      alternative = "less", correct = FALSE)
print(testgeho)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(geho["F", "Y"], geho["M", "Y"]) out of c(sum(geho["F", ]), sum(geho["M", ]))
## X-squared = 1.6788, df = 1, p-value = 0.9025
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000  0.02429777
## sample estimates:
##    prop 1    prop 2 
## 0.6058577 0.5951517

Tỷ lệ ước lượng từ dữ liệu:

Tỷ lệ nữ sở hữu nhà: prob1 = 0.60585777

Tỷ lệ nam sở hữu nhà: prob2 = 0.5951517

Hiệu chênh lệch giữa hai tỷ lệ: \[ \hat{d} = \hat{p}_F - \hat{p}_M = 0.6059 - 0.5952 = 0.0107 \]

Kết quả thu được:

  • \(X^2 = 1.6788\), df = 1
  • Giá trị p: \(p\text{-value} = 0.9025\)
  • Khoảng tin cậy 95% cho \(p_F - p_M\):
    \[ (-1.000,\; 0.0243) \]

Kết luận

Với \(p\text{-value} = 0.9025\), ta không bác bỏ giả thuyết \(H_0\).
Điều này cho thấy không có bằng chứng thống kê để kết luận rằng tỷ lệ nữ sở hữu nhà thấp hơn nam giới.

Ngược lại, tỷ lệ nữ còn nhỉnh hơn nam một chút, nhưng khác biệt này không có ý nghĩa thống kê.

7.2 Tỷ số Nguy cơ (Relative Risk - RR):

library(epitools)
rgeho <- riskratio(geho, method = "wald")
print(rgeho)
## $data
##        
##            N    Y Total
##   F     2826 4344  7170
##   M     2789 4100  6889
##   Total 5615 8444 14059
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate     lower    upper
##   F 1.0000000        NA       NA
##   M 0.9823291 0.9561812 1.009192
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M   0.195158    0.1964833  0.1950884
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Kết quả ước lượng tỷ số rủi ro (risk ratio)

Giới tính Ước lượng Risk Ratio Khoảng tin cậy 95% (Lower - Upper)
Nữ (F) 1.0000 NA
Nam (M) 0.9823 0.9562 – 1.0092

Giải thích:
- Risk Ratio (RR) của nhóm nam so với nữ là 0.9823, gần bằng 1, cho thấy tỷ lệ nam sở hữu nhà thấp hơn nữ khoảng 1.77%.
- Khoảng tin cậy 95% bao gồm giá trị 1, nghĩa là sự khác biệt về tỷ lệ sở hữu nhà giữa hai giới không có ý nghĩa thống kê.

Kết quả kiểm định ý nghĩa thống kê

Phương pháp kiểm định Giá trị p (two-sided)
Mid-p exact test 0.1952
Fisher exact test 0.1965
Chi-square test 0.1951

Giải thích:
- Tất cả các giá trị p đều lớn hơn mức ý nghĩa 0.05.
- Điều này nghĩa là ta không đủ bằng chứng để bác bỏ giả thuyết \(H_0\) tức là không có sự khác biệt đáng kể về tỷ lệ sở hữu nhà giữa hai giới tính dựa trên dữ liệu này.

7.3 Tỷ số Chênh (Odds Ratio - OR):

library(DescTools)
orgeho <- OddsRatio(geho, method="wald", conf.level = 0.95)
print(orgeho)
## odds ratio     lwr.ci     upr.ci 
##  0.9563518  0.8939173  1.0231469
  • OR < 1 nghĩa là odds sở hữu nhà của nữ thấp hơn odds sở hữu nhà của nam.

  • Giá trị OR = 0.9564 cho thấy odds sở hữu nhà của nữ chỉ thấp hơn khoảng 4.36% so với nam (1 - 0.9564 = 0.0436).

  • Khoảng tin cậy 95% cho OR là (0.8939, 1.0231) chứa giá trị 1.

  • Điều này cho thấy, về mặt thống kê, chúng ta không thể loại trừ khả năng odds sở hữu nhà của nữ và nam là bằng nhau (OR = 1).

Tổng kết:

  • Odds Ratio cung cấp một thước đo mạnh mẽ để so sánh khả năng (odds) xảy ra sự kiện giữa hai nhóm.

  • Tuy nhiên, khi khoảng tin cậy chứa giá trị 1, ta cần thận trọng khi kết luận có sự khác biệt.

  • Kết quả phù hợp với phân tích tỷ số rủi ro (Risk Ratio) đã trình bày trước đó, củng cố thêm kết luận rằng không có sự khác biệt đáng kể về sở hữu nhà giữa nữ và nam trong dữ liệu này.

LS0tDQp0aXRsZTogIk5ISeG7hk0gVuG7pCINCmF1dGhvcjogIk5ndXnhu4VuIE5n4buNYyBUw7ogQW5oIg0KZGF0ZTogJ2ByIGZvcm1hdChTeXMudGltZSgpLCAiJUg6JU06JVMsICVkIC0gJW0gLSAlWSIpYCcNCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNg0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNzczogc3R5bGUuY3NzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCiMgKipXNioqDQoNCiMjICoqUGjhuqduIDE6IEjhu5NpIHF1eSDEkcahbioqDQpgYGB7cn0NCmRmIDwtcmVhZC5jc3YoIkM6L1VzZXJzL0RFTEwvRG93bmxvYWRzL2RhdGEgKDEpLmNzdiIsIGhlYWRlcj0gVCkNCiMgVMOhY2ggZOG7ryBsaeG7h3UgdGjDoG5oIG5oaeG7gXUgY+G7mXQNCmRhdGEgPC0gdGlkeXI6OnNlcGFyYXRlKA0KICBkZiwNCiAgY29sID0gMSwNCiAgaW50byA9IGMoInR5cGVfc2Nob29sIiwgInNjaG9vbF9hY2NyZWRpdGF0aW9uIiwgImdlbmRlciIsICJpbnRlcmVzdCIsDQogICAgICAgICAgICJyZXNpZGVuY2UiLCAicGFyZW50X2FnZSIsICJwYXJlbnRfc2FsYXJ5IiwgImhvdXNlX2FyZWEiLA0KICAgICAgICAgICAiYXZlcmFnZV9ncmFkZXMiLCAicGFyZW50X3dhc19pbl9jb2xsZWdlIiwgIndpbGxfZ29fdG9fY29sbGVnZSIpLA0KICBzZXAgPSAiOyINCikNCg0KZGF0YSA8LSBkYXRhIFssLTZdDQpkYXRhJHR5cGVfc2Nob29sIDwtIGFzLmZhY3RvcihkYXRhJHR5cGVfc2Nob29sKQ0KZGF0YSRzY2hvb2xfYWNjcmVkaXRhdGlvbiA8LSBhcy5mYWN0b3IoZGF0YSRzY2hvb2xfYWNjcmVkaXRhdGlvbikNCmRhdGEkZ2VuZGVyIDwtIGFzLmZhY3RvcihkYXRhJGdlbmRlcikNCmRhdGEkaW50ZXJlc3QgPC0gYXMuZmFjdG9yKGRhdGEkaW50ZXJlc3QpDQpkYXRhJHJlc2lkZW5jZSA8LSBhcy5mYWN0b3IoZGF0YSRyZXNpZGVuY2UpDQoNCmRhdGEkcGFyZW50X3NhbGFyeSA8LSBhcy5mYWN0b3IoZGF0YSRwYXJlbnRfc2FsYXJ5KQ0KZGF0YSRob3VzZV9hcmVhIDwtIGFzLmZhY3RvcihkYXRhJGhvdXNlX2FyZWEpDQpkYXRhJGF2ZXJhZ2VfZ3JhZGVzIDwtIGFzLmZhY3RvcihkYXRhJGF2ZXJhZ2VfZ3JhZGVzKQ0KZGF0YSRwYXJlbnRfd2FzX2luX2NvbGxlZ2UgPC0gYXMuZmFjdG9yKGRhdGEkcGFyZW50X3dhc19pbl9jb2xsZWdlKQ0KZGF0YSR3aWxsX2dvX3RvX2NvbGxlZ2UgPC0gYXMuZmFjdG9yKGRhdGEkd2lsbF9nb190b19jb2xsZWdlKQ0KDQpgYGANCg0KDQojIyMgKioxLjEgTcO0IGjDrG5oIHjDoWMgc3XhuqV0IHR1eeG6v24gdMOtbmgqKg0KDQojIyMjICoqMS4xLjEgcmVzaWRlbmNlKioNCg0KDQpgYGB7cn0NCiMgQ2jhuqF5IG3DtCBow6xuaCBsb2dpc3RpYw0KeHN0dC5XUiA8LSBnbG0od2lsbF9nb190b19jb2xsZWdlIH4gcmVzaWRlbmNlLCBkYXRhID0gZGF0YSwgZmFtaWx5ID0gYmlub21pYWwpDQpzdW1tYXJ5KHhzdHQuV1IpDQpgYGANCg0KSMOgbSBo4buTaSBxdXkgY8OzIGThuqFuZzoNCg0KJCQNClxsb2dcbGVmdChcZnJhY3tcaGF0e1xwaX19ezEgLSBcaGF0e1xwaX19XHJpZ2h0KSA9IC0wLjAxMzAyICsgMC4wMjQxNSBcY2RvdCBcdGV4dHtyZXNpZGVuY2V9X3tcdGV4dHtVcmJhbn19DQokJA0KDQpUcm9uZyDEkcOzOg0KDQotIEjhu4cgc+G7kSBjaOG6t24gKEludGVyY2VwdCkgPSAtMC4wMTMwMiwgdGjhu4MgaGnhu4duIGxvZy1vZGRzIMSRaSBo4buNYyDEkeG6oWkgaOG7jWMga2hpIG5nxrDhu51pIMSRw7MgKipz4buRbmcg4bufIHbDuW5nIG7DtG5nIHRow7RuIChSdXJhbCkqKi4NCg0KLSBI4buHIHPhu5EgY+G7p2EgYHJlc2lkZW5jZVVyYmFuYCA9IDAuMDI0MTUsIG5naMSpYSBsw6AgbG9nLW9kZHMgdMSDbmcgbmjhurkgbuG6v3UgbmfGsOG7nWkgxJHDsyAqKnPhu5FuZyDhu58gdGjDoG5oIHRo4buLIChVcmJhbikqKiBzbyB24bubaSBSdXJhbC4NCg0KKirDnSBuZ2jEqWEgdGjhu5FuZyBrw6o6KioNCg0KfCBCaeG6v24gICAgICAgICAgICAgfCBFc3RpbWF0ZSB8IHAtdmFsdWUgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLXwNCnwgKEludGVyY2VwdCkgICAgICB8IC0wLjAxMzAyIHwgMC44ODkgICB8DQp8IHJlc2lkZW5jZVVyYmFuICAgfCAgMC4wMjQxNSB8IDAuODQ5ICAgfA0KDQotIEPhuqMgaGFpIGJp4bq/biDEkeG7gXUgY8OzICoqcC12YWx1ZSBy4bqldCBs4bubbioqICg+IDAuMDUpLCDEkeG6t2MgYmnhu4d0IGByZXNpZGVuY2VVcmJhbmAgY8OzIHAtdmFsdWUgPSAwLjg0OSDihpIgKipraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqLg0KLSBEbyDEkcOzLCAqKmtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgY2hvIHRo4bqleSBuxqFpIGPGsCB0csO6IChVcmJhbiBoYXkgUnVyYWwpIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyDEkWkgaOG7jWMgxJHhuqFpIGjhu41jKiouDQoNCioqxJDhu5kgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmg6KioNCg0KLSAqKk51bGwgZGV2aWFuY2UgPSAxMzg2LjMqKiwgKipSZXNpZHVhbCBkZXZpYW5jZSA9IDEzODYuMyoqIOKGkiBtw7QgaMOsbmggZ+G6p24gbmjGsCAqKmtow7RuZyBj4bqjaSB0aGnhu4duIGfDrCoqIHNvIHbhu5tpIG3DtCBow6xuaCBraMO0bmcgY8OzIGJp4bq/biBnaeG6o2kgdGjDrWNoLg0KLSAqKkFJQyA9IDEzOTAuMyoqIGPFqW5nIHTGsMahbmcgxJHhu5FpIGNhbywgY2hvIHRo4bqleSBtw7QgaMOsbmgga2jDtG5nIGhp4buHdSBxdeG6oy4NCg0KKioqS+G6v3QgbHXhuq1uOioqKg0KDQpCaeG6v24gYHJlc2lkZW5jZWAga2jDtG5nIHBo4bqjaSBsw6AgbeG7mXQgeeG6v3UgdOG7kSBnaeG6o2kgdGjDrWNoIHThu5F0IGNobyBiaeG6v24gYHdpbGxfZ29fdG9fY29sbGVnZWAuIEtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogbsOgbyBjaG8gdGjhuqV5IHPhu5FuZyDhu58gdGjDoG5oIHRo4buLIGhheSBuw7RuZyB0aMO0biDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgxJFpIGjhu41jIMSR4bqhaSBo4buNYyB0cm9uZyBk4buvIGxp4buHdSBuw6B5LiDEkOG7gyBj4bqjaSB0aGnhu4duIG3DtCBow6xuaCwgbsOqbiB4ZW0geMOpdCDEkcawYSB2w6BvIHRow6ptIGPDoWMgYmnhur9uIHF1YW4gdHLhu41uZyBraMOhYyBuaMawOiB0aHUgbmjhuq1wLCB0csOsbmggxJHhu5kgY2hhIG3hurksIGvhur90IHF14bqjIGjhu41jIHThuq1wLCB2LnYuDQoNCg0KIyMjIyAqKjEuMS4yIHBhcmVudF93YXNfaW5fY29sbGVnZSoqDQoNCg0KYGBge3J9DQojIENo4bqheSBtw7QgaMOsbmggbG9naXN0aWMNCnhzdHQuV1AgPC0gZ2xtKHdpbGxfZ29fdG9fY29sbGVnZSB+IHBhcmVudF93YXNfaW5fY29sbGVnZSwgZGF0YSA9IGRhdGEsIGZhbWlseSA9IGJpbm9taWFsKQ0Kc3VtbWFyeSh4c3R0LldQKQ0KYGBgDQoNCkjDoG0gaOG7k2kgcXV5IGPDsyBk4bqhbmc6DQoNCiQkDQpcbG9nXGxlZnQoXGZyYWN7XGhhdHtccGl9fXsxIC0gXGhhdHtccGl9fVxyaWdodCkgPSAtMC4xMDAxICsgMC4xOTI1IFxjZG90IFx0ZXh0e3BhcmVudFxfd2FzXF9pblxfY29sbGVnZX1fe1x0ZXh0e1RSVUV9fQ0KJCQNCg0KVHJvbmcgxJHDszoNCg0KLSBI4buHIHPhu5EgY2jhurduIChJbnRlcmNlcHQpID0gLTAuMTAwMSwgbMOgIGxvZy1vZGRzIMSRaSBo4buNYyDEkeG6oWkgaOG7jWMgY+G7p2Egbmjhu69uZyBuZ8aw4budaSBjw7MgY2hhIG3hurkga2jDtG5nIGjhu41jIMSR4bqhaSBo4buNYyAobmjDs20gdGhhbSBjaGnhur91KS4NCg0KLSBI4buHIHPhu5EgY+G7p2EgYmnhur9uIHBhcmVudF93YXNfaW5fY29sbGVnZVRSVUUgPSAwLjE5MjUsIG5naMSpYSBsw6AgbG9nLW9kZHMgxJFpIGjhu41jIMSR4bqhaSBo4buNYyBj4bunYSBuZ8aw4budaSBjw7MgY2hhIG3hurkgdOG7q25nIGjhu41jIMSR4bqhaSBo4buNYyBjYW8gaMahbiBt4buZdCBjaMO6dCBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgY8OzLg0KDQoNClbhu5tpIHAtdmFsdWUgPSAwLjEyOSAoPiAwLjA1KSwgYmnhur9uIHBhcmVudF93YXNfaW5fY29sbGVnZSBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgNSUuDQoNCkRvIMSRw7MsIGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgcsO1IHLDoG5nIGNobyB0aOG6pXkgY2hhIG3hurkgdOG7q25nIGjhu41jIMSR4bqhaSBo4buNYyDhuqNuaCBoxrDhu59uZyDEkeG6v24gdmnhu4djIGNvbiBjw6FpIGPDsyDEkWkgaOG7jWMgxJHhuqFpIGjhu41jIHRyb25nIG3DtCBow6xuaCBuw6B5Lg0KDQoNCioqxJDhu5kgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmg6KioNCg0KLSBOdWxsIGRldmlhbmNlID0gMTM4Ni4zOyBSZXNpZHVhbCBkZXZpYW5jZSA9IDEzODQuMCDihpIgbcO0IGjDrG5oIGNo4buJIGPhuqNpIHRoaeG7h24gcuG6pXQgbmjhurkgc28gduG7m2kgbcO0IGjDrG5oIGtow7RuZyBjw7MgYmnhur9uIGdp4bqjaSB0aMOtY2guDQoNCi0gQUlDID0gMTM4OCwga2jDtG5nIGPhuqNpIHRoaeG7h24gxJHDoW5nIGvhu4Mgc28gduG7m2kgbcO0IGjDrG5oIGNo4buJIGPDsyBJbnRlcmNlcHQuDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNCkJp4bq/biBwYXJlbnRfd2FzX2luX2NvbGxlZ2UgY2jGsGEgY2hvIHRo4bqleSDhuqNuaCBoxrDhu59uZyByw7UgcuG7h3QgxJHhur9uIHjDoWMgc3XhuqV0IMSRaSBo4buNYyDEkeG6oWkgaOG7jWMgY+G7p2EgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQuIE3hurdjIGTDuSBo4buHIHPhu5EgZMawxqFuZyBjaG8gdGjhuqV5IHh1IGjGsOG7m25nICJu4bq/dSBjaGEgbeG6uSB04burbmcgaOG7jWMgxJHhuqFpIGjhu41jIHRow6wgY29uIGPDoWkgY8OzIHh1IGjGsOG7m25nIGjhu41jIMSR4bqhaSBo4buNYyBjYW8gaMahbiIsIG5oxrBuZyBr4bq/dCBxdeG6oyBraMO0bmcgxJHhuqF0IG3hu6ljIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gTsOqbiB4ZW0geMOpdCBr4bq/dCBo4bujcCB0aMOqbSBjw6FjIGJp4bq/biBraMOhYyBuaMawIHRow6BuaCB0w61jaCBo4buNYyB04bqtcCwgdGh1IG5o4bqtcCwgbcO0aSB0csaw4budbmcgc+G7kW5nLCB2LnYuIMSR4buDIGPhuqNpIHRoaeG7h24gbcO0IGjDrG5oIGThu7EgxJFvw6FuLg0KDQoNCiMjIyAqKjEuMiBNw7QgaMOsbmggTG9naXQqKg0KDQojIyMjICoqMS4yLjEgc2Nob29sX2FjY3JlZGl0YXRpb24qKg0KDQpgYGB7cn0NCnJlZ2xvZ2l0X1NSIDwtIGdsbSggc2Nob29sX2FjY3JlZGl0YXRpb24gfiByZXNpZGVuY2UsIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ2xvZ2l0JykpDQpzdW1tYXJ5KHJlZ2xvZ2l0X1NSKQ0KYGBgDQoNCg0KQmnhur9uIGBzY2hvb2xfYWNjcmVkaXRhdGlvbmAgY8OzIGhhaSBt4bupYzogKipBKiogKGdpw6EgdHLhu4sgMSDigJMgbmjDs20gdGhhbSBjaGnhur91KSB2w6AgKipCKiogKGdpw6EgdHLhu4sgMCkuIEJp4bq/biBgcmVzaWRlbmNlYCBn4buTbSAqKlJ1cmFsKiogKG5ow7NtIHRoYW0gY2hp4bq/dSkgdsOgICoqVXJiYW4qKi4NCg0KSMOgbSBo4buTaSBxdXkgY8OzIGThuqFuZzoNCg0KJCQNClxsb2dcbGVmdChcZnJhY3tcaGF0e1xwaX19ezEgLSBcaGF0e1xwaX19XHJpZ2h0KSA9IDAuNjcwNDYgLSAxLjA4ODMwIFxjZG90IFx0ZXh0e3Jlc2lkZW5jZX1fe1x0ZXh0e1VyYmFufX0NCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gJFxoYXR7XHBpfSQgbMOgIHjDoWMgc3XhuqV0IGjhu41jIHThuqFpIHRyxrDhu51uZyBraeG7g20gxJHhu4tuaCBsb+G6oWkgQS4NCg0KLSBOaMOzbSBjxrAgdHLDuiAqKlJ1cmFsKiogxJHGsOG7o2MgZMO5bmcgbMOgbSB0aGFtIGNoaeG6v3UsIG7Dqm4gaOG7hyBz4buRIGPhu6dhIGByZXNpZGVuY2VVcmJhbmAgdGjhu4MgaGnhu4duIHPhu7Ega2jDoWMgYmnhu4d0IGxvZy1vZGRzIHNvIHbhu5tpIG5ow7NtIFJ1cmFsLg0KDQoqKkvhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZzoqKg0KDQp8IEJp4bq/biAgICAgICAgICAgIHwgRXN0aW1hdGUgIHwgU3RkLiBFcnJvciB8IHotdmFsdWUgfCBwLXZhbHVlICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwNCnwgKEludGVyY2VwdCkgICAgICB8ICAwLjY3MDQ2ICB8IDAuMDk4NDMgICAgIHwgNi44MTEgICB8IDkuNjdlLTEyICoqKiB8DQp8IHJlc2lkZW5jZVVyYmFuICAgfCAtMS4wODgzMCAgfCAwLjEzMjA2ICAgICB8IC04LjI0MSAgfCA8IDJlLTE2ICoqKiAgfA0KDQoqKkRp4buFbiBnaeG6o2k6KioNCg0KLSBI4buHIHPhu5EgYHJlc2lkZW5jZVVyYmFuID0gLTEuMDg4M2AgbmdoxKlhIGzDoCBuZ8aw4budaSBz4buRbmcg4bufIHRow6BuaCB0aOG7iyBjw7MgKipsb2ctb2RkcyBnaeG6o20gxJHDoW5nIGvhu4MqKiB24buBIGto4bqjIG7Eg25nIGjhu41jIHRyxrDhu51uZyBraeG7g20gxJHhu4tuaCBsb+G6oWkgQSBzbyB24bubaSBuw7RuZyB0aMO0bi4NCg0KLSBD4bqjIGhhaSBo4buHIHPhu5EgxJHhu4F1ICoqY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBjYW8qKiAocC12YWx1ZSBn4bqnbiAwKS4NCg0KKirEkOG7mSBwaMO5IGjhu6NwIG3DtCBow6xuaDoqKg0KDQotIE51bGwgZGV2aWFuY2U6IDEzODQuOSAgDQoNCi0gUmVzaWR1YWwgZGV2aWFuY2U6IDEzMTQuMiANCg0K4oaSIE3DtCBow6xuaCBnaeG6o20gZGV2aWFuY2UgxJHDoW5nIGvhu4Mg4oaSIHBow7kgaOG7o3AgdOG7kXQuDQotIEFJQyA9IDEzMTguMg0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpDw7MgKipi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBt4bqhbmgqKiBjaG8gdGjhuqV5IG5nxrDhu51pIHPhu5FuZyDhu58gKipraHUgduG7sWMgdGjDoG5oIHRo4buLKiogY8OzIHjDoWMgc3XhuqV0ICoqdGjhuqVwIGjGoW4qKiDEkeG7gyBo4buNYyB0csaw4budbmcga2nhu4NtIMSR4buLbmggbG/huqFpIEEuIMSQaeG7gXUgbsOgeSBn4bujaSDDvSBt4buRaSBsacOqbiBo4buHIHRp4buBbSBuxINuZyBnaeG7r2EgxJFp4buBdSBraeG7h24gxJHhu4thIGzDvSB2w6AgdGnhur9wIGPhuq1uIGdpw6FvIGThu6VjIGNo4bqldCBsxrDhu6NuZy4NCg0KDQojIyMjICoqMS4yLjIgc2Nob29sX2FjY3JlZGl0YXRpb24qKg0KDQoNCmBgYHtyfQ0KcmVnbG9naXRfU1BTIDwtIGdsbSggc2Nob29sX2FjY3JlZGl0YXRpb24gfiBwYXJlbnRfd2FzX2luX2NvbGxlZ2UsIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ2xvZ2l0JykpDQpzdW1tYXJ5KHJlZ2xvZ2l0X1NQUykNCmBgYA0KDQpIw6BtIGjhu5NpIHF1eSBjw7MgZOG6oW5nOg0KDQokJA0KXGxvZ1xsZWZ0KFxmcmFje1xoYXR7XHBpfX17MSAtIFxoYXR7XHBpfX1ccmlnaHQpID0gLTEuMTIxMCArIDIuMzM1OCBcY2RvdCBcdGV4dHtwYXJlbnRcX3dhc1xfaW5cX2NvbGxlZ2V9X3tcdGV4dHtUUlVFfX0NCiQkDQoNCioqS+G6v3QgcXXhuqM6KioNCg0KfCBCaeG6v24gICAgICAgICAgICAgICAgICAgICAgIHwgRXN0aW1hdGUgfCBTdGQuIEVycm9yIHwgei12YWx1ZSB8IHAtdmFsdWUgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfA0KfCAoSW50ZXJjZXB0KSAgICAgICAgICAgICAgICB8IC0xLjEyMTAgIHwgMC4xMDYwICAgICAgfCAtMTAuNTcgIHwgPCAyZS0xNiAqKiogfA0KfCBwYXJlbnRfd2FzX2luX2NvbGxlZ2VUUlVFIHwgIDIuMzM1OCAgfCAwLjE0ODggICAgICB8IDE1LjcwICAgfCA8IDJlLTE2ICoqKiB8DQoNCioqRGnhu4VuIGdp4bqjaToqKg0KDQotIEjhu4cgc+G7kSBkxrDGoW5nIGNobyB0aOG6pXkgbmfGsOG7nWkgY8OzIGNoYSBt4bq5IHThu6tuZyBo4buNYyDEkeG6oWkgaOG7jWMgY8OzICoqeMOhYyBzdeG6pXQgY2FvIGjGoW4gcsO1IHLhu4d0KiogxJHhu4MgaOG7jWMgdHLGsOG7nW5nIGxv4bqhaSBBLg0KDQotIEvhur90IHF14bqjIG7DoHkgKipjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IG3huqFuaCoqIChwLXZhbHVlIDwgMC4wMDEpLg0KDQoqKsSQ4buZIHBow7kgaOG7o3AgbcO0IGjDrG5oOioqDQoNCi0gTnVsbCBkZXZpYW5jZTogMTM4NC45IA0KDQotIFJlc2lkdWFsIGRldmlhbmNlOiAxMDk0LjggDQoNCi0gQUlDID0gMTA5OC44IOKGkiBtw7QgaMOsbmggcGjDuSBo4bujcCB04buRdC4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KQ2hhIG3hurkgdOG7q25nIGjhu41jIMSR4bqhaSBo4buNYyBsw6AgbeG7mXQgKip54bq/dSB04buRIHF1YW4gdHLhu41uZyoqIOG6o25oIGjGsOG7n25nIHTDrWNoIGPhu7FjIMSR4bq/biBraOG6oyBuxINuZyBo4buNYyB04bqhaSB0csaw4budbmcga2nhu4NtIMSR4buLbmggbG/huqFpIEEuDQoNCg0KIyMjICoqMS4zIE3DtCBow6xuaCBQcm9iaXQqKg0KDQojIyMjICoqMS4zLjEgc2Nob29sX2FjY3JlZGl0YXRpb24qKg0KDQpgYGB7cn0NCnJlZ3Byb2JpdF9TUiA8LSBnbG0oIHNjaG9vbF9hY2NyZWRpdGF0aW9uIH4gcmVzaWRlbmNlLCBkYXRhID0gZGF0YSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdwcm9iaXQnKSkNCnN1bW1hcnkocmVncHJvYml0X1NSKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCiMjICoqUGjhuqduIDI6IEjhu5NpIHF1eSBi4buZaSoqDQoNCiMjIyAqKjIuMSBNw7QgaMOsbmggTG9naXQqKg0KDQpgYGB7cn0NCmxvZ2lzdGljX21vZGVsX21sZSA8LSBnbG0od2lsbF9nb190b19jb2xsZWdlIH4gLiwgZGF0YSA9IGRhdGEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCnN1bW1hcnkobG9naXN0aWNfbW9kZWxfbWxlKQ0KYGBgDQoNCg0KKioxLiDEkMOhbmggZ2nDoSBU4buVbmcgdGjhu4MgTcO0IGjDrG5oKioNCg0KLSDEkOG7mSBwaMO5IGjhu6NwOiBNw7QgaMOsbmggduG6q24gcuG6pXQgdOG7kXQuIFJlc2lkdWFsIGRldmlhbmNlICg2ODguOSkgdGjhuqVwIGjGoW4gbmhp4buBdSBzbyB24bubaSBOdWxsIGRldmlhbmNlICgxMzg2LjMpLCBjaG8gdGjhuqV5IGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCBnaeG6o2kgdGjDrWNoIMSRxrDhu6NjIG3hu5l0IHBo4bqnbiBs4bubbiBz4buxIHRoYXkgxJHhu5VpIHRyb25nIHF1eeG6v3QgxJHhu4tuaCB2w6BvIMSR4bqhaSBo4buNYyBj4bunYSBzaW5oIHZpw6puLg0KDQotIEFJQzogR2nDoSB0cuG7iyBBSUMgbMOgIDcyMi45LiDEkMOieSBsw6AgbeG7mXQgY2jhu4kgc+G7kSB04buRdCDEkeG7gyBzbyBzw6FuaCB24bubaSBjw6FjIG3DtCBow6xuaCBraMOhYyAodsOtIGThu6UsIG7hur91IGLhuqFuIHRow6ptIGhv4bq3YyBi4bubdCBiaeG6v24pLg0KDQotIFPhu7Eg4buVbiDEkeG7i25oOiBDw6FjIGdpw6EgdHLhu4sgU3RhbmRhcmQgRXJyb3IgKFNhaSBz4buRIGNodeG6qW4pIGPhu6dhIGPDoWMgaOG7hyBz4buRIGdp4budIMSRw6J5IMSR4buBdSBo4bujcCBsw70sIGtow7RuZyBjw7JuIGPDoWMgY29uIHPhu5Ega2jhu5VuZyBs4buTIG5oxrAgdHLGsOG7m2MuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDoWMgxrDhu5tjIGzGsOG7o25nIChFc3RpbWF0ZSkgxJHDoyDhu5VuIMSR4buLbmggdsOgIMSRw6FuZyB0aW4gY+G6rXkgaMahbi4NCg0KKioyLiBQaMOibiB0w61jaCBDaGkgdGnhur90IGPDoWMgSOG7hyBz4buRICjGr+G7m2MgbMaw4bujbmcgTUxFKSoqDQoNCi0gKioqcmVzaWRlbmNlVXJiYW4gKE7GoWkg4bufOiDEkMO0IHRo4buLKToqKioNCg0KSOG7hyBz4buROiArMi44NC4gxJDDonkgduG6q24gbMOgIHnhur91IHThu5EgZOG7sSBiw6FvIGPhu7FjIGvhu7MgbeG6oW5oLg0KUGjDom4gdMOtY2g6IFNpbmggdmnDqm4gc+G7kW5nIOG7nyB0aMOgbmggdGjhu4sgY8OzIGto4bqjIG7Eg25nIHbDoG8gxJHhuqFpIGjhu41jIGNhbyBoxqFuIHLhuqV0IG5oaeG7gXUgc28gduG7m2kgc2luaCB2acOqbiDhu58gbsO0bmcgdGjDtG4uDQpU4bu3IGzhu4cgb2RkczogZXhwKDIuODQpIOKJiCAxNy4xLiBPZGRzIGPhu6dhIG3hu5l0IHNpbmggdmnDqm4gdGjDoG5oIHRo4buLIHbDoG8gxJHhuqFpIGjhu41jIGNhbyBoxqFuIGfhuqVwIDE3LjEgbOG6p24gc28gduG7m2kgc2luaCB2acOqbiBuw7RuZyB0aMO0biwga2hpIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLg0KIA0KLSAqKiogcGFyZW50X3NhbGFyeSAoTMawxqFuZyBj4bunYSBjaGEgbeG6uSk6KioqIA0KUGjDom4gdMOtY2g6IFNvIHbhu5tpIG3hu6ljIGzGsMahbmcgImFkZXF1YXRlIiAoxJHhuqd5IMSR4bunKSwgdGh1IG5o4bqtcCBj4bunYSBjaGEgbeG6uSBsw6AgeeG6v3UgdOG7kSBxdXnhur90IMSR4buLbmguDQoNCmF2ZXJhZ2UgKFRydW5nIGLDrG5oKTogSOG7hyBz4buRIC0xLjk2LiBPZGRzIHbDoG8gxJHhuqFpIGjhu41jIHRo4bqlcCBoxqFuIDEgLSBleHAoLTEuOTYpIOKJiCA4NiUuDQoNCmhpZ2ggKENhbyk6IEjhu4cgc+G7kSArMy4xNS4gT2RkcyB2w6BvIMSR4bqhaSBo4buNYyBjYW8gaMahbiBn4bqlcCBleHAoMy4xNSkg4omIIDIzLjMgbOG6p24uDQoNCmxvdyAoVGjhuqVwKTogSOG7hyBz4buRIC01LjAzLiBPZGRzIHbDoG8gxJHhuqFpIGjhu41jIGdp4bqjbSBj4buxYyBt4bqhbmgsIGfhuqduIG5oxrAgYuG6sW5nIDAuDQoNCi0gKioqaG91c2VfYXJlYSAoRGnhu4duIHTDrWNoIG5ow6ApOioqKg0KDQpQaMOibiB0w61jaDogU28gduG7m2kgbmjDoCAiTGFyZ2UiIChs4bubbiksIGRp4buHbiB0w61jaCBuaMOgIG5o4buPIGjGoW4gbMOgbSBnaeG6o20ga2jhuqMgbsSDbmcgdsOgbyDEkeG6oWkgaOG7jWMuDQoNCk1lZGl1bSAoVHJ1bmcgYsOsbmgpOiBI4buHIHPhu5EgLTEuNjEuIE9kZHMgdGjhuqVwIGjGoW4ga2hv4bqjbmcgODAlLg0KDQpTbWFsbCAoTmjhu48pOiBI4buHIHPhu5EgLTMuMTYuIE9kZHMgdGjhuqVwIGjGoW4ga2hv4bqjbmcgOTUuNyUuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGRp4buHbiB0w61jaCBuaMOgIChjw7MgdGjhu4MgbMOgIG3hu5l0IGNo4buJIGLDoW8gY2hvIHTDrG5oIHRy4bqhbmcga2luaCB04bq/IHjDoyBo4buZaSkgbMOgIG3hu5l0IHnhur91IHThu5EgcuG6pXQgcXVhbiB0cuG7jW5nLg0KDQotICoqKmF2ZXJhZ2VfZ3JhZGVzICjEkGnhu4NtIHRydW5nIGLDrG5oKToqKioNClBow6JuIHTDrWNoOiBTbyB24bubaSDEkWnhu4NtICJFeGNlbGxlbnQiICh4deG6pXQgc+G6r2MpLCDEkWnhu4NtIHRo4bqlcCBoxqFuIGzDoCBt4buZdCByw6BvIGPhuqNuIGzhu5tuLg0KDQpGYWlyIChLaMOhKTogSOG7hyBz4buRIC01LjczLg0KDQpHb29kIChU4buRdCk6IEjhu4cgc+G7kSAtNC41Ni4NCg0KQ+G6oyBoYWkgxJHhu4F1IGzDoG0gZ2nhuqNtIGPGoSBo4buZaSB2w6BvIMSR4bqhaSBo4buNYyBt4buZdCBjw6FjaCDEkcOhbmcga+G7gywgY2hvIHRo4bqleSBr4bq/dCBxdeG6oyBo4buNYyB04bqtcCBsw6AgeeG6v3UgdOG7kSB0acOqbiBxdXnhur90Lg0KDQotICoqKmludGVyZXN0IChN4bupYyDEkeG7mSBxdWFuIHTDom0pOioqKg0KDQpQaMOibiB0w61jaDogVuG6pW4gxJHhu4EgbOG6oSB24bqrbiBjw7JuIHThu5NuIHThuqFpLiBTbyB24bubaSBt4bupYyBjxqEgc+G7nyAiSW50ZXJlc3RlZCIgKFF1YW4gdMOibSksIGPDoWMgbeG7qWMgxJHhu5kga2jDoWMgxJHhu4F1IGzDoG0gdMSDbmcga2jhuqMgbsSDbmcgdsOgbyDEkeG6oWkgaOG7jWMuDQoNCk5vdCBJbnRlcmVzdGVkIChLaMO0bmcgcXVhbiB0w6JtKTogSOG7hyBz4buRICsyLjI5Lg0KDQpVbmNlcnRhaW4gKEtow7RuZyBjaOG6r2MgY2jhuq9uKTogSOG7hyBz4buRICsxLjg5Lg0KDQpWZXJ5IEludGVyZXN0ZWQgKFLhuqV0IHF1YW4gdMOibSk6IEjhu4cgc+G7kSArMS43NS4NCg0KLSAqKipzY2hvb2xfYWNjcmVkaXRhdGlvbkIgKEtp4buDbSDEkeG7i25oIHRyxrDhu51uZzogQik6KioqDQpI4buHIHPhu5E6IC0wLjcxIChwLXZhbHVlID0gMC4wMDM1ICoqKS4NCg0KUGjDom4gdMOtY2g6IFNvIHbhu5tpIHRyxrDhu51uZyBsb+G6oWkgQSwgaOG7jWMg4bufIHRyxrDhu51uZyDEkcaw4bujYyBraeG7g20gxJHhu4tuaCBsb+G6oWkgQiBsw6BtIGdp4bqjbSBraOG6oyBuxINuZyB2w6BvIMSR4bqhaSBo4buNYy4NCg0KVOG7tyBs4buHIG9kZHM6IGV4cCgtMC43MSkg4omIIDAuNDkuIE9kZHMgY+G7p2Egc2luaCB2acOqbiB0csaw4budbmcgQiBjaOG7iSBi4bqxbmcga2hv4bqjbmcgbeG7mXQgbuG7rWEgKDQ5JSkgc28gduG7m2kgc2luaCB2acOqbiB0csaw4budbmcgQS4NCg0KLSAqKipwYXJlbnRfd2FzX2luX2NvbGxlZ2VUUlVFIChDaGEgbeG6uSDEkcOjIGjhu41jIMSR4bqhaSBo4buNYyk6KioqIEjhu4cgc+G7kTogKzAuNjkgKHAtdmFsdWUgPSAwLjAyMTcgKikuDQoNClBow6JuIHTDrWNoOiBZ4bq/dSB04buRIG7DoHkgduG6q24gY8OzIMO9IG5naMSpYS4gTuG7gW4gdOG6o25nIGdpw6FvIGThu6VjIGPhu6dhIGdpYSDEkcOsbmggY8OzIOG6o25oIGjGsOG7n25nIHTDrWNoIGPhu7FjLg0KDQpU4bu3IGzhu4cgb2RkczogZXhwKDAuNjkpIOKJiCAyLjAuIE9kZHMgdsOgbyDEkeG6oWkgaOG7jWMgY+G7p2Egc2luaCB2acOqbiBjw7MgY2hhIG3hurkgdOG7q25nIGjhu41jIMSR4bqhaSBo4buNYyBjYW8gaMahbiBn4bqlcCDEkcO0aSBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGtow6FjLg0KDQojIyMgKioyLjIgTcO0IGjDrG5oIFByb2JpdCoqDQoNCg0KYGBge3J9DQpsb2dpc3RpY19tb2RlbF9wcm9iaXQgPC0gZ2xtKHdpbGxfZ29fdG9fY29sbGVnZSB+IC4sIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpKQ0Kc3VtbWFyeShsb2dpc3RpY19tb2RlbF9wcm9iaXQpDQpgYGANCg0KDQoqKkPDoWMgeeG6v3UgdOG7kSBjw7Mg4bqjbmggaMaw4bufbmcgbeG6oW5oIG5o4bqldCAocC12YWx1ZSApOioqDQoNCi0gKioqcmVzaWRlbmNlVXJiYW4gKE7GoWkg4bufOiDEkMO0IHRo4buLKToqKioNCg0KSOG7hyBz4buROiArMS42MzAuIEjhu4cgc+G7kSBkxrDGoW5nIHLhuqV0IGzhu5tuIGNobyB0aOG6pXkgc+G7kW5nIOG7nyB0aMOgbmggdGjhu4sgbMOgbSB0xINuZyBt4bqhbmggWi1zY29yZSwgdsOgIGRvIMSRw7MgbMOgbSB0xINuZyBt4bqhbmggeMOhYyBzdeG6pXQgdsOgbyDEkeG6oWkgaOG7jWMgc28gduG7m2kg4bufIG7DtG5nIHRow7RuLg0KDQotICoqcGFyZW50X3NhbGFyeSAoTMawxqFuZyBjaGEgbeG6uSk6KioNCmhpZ2ggKENhbyk6IEjhu4cgc+G7kSArMS44NjYuIFTDoWMgxJHhu5luZyB0w61jaCBj4buxYyB2w6AgbeG6oW5oIG5o4bqldC4NCg0KYXZlcmFnZSAoVHJ1bmcgYsOsbmgpOiBI4buHIHPhu5EgLTEuMTM5LiBUw6FjIMSR4buZbmcgdGnDqnUgY+G7sWMgbeG6oW5oLg0KbG93IChUaOG6pXApOiBI4buHIHPhu5EgLTIuODI4LiBUw6FjIMSR4buZbmcgdGnDqnUgY+G7sWMgbeG6oW5oIG5o4bqldCwgZ+G6p24gbmjGsCBsb+G6oWkgYuG7jyBjxqEgaOG7mWkgdsOgbyDEkeG6oWkgaOG7jWMuDQoNCi0gKioqaG91c2VfYXJlYSAoRGnhu4duIHTDrWNoIG5ow6ApOioqKg0KDQpNZWRpdW0gdsOgIFNtYWxsOiBD4bqjIGhhaSDEkeG7gXUgY8OzIGjhu4cgc+G7kSDDom0gKC0wLjkzNyB2w6AgLTEuODExKSwgY2hvIHRo4bqleSBjaMO6bmcgbMOgbSBnaeG6o20gxJHDoW5nIGvhu4MgeMOhYyBzdeG6pXQgdsOgbyDEkeG6oWkgaOG7jWMgc28gduG7m2kgbmjDoCAiTGFyZ2UiLg0KDQotICoqKmF2ZXJhZ2VfZ3JhZGVzICjEkGnhu4NtIHRydW5nIGLDrG5oKToqKioNCkZhaXIgdsOgIEdvb2Q6IEPhuqMgaGFpIMSR4buBdSBjw7MgaOG7hyBz4buRIMOibSBy4bqldCBs4bubbiAoLTIuOTI0IHbDoCAtMi4yNTQpLCBraOG6s25nIMSR4buLbmggcuG6sW5nIHZp4buHYyBraMO0bmcgxJHhuqF0IMSRaeG7g20gIkV4Y2VsbGVudCIgbMOgIG3hu5l0IHLDoG8gY+G6o24gY+G7sWMgbOG7m24uDQoNCi0gKioqaW50ZXJlc3QgKE3hu6ljIMSR4buZIHF1YW4gdMOibSk6KioqDQpW4bqlbiDEkeG7gSB24bqrbiBjw7JuIMSRw7M6IEdp4buRbmcgaOG7h3QgbcO0IGjDrG5oIExvZ2l0LCB04bqldCBj4bqjIGPDoWMgbeG7qWMgxJHhu5kgcXVhbiB0w6JtIGtow6FjIMSR4buBdSBjw7MgaOG7hyBz4buRIGTGsMahbmcgc28gduG7m2kgbeG7qWMgY8ahIHPhu58gIkludGVyZXN0ZWQiLiBOb3QgSW50ZXJlc3RlZCAoKzEuMzIxKSB0aOG6rW0gY2jDrSBjw7JuIGPDsyBo4buHIHPhu5EgY2FvIGjGoW4gVmVyeSBJbnRlcmVzdGVkICgrMS4wNDQpLiDEkGnhu4F1IG7DoHkgdGnhur9wIHThu6VjIGzDoCBt4buZdCBj4bqjbmggYsOhbyDEkeG7jyB24buBIGJp4bq/biBuw6B5Lg0KDQoqKkPDoWMgeeG6v3UgdOG7kSBjw7Mg4bqjbmggaMaw4bufbmcgY8OzIMO9IG5naMSpYSAocC12YWx1ZSk6KioNCg0KLSAqKipzY2hvb2xfYWNjcmVkaXRhdGlvbkIgKEtp4buDbSDEkeG7i25oIHRyxrDhu51uZzogQik6KioqDQpI4buHIHPhu5E6IC0wLjM2MyAocC12YWx1ZSAqKikuIFZp4buHYyBo4buNYyDhu58gdHLGsOG7nW5nIGxv4bqhaSBCIGzDoG0gZ2nhuqNtIHjDoWMgc3XhuqV0IHbDoG8gxJHhuqFpIGjhu41jIHNvIHbhu5tpIHRyxrDhu51uZyBsb+G6oWkgQS4NCg0KLSAqKipwYXJlbnRfd2FzX2luX2NvbGxlZ2VUUlVFIChDaGEgbeG6uSDEkcOjIGjhu41jIMSR4bqhaSBo4buNYyk6KioqDQpI4buHIHPhu5E6ICswLjM3MiAocC12YWx1ZSAqKS4gTuG7gW4gdOG6o25nIGdpw6FvIGThu6VjIGdpYSDEkcOsbmggY8OzIHTDoWMgxJHhu5luZyB0w61jaCBj4buxYy4NCg0KIyMjICoqMi4gMyBTbyBzw6FuaCBUcuG7sWMgcXVhbiBoYWkgTcO0IGjDrG5oKioNCg0KDQoNCg0KYGBge3J9DQojIEzhuqV5IGhp4buHdSDhu6luZyBk4buxIMSRb8OhbiB04burIGPhuqMgaGFpIG3DtCBow6xuaA0KbGlicmFyeShnZ2VmZmVjdHMpDQpwcmVkX2xvZ2l0IDwtIGdncHJlZGljdChsb2dpc3RpY19tb2RlbF9tbGUsIHRlcm1zID0gInJlc2lkZW5jZSIpDQpwcmVkX3Byb2JpdCA8LSBnZ3ByZWRpY3QobG9naXN0aWNfbW9kZWxfcHJvYml0LCB0ZXJtcyA9ICJyZXNpZGVuY2UiKQ0KDQojIFRow6ptIGPhu5l0IMSR4buDIHjDoWMgxJHhu4tuaCBtw7QgaMOsbmgNCnByZWRfbG9naXQkbW9kZWwgPC0gIkxvZ2l0Ig0KcHJlZF9wcm9iaXQkbW9kZWwgPC0gIlByb2JpdCINCg0KDQojIEfhu5lwIGThu68gbGnhu4d1IHbDoCB24bq9DQpjb21iaW5lZF9wcmVkcyA8LSByYmluZChwcmVkX2xvZ2l0LCBwcmVkX3Byb2JpdCkNCg0KIyBU4bqhbyBt4buZdCBiaeG6v24gcG9zaXRpb25fZG9kZ2UgxJHhu4MgZMO5bmcgY2h1bmcNCmxpYnJhcnkoZ2dwbG90MikNCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4yKSAjIEtob+G6o25nIGPDoWNoIMSR4buDIHTDoWNoIGPDoWMgxJHGsOG7nW5nDQoNCmdncGxvdChjb21iaW5lZF9wcmVkcywgYWVzKHggPSB4LCB5ID0gcHJlZGljdGVkLCBjb2xvdXIgPSBtb2RlbCwgZ3JvdXAgPSBtb2RlbCkpICsNCiAgIyBW4bq9IMSRxrDhu51uZyBu4buRaSBjw6FjIMSRaeG7g20sIMOhcCBk4bulbmcgZG9kZ2UNCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEuMiwgcG9zaXRpb24gPSBkb2RnZSkgKw0KICAjIFbhur0gxJFp4buDbSDEkeG7gyBuaOG6pW4gbeG6oW5oLCDDoXAgZOG7pW5nIGRvZGdlDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIHBvc2l0aW9uID0gZG9kZ2UpICsNCiAgIyBW4bq9IGThuqNpIHRpbiBj4bqteSBkxrDhu5tpIGThuqFuZyB0aGFuaCBs4buXaSAoZXJyb3IgYmFyKSDEkeG7gyBk4buFIG5ow6xuIGjGoW4ga2hpIGRvZGdlDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCksIHdpZHRoID0gMC4xLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiU28gc8OhbmggWMOhYyBzdeG6pXQgROG7sSDEkW/DoW4gZ2nhu69hIE3DtCBow6xuaCBMb2dpdCB2w6AgUHJvYml0IiwNCiAgICBzdWJ0aXRsZSA9ICJIaeG7h3Ug4bupbmcgY+G7p2EgTMawxqFuZyBDaGEgTeG6uSAoxJHDoyB0w6FjaCBuaOG6uSDEkeG7gyBk4buFIG5ow6xuKSIsDQogICAgeSA9ICJYw6FjIHN14bqldCB2w6BvIMSQ4bqhaSBo4buNYyAoROG7sSDEkW/DoW4pIiwNCiAgICB4ID0gIk7GoWkgc2luaCBz4buRbmciLA0KICAgIGNvbG91ciA9ICJNw7QgaMOsbmgiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB5bGltKDAsIDEpICMgxJDhuqNtIGLhuqNvIHRy4bulYyB5IGNo4bqheSB04burIDAgxJHhur9uIDENCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCiMgKipXNSoqDQoNCiMjICoqUEjhuqZOIDE6ICB3aWxsX2dvX3RvX2NvbGxlZ2UtcGFyZW50X3dhc19pbl9jb2xsZWdlKioNCg0KIyMjICoqMS4xIELhuqNuZyB0deG6p24gc+G7kSBjaMOpbyoqDQoNCmBgYHtyfQ0KdGFibGVfV1AgPC0gdGFibGUoZGF0YSR3aWxsX2dvX3RvX2NvbGxlZ2UsZGF0YSRwYXJlbnRfd2FzX2luX2NvbGxlZ2UpDQoNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmthYmxlKHRhYmxlX1dQLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDEuMSBU4bqnbiBz4buRIHRoZW8gcXV54bq/dCDEkeG7i25oIHRoZW8gaOG7jWMgY2FvIMSR4bqzbmcgdsOgIG5nxrDhu51pIGdpw6FtIGjhu5kgdGhlbyBo4buNYyBjYW8gxJHhurNuZyIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCBmdWxsX3dpZHRoID0gRikNCmBgYA0KDQoNCkLhuqNuZyB04bqnbiBz4buRIGNobyB0aOG6pXkgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgY8OzIHh1IGjGsOG7m25nIHF1eeG6v3QgxJHhu4tuaCB0aGVvIGjhu41jIGNhbyDEkeG6s25nIGNhbyBoxqFuIHNvIHbhu5tpIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kga2jDtG5nIGjhu41jIGNhbyDEkeG6s25nLiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmggdmFpIHRyw7IgcXVhbiB0cuG7jW5nIGPhu6dhIG7hu4FuIHThuqNuZyBo4buNYyB24bqlbiBuZ8aw4budaSBnacOhbSBo4buZIHRyb25nIHZp4buHYyDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIGjhu41jIHThuq1wIGPhu6dhIGNvbiBlbSBtw6xuaC4NCg0KIyMjICoqMS4yIFRy4buxYyBxdWFuIGhvw6EqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmRmX1dQIDwtIGFzLmRhdGEuZnJhbWUodGFibGVfV1ApDQpjb2xuYW1lcyhkZl9XUCkgPC0gYygiRGVjaXNpb24iLCAiUGFyZW50Q29sbGVnZSIsICJDb3VudCIpDQpnZ3Bsb3QoZGZfV1AsIGFlcyh4ID0gUGFyZW50Q29sbGVnZSwgeSA9IENvdW50LCBmaWxsID0gRGVjaXNpb24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKSArDQogIGxhYnMoDQogICAgeCA9ICJOZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyIsDQogICAgeSA9ICJT4buRIGzGsOG7o25nIGjhu41jIHNpbmgiLA0KICAgIGZpbGwgPSAiUXV54bq/dCDEkeG7i25oIGjhu41jIGNhbyDEkeG6s25nIiwNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgMS4xOiBU4bqnbiBz4buRIGjhu41jIHNpbmggdGhlbyBxdXnhur90IMSR4buLbmggaOG7jWMgY2FvIMSR4bqzbmcgdsOgIG5nxrDhu51pIGdpw6FtIGjhu5kgaOG7jWMgY2FvIMSR4bqzbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKk5I4bqsTiBYw4lUOioqDQoNCi0gQmnhu4N1IMSR4buTIHbDoCAgQuG6o25nIDEuMSBjaG8gdGjhuqV5IOG6o25oIGjGsOG7n25nIHLDtSBy4buHdCBj4bunYSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gbmfGsOG7nWkgZ2nDoW0gaOG7mSDEkeG6v24gcXV54bq/dCDEkeG7i25oIGjhu41jIGNhbyDEkeG6s25nIGPhu6dhIGjhu41jIHNpbmguIOG7niBuaMOzbSBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcsIHPhu5EgaOG7jWMgc2luaCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIChZRVMpIGzDoCAyNzIsIGNhbyBoxqFuIG5ow7NtIGtow7RuZyBo4buNYyAoTk8pIGzDoCAyNDguIE5nxrDhu6NjIGzhuqFpLCB24bubaSBuaMOzbSBraMO0bmcgY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nLCBz4buRIGjhu41jIHNpbmgga2jDtG5nIGjhu41jIGNhbyDEkeG6s25nIGzhuqFpIGNhbyBoxqFuICgyNTIgc28gduG7m2kgMjI4KS4NCg0KLSBT4buxIGtow6FjIGJp4buHdCBuw6B5IHBo4bqjbiDDoW5oIHh1IGjGsOG7m25nOiBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBjw7MgeHUgaMaw4bubbmcgY2jhu41uIGjhu41jIHRp4bq/cCBjYW8gaMahbi4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPhu6dhIG5nxrDhu51pIGdpw6FtIGjhu5kgY8OzIHRo4buDIMSRw7NuZyB2YWkgdHLDsiB0w61jaCBj4buxYyB0cm9uZyB2aeG7h2MgxJHhu4tuaCBoxrDhu5tuZyBo4buNYyB04bqtcCBjaG8gaOG7jWMgc2luaCwgbMOgIHnhur91IHThu5EgxJHDoW5nIGPDom4gbmjhuq9jIHRyb25nIGPDoWMgY2jDrW5oIHPDoWNoIGtodXnhur9uIGjhu41jIHbDoCBo4buXIHRy4bujIGdpw6FvIGThu6VjLg0KDQojIyMgKioxLjMgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6oqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXDsgIFx0ZXh0e3Ryw6xuaCDEkeG7mSBo4buNYyB24bqlbiBj4bunYSBuZ8aw4budaSBnacOhbSBo4buZIHbDoCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGPhu6dhIGjhu41jIHNpbmggxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUgfSBcXCANCkhfMTogXDsgIFx0ZXh0e3Ryw6xuaCDEkeG7mSBo4buNYyB24bqlbiBj4bunYSBuZ8aw4budaSBnacOhbSBo4buZIHbDoCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGPhu6dhIGjhu41jIHNpbmggY8OzIGxpw6puIHF1YW4gxJHhur9uIG5oYXV9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0LiQkDQoNClRhIHRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIHbDoCDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KYGBge3J9DQpjaGlXUCA8LSBjaGlzcS50ZXN0KHRhYmxlX1dQKQ0KcHJpbnQoY2hpV1ApDQpgYGANCioqTkjhuqxOIFjDiVQ6KioNCg0KVuG7m2kgYsOgaSB0b8OhbiBraeG7g20gxJHhu4tuaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2EgbmfGsOG7nWkgZ2nDoW0gaOG7mSB2w6AgcXV54bq/dCDEkeG7i25oIGjhu41jIHRp4bq/cCBjYW8gxJHhurNuZyBj4bunYSBo4buNYyBzaW5oLCB0YSBz4butIGThu6VuZyBraeG7g20gxJHhu4tuaCBDaGktc3F1YXJlZCB24bubaSBoaeG7h3UgY2jhu4luaCBZYXRlcy4gS+G6v3QgcXXhuqMgY2hvIHRo4bqleSB0aOG7kW5nIGvDqiAkXGNoaV4yID0gMi4xMTk0JCB24bubaSAxIGLhuq1jIHThu7EgZG8gdsOgIHAtdmFsdWUgPSAwLjE0NTQsIGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIDUlLg0KDQpEbyDEkcOzLCBraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gxJBp4buBdSBuw6B5IMSR4buTbmcgbmdoxKlhIHbhu5tpIHZp4buHYyBjaMawYSB0aOG7gyBraOG6s25nIMSR4buLbmggY8OzIG3hu5FpIGxpw6puIGjhu4cgcsO1IHLDoG5nIGdp4buvYSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2EgbmfGsOG7nWkgZ2nDoW0gaOG7mSB2w6AgcXV54bq/dCDEkeG7i25oIGjhu41jIHRp4bq/cCBj4bunYSBo4buNYyBzaW5oIHRyb25nIHThu5VuZyB0aOG7gy4gTeG6t2MgZMO5IGPDsyBz4buxIGNow6puaCBs4buHY2ggbmjhurkgduG7gSB04bqnbiBz4buRIHRyb25nIGLhuqNuZywgbmjGsG5nIHjDqXQgdHLDqm4ga2jDrWEgY+G6oW5oIHRo4buRbmcga8OqLCBz4buxIGtow6FjIGJp4buHdCBuw6B5IGNoxrBhIMSR4bunIMO9IG5naMSpYSDEkeG7gyByw7p0IHJhIGvhur90IGx14bqtbiBjaOG6r2MgY2jhuq9uLiBDw6FjIHnhur91IHThu5Ega2jDoWMgY8OzIHRo4buDIMSRYW5nIMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgaMahbiB0cm9uZyBxdXnhur90IMSR4buLbmggaOG7jWMgdOG6rXAgY+G7p2EgaOG7jWMgc2luaC4NCg0KIyMjICoqMS40IEhp4buHdSBoYWkgdOG7tyBs4buHKioNCg0KKipUaGnhur90IGzhuq1wIHThu7cgbOG7hyoqDQoNClThu7cgbOG7hyBo4buNYyBzaW5oIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSBo4buNYyBjYW8gxJHhurNuZzoNCg0KDQokJA0KcF8xID0gUChcdGV4dHtwYXJlbnRzX3dhc19pbl9jb2xsZWdlfSA9IFRSVUUgXG1pZCBcdGV4dHt3aWxsX2dvX3RvX2NvbGxlZ2V9ID0gWUVTKQ0KJCQNClThu7cgbOG7hyBo4buNYyBzaW5oIGtow7RuZyBxdXnhur90IMSR4buLbmggaOG7jWMgY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgaOG7jWMgY2FvIMSR4bqzbmc6DQoNCiQkDQpwXzEgPSBQKFx0ZXh0e3BhcmVudHNfd2FzX2luX2NvbGxlZ2V9ID0gVFJVRSBcbWlkIFx0ZXh0e3dpbGxfZ29fdG9fY29sbGVnZX0gPSBOTykNCiQkDQpIaeG7h3UgY2jDqm5oIGzhu4djaCBnaeG7r2EgaGFpIHThu7cgbOG7hzoNCg0KJCQNCmQgPSBwXzEgLSBwXzINCiQkDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotICoqR2nhuqMgdGh1eeG6v3QgSOKCgCoqOiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgdOG7tyBs4buHICANCiAgJCQgSF8wOiBwXzEgLSBwXzIgPSAwJCQNCg0KLSAqKkdp4bqjIHRodXnhur90IEgxKSoqOiBU4bu3IGzhu4cgaOG7jWMgc2luaCBxdXnhur90IMSR4buLbmggaOG7jWMgY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgaOG7jWMgY2FvIMSR4bqzbmcgdGjhuqVwIGjGoW4gVOG7tyBs4buHIGjhu41jIHNpbmgga2jDtG5nIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSBo4buNYyBjYW8gxJHhurNuZzogJEhfMTogcF8xIC0gcF8yIDwgMCQNCiAgDQoNCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIHF1eeG6v3QgxJHhu4tuaCBo4buNYyB0aeG6v3AgY2FvIMSR4bqzbmcgduG7m2kgYuG7kSBt4bq5IHRoZW8gaOG7jWMgY2FvIMSR4bqzbmcNCmxpYnJhcnkoc3RhdHMpDQoNCnRlc3RXUCA8LSBwcm9wLnRlc3QoeCA9IGModGFibGVfV1BbIllFUyIsIlRSVUUiXSwgdGFibGVfV1BbIk5PIiwiVFJVRSJdKSwNCiAgICAgICAgICAgICAgICAgICAgICBuID0gYyhzdW0odGFibGVfV1BbIllFUyIsXSksIHN1bSh0YWJsZV9XUFsiTk8iLF0pKSwNCiAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgY29ycmVjdCA9IEZBTFNFKQ0KcHJpbnQodGVzdFdQKQ0KYGBgDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBoYWkgdOG7tyBs4buHIGNobyB0aOG6pXkgJFxjaGleMiA9IDIuMzA3NyQsIHbhu5tpIHAtdmFsdWUgPSAwLjkzNTYsIGzhu5tuIGjGoW4gbmhp4buBdSBzbyB24bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNS4gRG8gxJHDsywgdGEga2jDtG5nIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJCwgdOG7qWMgbMOgIGtow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyB04bu3IGzhu4cgaOG7jWMgc2luaCBxdXnhur90IMSR4buLbmggaOG7jWMgY2FvIMSR4bqzbmcgY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIHRo4bqlcCBoxqFuIG5ow7NtIGPDsm4gbOG6oWkuIE5nxrDhu6NjIGzhuqFpLCDGsOG7m2MgbMaw4bujbmcgbeG6q3UgbOG6oWkgY2hvIHRo4bqleSB04bu3IGzhu4cgbsOgeSBjYW8gaMahbiBt4buZdCBjaMO6dCAoMC41NDQgPiAwLjQ5NiksIGTDuSBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gaGnhu4d1IHPhu5EgdOG7tyBs4buHICQocF8xIC0gcF8yKSQgbMOgIHThu6sg4oCTMS4wMDAwIMSR4bq/biAwLjA5OTkxMzIxIGJhbyBn4buTbSAwLCBjw6BuZyBj4bunbmcgY+G7kSB2aeG7h2Mga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gy4gRMO5IHThu7cgbOG7hyDGsOG7m2MgbMaw4bujbmcgY+G7p2EgbmjDs20gaOG7jWMgdGnhur9wIGjhu41jIGNhbyDEkeG6s25nIGzDoCAwLjU0NCwgY2FvIGjGoW4gbmjDs20ga2jDtG5nIGjhu41jICgwLjQ5NiksIG5oxrBuZyBjaMOqbmggbOG7h2NoIG7DoHkga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCioqSGnhu4d1IGNow6puaCBs4buHY2ggZ2nhu69hIGhhaSB04bu3IGzhu4c6KioNCiQkDQpcaGF0e2R9ID0gMC41NDQgLSAwLjQ5NiA9IDAuMDQ4DQokJA0KDQojIyMgKioxLjUgIFThu7cgc+G7kSBOZ3V5IGPGoSAoUmVsYXRpdmUgUmlzayAtIFJSKSoqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJXUCA8LSByaXNrcmF0aW8odGFibGVfV1AsIG1ldGhvZCA9ICJ3YWxkIikNCnByaW50KHJXUCkNCmBgYA0KDQpE4buxYSB0csOqbiBi4bqjbmcgZOG7ryBsaeG7h3UgMsOXMiwgdOG7tyBz4buRIHLhu6dpIHJvIChyaXNrIHJhdGlvKSBnaeG7r2EgbmjDs20gaOG7jWMgc2luaCBjw7MgcXV54bq/dCDEkeG7i25oIGjhu41jIGNhbyDEkeG6s25nIHbDoCBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBsw6AgUlIgPSAxLjA5NywgdOG7qWMgY2FvIGjGoW4ga2hv4bqjbmcgOS43JSBzbyB24bubaSBuaMOzbSBxdXnhur90IMSR4buLbmgga2jDtG5nIGjhu41jLiBUdXkgbmhpw6puLCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGzDoCAoMC45NzM7IDEuMjM2KSBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAxLCBuZ2jEqWEgbMOgIGNoxrBhIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGto4bqzbmcgxJHhu4tuaCBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgdGjhu7FjIHPhu7EuDQoNCg0KfCBQaMawxqFuZyBwaMOhcCBraeG7g20gxJHhu4tuaCB8IEdpw6EgdHLhu4sgcCAodHdvLXNpZGVkKSB8DQp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8IE1pZC1wIGV4YWN0IHRlc3QgICAgICB8IDAuMTI5NSAgICAgICAgICAgICAgICB8DQp8IEZpc2hlciBleGFjdCB0ZXN0ICAgICB8IDAuMTQ1NCAgICAgICAgICAgICAgICB8DQp8IENoaS1zcXVhcmUgdGVzdCAgICAgICB8IDAuMTI4NyAgICAgICAgICAgICAgICB8DQoNCi0gVOG6pXQgY+G6oyBjw6FjIGdpw6EgdHLhu4sgcCDEkeG7gXUgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgMC4wNS4NCg0KLSDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgdGEga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAgdOG7qWMgbMOgIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSB04bu3IGzhu4cgcXV54bq/dCDEkeG7i25oIGjhu41jIHRp4bq/cCBjYW8gxJHhurNuZyBnaeG7r2EgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgdsOgIGtow7RuZyBo4buNYyBjYW8gxJHhurNuZyBk4buxYSB0csOqbiBk4buvIGxp4buHdSBuw6B5Lg0KDQotIEvhur90IGx14bqtbjogROG7ryBsaeG7h3UgY2jGsGEgY2hvIHRo4bqleSBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIHRyw6xuaCDEkeG7mSBuZ8aw4budaSBnacOhbSBo4buZIHbDoCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGPhu6dhIGjhu41jIHNpbmguDQoNCiMjIyAqKjEuNiBU4bu3IHPhu5EgQ2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpOioqDQoNCmBgYHtyfQ0KbGlicmFyeShEZXNjVG9vbHMpDQpvcldQIDwtIE9kZHNSYXRpbyh0YWJsZV9XUCwgbWV0aG9kPSJ3YWxkIiwgY29uZi5sZXZlbCA9IDAuOTUpDQpwcmludChvcldQKQ0KYGBgDQotIE9SID4gMSBuZ2jEqWEgbMOgIG9kZHMgcXV54bq/dCDEkeG7i25oIGjhu41jIHRp4bq/cCBjYW8gxJHhurNuZyBj4bunYSBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBjYW8gaMahbiBvZGRzIGPhu6dhIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kga2jDtG5nIGjhu41jIGNhbyDEkeG6s25nLg0KDQotIEdpw6EgdHLhu4sgT1IgPSAxLjIxMjIgY2hvIHRo4bqleSBvZGRzIGjhu41jIHRp4bq/cCBjYW8gxJHhurNuZyBj4bunYSBuaMOzbSBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBjYW8gaMahbiBraG/huqNuZyAyMS4yMiUgc28gduG7m2kgbmjDs20gY8OybiBs4bqhaSAoMS4yMTIyIC0gMSA9IDAuMjEyMikuDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gT1IgbMOgICgwLjk0NTYsIDEuNTU0MCkgY2jhu6lhIGdpw6EgdHLhu4sgMS4NCg0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSwgduG7gSBt4bq3dCB0aOG7kW5nIGvDqiwgY2jDum5nIHRhIGtow7RuZyB0aOG7gyBraOG6s25nIMSR4buLbmggY2jhuq9jIGNo4bqvbiBz4buxIGtow6FjIGJp4buHdCB24buBIG9kZHMgZ2nhu69hIGhhaSBuaMOzbSwgdOG7qWMgY8OzIGto4bqjIG7Eg25nIG9kZHMgY+G7p2EgaGFpIG5ow7NtIGzDoCBi4bqxbmcgbmhhdSAoT1IgPSAxKS4NCg0KKipU4buUTkcgS+G6vlQqKg0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IHThu7cgc+G7kSBy4bunaSBybyAoUlIgPSAxLjA5NykgdsOgIG9kZHMgcmF0aW8gKE9SID0gMS4yMTIpIMSR4buBdSBs4bubbiBoxqFuIDEsIGNo4buJIHJhIG5ow7NtIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIGPDsyB4dSBoxrDhu5tuZyBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGNhbyDEkeG6s25nIGNhbyBoxqFuIG5ow7NtIGPDsm4gbOG6oWksIHTGsMahbmcg4bupbmcgdMSDbmcga2hv4bqjbmcgOS43JSB24buBIHThu7cgbOG7hyB2w6AgMjEuMiUgduG7gSBvZGRzLiBUdXkgbmhpw6puLCBjw6FjIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY+G7p2EgUlIgKDAuOTcz4oCTMS4yMzYpIHbDoCBPUiAoMC45NDbigJMxLjU1NCkgxJHhu4F1IGNo4bupYSBnacOhIHRy4buLIDEsIGPDuW5nIHbhu5tpIGPDoWMgZ2nDoSB0cuG7iyBwIGtp4buDbSDEkeG7i25oIGNoaS1zcXVhcmUsIEZpc2hlciwgdsOgIG1pZC1wIMSR4buBdSBs4bubbiBoxqFuIDAuMDUsIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjaMawYSDEkeG7pyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIE5oxrAgduG6rXksIGNoxrBhIGPDsyBi4bqxbmcgY2jhu6luZyByw7UgcsOgbmcga2jhurNuZyDEkeG7i25oIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHRyw6xuaCDEkeG7mSBuZ8aw4budaSBnacOhbSBo4buZIHbDoCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGPhu6dhIGjhu41jIHNpbmguDQoNCg0KIyMgKipQSOG6pk4gMjogIHdpbGxfZ29fdG9fY29sbGVnZS1nZW5kZXIqKg0KDQojIyMgKioyLjEgQuG6o25nIHR14bqnbiBz4buRIGNow6lvKioNCg0KDQpgYGB7cn0NCnRhYmxlX1dHIDwtIHRhYmxlKGRhdGEkd2lsbF9nb190b19jb2xsZWdlLGRhdGEkZ2VuZGVyKQ0KDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQprYWJsZSh0YWJsZV9XRywgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyAyLjEgVOG6p24gc+G7kSB0aGVvIHF1eeG6v3QgxJHhu4tuaCB0aGVvIGjhu41jIGNhbyDEkeG6s25nIGLhu59pIGdp4bubaSB0w61uaCBj4bunYSBo4buNYyBzaW5oIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIGZ1bGxfd2lkdGggPSBGKQ0KYGBgDQoNCkLhuqNuZyAyLjEgdHLDrG5oIGLDoHkgcGjDom4gcGjhu5FpIHThuqduIHPhu5EgbOG7sWEgY2jhu41uIGjhu41jIGNhbyDEkeG6s25nIGPhu6dhIGjhu41jIHNpbmggdGhlbyBnaeG7m2kgdMOtbmguIEvhur90IHF14bqjIGNobyB0aOG6pXkgdHJvbmcgdOG7lW5nIHPhu5EgbuG7ryBzaW5oLCBjw7MgMjUxIGVtIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjYW8gxJHhurNuZyAoY2hp4bq/bSBraG/huqNuZyA1MSw4JSksIHRyb25nIGtoaSAyMzQgZW0ga2jDtG5nIHRoZW8gaOG7jWMuIMSQ4buRaSB24bubaSBuYW0gc2luaCwgMjQ5IGVtIGNo4buNbiBo4buNYyBjYW8gxJHhurNuZyAoY2hp4bq/bSB44bqlcCB44buJIDQ4LDQlKSB2w6AgMjY2IGVtIGtow7RuZyB0aGVvIGjhu41jLiBN4bq3YyBkw7kgdOG7tyBs4buHIGzhu7FhIGNo4buNbiBo4buNYyBjYW8gxJHhurNuZyBnaeG7r2EgbmFtIHbDoCBu4buvIGtow6EgdMawxqFuZyDEkcawxqFuZywgbuG7ryBzaW5oIGPDsyB4dSBoxrDhu5tuZyBs4buxYSBjaOG7jW4gaOG7jWMgY2FvIMSR4bqzbmcgY2FvIGjGoW4gbeG7mXQgY2jDunQgc28gduG7m2kgbmFtIHNpbmguIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgZ+G7o2kgw70gduG7gSBz4buxIGtow6FjIGJp4buHdCBow6BuaCB2aSB0aGVvIGdp4bubaSB0cm9uZyB2aeG7h2MgcmEgcXV54bq/dCDEkeG7i25oIGdpw6FvIGThu6VjIHNhdSB0cnVuZyBo4buNYy4NCg0KDQojIyMgKioyLjIgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZGZfV0cgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZV9XRykNCmNvbG5hbWVzKGRmX1dHKSA8LSBjKCJEZWNpc2lvbiIsICJHZW5kZXIiLCAiQ291bnQiKQ0KZ2dwbG90KGRmX1dHLCBhZXMoeCA9IEdlbmRlciwgeSA9IENvdW50LCBmaWxsID0gRGVjaXNpb24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKSArDQogIGxhYnMoDQogICAgeCA9ICJHaeG7m2kgdMOtbmgiLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyBo4buNYyBzaW5oIiwNCiAgICBmaWxsID0gIlF1eeG6v3QgxJHhu4tuaCBo4buNYyBjYW8gxJHhurNuZyIsDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIDIuMTogVOG6p24gc+G7kSB0aGVvIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjYW8gxJHhurNuZyB2w6AgZ2nhu5tpIHTDrW5oIGPhu6dhIGjhu41jIHNpbmgiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKk5I4bqsTiBYw4lUOioqDQoNCkJp4buDdSDEkeG7kyAyLjEgbWluaCBo4buNYSBwaMOibiBi4buRIHPhu5EgbMaw4bujbmcgaOG7jWMgc2luaCB0aGVvIGdp4bubaSB0w61uaCB2w6AgcXV54bq/dCDEkeG7i25oIGjhu41jIGNhbyDEkeG6s25nLiBUcm9uZyBuaMOzbSBu4buvIHNpbmgsIHPhu5EgbMaw4bujbmcgY2jhu41uIGjhu41jIGNhbyDEkeG6s25nICgyNTEpIG5o4buJbmggaMahbiBz4buRIGtow7RuZyBo4buNYyAoMjM0KSwgdHJvbmcga2hpIOG7nyBuaMOzbSBuYW0sIHPhu5EgaOG7jWMgc2luaCBraMO0bmcgaOG7jWMgY2FvIMSR4bqzbmcgKDI2NikgbOG6oWkgY2FvIGjGoW4gc+G7kSBjaOG7jW4gaOG7jWMgKDI0OSkuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG7hu68gc2luaCBjw7MgeHUgaMaw4bubbmcgbOG7sWEgY2jhu41uIGjhu41jIHRp4bq/cCBjYW8gxJHhurNuZyBjYW8gaMahbiBuYW0gc2luaC4gVHV5IG5oacOqbiwgc+G7sSBjaMOqbmggbOG7h2NoIGdp4buvYSBoYWkgbmjDs20gZ2nhu5tpIHTDrW5oIGzDoCBraMO0bmcgbOG7m24uDQoNCiMjIyAqKjIuMyBLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqioqDQoNCkLDoGkgdG/DoW4gY8OzIGdp4bqjIHRodXnhur90IG5oxrAgc2F1OiAkJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsfQ0KSF8wOiBcOyAgXHRleHR7R2nhu5tpIHTDrW5oICB2w6AgcXV54bq/dCDEkeG7i25oIGjhu41jIHRp4bq/cCBj4bunYSBo4buNYyBzaW5oIMSR4buZYyBs4bqtcCB24bubaSBuaGF1IH0gXFwgDQpIXzE6IFw7ICBcdGV4dHtHaeG7m2kgdMOtbmggIHbDoCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGPhu6dhIGjhu41jIHNpbmggY8OzIGxpw6puIHF1YW4gxJHhur9uIG5oYXV9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0LiQkDQoNClRhIHRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIHbDoCDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KYGBge3J9DQpjaGlXRyA8LSBjaGlzcS50ZXN0KHRhYmxlX1dHKQ0KcHJpbnQoY2hpV0cpDQpgYGANCioqTkjhuqxOIFjDiVQ6KioNCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIHbhu5tpIGhp4buHdSBjaOG7iW5oIFlhdGVzIGNobyB0aOG6pXkgdGjhu5FuZyBrw6oga2nhu4NtIMSR4buLbmggY8OzIGdpw6EgdHLhu4sgXCggXGNoaV4yID0gMS4wMiBcKSB24bubaSAxIGLhuq1jIHThu7EgZG8gdsOgIGdpw6EgdHLhu4sgcC12YWx1ZSA9IDAuMzExNC4gVsOsIHAtdmFsdWUgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgdGjDtG5nIHRoxrDhu51uZyAoMC4wNSksIHRhICoqa2jDtG5nIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkqKi4gRG8gxJHDsywga2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIGdp4bubaSB0w61uaCB2w6AgcXV54bq/dCDEkeG7i25oIGjhu41jIGNhbyDEkeG6s25nIGPhu6dhIGjhu41jIHNpbmggY8OzIG3hu5FpIGxpw6puIGjhu4cuIE7Ds2kgY8OhY2gga2jDoWMsIGThu68gbGnhu4d1IGhp4buHbiB04bqhaSBjaG8gdGjhuqV5IGhhaSBiaeG6v24gbsOgeSAqKmPDsyB0aOG7gyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdSoqIHRyb25nIHThu5VuZyB0aOG7gy4NCg0KIyMjICoqMi40IEhp4buHdSBoYWkgdOG7tyBs4buHKioNCg0KKipUaGnhur90IGzhuq1wIHThu7cgbOG7hyoqDQoNClThu7cgbOG7hyBo4buNYyBzaW5oIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjYW8gxJHhurNuZyBsw6AgbuG7rzoNCg0KJCQNCnBfMSA9IFAoXHRleHR7Z2VuZGVyfSA9IFx0ZXh0e0ZlbWFsZX0gXG1pZCBcdGV4dHt3aWxsX2dvX3RvX2NvbGxlZ2V9ID0gXHRleHR7WUVTfSkNCiQkDQpU4bu3IGzhu4cgaOG7jWMgc2luaCAqKmtow7RuZyoqIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjYW8gxJHhurNuZyBsw6AgbuG7rzoNCg0KJCQNCnBfMiA9IFAoXHRleHR7Z2VuZGVyfSA9IFx0ZXh0e0ZlbWFsZX0gXG1pZCBcdGV4dHt3aWxsX2dvX3RvX2NvbGxlZ2V9ID0gXHRleHR7Tk99KQ0KJCQNCg0KSGnhu4d1IGNow6puaCBs4buHY2ggZ2nhu69hIGhhaSB04bu3IGzhu4c6DQoNCiQkDQpkID0gcF8xIC0gcF8yDQokJA0KDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotICoqR2nhuqMgdGh1eeG6v3QgSOKCgCoqOiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgdOG7tyBs4buHICANCiAgJCQgSF8wOiBwXzEgLSBwXzIgPSAwJCQNCg0KLSAqKkdp4bqjIHRodXnhur90IEgxKSoqOiBU4bu3IGzhu4cgaOG7jWMgc2luaCBu4buvIHF1eeG6v3QgxJHhu4tuaCBo4buNY2NhbyDEkeG6s25nIHRo4bqlcCBoxqFuIFThu7cgbOG7hyBo4buNYyBzaW5oIG7hu68ga2jDtG5nIHF1eeG6v3QgxJHhu4tuaCBo4buNYyAgY2FvIMSR4bqzbmc6ICRIXzE6IHBfMSAtIHBfMiA8IDAkDQoNCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIHF1eeG6v3QgxJHhu4tuaCBo4buNYyB0aeG6v3AgY2FvIMSR4bqzbmcgduG7m2kgYuG7kSBt4bq5IHRoZW8gaOG7jWMgY2FvIMSR4bqzbmcNCmxpYnJhcnkoc3RhdHMpDQoNCnRlc3RXRyA8LSBwcm9wLnRlc3QoeCA9IGModGFibGVfV0dbIllFUyIsIkZlbWFsZSJdLCB0YWJsZV9XR1siTk8iLCJGZW1hbGUiXSksDQogICAgICAgICAgICAgICAgICAgICAgbiA9IGMoc3VtKHRhYmxlX1dHWyJZRVMiLF0pLCBzdW0odGFibGVfV0dbIk5PIixdKSksDQogICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIsIGNvcnJlY3QgPSBGQUxTRSkNCnByaW50KHRlc3RXRykNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqICANCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGhhaSB04bu3IGzhu4cgxJHhu5ljIGzhuq1wIGNobyB0aOG6pXkgZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaCBsw6AgXCggXGNoaV4yID0gMS4xNTcgXCksIHbhu5tpIG3hu5l0IGLhuq1jIHThu7EgZG8gdsOgIGdpw6EgdHLhu4sgcC12YWx1ZSA9IDAuODU5IChraMO0bmcgaGnhu4d1IGNo4buJbmggbGnDqm4gdOG7pWMpLiBHaeG6oyB0aHV54bq/dCDEkeG7kWkgbMOgIHThu7cgbOG7hyBu4buvIHRyb25nIG5ow7NtIGjhu41jIHNpbmggKipxdXnhur90IMSR4buLbmggaOG7jWMgY2FvIMSR4bqzbmcqKiBuaOG7jyBoxqFuIHThu7cgbOG7hyBu4buvIHRyb25nIG5ow7NtICoqa2jDtG5nIGjhu41jIGNhbyDEkeG6s25nKiouIFR1eSBuaGnDqm4sIHbhu5tpIHAtdmFsdWUgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgNSUsIHRhICoqa2jDtG5nIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkqKiBy4bqxbmcgaGFpIHThu7cgbOG7hyBuw6B5IGLhurFuZyBuaGF1LiAgDQoNCk5nb8OgaSByYSwga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gaGnhu4d1IHPhu5EgaGFpIHThu7cgbOG7hyBiYW8gZ+G7k20gMCAoWy0xOyAwLjA4Nl0pLCBj4bunbmcgY+G7kSBr4bq/dCBsdeG6rW4gcuG6sW5nICoqa2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiByw7UgcsOgbmcgduG7gSBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgaGFpIHThu7cgbOG7hyBu4buvKiogdHJvbmcgaGFpIG5ow7NtLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBnaeG7m2kgdMOtbmggKG7hu68pICoqa2jDtG5nIOG6o25oIGjGsOG7n25nIMSRw6FuZyBr4buDIMSR4bq/biBxdXnhur90IMSR4buLbmggaOG7jWMgY2FvIMSR4bqzbmcqKiB0cm9uZyBt4bqrdSBk4buvIGxp4buHdSBuw6B5Lg0KDQoNCiMjIyAqKjIuNSAgVOG7tyBz4buRIE5ndXkgY8ahIChSZWxhdGl2ZSBSaXNrIC0gUlIpKioNCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0KcldHIDwtIHJpc2tyYXRpbyh0YWJsZV9XRywgbWV0aG9kID0gIndhbGQiKQ0KcHJpbnQocldHKQ0KYGBgDQoqKk5o4bqtbiB4w6l0OioqICANCkvhur90IHF14bqjIHRo4buRbmcga8OqIGNobyB0aOG6pXkgdOG7tyBzdeG6pXQgcuG7p2kgcm8gKHJpc2sgcmF0aW8pIGdp4buvYSBu4buvIHbDoCBuYW0gdHJvbmcgcXV54bq/dCDEkeG7i25oIGjhu41jIGNhbyDEkeG6s25nIGzDoCAqKjAuOTM2KiosIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgbMOgIFwoWzAuODMwO1wgMS4wNTZdXCksIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5ICoqa2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiByw7UgcsOgbmcgduG7gSBz4buxIGtow6FjIGJp4buHdCB0cm9uZyB4w6FjIHN14bqldCBo4buNYyBjYW8gxJHhurNuZyBnaeG7r2EgaGFpIGdp4bubaSB0w61uaCoqLg0KDQpQLXZhbHVlIHTGsMahbmcg4bupbmcgdOG7qyBjw6FjIHBoxrDGoW5nIHBow6FwIGtow6FjIG5oYXUgxJHhu4F1IGzhu5tuIGjGoW4gMC4wNSAodsOtIGThu6U6IEZpc2hlcuKAmXMgZXhhY3QgPSAwLjMxMSwgQ2hpLXNxdWFyZSA9IDAuMjgyKSwgbsOqbiAqKmtow7RuZyDEkeG7pyBjxqEgc+G7nyAgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IFwoIEhfMCBcKSoqIHLhurFuZyBnaeG7m2kgdMOtbmggdsOgIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjYW8gxJHhurNuZyBsw6AgxJHhu5ljIGzhuq1wLiAgDQoNClTDs20gbOG6oWksKipnaeG7m2kgdMOtbmgga2jDtG5nIHBo4bqjaSBsw6AgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24geMOhYyBzdeG6pXQgaOG7jWMgc2luaCBxdXnhur90IMSR4buLbmggaOG7jWMgY2FvIMSR4bqzbmcqKiB0cm9uZyBt4bqrdSBuw6B5Lg0KDQoNCiMjIyAqKjIuNiBU4bu3IHPhu5EgQ2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpOioqDQoNCmBgYHtyfQ0KbGlicmFyeShEZXNjVG9vbHMpDQpvcldHIDwtIE9kZHNSYXRpbyh0YWJsZV9XRywgbWV0aG9kPSJ3YWxkIiwgY29uZi5sZXZlbCA9IDAuOTUpDQpwcmludChvcldHKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogIA0KLSBPUiA8IDEgbmdoxKlhIGzDoCBvZGRzICh04bu3IGzhu4cgY8aw4bujYykgaOG7jWMgc2luaCAqKm5hbSoqIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjYW8gxJHhurNuZyAqKnRo4bqlcCBoxqFuKiogc28gduG7m2kgaOG7jWMgc2luaCAqKm7hu68qKi4gIA0KLSBD4bulIHRo4buDLCBvZGRzIHJhdGlvIMaw4bubYyBsxrDhu6NuZyDEkcaw4bujYyBsw6AgKiowLjg3MyoqLCBjaG8gdGjhuqV5IGjhu41jIHNpbmggbmFtIGPDsyBvZGRzIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjYW8gxJHhurNuZyAqKmNo4buJIGLhurFuZyBraG/huqNuZyA4Ny4zJSoqIHNvIHbhu5tpIGjhu41jIHNpbmggbuG7ry4NCg0KQ+G7pSB0aOG7gywgb2RkcyByYXRpbyBuaOG7jyBoxqFuIDEgY2hvIHRo4bqleSBo4buNYyBzaW5oIG5hbSBjw7MgeHUgaMaw4bubbmcgKirDrXQgcXV54bq/dCDEkeG7i25oIGjhu41jIGNhbyDEkeG6s25nIGjGoW4gbuG7ryoqLCBuaMawbmcgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiogZG8ga2hv4bqjbmcgdGluIGPhuq15IGNo4bupYSBnacOhIHRy4buLIHRydW5nIGzhuq1wICgxKS4gIA0KDQpEbyDEkcOzLCB24bubaSBk4buvIGxp4buHdSBoaeG7h24gdOG6oWksIHRhIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nICoqZ2nhu5tpIHTDrW5oIGtow7RuZyBwaOG6o2kgbMOgIHnhur91IHThu5EgY8OzIOG6o25oIGjGsOG7n25nIHLDtSBy4buHdCDEkeG6v24gaMOgbmggdmkgcXV54bq/dCDEkeG7i25oIGjhu41jIHRp4bq/cCBj4bunYSBo4buNYyBzaW5oKiouDQoNCiMjICoqUEjhuqZOIDM6ICByZXNpZGVuY2UtdHlwZXNjaG9vbCoqDQoNCiMjIyAqKjMuMSBC4bqjbmcgdHXhuqduIHPhu5EgY2jDqW8qKg0KYGBge3J9DQp0YWJsZV90eXBlcmUgPC0gdGFibGUoZGF0YSR0eXBlX3NjaG9vbCxkYXRhJHJlc2lkZW5jZSkNCg0KbGlicmFyeShrYWJsZUV4dHJhKQ0Ka2FibGUodGFibGVfdHlwZXJlLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDMuMSBU4bqnbiBz4buRIHRoZW8gbG/huqFpIHRyxrDhu51uZyB2w6AgbsahaSBz4buLbmggc+G7kW5nIGPhu6dhIGjhu41jIHNpbmgiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQpC4bqjbmcgMy4xIGNobyB0aOG6pXkgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBsb+G6oWkgdHLGsOG7nW5nIGjhu41jIHNpbmggdGhlbyBo4buNYyAoQWNhZGVtaWMgdsOgIFZvY2F0aW9uYWwpIHbhu5tpIG7GoWkgc2luaCBz4buRbmcgKFJ1cmFsIHbDoCBVcmJhbikuIFRyb25nIG5ow7NtIGjhu41jIHNpbmggaOG7jWMgdHLGsOG7nW5nIEFjYWRlbWljLCBwaOG6p24gbOG7m24gxJHhur9uIHThu6sga2h1IHbhu7FjIFVyYmFuICgzODggZW0pLCBjYW8gZ+G6p24gZ+G6pXAgxJHDtGkgc28gduG7m2kga2h1IHbhu7FjIFJ1cmFsICgyMjEgZW0pLiBOZ8aw4bujYyBs4bqhaSwgdHJvbmcgbmjDs20gaOG7jWMgc2luaCBo4buNYyB0csaw4budbmcgVm9jYXRpb25hbCwgdOG7tyBs4buHIHThu6sgUnVyYWwgKDI0MCBlbSkgbOG6oWkgY2hp4bq/bSDGsHUgdGjhur8gc28gduG7m2kgVXJiYW4gKDE1MSBlbSkuDQoNClPhu7EgcGjDom4gYuG7kSBuw6B5IGfhu6NpIMO9IHLhurFuZyBuxqFpIHNpbmggc+G7kW5nIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24geHUgaMaw4bubbmcgbOG7sWEgY2jhu41uIGxv4bqhaSBow6xuaCBnacOhbyBk4bulYy4gQ+G7pSB0aOG7gywgaOG7jWMgc2luaCBz4buRbmcg4bufIMSRw7QgdGjhu4sgY8OzIHh1IGjGsOG7m25nIHRoZW8gaOG7jWMgY8OhYyB0csaw4budbmcgaOG7jWMgdGh14bqtdCAoQWNhZGVtaWMpLCB0cm9uZyBraGkgaOG7jWMgc2luaCBuw7RuZyB0aMO0biBjw7MgeHUgaMaw4bubbmcgdGhlbyBo4buNYyBjw6FjIHRyxrDhu51uZyBuZ2jhu4EgKFZvY2F0aW9uYWwpLiANCg0KIyMjICoqMy4yIFRy4buxYyBxdWFuIGhvw6EqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmRmX3R5cGVyZSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlX3R5cGVyZSkNCmNvbG5hbWVzKGRmX3R5cGVyZSkgPC0gYygiUmVzaWRlbmNlIiwgIlNjaG9vbFR5cGUiLCAiQ291bnQiKQ0KZ2dwbG90KGRmX3R5cGVyZSwgYWVzKHggPSBTY2hvb2xUeXBlLCB5ID0gQ291bnQsIGZpbGwgPSBSZXNpZGVuY2UpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCkscG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkpICsNCiAgbGFicygNCiAgICB4ID0gIkxv4bqhaSB0csaw4budbmciLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyBo4buNYyBzaW5oIiwNCiAgICBmaWxsID0gIk7GoWkgc2luaCBz4buRbmciLA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyA0LjI6IFThuqduIHPhu5EgaOG7jWMgc2luaCB0aGVvIGxv4bqhaSB0csaw4budbmcgdsOgIG7GoWkgc2luaCBz4buRbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKk5I4bqsTiBYw4lUOioqDQoNCg0KQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buxIHBow6JuIGLhu5EgaOG7jWMgc2luaCB0aGVvIGxv4bqhaSB0csaw4budbmcgKEFjYWRlbWljLCBWb2NhdGlvbmFsKSB2w6AgbsahaSBzaW5oIHPhu5FuZyAoUnVyYWwsIFVyYmFuKS4gROG7hSB0aOG6pXksIHRyb25nIG5ow7NtIGjhu41jIHNpbmggdGhlbyBo4buNYyB0csaw4budbmcgaOG7jWMgdGh14bqtdCAoQWNhZGVtaWMpLCBz4buRIGzGsOG7o25nIGjhu41jIHNpbmggVXJiYW4gKDM4OCkgdsaw4bujdCB0cuG7mWkgc28gduG7m2kgUnVyYWwgKDIyMSkuIE5nxrDhu6NjIGzhuqFpLCDEkeG7kWkgduG7m2kgdHLGsOG7nW5nIG5naOG7gSAoVm9jYXRpb25hbCksIGjhu41jIHNpbmggUnVyYWwgKDI0MCkgY2hp4bq/bSDGsHUgdGjhur8gaMahbiBVcmJhbiAoMTUxKS4NCg0KDQojIyMgKiozLjMgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6oqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXDsgIFx0ZXh0e07GoWkgc2luaCBz4buRbmcgIHbDoCBsb+G6oWkgdHLGsOG7nW5nIHRoZW8gaOG7jWMgY+G7p2EgaOG7jWMgc2luaCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdSB9IFxcIA0KSF8xOiBcOyAgXHRleHR7TsahaSBzaW5oIHPhu5FuZyAgdsOgIGxv4bqhaSB0csaw4budbmcgdGhlbyBo4buNYyBj4bunYSBo4buNYyBzaW5oIGPDsyBsacOqbiBxdWFuIMSR4bq/biBuaGF1fQ0KXGVuZHthcnJheX0NClxyaWdodC4kJA0KDQpUYSB0aOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZyB2w6AgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXU6DQoNCmBgYHtyfQ0KY2hpdHlwZXJlIDwtIGNoaXNxLnRlc3QodGFibGVfdHlwZXJlKQ0KcHJpbnQoY2hpdHlwZXJlKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaCBsw6AgJFxjaGleMiA9IDU5LjMzJCB24bubaSAxIGLhuq1jIHThu7EgZG8gdsOgIGdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBuaOG7jyAo4omIICQxLjMzIFx0aW1lcyAxMF57LTE0fSQpLiBWw6wgcC12YWx1ZSA8IDAuMDUsIHRhICoqY8OzIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJCoqIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JS4gDQoNCsSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5ICoqY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIG3huqFuaCBt4bq9IHLhurFuZyBuxqFpIHNpbmggc+G7kW5nIHbDoCBsb+G6oWkgdHLGsOG7nW5nIHRoZW8gaOG7jWMgY+G7p2EgaOG7jWMgc2luaCBjw7MgbGnDqm4gcXVhbiDEkeG6v24gbmhhdSoqLiBOw7NpIGPDoWNoIGtow6FjLCBs4buxYSBjaOG7jW4gaOG7jWMgdHLGsOG7nW5nICphY2FkZW1pYyogaGF5ICp2b2NhdGlvbmFsKiAqKmPDsyB0aOG7gyBwaOG7pSB0aHXhu5ljIHbDoG8gbsahaSBzaW5oIHPhu5FuZyoqIChydXJhbC91cmJhbikgY+G7p2EgaOG7jWMgc2luaC4NCg0KDQojIyMgKiozLjQgSGnhu4d1IGhhaSB04bu3IGzhu4cqKg0KDQoqKlRoaeG6v3QgbOG6rXAgdOG7tyBs4buHKioNCg0KVOG7tyBs4buHIGjhu41jIHNpbmggc+G7kW5nIOG7nyAqKm7DtG5nIHRow7RuIChSdXJhbCkqKiB0aGVvIGjhu41jICoqdHLGsOG7nW5nIGjhu41jIHRodeG6rXQgKEFjYWRlbWljKSoqOg0KDQokJA0KcF8xID0gUChcdGV4dHtyZXNpZGVuY2V9ID0gXHRleHR7UnVyYWx9IFxtaWQgXHRleHR7c2Nob29fdHlwZX0gPSBcdGV4dHtBY2FkZW1pY30pIA0KJCQNCg0KVOG7tyBs4buHIGjhu41jIHNpbmggc+G7kW5nIOG7nyAqKm7DtG5nIHRow7RuIChSdXJhbCkqKiB0aGVvIGjhu41jICoqdHLGsOG7nW5nIG5naOG7gSAoVm9jYXRpb25hbCkqKjoNCg0KJCQNCnBfMiA9IFAoXHRleHR7cmVzaWRlbmNlfSA9IFx0ZXh0e1J1cmFsfSBcbWlkIFx0ZXh0e3NjaG9vbFxfdHlwZX0gPSBcdGV4dHtWb2NhdGlvbmFsfSkgDQokJA0KDQpIaeG7h3UgY2jDqm5oIGzhu4djaCBnaeG7r2EgaGFpIHThu7cgbOG7hzoNCg0KJCQNCmQgPSBwXzEgLSBwXzIgDQokJA0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oKioNCg0KLSAqKkdp4bqjIHRodXnhur90IEjigoAqKjogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgaGFpIHThu7cgbOG7hyAgDQogICQkIEhfMDogcF8xIC0gcF8yID0gMCAkJA0KDQotICoqR2nhuqMgdGh1eeG6v3QgSOKCgSoqOiBU4bu3IGzhu4cgaOG7jWMgc2luaCBo4buNYyB0csaw4budbmcgaOG7jWMgdGh14bqtdCBz4buRbmcg4bufIG7DtG5nIHRow7RuIHRo4bqlcCBoxqFuIHThu7cgbOG7hyBo4buNYyBzaW5oIGjhu41jIHRyxrDhu51uZyBuZ2jhu4Egc+G7kW5nIOG7nyBuw7RuZyB0aMO0biAgDQogICQkIEhfMTogcF8xIC0gcF8yIDwgMCAkJA0KDQpgYGB7cn0NCg0KbGlicmFyeShzdGF0cykNCg0KdGVzdHR5cGVyZSA8LSBwcm9wLnRlc3QoeCA9IGModGFibGVfdHlwZXJlIFsiQWNhZGVtaWMiLCJSdXJhbCJdLCB0YWJsZV90eXBlcmUgWyJWb2NhdGlvbmFsIiwiUnVyYWwiXSksDQogICAgICAgICAgICAgICAgICAgICAgbiA9IGMoc3VtKHRhYmxlX3R5cGVyZSBbIkFjYWRlbWljIixdKSwgc3VtKHRhYmxlX3R5cGVyZSBbIlZvY2F0aW9uYWwiLF0pKSwNCiAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgY29ycmVjdCA9IEZBTFNFKQ0KcHJpbnQodGVzdHR5cGVyZSApDQpgYGANCioqTmjhuq1uIHjDqXQ6KioNCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggaGnhu4d1IGhhaSB04bu3IGzhu4cgY2hvIHRo4bqleSBnacOhIHRy4buLIHRo4buRbmcga8OqIGtp4buDbSDEkeG7i25oIGzDoCA2MC4zMzYgduG7m2kgcC12YWx1ZSDiiYggMy45OTjDlzEw4oG7wrnigbUgKHLhuqV0IG5o4buPKS4gVsOsIHAtdmFsdWUgbmjhu48gaMahbiBt4bupYyDDvSBuZ2jEqWEgdGjDtG5nIHRoxrDhu51uZyAoMC4wNSksIHRhICoqY8OzIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKAKiouDQoNCsSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCAqKnThu7cgbOG7hyBo4buNYyBzaW5oIGjhu41jIHRyxrDhu51uZyBo4buNYyB0aHXhuq10IHPhu5FuZyDhu58gbsO0bmcgdGjDtG4gdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4MqKiBzbyB24bubaSB04bu3IGzhu4cgaOG7jWMgc2luaCBo4buNYyB0csaw4budbmcgbmdo4buBIHPhu5FuZyDhu58gbsO0bmcgdGjDtG4uIE7Ds2kgY8OhY2gga2jDoWMsIGThu68gbGnhu4d1IGNobyB0aOG6pXkgaOG7jWMgc2luaCBuw7RuZyB0aMO0biBjw7MgeHUgaMaw4bubbmcgY2jhu41uICoqdHLGsOG7nW5nIG5naOG7gSoqIG5oaeG7gXUgaMahbiBzbyB24bubaSB0csaw4budbmcgaOG7jWMgdGh14bqtdC4NCg0KDQojIyMgKiozLjUgIFThu7cgc+G7kSBOZ3V5IGPGoSAoUmVsYXRpdmUgUmlzayAtIFJSKSoqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJ0eXBlcmUgPC0gcmlza3JhdGlvKHRhYmxlX3R5cGVyZSwgbWV0aG9kID0gIndhbGQiKQ0KcHJpbnQocnR5cGVyZSkNCmBgYA0KKipOaOG6rW4geMOpdCoqDQoNCkdpw6EgdHLhu4sgKipSUiA9IDAuNjA2MTU3OSoqIGNobyBiaeG6v3QgIGjhu41jIHNpbmggc+G7kW5nIOG7nyAqKnRow6BuaCB0aOG7iyoqIHRyb25nIG5ow7NtIHRoZW8gaOG7jWMgKip0csaw4budbmcgbmdo4buBIChWb2NhdGlvbmFsKSoqIHRo4bqlcCBoxqFuIGtob+G6o25nICoqNDAlKiogc28gduG7m2kgbmjDs20gaOG7jWMgc2luaCB0aGVvIGjhu41jICoqdHLGsOG7nW5nIGjhu41jIHRodeG6rXQgKEFjYWRlbWljKSoqLg0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB04burIG5oaeG7gXUgcGjGsMahbmcgcGjDoXAgxJHhu4F1IGNobyB0aOG6pXkgKipwLXZhbHVlIHLhuqV0IG5o4buPKiosIGPhu6UgdGjhu4M6DQoNCi0gKipDaGktc3F1YXJlKio6IHAgPSA3Ljk5NyDDlyAxMOKBu8K54oG1ICANCi0gKipNaWQtcCBleGFjdCoqOiBwID0gNy41NTAgw5cgMTDigbvCueKBtSAgDQotICoqRmlzaGVyIGV4YWN0Kio6IHAgPSA3Ljc1NyDDlyAxMOKBu8K54oG1ICANCg0KIyMjICoqMy42IFThu7cgc+G7kSBDaMOqbmggKE9kZHMgUmF0aW8gLSBPUik6KioNCg0KYGBge3J9DQpsaWJyYXJ5KERlc2NUb29scykNCm9ydHlwZXJlIDwtIE9kZHNSYXRpbyh0YWJsZV90eXBlcmUsIG1ldGhvZD0id2FsZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KcHJpbnQob3J0eXBlcmUpDQpgYGANCg0KR2nDoSB0cuG7iyAqKk9kZHMgUmF0aW8gKE9SKSA9IDAuMzU4NCoqIGNobyBiaeG6v3Qgb2RkcyAodOG7tyBs4buHIGNow6puaCkgaOG7jWMgc2luaCBz4buRbmcg4bufICoqdGjDoG5oIHRo4buLKiogdHJvbmcgbmjDs20gdGhlbyBo4buNYyAqKnRyxrDhu51uZyBo4buNYyB0aHXhuq10IChBY2FkZW1pYykqKiBjaOG7iSBi4bqxbmcga2hv4bqjbmcgKiozNS44JSoqIHNvIHbhu5tpIG9kZHMgY+G7p2EgaOG7jWMgc2luaCB0aMOgbmggdGjhu4sgdGhlbyBo4buNYyAqKnRyxrDhu51uZyBuZ2jhu4EgKFZvY2F0aW9uYWwpKiouDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIE9SIGzDoCAqKigwLjI3NTc7IDAuNDY1OCkqKiwgKipraMO0bmcgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMSoqLCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IGzDoCAqKmPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKi4NCg0KQ8OhYyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiBjxaluZyBjaG8ga+G6v3QgcXXhuqMgKipwLXZhbHVlIHLhuqV0IG5o4buPKio6DQoNCi0gKipDaGktc3F1YXJlKio6IHAgPSA3Ljk5NyDDlyAxMOKBu8K54oG1ICANCi0gKipNaWQtcCBleGFjdCoqOiBwID0gNy41NTAgw5cgMTDigbvCueKBtSAgDQotICoqRmlzaGVyIGV4YWN0Kio6IHAgPSA3Ljc1NyDDlyAxMOKBu8K54oG1ICANCg0KDQojIyAqKlBI4bqmTiA0OiAgcmVzaWRlbmNlLXR5cGVzY2hvb2wqKg0KDQojIyMgKio0LjEgQuG6o25nIHR14bqnbiBz4buRIGNow6lvKioNCmBgYHtyfQ0KdGFibGVfdHlwZXBhdyA8LSB0YWJsZShkYXRhJHR5cGVfc2Nob29sLGRhdGEkcGFyZW50X3dhc19pbl9jb2xsZWdlKQ0KDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQprYWJsZSh0YWJsZV90eXBlcGF3LCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDQuMSBU4bqnbiBz4buRIHRoZW8gbG/huqFpIHRyxrDhu51uZyB2w6AgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIG5nxrDhu51pIGdpw6FtIGjhu5kiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KROG7sWEgdsOgbyBC4bqjbmcgNC4xLCB0YSB0aOG6pXkgcuG6sW5nIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kga2jDtG5nIGjhu41jIGNhbyDEkeG6s25nIChGQUxTRSkgY2jhu6cgeeG6v3UgdGhlbyBo4buNYyB0csaw4budbmcgaOG7jWMgdGh14bqtdCAoMzI4IGjhu41jIHNpbmgpIG5oaeG7gXUgaMahbiBzbyB24bubaSB0csaw4budbmcgbmdo4buBICgxNTIgaOG7jWMgc2luaCkuIE5nxrDhu6NjIGzhuqFpLCB0cm9uZyBuaMOzbSBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIMSRw6MgaOG7jWMgY2FvIMSR4bqzbmcgKFRSVUUpLCBz4buRIGjhu41jIHNpbmggdGhlbyBo4buNYyB0csaw4budbmcgbmdo4buBICgyMzkgaOG7jWMgc2luaCkgbOG6oWkgZ+G6p24gdMawxqFuZyDEkcawxqFuZywgdGjhuq1tIGNow60gdsaw4bujdCBzbyB24bubaSBz4buRIGjhu41jIHNpbmggdGhlbyBo4buNYyB0csaw4budbmcgaOG7jWMgdGh14bqtdCAoMjgxIGjhu41jIHNpbmgpLiBOaMawIHbhuq15LCBjw7MgZOG6pXUgaGnhu4d1IGNobyB0aOG6pXkgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPhu6dhIG5nxrDhu51pIGdpw6FtIGjhu5kgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBsb+G6oWkgdHLGsOG7nW5nIG3DoCBo4buNYyBzaW5oIGzhu7FhIGNo4buNbiwga2hpIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgaOG7jWMgY2FvIMSR4bqzbmcgY8OzIHh1IGjGsOG7m25nIGNo4buNbiB0csaw4budbmcgbmdo4buBIG5oaeG7gXUgaMahbi4NCg0KDQojIyMgKio0LjIgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZGZfdHlwZXBhdyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlX3R5cGVwYXcpDQpjb2xuYW1lcyhkZl90eXBlcGF3KSA8LSBjKCJQYXJlbnRzQ29sbGVnZSIsICJTY2hvb2xUeXBlIiwgIkNvdW50IikNCmdncGxvdChkZl90eXBlcGF3LCBhZXMoeCA9IFNjaG9vbFR5cGUsIHkgPSBDb3VudCwgZmlsbCA9IFBhcmVudHNDb2xsZWdlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKSArDQogIGxhYnMoDQogICAgeCA9ICJMb+G6oWkgdHLGsOG7nW5nIiwNCiAgICB5ID0gIlPhu5EgbMaw4bujbmcgaOG7jWMgc2luaCIsDQogICAgZmlsbCA9ICJOxqFpIHNpbmggc+G7kW5nIiwNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgNC4xOiBU4bqnbiBz4buRIGjhu41jIHNpbmggdGhlbyBsb+G6oWkgdHLGsOG7nW5nIHbDoCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gbmfGsOG7nWkgZ2nDoW0gaOG7mSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KQmnhu4N1IMSR4buTIDQuMSBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBo4buNYyBzaW5oIHRoZW8gbG/huqFpIHRyxrDhu51uZyB2w6AgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPhu6dhIG5nxrDhu51pIGdpw6FtIGjhu5kuIFRyb25nIG5ow7NtIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kga2jDtG5nIGjhu41jIGNhbyDEkeG6s25nIChGQUxTRSksIHPhu5EgaOG7jWMgc2luaCBjaOG7jW4gdHLGsOG7nW5nIGjhu41jIHRodeG6rXQgKEFjYWRlbWljKSAoMzI4KSBjYW8gaMahbiByw7UgcuG7h3Qgc28gduG7m2kgdHLGsOG7nW5nIG5naOG7gSAoVm9jYXRpb25hbCkgKDE1MikuIE5nxrDhu6NjIGzhuqFpLCDhu58gbmjDs20gY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgxJHDoyBo4buNYyBjYW8gxJHhurNuZyAoVFJVRSksIHPhu5EgaOG7jWMgc2luaCBjaOG7jW4gdHLGsOG7nW5nIG5naOG7gSAoMjM5KSB0xINuZyBsw6puIMSRw6FuZyBr4buDIHbDoCBn4bqnbiB0aeG7h20gY+G6rW4gc+G7kSBo4buNYyBzaW5oIGNo4buNbiB0csaw4budbmcgaOG7jWMgdGh14bqtdCAoMjgxKS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPhu6dhIG5nxrDhu51pIGdpw6FtIGjhu5kgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biDEkeG7i25oIGjGsOG7m25nIGNo4buNbiBsb+G6oWkgdHLGsOG7nW5nIGPhu6dhIGjhu41jIHNpbmguDQoNCg0KIyMjICoqNC4zIEtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqKioNCg0KQsOgaSB0b8OhbiBjw7MgZ2nhuqMgdGh1eeG6v3QgbmjGsCBzYXU6ICQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2x9DQpIXzA6IFw7ICBcdGV4dHt0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2EgbmfGsOG7nWkgZ2nDoW0gaOG7mSAgdsOgIGxv4bqhaSB0csaw4budbmcgdGhlbyBo4buNYyBj4bunYSBo4buNYyBzaW5oIMSR4buZYyBs4bqtcCB24bubaSBuaGF1IH0gXFwgDQpIXzE6IFw7ICBcdGV4dHt0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2EgbmfGsOG7nWkgZ2nDoW0gaOG7mSB2w6AgbG/huqFpIHRyxrDhu51uZyB0aGVvIGjhu41jIGPhu6dhIGjhu41jIHNpbmggY8OzIGxpw6puIHF1YW4gxJHhur9uIG5oYXV9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0LiQkDQoNClRhIHRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIHbDoCDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KYGBge3J9DQpjaGl0eXBlcGF3IDwtIGNoaXNxLnRlc3QodGFibGVfdHlwZXBhdykNCnByaW50KGNoaXR5cGVwYXcpDQpgYGANCk5o4bqtbiB4w6l0OiBW4bubaSBwLXZhbHVlIHLhuqV0IG5o4buPIChwIDwgMC4wNSksIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2EgbmfGsOG7nWkgZ2nDoW0gaOG7mSB2w6AgbG/huqFpIHRyxrDhu51uZyBo4buNYyBzaW5oIHRoZW8gaOG7jWMNCg0KDQojIyMgKio0LjQgSGnhu4d1IGhhaSB04bu3IGzhu4cqKg0KDQoqKlRoaeG6v3QgbOG6rXAgdOG7tyBs4buHKioNCg0KVOG7tyBs4buHIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgKipraMO0bmcgaOG7jWMgxJHhuqFpIGjhu41jKiogdGhlbyBo4buNYyAqKnRyxrDhu51uZyBo4buNYyB0aHXhuq10IChBY2FkZW1pYykqKjoNCg0KJCQNCnBfMSA9IFAoXHRleHR7cGFyZW50c1xfd2FzXF9pblxfY29sbGVnZX0gPSBcdGV4dHtGQUxTRX0gXG1pZCBcdGV4dHtzY2hvb2xcX3R5cGV9ID0gXHRleHR7QWNhZGVtaWN9KQ0KJCQNCg0KVOG7tyBs4buHIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgKipraMO0bmcgaOG7jWMgxJHhuqFpIGjhu41jKiogdGhlbyBo4buNYyAqKnRyxrDhu51uZyBuZ2jhu4EgKFZvY2F0aW9uYWwpKio6DQoNCiQkDQpwXzIgPSBQKFx0ZXh0e3BhcmVudHNcX3dhc1xfaW5cX2NvbGxlZ2V9ID0gXHRleHR7RkFMU0V9IFxtaWQgXHRleHR7c2Nob29sXF90eXBlfSA9IFx0ZXh0e1ZvY2F0aW9uYWx9KQ0KJCQNCg0KSGnhu4d1IGNow6puaCBs4buHY2ggZ2nhu69hIGhhaSB04bu3IGzhu4c6DQoNCiQkDQpkID0gcF8xIC0gcF8yDQokJA0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oKioNCg0KLSAqKkdp4bqjIHRodXnhur90IEjigoAqKjogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgaGFpIHThu7cgbOG7hyAgDQogICQkIEhfMDogcF8xIC0gcF8yID0gMCAkJA0KDQotICoqR2nhuqMgdGh1eeG6v3QgSOKCgSoqOiBU4bu3IGzhu4cgaOG7jWMgc2luaCBo4buNYyB0csaw4budbmcgaOG7jWMgdGh14bqtdCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSBraMO0bmcgaOG7jWMgxJHhuqFpIGjhu41jIGNhbyBoxqFuIHNvIHbhu5tpIGjhu41jIHNpbmggaOG7jWMgdHLGsOG7nW5nIG5naOG7gSAgDQogICQkIEhfMTogcF8xIC0gcF8yID4gMCAkJA0KDQpgYGB7cn0NCmNoaXR5cGVwYXcgPC0gY2hpc3EudGVzdCh0YWJsZV90eXBlcGF3KQ0KcHJpbnQoY2hpdHlwZXBhdykNCmBgYA0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIHbhu5tpIGhp4buHdSBjaOG7iW5oIFlhdGVzIGNobyBi4bqjbmcgY2jDqW8gZ2nhu69hIGxv4bqhaSB0csaw4budbmcgdGhlbyBo4buNYyB2w6AgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPhu6dhIG5nxrDhu51pIGdpw6FtIGjhu5kgY2hvIHRo4bqleTogZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiAkXGNoaV4yID0gMjB7LH04MjMkIHbhu5tpIDEgYuG6rWMgdOG7sSBkbyB2w6AgcC12YWx1ZSA9IDUuMDM2ZS0wNi4gVsOsIHAtdmFsdWUgbmjhu48gaMahbiBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgdGEgY8OzIMSR4bunIGPGoSBz4bufIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgbG/huqFpIHRyxrDhu51uZyBo4buNYyBzaW5oIHRoZW8gaOG7jWMgdsOgIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBj4bunYSBuZ8aw4budaSBnacOhbSBo4buZLiBOw7NpIGPDoWNoIGtow6FjLCB2aeG7h2MgaOG7jWMgc2luaCBjaOG7jW4gaOG7jWMgdHLGsOG7nW5nIGjhu41jIHRodeG6rXQgaGF5IHRyxrDhu51uZyBuZ2jhu4EgY8OzIGxpw6puIHF1YW4gxJHhur9uIHZp4buHYyBuZ8aw4budaSBnacOhbSBo4buZIGPhu6dhIGPDoWMgZW0gY8OzIGjhu41jIMSR4bqhaSBo4buNYyBoYXkga2jDtG5nLg0KDQoNCiMjIyAqKjQuNSAgVOG7tyBz4buRIE5ndXkgY8ahIChSZWxhdGl2ZSBSaXNrIC0gUlIpKioNCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0KcnR5cGVwYXcgPC0gcmlza3JhdGlvKHRhYmxlX3R5cGVwYXcsIG1ldGhvZCA9ICJ3YWxkIikNCnByaW50KHJ0eXBlcGF3KQ0KYGBgDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIHThu7cgbOG7hyBy4bunaSBybyAocmlzayByYXRpbykgZ2nhu69hIGxv4bqhaSB0csaw4budbmcgaOG7jWMgc2luaCB0aGVvIGjhu41jIHbDoCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2EgbmfGsOG7nWkgZ2nDoW0gaOG7mSBjaG8gdGjhuqV5OiBo4buNYyBzaW5oIGjhu41jIHRyxrDhu51uZyBuZ2jhu4EgY8OzIHjDoWMgc3XhuqV0IGPDsyBuZ8aw4budaSBnacOhbSBo4buZIGtow7RuZyBo4buNYyDEkeG6oWkgaOG7jWMgY2FvIGjGoW4ga2hv4bqjbmcgMzIlICBzbyB24bubaSBo4buNYyBzaW5oIGjhu41jIHRyxrDhu51uZyBo4buNYyB0aHXhuq10IChSUiA9IDEuMzI0NykuIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIMaw4bubYyBsxrDhu6NuZyBuw6B5IGzDoCB04burIDEuMTc5IMSR4bq/biAxLjQ4OSwgIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIMSQ4buTbmcgdGjhu51pLCBwLXZhbHVlIHLhuqV0IG5o4buPICjiiYggMy42ZS0wNiksIG5o4buPIGjGoW4gbmhp4buBdSBzbyB24bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgbsOqbiB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdC4gTmjGsCB24bqteSwgY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIGNobyB0aOG6pXkgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSBraMO0bmcgaOG7jWMgxJHhuqFpIGjhu41jIGPDsyB4dSBoxrDhu5tuZyB0aGVvIGjhu41jIHRyxrDhu51uZyBuZ2jhu4EgY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgY8OhYyBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyDEkeG6oWkgaOG7jWMuIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCB2YWkgdHLDsiBxdWFuIHRy4buNbmcgY+G7p2EgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIHBo4bulIGh1eW5oIHRyb25nIMSR4buLbmggaMaw4bubbmcgaOG7jWMgdOG6rXAgY+G7p2EgaOG7jWMgc2luaC4NCg0KDQojIyMgKio0LjYgVOG7tyBz4buRIENow6puaCAoT2RkcyBSYXRpbyAtIE9SKToqKg0KDQpgYGB7cn0NCmxpYnJhcnkoRGVzY1Rvb2xzKQ0Kb3J0eXBlcGF3IDwtIE9kZHNSYXRpbyh0YWJsZV90eXBlcGF3LCBtZXRob2Q9IndhbGQiLCBjb25mLmxldmVsID0gMC45NSkNCnByaW50KG9ydHlwZXBhdykNCmBgYA0KR2nDoSB0cuG7iyBvZGRzIHJhdGlvID0gMS44MzU0IGNobyBiaeG6v3QgdOG7tyBs4buHIGNow6puaCAob2RkcykgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSBraMO0bmcgaOG7jWMgxJHhuqFpIGjhu41jIHRoZW8gaOG7jWMgdHLGsOG7nW5nIG5naOG7gSAoVm9jYXRpb25hbCkgY2FvIGjGoW4ga2hv4bqjbmcgODMuNSUgc28gduG7m2kgaOG7jWMgc2luaCB0aGVvIGjhu41jIHRyxrDhu51uZyBo4buNYyB0aHXhuq10IChBY2FkZW1pYykuIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIG9kZHMgcmF0aW8gbMOgIHThu6sgMS40MTggxJHhur9uIDIuMzc2LCBraMO0bmcgY2jhu6lhIGdpw6EgdHLhu4sgMSwgbsOqbiBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIMSQaeG7gXUgxJHDsyBjaG8gdGjhuqV5IGPDsyBt4buRaSBsacOqbiBo4buHIHLDtSBy4buHdCBnaeG7r2EgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPhu6dhIG5nxrDhu51pIGdpw6FtIGjhu5kgdsOgIGxv4bqhaSB0csaw4budbmcgaOG7jWMgc2luaCB0aGVvIGjhu41jLiBWaeG7h2MgbmfGsOG7nWkgZ2nDoW0gaOG7mSBjaMawYSB04burbmcgaOG7jWMgxJHhuqFpIGjhu41jIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24geHUgaMaw4bubbmcgY2jhu41uIHRyxrDhu51uZyBuZ2jhu4EgY+G7p2EgaOG7jWMgc2luaCwgY8OzIHRo4buDIGRvIMSR4buLbmggaMaw4bubbmcgbmdo4buBIG5naGnhu4dwIHRo4buxYyB0aeG7hW4gaG/hurdjIMSRaeG7gXUga2nhu4duIGdpYSDEkcOsbmguDQoNCg0KDQojIyAqKlBI4bqmTiA1LiBQSMavxqBORyBQSMOBUCDGr+G7mkMgTMav4buiTkcgTUFYSU1VTSBMSUtFSE9PRCoqDQoNCiMjIyAqKjUuMS4gVOG7lW5nIHF1YW4ga2jDoWkgbmnhu4dtKioNCg0KUGjGsMahbmcgcGjDoXAgxrDhu5tjIGzGsOG7o25nIGjhu6NwIGzDvSB04buRaSDEkWEgKE1heGltdW0gTGlrZWxpaG9vZCBFc3RpbWF0aW9uIC0gTUxFKSBsw6AgbeG7mXQga+G7uSB0aHXhuq10IHRo4buRbmcga8OqIHBo4buVIHF1w6F0IGTDuW5nIMSR4buDIHjDoWMgxJHhu4tuaCBnacOhIHRy4buLIGPhu6dhIGPDoWMgdGhhbSBz4buRIHRyb25nIG3hu5l0IG3DtCBow6xuaCBzYW8gY2hvIHjDoWMgc3XhuqV0IHh14bqldCBoaeG7h24gY+G7p2EgZOG7ryBsaeG7h3UgcXVhbiBzw6F0IMSRxrDhu6NjIGzDoCBs4bubbiBuaOG6pXQuIFbhu4EgYuG6o24gY2jhuqV0LCBNTEUgbMOgIGPhuqd1IG7hu5FpIGdp4buvYSBk4buvIGxp4buHdSB0aOG7sWMgdOG6vyB2w6AgbcO0IGjDrG5oIGzDvSB0aHV54bq/dCwgY2hvIHBow6lwIGPDoWMgbmjDoCBwaMOibiB0w61jaCDEkeG7i25oIGzGsOG7o25nIGjDs2EgaGnhu4duIHTGsOG7o25nIG5n4bqrdSBuaGnDqm4gYuG6sW5nIGPDoWNoIHThu5FpIMSRYSBow7NhICLEkeG7mSBwaMO5IGjhu6NwIiBnaeG7r2EgbcO0IGjDrG5oIHbDoCBk4buvIGxp4buHdS4NCg0KVHJvbmcgY8OhYyBiw6BpIHRvw6FuIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmggaG/hurdjIG5o4buLIHBow6JuLCBNTEUgxJHGsOG7o2MgeGVtIGzDoCBwaMawxqFuZyBwaMOhcCDGsOG7m2MgbMaw4bujbmcgY2h14bqpbiwgdGjGsOG7nW5nIMSRxrDhu6NjIMOhcCBk4bulbmcgdHJvbmcgY8OhYyBtw7QgaMOsbmggcGjDom4gcGjhu5FpIHLhu51pIHLhuqFjIG5oxrAgQmVybm91bGxpLCBCaW5vbWlhbCBoYXkgTXVsdGlub21pYWwsIGPFqW5nIG5oxrAgdHJvbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYy4NCg0KDQojIyMgKio1LjIgTmd1ecOqbiBsw70gY+G7kXQgbMO1aTogSMOgbSBI4bujcCBsw70gdsOgIFThu5FpIMSRYSBow7NhKioNCg0KIyMjIyAqKjUuMi4xIFBow6JuIGJp4buHdCB4w6FjIHN14bqldCB2w6AgxJHhu5kgaOG7o3AgbMO9KioNCg0KIFjDoWMgc3XhuqV0IHbDoCBIw6BtIGjhu6NwIGzDvSB0cm9uZyB0aOG7kW5nIGvDqg0KDQotICoqWMOhYyBzdeG6pXQqKiAkUChcdGV4dHtEYXRhfSBcbWlkIFx0aGV0YSkkOiDEkeG6oWkgZGnhu4duIGNobyBraOG6oyBuxINuZyB44bqjeSByYSBj4bunYSBk4buvIGxp4buHdSBxdWFuIHPDoXQgxJHGsOG7o2Mga2hpICoqdGhhbSBz4buRICRcdGhldGEkIMSRw6MgYmnhur90KiouIMSQw6J5IGzDoCBraMOhaSBuaeG7h20gdGjGsOG7nW5nIGTDuW5nIHRyb25nIG3DtCBow6xuaCBzdXkgZGnhu4VuLg0KDQotICoqxJDhu5kgaOG7o3AgbMO9IChMaWtlbGlob29kKSoqICRMKFx0aGV0YSBcbWlkIFx0ZXh0e0RhdGF9KSQ6IMSRw6FuaCBnacOhIG3hu6ljIMSR4buZICpwaMO5IGjhu6NwKiBj4bunYSB0aGFtIHPhu5EgJFx0aGV0YSQgduG7m2kgZOG7ryBsaeG7h3UgxJHDoyBxdWFuIHPDoXQuIMSQw6J5IGzDoCBu4buBbiB04bqjbmcgY+G7p2EgcGjGsMahbmcgcGjDoXAgxrDhu5tjIGzGsOG7o25nIGjhu6NwIGzDvSB04buRaSDEkWEgKE1heGltdW0gTGlrZWxpaG9vZCBFc3RpbWF0aW9uIC0gTUxFKS4NCg0KIFRyxrDhu51uZyBo4bujcCBjw6FjIHF1YW4gc8OhdCDEkeG7mWMgbOG6rXANCg0KS2hpIGPDoWMgcXVhbiBzw6F0ICR5XzEsIHlfMiwgLi4uLCB5X24kIGzDoCAqKsSR4buZYyBs4bqtcCoqLCBow6BtIGjhu6NwIGzDvSBjw7MgdGjhu4MgxJHGsOG7o2Mgdmnhur90IGTGsOG7m2kgZOG6oW5nIHTDrWNoIGPhu6dhIHjDoWMgc3XhuqV0IGPDsyDEkWnhu4F1IGtp4buHbjoNCg0KJCQNCkwoXHRoZXRhIFxtaWQgeV8xLCB5XzIsIFxsZG90cywgeV9uKSA9IFxwcm9kX3tpPTF9XntufSBQKHlfaSBcbWlkIFx0aGV0YSkNCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gJFx0aGV0YSQ6IHRoYW0gc+G7kSBjaMawYSBiaeG6v3QgY+G7p2EgbcO0IGjDrG5oLA0KLSAkeV9pJDogZ2nDoSB0cuG7iyBxdWFuIHPDoXQgxJHGsOG7o2MgdOG7qyBt4bqrdSBk4buvIGxp4buHdS4NCg0KDQojIyMjICoqNS4yLjIgVOG7kWkgxJFhIGjDs2EgaMOgbSBo4bujcCBsw70qKg0KDQpN4bulYyB0acOqdSBj4bunYSBNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiAoTUxFKQ0KDQpN4bulYyB0acOqdSBj4bunYSBwaMawxqFuZyBwaMOhcCDGsOG7m2MgbMaw4bujbmcgaOG7o3AgbMO9IHThu5FpIMSRYSBsw6AgdMOsbSBnacOhIHRy4buLIMaw4bubYyBsxrDhu6NuZyAkXGhhdHtcdGhldGF9JCBzYW8gY2hvOg0KDQokJA0KXGhhdHtcdGhldGF9ID0gXGFyZ1xtYXhfe1x0aGV0YX0gTChcdGhldGEpDQokJA0KDQpU4bupYyBsw6AgdMOsbSBnacOhIHRy4buLIHRoYW0gc+G7kSAkXHRoZXRhJCBsw6BtICoqdOG7kWkgxJFhIGjDs2EgaMOgbSBo4bujcCBsw70qKiAkTChcdGhldGEpJCwgduG7m2kgZOG7ryBsaeG7h3UgxJHDoyBjaG8uDQoNCkjDoG0gbG9nLWxpa2VsaWhvb2QNCg0KxJDhu4MgxJHGoW4gZ2nhuqNuIGjDs2Egdmnhu4djIHTDrW5oIHRvw6FuLCBuZ8aw4budaSB0YSB0aMaw4budbmcgc+G7rSBk4bulbmcgKipow6BtIGxvZy1saWtlbGlob29kKiosIHbDrCBsb2dhcml0IGPhu6dhIGjDoG0gdMOtY2ggc+G6vSB0cuG7nyB0aMOgbmggdOG7lW5nLCBk4buFIHjhu60gbMO9IGjGoW4gdHJvbmcgcGjDom4gdMOtY2ggZ2nhuqNpIHTDrWNoOg0KDQokJA0KXGxvZyBMKFx0aGV0YSkgPSBcc3VtX3tpPTF9XntufSBcbG9nIFAoeV9pIFxtaWQgXHRoZXRhKQ0KJCQNCg0KDQpWaeG7h2MgdOG7kWkgxJFhIGjDs2EgJFxsb2cgTChcdGhldGEpJCB0aMaw4budbmcgxJHGsOG7o2MgxrBhIGNodeG7mW5nIGjGoW4gdsOsOg0KDQotIEJp4bq/biB0w61jaCB0aMOgbmggdOG7lW5nLCB0aHXhuq1uIHRp4buHbiBoxqFuIGtoaSBs4bqleSDEkeG6oW8gaMOgbSwNCi0gVHLDoW5oIHNhaSBz4buRIGzDoG0gdHLDsm4ga2hpIHTDrW5oIHTDrWNoIGPDoWMgeMOhYyBzdeG6pXQgcuG6pXQgbmjhu48sDQotIEdp4bqjbSDEkeG7mSBwaOG7qWMgdOG6oXAgdMOtbmggdG/DoW4gdHJvbmcgY8OhYyBtw7QgaMOsbmggbOG7m24uDQoNCkRvIMSRw7MsIGjhuqd1IGjhur90IGPDoWMgdGh14bqtdCB0b8OhbiBNTEUgdGjhu7FjIHThur8gxJHhu4F1IHPhu60gZOG7pW5nICoqbG9nLWxpa2VsaWhvb2QqKiB0aGF5IHbDrCB0cuG7sWMgdGnhur9wIGzDoG0gdmnhu4djIHbhu5tpIGjDoG0gaOG7o3AgbMO9IGJhbiDEkeG6p3UuDQoNCiMjIyAqKjUuMyBRdXkgdHLDrG5oIHRyaeG7g24ga2hhaSBNTEUqKg0KDQoNCiBDw6FjIGLGsOG7m2MgdGjhu7FjIGhp4buHbiBwaMawxqFuZyBwaMOhcCDGsOG7m2MgbMaw4bujbmcgaOG7o3AgbMO9IHThu5FpIMSRYSAoTUxFKQ0KDQogKipCxrDhu5tjIDE6IFjDoWMgxJHhu4tuaCBtw7QgaMOsbmggcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0KioNCg0KTOG7sWEgY2jhu41uIG3DtCBow6xuaCBwaMOibiBwaOG7kWkgcGjDuSBo4bujcCB24bubaSBi4bqjbiBjaOG6pXQgY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgKGJp4bq/biDEkeG6p3UgcmEpOg0KDQotICoqQmVybm91bGxpKio6IETDuW5nIGNobyBiaeG6v24gbmjhu4sgcGjDom4gKDAvMSksDQotICoqQmlub21pYWwqKjogRMO5bmcga2hpIG3DtCBow6xuaCBow7NhIHThu5VuZyBz4buRIGzhuqduIHRow6BuaCBjw7RuZyB0cm9uZyBuaGnhu4F1IGzhuqduIHRo4butLA0KLSAqKk11bHRpbm9taWFsKio6IETDuW5nIGNobyBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7Mgbmhp4buBdSBt4bupYyAoY2F0ZWdvcmljYWwgbmhp4buBdSBoxqFuIDIgbmjDs20pLg0KDQogKipCxrDhu5tjIDI6IFRoaeG6v3QgbOG6rXAgaMOgbSBo4bujcCBsw70gKExpa2VsaWhvb2QgRnVuY3Rpb24pKioNCg0KROG7sWEgdsOgbyBtw7QgaMOsbmggeMOhYyBzdeG6pXQgxJHDoyBjaOG7jW4sIGJp4buDdSB0aOG7qWMgaMOgbSBo4bujcCBsw70gxJHGsOG7o2MgdGhp4bq/dCBs4bqtcCBi4bqxbmcgY8OhY2ggbmjDom4gY8OhYyB4w6FjIHN14bqldCBjw7MgxJFp4buBdSBraeG7h24g4bupbmcgduG7m2kgdOG7q25nIHF1YW4gc8OhdDoNCg0KJCQNCkwoXHRoZXRhKSA9IFxwcm9kX3tpPTF9XntufSBQKHlfaSBcbWlkIFx0aGV0YSkNCiQkDQoNCg0KDQoqKkLGsOG7m2MgMzogVMOtbmggbG9nLWxpa2VsaWhvb2QqKg0KDQpT4butIGThu6VuZyBsb2dhcml0IHThu7Egbmhpw6puIMSR4buDIGJp4bq/biDEkeG7lWkgdMOtY2ggdGjDoG5oIHThu5VuZywgdGh14bqtbiB0aeG7h24gY2hvIHZp4buHYyB04buRaSDGsHU6DQoNCiQkDQpcbG9nIEwoXHRoZXRhKSA9IFxzdW1fe2k9MX1ee259IFxsb2cgUCh5X2kgXG1pZCBcdGhldGEpDQokJA0KDQogKipCxrDhu5tjIDQ6IFThu5FpIMSRYSBow7NhIGxvZy1saWtlbGlob29kKioNCg0KLSBUw61uaCDEkeG6oW8gaMOgbSByacOqbmcgdGhlbyB0aGFtIHPhu5EgJFx0aGV0YSQ6DQoNCiQkDQpcZnJhY3tkfXtkXHRoZXRhfSBcbG9nIEwoXHRoZXRhKQ0KJCQNCg0KLSBHaeG6o2kgcGjGsMahbmcgdHLDrG5oIMSR4bqhbyBow6BtIGLhuq1jIG5o4bqldDoNCg0KJCQNClxmcmFje2R9e2RcdGhldGF9IFxsb2cgTChcdGhldGEpID0gMA0KJCQNCg0KLSBLaeG7g20gdHJhIMSRaeG7gXUga2nhu4duIGPhu7FjIMSR4bqhaToNCiAgLSDEkOG6oW8gaMOgbSBi4bqtYyBoYWkgcGjhuqNpIMOibTogJFxmcmFje2ReMn17ZFx0aGV0YV4yfSBcbG9nIEwoXHRoZXRhKSA8IDAkLCAgDQogIC0gSG/hurdjIHPhu60gZOG7pW5nIGPDoWMgcGjGsMahbmcgcGjDoXAgc+G7kSAobmjGsCBOZXd0b24tUmFwaHNvbikgxJHhu4MgdMOsbSBj4buxYyB0cuG7iy4NCg0KIyMjICoqNS40IOG7qG5nIGThu6VuZyBNTEUgdHJvbmcgSOG7k2kgcXV5IExvZ2lzdGljKioNCg0KVHJvbmcgY8OhYyBtw7QgaMOsbmggKipo4buTaSBxdXkgbG9naXN0aWMqKiDigJMgbsahaSBiaeG6v24gcGjhuqNuIGjhu5NpICRZJCBsw6AgKipuaOG7iyBwaMOibioqICgwLzEpIOKAkyAqKnBoxrDGoW5nIHBow6FwIMaw4bubYyBsxrDhu6NuZyBo4bujcCBsw70gdOG7kWkgxJFhIChNTEUpKiogxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxrDhu5tjIGzGsOG7o25nIGPDoWMgaOG7hyBz4buRIGjhu5NpIHF1eSAkXGJldGEkIHNhbyBjaG8gKip4w6FjIHN14bqldCBk4buxIMSRb8OhbioqOg0KDQokJA0KUChZID0gMSBcbWlkIFgpID0gXGZyYWN7MX17MSArIFxleHBbLShcYmV0YV8wICsgXGJldGFfMSBYXzEgKyBcY2RvdHMgKyBcYmV0YV9rIFhfayldfQ0KJCQNCg0KcGjDuSBo4bujcCBuaOG6pXQgduG7m2kgZOG7ryBsaeG7h3UgcXVhbiBzw6F0Lg0KDQoNCioqSMOgbSBsb2ctbGlrZWxpaG9vZCB0cm9uZyBo4buTaSBxdXkgbG9naXN0aWMqKg0KDQpW4bubaSAkcF9pID0gUChZX2kgPSAxIFxtaWQgWF9pKSQsIGjDoG0gbG9nLWxpa2VsaWhvb2QgY8OzIGThuqFuZzoNCg0KJCQNCkxMKFxib2xkc3ltYm9se1xiZXRhfSkgPSBcc3VtX3tpPTF9XntufSBcbGVmdFsgeV9pIFxsb2cocF9pKSArICgxIC0geV9pKSBcbG9nKDEgLSBwX2kpIFxyaWdodF0NCiQkDQoNCkjDoG0gbG9nLWxpa2VsaWhvb2QgbsOgeSDEkcOhbmggZ2nDoSDEkeG7mSBwaMO5IGjhu6NwIGdp4buvYSBtw7QgaMOsbmggbG9naXN0aWMgdsOgIGThu68gbGnhu4d1IHF1YW4gc8OhdC4NCg0KDQoqKsav4bubYyBsxrDhu6NuZyAkXGhhdHtcYmV0YX0kKioNCg0KQ8OhYyBo4buHIHPhu5EgaOG7k2kgcXV5ICRcaGF0e1xiZXRhfSQgxJHGsOG7o2MgdMOsbSBi4bqxbmcgY8OhY2ggKip04buRaSDEkWEgaMOzYSBow6BtIGxvZy1saWtlbGlob29kKiosIHRow7RuZyBxdWEgY8OhYyB0aHXhuq10IHRvw6FuIHThu5FpIMawdSBz4buRIG5oxrA6DQoNCi0gKipOZXd0b24tUmFwaHNvbioqDQotICoqRmlzaGVyIFNjb3JpbmcqKg0KLSAqKkdyYWRpZW50IERlc2NlbnQqKiwgdi52Lg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQojICoqVzQqKg0KIyMgKipQSOG6pk4gMTogVMOMTSBISeG7glUgVsOAIENIVeG6qE4gQuG7iiBE4buuIExJ4buGVSoqDQoNCiMjIyAqKjEuMSDEkOG7jWMgZOG7ryBsaeG7h3UqKg0KDQpgYGB7cn0NCmRmIDwtcmVhZC5jc3YoIkM6L1VzZXJzL0RFTEwvRG93bmxvYWRzL2RhdGEgKDEpLmNzdiIsIGhlYWRlcj0gVCkNCiMgVMOhY2ggZOG7ryBsaeG7h3UgdGjDoG5oIG5oaeG7gXUgY+G7mXQNCmRhdGEgPC0gdGlkeXI6OnNlcGFyYXRlKA0KICBkZiwNCiAgY29sID0gMSwNCiAgaW50byA9IGMoInR5cGVfc2Nob29sIiwgInNjaG9vbF9hY2NyZWRpdGF0aW9uIiwgImdlbmRlciIsICJpbnRlcmVzdCIsDQogICAgICAgICAgICJyZXNpZGVuY2UiLCAicGFyZW50X2FnZSIsICJwYXJlbnRfc2FsYXJ5IiwgImhvdXNlX2FyZWEiLA0KICAgICAgICAgICAiYXZlcmFnZV9ncmFkZXMiLCAicGFyZW50X3dhc19pbl9jb2xsZWdlIiwgIndpbGxfZ29fdG9fY29sbGVnZSIpLA0KICBzZXAgPSAiOyINCikNCg0KYGBgDQoNCkLhu5kgZOG7ryBsaeG7h3UgR28tdG8tQ29sbGVnZSDEkcaw4bujYyB04buVbmcgaOG7o3AgcGjhu6VjIHbhu6UgY2hvIG3hu5l0IGThu7Egw6FuIOG7nyB0csaw4budbmcgxJHhuqFpIGjhu41jLlRow7RuZyBxdWEgdmnhu4dwaMOibiB0w61jaCwgY8OhYyBj4buRIHbhuqVuIGjhu41jIMSRxrDhu51uZyBjw7MgdGjhu4MgaOG7lyB0cuG7oyBuaOG7r25nIGjhu41jIHNpbmggY8OzIG5ndXkgY8ahIGtow7RuZyBo4buNYyB0aeG6v3AgYuG6sW5nIGPDoWNoIHjDoWMgxJHhu4tuaCBjw6FjIHnhur91IHThu5EgbGnDqm4gcXVhbiB2w6AgxJHGsGEgcmEgaOG7lyB0cuG7oyBwaMO5IGjhu6NwLg0KDQojIyMgKioxLjIgTMOgbSBxdWVuIGThu68gbGnhu4d1KioNCg0KYGBge3J9DQpzdHIoZGF0YSkNCmBgYA0KDQpC4buZIGThu68gbGnhu4d1IGJhbyBn4buTbSAxMSBiaeG6v24gLCBwaOG6o24gw6FuaCDEkeG6t2MgxJFp4buDbSBjw6EgbmjDom4gdsOgIGdpYSDEkcOsbmggY+G7p2EgaOG7jWMgc2luaDoNCg0KfCBUw6puIGJp4bq/biB8IE3DtCB04bqjIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBgdHlwZV9zY2hvb2xgIHwgTG/huqFpIHRyxrDhu51uZyBo4buNYzogIkFjYWRlbWljIiBob+G6t2MgIlZvY2F0aW9uYWwiIHwNCnwgYHNjaG9vbF9hY2NyZWRpdGF0aW9uYCB8IFjhur9wIGjhuqFuZyBraeG7g20gxJHhu4tuaCBj4bunYSB0csaw4budbmc6ICJBIiwgIkIiLCAuLi4gfA0KfCBgZ2VuZGVyYCB8IEdp4bubaSB0w61uaDogIk1hbGUiLCAiRmVtYWxlIiB8DQp8IGBpbnRlcmVzdGAgfCBN4bupYyDEkeG7mSBo4bupbmcgdGjDuiB24bubaSB2aeG7h2MgaOG7jWM6ICJMZXNzIEludGVyZXN0ZWQiLCAiVmVyeSBJbnRlcmVzdGVkIiwgLi4uIHwNCnwgYHJlc2lkZW5jZWAgfCBOxqFpIGPGsCB0csO6OiAiVXJiYW4iIGhv4bq3YyAiUnVyYWwiIHwNCnwgYHBhcmVudF9hZ2VgIHwgVHXhu5VpIGPhu6dhIGNoYSBt4bq5IHwNCnwgYHBhcmVudF9zYWxhcnlgIHwgVGh1IG5o4bqtcCBj4bunYSBjaGEgbeG6uSB8DQp8IGBob3VzZV9hcmVhYCB8IERp4buHbiB0w61jaCBuaMOgIOG7nyB8DQp8IGBhdmVyYWdlX2dyYWRlc2AgfCDEkGnhu4NtIHRydW5nIGLDrG5oIGjhu41jIHThuq1wIGPhu6dhIGjhu41jIHNpbmggfA0KfCBgcGFyZW50X3dhc19pbl9jb2xsZWdlYCB8IENoYSBt4bq5IGPDsyB04burbmcgaOG7jWMgxJHhuqFpIGjhu41jIGhheSBraMO0bmc6ICJUcnVlIi8iRmFsc2UiIHwNCnwgYHdpbGxfZ29fdG9fY29sbGVnZWAgfCBo4buNYyBzaW5oIGPDsyBo4buNYyB0aeG6v3AgxJHhuqFpIGjhu41jIGhheSBraMO0bmc6ICJUcnVlIi8iRmFsc2UiIHwNCg0KVuG7m2kgMS4wMDAgcXVhbiBzw6F0IHbDoCAxMSBiaeG6v24sIGLhu5kgZOG7ryBsaeG7h3UgR28tdG8tQ29sbGVnZSBjw7MgcXV5IG3DtCBwaMO5IGjhu6NwIMSR4buDIHRo4buxYyBoaeG7h24gY8OhYyBwaMOibiB0w61jaCB0aOG7kW5nIGvDqiwgeMOieSBk4buxbmcgbcO0IGjDrG5oIGThu7EgxJFvw6FuLCBjxaluZyBuaMawIHBow6JuIG5ow7NtIGjhu41jIHNpbmggdGhlbyBjw6FjIMSR4bq3YyDEkWnhu4NtIGtow6FjIG5oYXUuDQoNCkThu68gbGnhu4d1IMSRYSBk4bqhbmcgdsOgIHBob25nIHBow7o6IGJhbyBn4buTbSBjw6FjIGJp4bq/biBuaMawIHR5cGVfc2Nob29sLCBzY2hvb2xfYWNjcmVkaXRhdGlvbiwgZ2VuZGVyLCBpbnRlcmVzdCwgcmVzaWRlbmNlLCBwYXJlbnRfYWdlLCBwYXJlbnRfc2FsYXJ5LCBob3VzZV9hcmVhLCBhdmVyYWdlX2dyYWRlcywgcGFyZW50X3dhc19pbl9jb2xsZWdlLCBjdW5nIGPhuqVwIG5oaeG7gXUgdGjDtG5nIHRpbiBuaMOibiBraOG6qXUgaOG7jWMsIGtpbmggdOG6vyAtIHjDoyBo4buZaSB2w6AgaOG7jWMgdOG6rXAsIHLhuqV0IGjhu691IMOtY2ggY2hvIHZp4buHYyBwaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIHF1eeG6v3QgxJHhu4tuaCBo4buNYyDEkeG6oWkgaOG7jWMuDQoNCkLDqm4gY+G6oW5oIMSRw7MsIGJp4bq/biBt4bulYyB0acOqdSB3aWxsX2dvX3RvX2NvbGxlZ2UgZ2nDunAgdGh14bqtbiB0aeG7h24gdHJvbmcgdmnhu4djIHjDonkgZOG7sW5nIGPDoWMgbcO0IGjDrG5oIHBow6JuIGxv4bqhaSBuaOG6sW0gZOG7sSDEkW/DoW4ga2jhuqMgbsSDbmcgaOG7jWMgc2luaCB0aeG6v3AgdOG7pWMgaOG7jWMgbMOqbiDEkeG6oWkgaOG7jWMsIHThu6sgxJHDsyBo4buXIHRy4bujIHTGsCB24bqlbiB2w6AgY2FuIHRoaeG7h3Aga+G7i3AgdGjhu51pLg0KDQoqKipIaeG7g24gdGjhu4sgMTAgZMOybmcgxJHhuqd1IGLhu5kgZOG7ryBsaeG7h3UqKioNCg0KYGBge3J9DQpoZWFkKGRhdGEsMTApDQpgYGANCg0KKioqSGnhu4NuIHRo4buLIDEwIGTDsm5nIGN14buRaSBi4buZIGThu68gbGnhu4d1KioqDQoNCmBgYHtyfQ0KdGFpbChkYXRhLDEwKQ0KYGBgDQojIyMgKioxLjMgS2nhu4NtIHRyYSBnacOhIHRy4buLIE5BKioNCg0KYGBge3J9DQpkYXRhbmEgPC0gc3VtKGlzLm5hKGRhdGEpKQ0KcHJpbnQoZGF0YW5hKQ0KYGBgDQpW4bqteSBraGkga2nhu4NtIHRyYSB04buVbmcgc+G7kSBnacOhIHRy4buLIE5BIHRvw6BuIGLhu5kgZGF0YSBi4bqxbmcgY8OidSBs4buHbmggYHN1bShpcy5uYShkYXRhKSlgLCBr4bq/dCBxdeG6oyBuaOG6rW4gxJHGsOG7o2MgbMOgICoqS0jDlE5HIEPDkyBHScOBIFRS4buKIE5BKiogbsOqbiB0YSB0aeG6v24gaMOgbmggcGjDom4gdMOtY2ggdGnhur9wLg0KDQojIyMgKioxLjQgQ2h1eeG7g24gxJHhu5VpIHRow6BuaCBiaeG6v24gxJHhu4tuaCB0w61uaCoqDQoNClZp4buHYyBjaHV54buDbiBjw6FjIGJp4bq/biBuaMawIHR5cGVfc2Nob29sLCBzY2hvb2xfYWNjcmVkaXRhdGlvbiwgZ2VuZGVyLCBpbnRlcmVzdCwgcmVzaWRlbmNlLCBwYXJlbnRfd2FzX2luX2NvbGxlZ2Ugc2FuZyBraeG7g3UgZmFjdG9yIGzDoCBixrDhu5tjIHRp4buBbiB44butIGzDvSBxdWFuIHRy4buNbmcgdHJvbmcgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UuIMSQaeG7gXUgbsOgeSBnacO6cCBSIG5o4bqtbiBkaeG7h24gxJHDum5nIGLhuqNuIGNo4bqldCBwaMOibiBsb+G6oWkgY+G7p2EgY8OhYyBiaeG6v24gbsOgeSwgdOG7qyDEkcOzIGjhu5cgdHLhu6MgdOG7kXQgaMahbiBjaG8gdmnhu4djIHBow6JuIHTDrWNoIHRo4buRbmcga8OqIHbDoCB4w6J5IGThu7FuZyBtw7QgaMOsbmguIFbDrCB24bqteSwgdGEgdGnhur9uIGjDoG5oIGNodXnhu4NuIMSR4buVaSBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIG7DoHk6DQoNCmBgYHtyfQ0KaXNmIDwtIG5hbWVzKGRhdGEpW3NhcHBseShkYXRhLCBmdW5jdGlvbih4KSBpcy5mYWN0b3IoeCkgfHwgaXMuY2hhcmFjdGVyKHgpKV0NCnByaW50KGlzZikNCmBgYA0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBjw7MgMTEgYmnhur9uIHRyb25nIHThuq1wIGThu68gbGnhu4d1IMSRYW5nIOG7nyBk4bqhbmcgZmFjdG9yIGhv4bq3YyBjaGFyYWN0ZXIsIGNo4bunIHnhur91IGzDoCBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIG5oxrAgbG/huqFpIHRyxrDhu51uZywgZ2nhu5tpIHTDrW5oLCBt4bupYyDEkeG7mSBxdWFuIHTDom0sIG7GoWkgY8awIHRyw7osDQoNCg0KYGBge3J9DQpkYXRhJHR5cGVfc2Nob29sIDwtIGFzLmZhY3RvcihkYXRhJHR5cGVfc2Nob29sKQ0KZGF0YSRzY2hvb2xfYWNjcmVkaXRhdGlvbiA8LSBhcy5mYWN0b3IoZGF0YSRzY2hvb2xfYWNjcmVkaXRhdGlvbikNCmRhdGEkZ2VuZGVyIDwtIGFzLmZhY3RvcihkYXRhJGdlbmRlcikNCmRhdGEkaW50ZXJlc3QgPC0gYXMuZmFjdG9yKGRhdGEkaW50ZXJlc3QpDQpkYXRhJHJlc2lkZW5jZSA8LSBhcy5mYWN0b3IoZGF0YSRyZXNpZGVuY2UpDQpkYXRhJHBhcmVudF9hZ2UgPC0gYXMuZmFjdG9yKGRhdGEkcGFyZW50X2FnZSkNCmRhdGEkcGFyZW50X3NhbGFyeSA8LSBhcy5mYWN0b3IoZGF0YSRwYXJlbnRfc2FsYXJ5KQ0KZGF0YSRob3VzZV9hcmVhIDwtIGFzLmZhY3RvcihkYXRhJGhvdXNlX2FyZWEpDQpkYXRhJGF2ZXJhZ2VfZ3JhZGVzIDwtIGFzLmZhY3RvcihkYXRhJGF2ZXJhZ2VfZ3JhZGVzKQ0KZGF0YSRwYXJlbnRfd2FzX2luX2NvbGxlZ2UgPC0gYXMuZmFjdG9yKGRhdGEkcGFyZW50X3dhc19pbl9jb2xsZWdlKQ0KZGF0YSR3aWxsX2dvX3RvX2NvbGxlZ2UgPC0gYXMuZmFjdG9yKGRhdGEkd2lsbF9nb190b19jb2xsZWdlKQ0KDQpgYGANCg0KDQpDw6FjIGJp4bq/biBuaMawIHR5cGVfc2Nob29sLCBzY2hvb2xfYWNjcmVkaXRhdGlvbiwgZ2VuZGVyLCBpbnRlcmVzdCB2w6AgcmVzaWRlbmNlIMSRw6MgxJHGsOG7o2MgY2h1eeG7g24gc2FuZyBraeG7g3UgZmFjdG9yIMSR4buDIFIgaGnhu4N1IMSRw7MgbMOgIGPDoWMgYmnhur9uIHBow6JuIGxv4bqhaS4gVmnhu4djIG7DoHkgcuG6pXQgcXVhbiB0cuG7jW5nIG5o4bqxbSDEkeG6o20gYuG6o28gUiBraMO0bmcgeGVtIGNow7puZyBsw6AgZOG7ryBsaeG7h3UgbGnDqm4gdOG7pWMuIFZp4buHYyB44butIGzDvSDEkcO6bmcgbG/huqFpIGJp4bq/biBnacO6cCBj4bqjaSB0aGnhu4duIMSR4buZIGNow61uaCB4w6FjIHRyb25nIHBow6JuIHTDrWNoIHRo4buRbmcga8OqIHbDoCBtw7QgaMOsbmggaMOzYSBk4buxIGLDoW8gaOG7jWMgc2luaCBjw7MgdGnhur9wIHThu6VjIGjhu41jIMSR4bqhaSBo4buNYyBoYXkga2jDtG5nLg0KDQojIyAqKlBI4bqmTiAyOiBQSMOCTiBUw41DSCBNw5QgVOG6oiBN4buYVCBCSeG6vk4gxJDhu4pOSCBUw41OSCAtIFVOSVZBUklBVEUgREVTQ1JJUFRJVkUgQU5BTFlTSVMqKg0KDQojIyMgKioyLjEgVFlQRSBTQ0hPT0wqKg0KDQojIyMjICoqMi4xLjEgVGjhu5FuZyBrw6ogVOG6p24gc3XhuqV0KioNCmBgYHtyfQ0KdHlwZXNjaG9vbF9mcmVxIDwtIHRhYmxlKGRhdGEkdHlwZV9zY2hvb2wpDQp0eXBlc2Nob29scGMgPC0gdGFibGUoZGF0YSR0eXBlX3NjaG9vbCkvbnJvdyhkYXRhKSoxMDANCnR5cGVzY2hvb2xfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgdHlwZXNjaG9vbCA9IG5hbWVzKHR5cGVzY2hvb2xfZnJlcSksDQogIEZyZXF1ZW5jeSA9IGFzLmludGVnZXIodHlwZXNjaG9vbF9mcmVxKSwNCiAgUGVyY2VudGFnZSA9IHJvdW5kKHR5cGVzY2hvb2xwYywgMykNCikNCmNvbG5hbWVzKHR5cGVzY2hvb2xfdGFibGUpIDwtIGMoIlR5cGUgb2Ygc2Nob29sIiwgIkZyZXF1ZW5jeSIsICJUeXBlIG9mIHNjaG9vbCIsICJQZXJjZW50YWdlICglKSIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgxJHhurlwDQp0eXBlc2Nob29sX3RhYmxlICU+JQ0KICBrYWJsZSgiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDIuMSBQaMOibiBwaOG7kWkgbG/huqFpIHRyxrDhu51uZyAtIHR5cGVzY2hvb2wiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQpW4bqteSB0cm9uZyBkYXRhIG7DoHkgY8OzIGByIHRhYmxlKGRhdGEkdHlwZXNjaG9vbClbMV0vbnJvdyhkYXRhKSoxMDBgJSBo4buNIHNpbmggdGhlbyBo4buNYyBtw7RpIHRyxrDhu51uZyBo4buNYyB0aHXhuq10IHbDoCBgciB0YWJsZShkYXRhJHR5cGVzY2hvb2wpWzJdL25yb3coZGF0YSkqMTAwYCUgaOG7jWMgc2luaCBo4buNYyB0csaw4budbmcgbmdo4buBLg0KDQojIyMjICoqMi4xLjIgVHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KIyBW4bq9IFRy4buxYyBxdWFuIGhvw6EgdHLDsm4NCnBpZSh0eXBlc2Nob29sX2ZyZXEsDQogICAgbWFpbiAgID0gIkJp4buDdSDEkeG7kyAyLjE6IFBow6JuIGLhu5EgbG/huqFpIHRyxrDhu51uZyAodHlwZXNjaG9vbCkiLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyh0eXBlc2Nob29sX2ZyZXEpLA0KICAgICAgICAgICAgICAgICAgICAiICgiLCByb3VuZCh0eXBlc2Nob29scGMsIDMpLCAiJSkiKSwNCiAgICBjb2wgICAgPSBjKCIjRENCMEMzIiwgIiM1OTZDQUQiKSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCkThu7FhIHbDoG8gQuG6o25nIDIuMSB2w6AgQmnhu4N1IMSR4buTIDIuMTogUGjDom4gYuG7kSBsb+G6oWkgdHLGsOG7nW5nICh0eXBlc2Nob29sKSwgdGEgdGjhuqV5IHLhurFuZyBo4buNYyBzaW5oIGNo4bunIHnhur91IHRoZW8gaOG7jWMgdOG6oWkgY8OhYyB0csaw4budbmcgQWNhZGVtaWMgKGjhu41jIHRodeG6rXQpIHbhu5tpIHThuqduIHN14bqldCA2MDkgaOG7jWMgc2luaCwgY2hp4bq/bSA2MC45JSB04buVbmcgc+G7kS4gVHJvbmcga2hpIMSRw7MsIFZvY2F0aW9uYWwgKGThuqF5IG5naOG7gSkgY2jhu4kgY2hp4bq/bSAzOS4xJSB24bubaSAzOTEgaOG7jWMgc2luaC4gQmnhu4N1IMSR4buTIHRyw7JuIHRy4buxYyBxdWFuIGjDs2EgcsO1IHPhu7EgY2jDqm5oIGzhu4djaCBuw6B5IHF1YSBkaeG7h24gdMOtY2ggY8OhYyBsw6F0IGPhuq90LCBjaG8gdGjhuqV5IHh1IGjGsOG7m25nIGjhu41jIHNpbmggbmdoacOqbmcgduG7gSBjb24gxJHGsOG7nW5nIGjhu41jIHRodeG6rXQgaMahbiBsw6Agbmdo4buBIG5naGnhu4dwLiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIHBo4bqjbiDDoW5oIMSR4buLbmggaMaw4bubbmcgeMOjIGjhu5lpLCBr4buzIHbhu41uZyBo4buNYyB24bqlbiBob+G6t2Mgbmjhuq1uIHRo4bupYyB24buBIGPGoSBo4buZaSBuZ2jhu4EgbmdoaeG7h3AgZ2nhu69hIGhhaSBsb+G6oWkgaMOsbmggZ2nDoW8gZOG7pWMuIFR1eSBuaGnDqm4sIHThu7cgbOG7hyBo4buNYyBzaW5oIGNo4buNbiBo4buNYyBuZ2jhu4EgY8Wpbmcga2jDtG5nIG5o4buPLCBjaG8gdGjhuqV5IHPhu7EgxJFhIGThuqFuZyB0cm9uZyBs4buxYSBjaOG7jW4gY29uIMSRxrDhu51uZyBo4buNYyB04bqtcC4NCg0KIyMjICoqMi4yIFNjaG9vbF9hY2NyZWRpdGF0aW9uKioNCg0KIyMjIyAqKjIuMi4xIFRo4buRbmcga8OqIFThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0Kc2Nob29sX2FjY3JlZGl0YXRpb25fZnJlcSA8LSB0YWJsZShkYXRhJHNjaG9vbF9hY2NyZWRpdGF0aW9uKQ0KDQpzY2hvb2xfYWNjcmVkaXRhdGlvbl9wY3QgPC0gdGFibGUoZGF0YSRzY2hvb2xfYWNjcmVkaXRhdGlvbikvc3VtKG5yb3coZGF0YSkpKjEwMA0KDQpzY2hvb2xfYWNjcmVkaXRhdGlvbl90YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBzY2hvb2xfYWNjcmVkaXRhdGlvbiA9IG5hbWVzKHNjaG9vbF9hY2NyZWRpdGF0aW9uX2ZyZXEpLA0KICBGcmVxdWVuY3kgPSBhcy5pbnRlZ2VyKHNjaG9vbF9hY2NyZWRpdGF0aW9uX2ZyZXEpLA0KICBQZXJjZW50YWdlID0gcm91bmQoc2Nob29sX2FjY3JlZGl0YXRpb25fcGN0LCAzKQ0KKQ0KY29sbmFtZXMoc2Nob29sX2FjY3JlZGl0YXRpb25fdGFibGUpIDwtIGMoInNjaG9vbF9hY2NyZWRpdGF0aW9uIiwgIkZyZXF1ZW5jeSIsICJzY2hvb2xfYWNjcmVkaXRhdGlvbiIsICJQZXJjZW50YWdlICglKSIpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyDEkeG6uXANCnNjaG9vbF9hY2NyZWRpdGF0aW9uX3RhYmxlICU+JQ0KICBrYWJsZSgiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDIuMiBQaMOibiBwaOG7kWkgeOG6v3AgaOG6oW5nIHRyxrDhu51uZyAgLSBzY2hvb2xfYWNjcmVkaXRhdGlvbiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCg0KIyMjIyAqKjIuMi4yIFRy4buxYyBxdWFuIGjDs2EqKg0KYGBge3J9DQojIFbhur0gVHLhu7FjIHF1YW4gaG/DoSB0csOybg0KcGllKHNjaG9vbF9hY2NyZWRpdGF0aW9uX2ZyZXEsDQogICAgbWFpbiAgID0gIkJp4buDdSDEkeG7kyAyLjI6IFBow6JuIHBo4buRaSB44bq/cCBo4bqhbmcgdHLGsOG7nW5nIC0gc2Nob29sX2FjY3JlZGl0YXRpb24iLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhzY2hvb2xfYWNjcmVkaXRhdGlvbl9mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQoc2Nob29sX2FjY3JlZGl0YXRpb25fcGN0LCAzKSwgIiUpIiksDQogICAgY29sICAgID0gYygiI0ZFRjlEQiIsICIjNEM2ODlCIikpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQpE4buxYSB2w6BvIELhuqNuZyAyLjIgdsOgIGJp4buDdSDEkeG7kyB0csOybiBtaW5oIGjhu41hIHBow6JuIHBo4buRaSBz4buRIGjhu41jIHNpbmggdGhlbyB44bq/cCBo4bqhbmcgdHLGsOG7nW5nIChzY2hvb2xfYWNjcmVkaXRhdGlvbiksIHRhIHRo4bqleSBy4bqxbmcgc+G7kSBo4buNYyBzaW5oIHRoZW8gaOG7jWMgdOG6oWkgdHLGsOG7nW5nIHjhur9wIGjhuqFuZyBCIGNoaeG6v20gdOG7tyBs4buHIG5o4buJbmggaMahbiAoNTEuOSUpIHNvIHbhu5tpIHRyxrDhu51uZyB44bq/cCBo4bqhbmcgQSAoNDguMSUpLiBCaeG7g3UgxJHhu5MgdHLDsm4gdGjhu4MgaGnhu4duIHPhu7EgcGjDom4gYuG7kSBraMOhIGPDom4gxJHhu5FpIGdp4buvYSBoYWkgbG/huqFpIHjhur9wIGjhuqFuZywgduG7m2kgbMOhdCBj4bqvdCBraMO0bmcgY2jDqm5oIGzhu4djaCBuaGnhu4F1LiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB0cm9uZyB0aOG7sWMgdOG6vywgaOG7jWMgc2luaCBraMO0bmcgY2jhu4kgdOG6rXAgdHJ1bmcgdsOgbyBjw6FjIHRyxrDhu51uZyDEkeG6oXQgY2h14bqpbiBjYW8gbmjhuqV0IChBKSwgbcOgIHbhuqtuIGPDsyB4dSBoxrDhu5tuZyBs4buxYSBjaOG7jW4gY+G6oyB0csaw4budbmcgeOG6v3AgaOG6oW5nIEIsIGPDsyB0aOG7gyBkbyB54bq/dSB04buRIHbhu4sgdHLDrSDEkeG7i2EgbMO9LCDEkWnhu4F1IGtp4buHbiBnaWEgxJHDrG5oIGhv4bq3YyBuaOG6rW4gdGjhu6ljIHbhu4EgY2jhuqV0IGzGsOG7o25nIGdp4bqjbmcgZOG6oXkuDQoNCiMjIyAqKjIuMyBHZW5kZXIqKg0KDQojIyMjICoqMi4zLjEgVGjhu5FuZyBrw6ogVOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpncl9mcmVxIDwtIHRhYmxlKGRhdGEkZ2VuZGVyKQ0KDQpncl9wY3QgPC0gdGFibGUoZGF0YSRnZW5kZXIpL3N1bShucm93KGRhdGEpKSoxMDANCg0KZ3JfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgR2VuZGVyID0gbmFtZXMoZ3JfZnJlcSksDQogIEZyZXF1ZW5jeSA9IGFzLmludGVnZXIoZ3JfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChncl9wY3QsIDMpDQopDQpjb2xuYW1lcyhncl90YWJsZSkgPC0gYygiR2VuZGVyIiwgIkZyZXF1ZW5jeSIsICJHZW5kZXIiLCAiUGVyY2VudGFnZSAoJSkiKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KIyBIaeG7g24gdGjhu4sgYuG6o25nIMSR4bq5cA0KZ3JfdGFibGUgJT4lDQogIGthYmxlKCJodG1sIiwgY2FwdGlvbiA9ICJC4bqjbmcgMi4zIFBow6JuIHBo4buRaSBnaeG7m2kgdMOtbmggaOG7jWMgc2luaCAtIEdFTkRFUiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCiMjIyMgKioyLjMuMiBUcuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQpwaWUoZ3JfZnJlcSwNCiAgICBtYWluICAgPSAiQmnhu4N1IMSR4buTIDIuMzogUGjDom4gcGjhu5FpIGdp4bubaSB0w61uaCBo4buNYyBzaW5oIC0gZ2VuZGVyIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoZ3JfZnJlcSksDQogICAgICAgICAgICAgICAgICAgICIgKCIsIHJvdW5kKGdyX3BjdCwgMyksICIlKSIpLA0KICAgIGNvbCAgICA9IGMoIiNGN0U0RTIiLCAiIzYzODQ3RCIpKSANCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCkThu7FhIHbDoG8gQuG6o25nIDIuMyB2w6AgYmnhu4N1IMSR4buTIHRyw7JuIG1pbmggaOG7jWEgcGjDom4gcGjhu5FpIGdp4bubaSB0w61uaCBo4buNYyBzaW5oIChHRU5ERVIpLCBjw7MgdGjhu4MgdGjhuqV5IHThu7cgbOG7hyBo4buNYyBzaW5oIG5hbSBjaGnhur9tIMawdSB0aOG6vyBuaOG6uSB24bubaSA1MTUgaOG7jWMgc2luaCAoNTEuNSUpLCB0cm9uZyBraGkgbuG7ryBjaGnhur9tIDQ4LjUlIHbhu5tpIDQ4NSBo4buNYyBzaW5oLiBCaeG7g3UgxJHhu5MgdHLDsm4gdGjhu4MgaGnhu4duIGhhaSBsw6F0IGPhuq90IGfhuqduIG5oxrAgYuG6sW5nIG5oYXUsIHBo4bqjbiDDoW5oIHPhu7EgY8OibiBi4bqxbmcgZ2nhu5tpIHTDrW5oIHTGsMahbmcgxJHhu5FpIHRyb25nIG3huqt1IGto4bqjbyBzw6F0LiBUdXkgbmFtIGPDsyBz4buRIGzGsOG7o25nIG5oaeG7gXUgaMahbiBt4buZdCBjaMO6dCwgbmjGsG5nIG3hu6ljIGNow6puaCBs4buHY2gga2jDtG5nIMSRw6FuZyBr4buDLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBraMO0bmcgY8OzIHPhu7EgdGhpw6puIGzhu4djaCByw7UgcuG7h3QgduG7gSBnaeG7m2kgdMOtbmggdHJvbmcgdGnhur9wIGPhuq1uIGdpw6FvIGThu6VjIHBo4buVIHRow7RuZywgdsOgIGPDsyB0aOG7gyBjb2kgxJHDonkgbMOgIG3hu5l0IGThuqV1IGhp4buHdSB0w61jaCBj4buxYyB24buBIGLDrG5oIMSR4bqzbmcgZ2nhu5tpIHRyb25nIGjhu41jIHThuq1wLg0KDQojIyMgKioyLjQgaW50ZXJlc3QqKg0KDQojIyMjICoqMi40LjEgVGjhu5FuZyBrw6ogVOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQppbnRlcmVzdF9mcmVxIDwtIHRhYmxlKGRhdGEkaW50ZXJlc3QpDQoNCmludGVyZXN0X3BjdCA8LSB0YWJsZShkYXRhJGludGVyZXN0KS9zdW0obnJvdyhkYXRhKSkqMTAwDQoNCmludGVyZXN0X3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIGludGVyZXN0ID0gbmFtZXMoaW50ZXJlc3RfZnJlcSksDQogIEZyZXF1ZW5jeSA9IGFzLmludGVnZXIoaW50ZXJlc3RfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChpbnRlcmVzdF9wY3QsIDMpDQopDQpjb2xuYW1lcyhpbnRlcmVzdF90YWJsZSkgPC0gYygiaW50ZXJlc3QiLCAiRnJlcXVlbmN5IiwgImludGVyZXN0IiwgIlBlcmNlbnRhZ2UgKCUpIikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIMSR4bq5cA0KaW50ZXJlc3RfdGFibGUgJT4lDQogIGthYmxlKCJodG1sIiwgY2FwdGlvbiA9ICJC4bqjbmcgMi40IFBow6JuIHBo4buRaSBt4bupYyDEkeG7mSB0aMOtY2ggdGjDuiB0cm9uZyBo4buNYyB04bqtcCAtIGludGVyZXN0IikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQojIyMjICoqMi40LjIgVHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQppbnRlcmVzdF9kZiA8LSBhcy5kYXRhLmZyYW1lKGludGVyZXN0X3BjdCkNCmNvbG5hbWVzKGludGVyZXN0X2RmKSA8LSBjKCJpbnRlcmVzdCIsICJQZXJjZW50YWdlIikNCg0KZ2dwbG90KGludGVyZXN0X2RmLCBhZXMoeCA9IHJlb3JkZXIoaW50ZXJlc3QsIC1QZXJjZW50YWdlKSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBpbnRlcmVzdCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgMi40OiBQaMOibiBwaOG7kWkgbeG7qWMgxJHhu5kgdGjDrWNoIHRow7ogdHJvbmcgaOG7jWMgdOG6rXAiLA0KICAgICAgIHggPSAixJDhu5kgdGjDrWNoIHRow7oiLCB5ID0gIlThu7cgbOG7hyAlIikgKw0KICB0aGVtZV9saWdodCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpKQ0KDQpgYGANCioqTkjhuqxOIFjDiVQ6KioNCg0KROG7sWEgdsOgbyBC4bqjbmcgMi40IHbDoCBiaeG7g3UgxJHhu5MgdHLDsm4gbWluaCBo4buNYSBwaMOibiBwaOG7kWkgbeG7qWMgxJHhu5kgdGjDrWNoIHRow7ogdHJvbmcgaOG7jWMgdOG6rXAgKGludGVyZXN0KSwgY8OzIHRo4buDIHRo4bqleSBt4bupYyDEkeG7mSBo4bupbmcgdGjDuiBj4bunYSBo4buNYyBzaW5oIGtow6EgxJFhIGThuqFuZy4gVHJvbmcgxJHDsywgbmjDs20gIlZlcnkgSW50ZXJlc3RlZCIgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCB24bubaSAzMi40JSAoMzI0IGjhu41jIHNpbmgpLCBjaG8gdGjhuqV5IG3hu5l0IGLhu5kgcGjhuq1uIGzhu5tuIGjhu41jIHNpbmggY8OzIMSR4buZbmcgbOG7sWMgaOG7jWMgdOG6rXAgcsO1IHLhu4d0LiBUdXkgbmhpw6puLCDEkcOhbmcgY2jDuiDDvSBsw6AgY8OzIHThu5tpIDI2LjElICgyNjEgaOG7jWMgc2luaCkgbuG6sW0gdHJvbmcgbmjDs20gIlVuY2VydGFpbiIsIHBo4bqjbiDDoW5oIHPhu7EgdGhp4bq/dSBjaOG6r2MgY2jhuq9uIGhv4bq3YyBraMO0bmcgcsO1IHLDoG5nIHbhu4EgdGjDoWkgxJHhu5kgaOG7jWMgdOG6rXAuIE5nb8OgaSByYSwgZ+G6p24gMS8zIHPhu5EgaOG7jWMgc2luaCBjw7JuIGzhuqFpIHRodeG7mWMgbmjDs20gIkxlc3MgSW50ZXJlc3RlZCIgaG/hurdjICJOb3QgSW50ZXJlc3RlZCIsIGNoaeG6v20gdOG7lW5nIGPhu5luZyAzMS41JSwgY2hvIHRo4bqleSB24bqrbiBjw7JuIG3hu5l0IHThu7cgbOG7hyDEkcOhbmcga+G7gyBo4buNYyBzaW5oIHRoaeG6v3Ugc+G7sSBn4bqvbiBiw7MgduG7m2kgdmnhu4djIGjhu41jLg0KDQojIyMgKioyLjUgcmVzaWRlbmNlKioNCg0KIyMjIyAqKjIuNS4xIFRo4buRbmcga8OqIFThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KcmVzaWRlbmNlX2ZyZXEgPC0gdGFibGUoZGF0YSRyZXNpZGVuY2UpDQoNCnJlc2lkZW5jZV9wY3QgPC0gdGFibGUoZGF0YSRyZXNpZGVuY2UpL3N1bShucm93KGRhdGEpKSoxMDANCg0KcmVzaWRlbmNlX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIHJlc2lkZW5jZSA9IG5hbWVzKHJlc2lkZW5jZV9mcmVxKSwNCiAgRnJlcXVlbmN5ID0gYXMuaW50ZWdlcihyZXNpZGVuY2VfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChyZXNpZGVuY2VfcGN0LCAzKQ0KKQ0KY29sbmFtZXMocmVzaWRlbmNlX3RhYmxlKSA8LSBjKCJyZXNpZGVuY2UiLCAiRnJlcXVlbmN5IiwgInJlc2lkZW5jZSIsICJQZXJjZW50YWdlICglKSIpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyDEkeG6uXANCnJlc2lkZW5jZV90YWJsZSAlPiUNCiAga2FibGUoImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyAyLjUgUGjDom4gcGjhu5FpIMSR4buLbmggY8awIGPhu6dhIGjhu41jIHNpbmggLSByZXNpZGVuY2UiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCiMjIyMgKioyLjUuMiBUcuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQojIFbhur0gVHLhu7FjIHF1YW4gaG/DoSB0csOybg0KcGllKHJlc2lkZW5jZV9mcmVxLA0KICAgIG1haW4gICA9ICJCaeG7g3UgxJHhu5MgMi41OiBQaMOibiBi4buRIMSR4buLbmggY8awIGPhu6dhIGjhu41jIHNpbmggKHJlc2lkZW5jZSkiLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhyZXNpZGVuY2VfZnJlcSksDQogICAgICAgICAgICAgICAgICAgICIgKCIsIHJvdW5kKHJlc2lkZW5jZV9wY3QsIDMpLCAiJSkiKSwNCiAgICBjb2wgICAgPSBjKCIjRENCMEMzIiwgIiM1OTZDQUQiKSkNCmBgYA0KDQoqKk5I4bqsTiBYw4lUOioqDQoNCkThu7FhIHbDoG8gQuG6o25nIDIuNSB2w6AgYmnhu4N1IMSR4buTIHRyw7JuIG1pbmggaOG7jWEgcGjDom4gcGjhu5FpIG7GoWkgY8awIHRyw7ogY+G7p2EgaOG7jWMgc2luaCAocmVzaWRlbmNlKSwgdGEgdGjhuqV5IHLhurFuZyBo4buNYyBzaW5oIMSR4bq/biB04burIGtodSB24buxYyDEkcO0IHRo4buLIChVcmJhbikgY2hp4bq/bSB04bu3IGzhu4cgY2FvIGjGoW4gduG7m2kgNTM5IGjhu41jIHNpbmggKDUzLjklKSwgdHJvbmcga2hpIGjhu41jIHNpbmggdOG7qyBuw7RuZyB0aMO0biAoUnVyYWwpIGzDoCA0NjEgaOG7jWMgc2luaCAoNDYuMSUpLiBCaeG7g3UgxJHhu5MgdHLDsm4gdGjhu4MgaGnhu4duIGhhaSBsw6F0IGPhuq90IGfhuqduIHTGsMahbmcgxJHGsMahbmcsIHBo4bqjbiDDoW5oIHPhu7EgcGjDom4gYuG7kSBkw6JuIGPGsCBraMOhIMSR4buTbmcgxJHhu4F1IHRyb25nIG3huqt1IGto4bqjbyBzw6F0LiBUdXkgbmhpw6puLCBz4buxIG5o4buJbmggaMahbiB04burIHBow61hIMSRw7QgdGjhu4sgY8OzIHRo4buDIGfhu6NpIMO9IHbhu4Ega2jhuqMgbsSDbmcgdGnhur9wIGPhuq1uIGdpw6FvIGThu6VjIGNhbyBoxqFuIOG7nyBraHUgduG7sWMgdGjDoG5oIHRo4buLLCBuaOG7nSDEkWnhu4F1IGtp4buHbiBraW5oIHThur8g4oCTIHjDoyBo4buZaSB0aHXhuq1uIGzhu6NpIGjGoW4uIMSQ4buTbmcgdGjhu51pLCDEkWnhu4F1IG7DoHkgY8WpbmcgY2hvIHRo4bqleSB24bqrbiBjw7MgdOG7tyBs4buHIGzhu5tuIGjhu41jIHNpbmggbsO0bmcgdGjDtG4gxJFhbmcgdGhhbSBnaWEgaOG7jWMgdOG6rXAsIHRo4buDIGhp4buHbiBu4buXIGzhu7FjIG3hu58gcuG7mW5nIGPGoSBo4buZaSBnacOhbyBk4bulYyDhu58gbeG7jWkgdsO5bmcgbWnhu4FuLg0KDQoNCg0KIyMjICoqMi43IHBhcmVudF9zYWxhcnkqKg0KDQojIyMjICoqMi43LjEgVGjhu5FuZyBrw6ogVOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpwYXJlbnRfc2FsYXJ5X2ZyZXEgPC0gdGFibGUoZGF0YSRwYXJlbnRfc2FsYXJ5KQ0KDQpwYXJlbnRfc2FsYXJ5X3BjdCA8LSB0YWJsZShkYXRhJHBhcmVudF9zYWxhcnkpL3N1bShucm93KGRhdGEpKSoxMDANCg0KcGFyZW50X3NhbGFyeV90YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBwYXJlbnRfc2FsYXJ5ID0gbmFtZXMocGFyZW50X3NhbGFyeV9mcmVxKSwNCiAgRnJlcXVlbmN5ID0gYXMuaW50ZWdlcihwYXJlbnRfc2FsYXJ5X2ZyZXEpLA0KICBQZXJjZW50YWdlID0gcm91bmQocGFyZW50X3NhbGFyeV9wY3QsIDMpDQopDQpjb2xuYW1lcyhwYXJlbnRfc2FsYXJ5X3RhYmxlKSA8LSBjKCJwYXJlbnRfc2FsYXJ5IiwgIkZyZXF1ZW5jeSIsICJwYXJlbnRfc2FsYXJ5IiwgIlBlcmNlbnRhZ2UgKCUpIikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIMSR4bq5cA0KcGFyZW50X3NhbGFyeV90YWJsZSAlPiUNCiAga2FibGUoImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyAyLjcgUGjDom4gcGjhu5FpIHRoZW8gdGhlbyB0aHUgbmjhuq1wIGPhu6dhIG5nxrDhu51pIGdpw6FtIGjhu5kgLSBwYXJlbnRfc2FsYXJ5IikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQojIyMjICoqMi43LjIgVHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCiMgVuG6vSBUcuG7sWMgcXVhbiBob8OhIHRyw7JuDQpwaWUocGFyZW50X3NhbGFyeV9mcmVxLA0KICAgIG1haW4gICA9ICJCaeG7g3UgxJHhu5MgMi43OiBQaMOibiBwaOG7kWkgdGhlbyB0aHUgbmjhuq1wIGPhu6dhIG5nxrDhu51pIGdpw6FtIGjhu5kgLSBwYXJlbnRfc2FsYXJ5IiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMocGFyZW50X3NhbGFyeV9mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQocGFyZW50X3NhbGFyeV9wY3QsIDMpLCAiJSkiKSwNCiAgICBjb2wgICAgPSBjKCIjQUJCRUUwIiwgIiNGNEMwQzIiLCAiI0IyRUVEQSIsICIjRkZFQ0FGIikpIA0KYGBgDQoNCioqTkjhuqxOIFjDiVQ6KioNCg0KUGjDom4gcGjhu5FpIHRodSBuaOG6rXAgbmfGsOG7nWkgZ2nDoW0gaOG7mSBjaG8gdGjhuqV5IHPhu7EgdMawxqFuZyDEkeG7k25nIHLDtSBy4buHdCBnaeG7r2EgbmjDs20gY8OzIHRodSBuaOG6rXAgImFkZXF1YXRlIiAoNDQuOCUpIHbDoCAiYXZlcmFnZSIgKDQ0LjYlKSwgY2hp4bq/bSBn4bqnbiA5MCUgdOG7lW5nIHPhu5EgaOG7jWMgc2luaC4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIHLhurFuZyDEkWEgc+G7kSBo4buNYyBzaW5oIHh14bqldCB0aMOibiB04burIGPDoWMgZ2lhIMSRw6xuaCBjw7MgbeG7qWMgc+G7kW5nIOG7lW4gxJHhu4tuaCwga2jDtG5nIHF1w6EgZ2nDoHUgY8Wpbmcga2jDtG5nIHF1w6Ega2jDsyBraMSDbi4gU28gduG7m2kgY8OhYyBuaMOzbSBuw6B5LCBuaMOzbSB0aHUgbmjhuq1wICJoaWdoIiBjaOG7iSBjaGnhur9tIHLhuqV0IG5o4buPICgzLjklKSwgY2hvIHRo4bqleSBjw6FjIGdpYSDEkcOsbmgga2jDoSBnaeG6oyBraMO0bmcgbmhp4buBdSB0cm9uZyBt4bqrdSBraOG6o28gc8OhdC4gTmjDs20gdGh1IG5o4bqtcCAibG93IiBjaGnhur9tIDYuNyUsIHRo4bqlcCBoxqFuIGtow6Egbmhp4buBdSBzbyB24bubaSBoYWkgbmjDs20gdHJ1bmcgYsOsbmgsIG5oxrBuZyB24bqrbiBsw6AgbeG7mXQgdOG7tyBs4buHIGtow7RuZyBuaOG7jywgcGjhuqNuIMOhbmggcuG6sW5nIGPDsm4gbmhp4buBdSBo4buNYyBzaW5oIMSR4bq/biB04burIGdpYSDEkcOsbmggY8OzIMSRaeG7gXUga2nhu4duIGtpbmggdOG6vyBo4bqhbiBjaOG6vy4gU28gc8OhbmggduG7m2kgY8OhYyBwaMOibiBwaOG7kWkga2jDoWMgbmjGsCDEkeG7mSB0deG7lWkgZ2nDoW0gaOG7mSBoYXkgbsahaSBjxrAgdHLDuiwgdGh1IG5o4bqtcCBjw7Mgc+G7sSBwaMOibiBow7NhIHLDtSBoxqFuLCBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGPGoSBo4buZaSB2w6AgxJFp4buBdSBraeG7h24gaOG7jWMgdOG6rXAgY+G7p2EgaOG7jWMgc2luaC4NCg0KIyMjICoqMi44IGhvdXNlX2FyZWEqKg0KDQojIyMjICoqMi44LjEgVGjhu5FuZyBrw6ogVOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpob3VzZV9hcmVhX2ZyZXEgPC0gdGFibGUoZGF0YSRob3VzZV9hcmVhKQ0KDQpob3VzZV9hcmVhX3BjdCA8LSB0YWJsZShkYXRhJGhvdXNlX2FyZWEpL3N1bShucm93KGRhdGEpKSoxMDANCg0KaG91c2VfYXJlYV90YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBob3VzZV9hcmVhID0gbmFtZXMoaG91c2VfYXJlYV9mcmVxKSwNCiAgRnJlcXVlbmN5ID0gYXMuaW50ZWdlcihob3VzZV9hcmVhX2ZyZXEpLA0KICBQZXJjZW50YWdlID0gcm91bmQoaG91c2VfYXJlYV9wY3QsIDMpDQopDQpjb2xuYW1lcyhob3VzZV9hcmVhX3RhYmxlKSA8LSBjKCJob3VzZV9hcmVhIiwgIkZyZXF1ZW5jeSIsICJob3VzZV9hcmVhIiwgIlBlcmNlbnRhZ2UgKCUpIikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIMSR4bq5cA0KaG91c2VfYXJlYV90YWJsZSAlPiUNCiAga2FibGUoImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyAyLjggUGjDom4gcGjhu5FpIHRoZW8gZGnhu4duIHTDrWNoIG5ow6Ag4bufIC0gaG91c2VfYXJlYSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCg0KIyMjIyAqKjIuOC4yIFRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9DQojIFbhur0gVHLhu7FjIHF1YW4gaG/DoSB0csOybg0KcGllKGhvdXNlX2FyZWFfZnJlcSwNCiAgICBtYWluICAgPSAiQmnhu4N1IMSR4buTIDIuODogUGjDom4gcGjhu5FpIHRoZW8gdGhlbyBkaeG7h24gdMOtY2ggbmjDoCDhu58gLSBob3VzZV9hcmVhIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoaG91c2VfYXJlYV9mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQoaG91c2VfYXJlYV9wY3QsIDMpLCAiJSkiKSwNCiAgICBjb2wgICAgPSBjKCIjOTZCRkJDIiwgIiNFOEVEREEiLCAiI0Q0QTJBNiIpKSANCmBgYA0KDQoqKk5I4bqsTiBYw4lUOioqDQoNClBow6JuIHBo4buRaSBkaeG7h24gdMOtY2ggbmjDoCDhu58gY2hvIHRo4bqleSBn4bqnbiA4MCUgaOG7jWMgc2luaCBz4buRbmcgdHJvbmcgbmjDoCBjw7MgZGnhu4duIHTDrWNoIG5o4buPIMSR4bq/biB0cnVuZyBiw6xuaCAoMzcuNiUgZGnhu4duIHTDrWNoIG5o4buPLCA0Mi40JSBkaeG7h24gdMOtY2ggdHJ1bmcgYsOsbmgpLCBjaOG7iSBjw7MgMjAlIHPhu5FuZyB0cm9uZyBuaMOgIGRp4buHbiB0w61jaCBs4bubbi4gS+G6v3QgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UgduG7gSB0aHUgbmjhuq1wIG5nxrDhu51pIGdpw6FtIGjhu5kgY2jhu6cgeeG6v3Ug4bufIG3hu6ljIGFkZXF1YXRlIHbDoCBhdmVyYWdlIChn4bqnbiA5MCUpLCBjxaluZyBuaMawIMSR4buZIHR14buVaSBuZ8aw4budaSBnacOhbSBo4buZIHThuq1wIHRydW5nIHThu6sgNTAgxJHhur9uIDU1LCBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBo4buNYyBzaW5oIHRodeG7mWMgZ2lhIMSRw6xuaCBjw7MgxJFp4buBdSBraeG7h24ga2luaCB04bq/IOG7lW4gxJHhu4tuaCBuaMawbmcga2jDtG5nIHF1w6EgZMawIGdp4bqjLiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmggbcO0aSB0csaw4budbmcgc2luaCBob+G6oXQgdsOgIGjhu41jIHThuq1wIGNo4bunIHnhur91IHRodeG7mWMgdOG6p25nIGzhu5twIHRydW5nIGzGsHUsIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyB0aeG6v3AgY+G6rW4gdsOgIGNo4bqldCBsxrDhu6NuZyBnacOhbyBk4bulYyBj4bunYSBo4buNYyBzaW5oLg0KDQojIyMgKioyLjkgQmnhur9uIGF2ZXJhZ2VfZ3JhZGVzKioNCg0KIyMjIyAqKjIuOS4xIFRo4buRbmcga8OqIFThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KYXZlcmFnZV9ncmFkZXNfZnJlcSA8LSB0YWJsZShkYXRhJGF2ZXJhZ2VfZ3JhZGVzKQ0KDQphdmVyYWdlX2dyYWRlc19wY3QgPC0gdGFibGUoZGF0YSRhdmVyYWdlX2dyYWRlcykvc3VtKG5yb3coZGF0YSkpKjEwMA0KDQphdmVyYWdlX2dyYWRlc190YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBhdmVyYWdlX2dyYWRlcyA9IG5hbWVzKGF2ZXJhZ2VfZ3JhZGVzX2ZyZXEpLA0KICBGcmVxdWVuY3kgPSBhcy5pbnRlZ2VyKGF2ZXJhZ2VfZ3JhZGVzX2ZyZXEpLA0KICBQZXJjZW50YWdlID0gcm91bmQoYXZlcmFnZV9ncmFkZXNfcGN0LCAzKQ0KKQ0KY29sbmFtZXMoYXZlcmFnZV9ncmFkZXNfdGFibGUpIDwtIGMoImF2ZXJhZ2VfZ3JhZGVzIiwgIkZyZXF1ZW5jeSIsICJhdmVyYWdlX2dyYWRlcyIsICJQZXJjZW50YWdlICglKSIpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyDEkeG6uXANCmF2ZXJhZ2VfZ3JhZGVzX3RhYmxlICU+JQ0KICBrYWJsZSgiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDIuOSBQaMOibiBwaOG7kWkgdGhlbyBr4bq/dCBxdeG6oyBo4buNYyB04bqtcCBj4bunYSBo4buNYyBzaW5oIC0gYXZlcmFnZV9ncmFkZXMiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCiMjIyMgKioyLjkuMiBUcuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04fQ0KDQojIFbhur0gVHLhu7FjIHF1YW4gaG/DoSB0csOybg0KcGllKGF2ZXJhZ2VfZ3JhZGVzX2ZyZXEsDQogICAgbWFpbiAgID0gIkJp4buDdSDEkeG7kyAyLjk6IFBow6JuIHBo4buRaSBr4bq/dCBxdeG6oyBo4buNYyB04bqtcCBj4bunYSBo4buNYyBzaW5oIChhdmVyYWdlX2dyYWRlcykiLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhhdmVyYWdlX2dyYWRlc19mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQoYXZlcmFnZV9ncmFkZXNfcGN0LCAzKSwgIiUpIiksDQogICAgY29sICAgID0gYygiI0M0QzFFMSIsICIjRUVEZEI2IiwgIiNEQ0EyQTciKSkgDQpgYGANCg0KROG7sWEgdsOgbyBC4bqjbmcgMi45IHbhu4EgcGjDom4gcGjhu5FpIGvhur90IHF14bqjIGjhu41jIHThuq1wIGPhu6dhIGjhu41jIHNpbmgsIHRhIHRo4bqleSBuaMOzbSBjw7MgdGjDoG5oIHTDrWNoIEdvb2QgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCB24bubaSA0NC4zJSAoNDQzIGjhu41jIHNpbmgpLCB0aeG6v3AgdGhlbyBsw6AgbmjDs20gRmFpciBjaGnhur9tIDQyLjQlICg0MjQgaOG7jWMgc2luaCksIHbDoCBuaMOzbSBFeGNlbGxlbnQgY2hp4bq/bSB04bu3IGzhu4cgdGjhuqVwIG5o4bqldCB24bubaSAxMy4zJSAoMTMzIGjhu41jIHNpbmgpLg0KDQoqKk5o4bqtbiB4w6l0OioqIFBo4bqnbiBs4bubbiBo4buNYyBzaW5oIMSR4bqhdCBr4bq/dCBxdeG6oyBo4buNYyB04bqtcCB04burIG3hu6ljIEZhaXIgxJHhur9uIEdvb2QsIHRo4buDIGhp4buHbiBjaOG6pXQgbMaw4bujbmcgaOG7jWMgdOG6rXAgdHJ1bmcgYsOsbmggxJHhur9uIGtow6EgcGjhu5UgYmnhur9uIHRyb25nIG3huqt1IGto4bqjbyBzw6F0LiBU4bu3IGzhu4cgaOG7jWMgc2luaCB4deG6pXQgc+G6r2MgY8OybiBraMOhIGtoacOqbSB04buRbiwgY2jhu4kga2hv4bqjbmcgMS84IHThu5VuZyBz4buRLiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIHBo4bqjbiDDoW5oIGPhuqMgbsSDbmcgbOG7sWMgaOG7jWMgdOG6rXAgdsOgIGPDoWMgxJFp4buBdSBraeG7h24gaOG7lyB0cuG7oyBo4buNYyB04bqtcCBoaeG7h24gdOG6oWksIHThu6sgxJHDsyBn4bujaSDDvSBj4bqnbiBjw6FjIGJp4buHbiBwaMOhcCBuw6JuZyBjYW8gY2jhuqV0IGzGsOG7o25nIGdpw6FvIGThu6VjIMSR4buDIGdpw7pwIG5oaeG7gXUgaOG7jWMgc2luaCDEkeG6oXQga+G6v3QgcXXhuqMgY2FvIGjGoW4uDQoNCg0KIyMjICoqMi4xMCBwYXJlbnRfd2FzX2luX2NvbGxlZ2UqKg0KDQojIyMjICoqMi4xMC4xIFRo4buRbmcga8OqIFThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KcGFyZW50X3dhc19pbl9jb2xsZWdlX2ZyZXEgPC0gdGFibGUoZGF0YSRwYXJlbnRfd2FzX2luX2NvbGxlZ2UpDQoNCnBhcmVudF93YXNfaW5fY29sbGVnZV9wY3QgPC0gdGFibGUoZGF0YSRwYXJlbnRfd2FzX2luX2NvbGxlZ2UpL3N1bShucm93KGRhdGEpKSoxMDANCg0KcGFyZW50X3dhc19pbl9jb2xsZWdlX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIHBhcmVudF93YXNfaW5fY29sbGVnZSA9IG5hbWVzKHBhcmVudF93YXNfaW5fY29sbGVnZV9mcmVxKSwNCiAgRnJlcXVlbmN5ID0gYXMuaW50ZWdlcihwYXJlbnRfd2FzX2luX2NvbGxlZ2VfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChwYXJlbnRfd2FzX2luX2NvbGxlZ2VfcGN0LCAzKQ0KKQ0KY29sbmFtZXMocGFyZW50X3dhc19pbl9jb2xsZWdlX3RhYmxlKSA8LSBjKCJwYXJlbnRfd2FzX2luX2NvbGxlZ2UiLCAiRnJlcXVlbmN5IiwgInBhcmVudF93YXNfaW5fY29sbGVnZSIsICJQZXJjZW50YWdlICglKSIpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyDEkeG6uXANCnBhcmVudF93YXNfaW5fY29sbGVnZV90YWJsZSU+JQ0KICBrYWJsZSgiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDIuMTAgUGjDom4gcGjhu5FpIHRoZW8ga2jhuqMgbsSDbmcgbmfGsOG7nWkgZ2nDoW0gaOG7mSB0aGVvIGjhu41jIGNhbyDEkeG6s25nIC0gcGFyZW50X3dhc19pbl9jb2xsZWdlIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQojIyMjICoqMi4xMC4yIFRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9DQoNCiMgVuG6vSBUcuG7sWMgcXVhbiBob8OhIHRyw7JuDQpwaWUocGFyZW50X3dhc19pbl9jb2xsZWdlX2ZyZXEsDQogICAgbWFpbiAgID0gIkJp4buDdSDEkeG7kyAyLjEwOiBQaMOibiBwaOG7kWkga2jhuqMgbsSDbmcgbmfGsOG7nWkgZ2nDoW0gaOG7mSB0aGVvIGjhu41jIGNhbyDEkeG6s25nIC0gcGFyZW50X3dhc19pbl9jb2xsZWdlIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMocGFyZW50X3dhc19pbl9jb2xsZWdlX2ZyZXEpLA0KICAgICAgICAgICAgICAgICAgICAiICgiLCByb3VuZChwYXJlbnRfd2FzX2luX2NvbGxlZ2VfcGN0LCAzKSwgIiUpIiksDQogICAgY29sICAgID0gYygiI0M0QzFFMSIsICIjRUVEZEI2IiwgIiNEQ0EyQTciKSkgDQpgYGANCioqTkjhuqxOIFjDiVQ6KioNCg0KROG7ryBsaeG7h3UgY2hvIHRo4bqleSA1MiUgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgdHLhu58gbMOqbiwgdHJvbmcga2hpIDQ4JSBraMO0bmcgY8OzLiBUcsOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2EgbmfGsOG7nWkgZ2nDoW0gaOG7mSBraMOhIGPDom4gYuG6sW5nIG5oxrBuZyBuZ2hpw6puZyBuaOG6uSB24buBIHBow61hIGPDsyBo4buNYyB24bqlbiBjYW8sIMSRaeG7gXUgbsOgeSBwaOG6p24gbsOgbyBsw70gZ2nhuqNpIHbDrCBzYW8gcGjhuqduIGzhu5tuIGjhu41jIHNpbmggxJHhuqF0IGvhur90IHF14bqjIGjhu41jIHThuq1wIOG7nyBt4bupYyBGYWlyICg0Mi40JSkgdsOgIEdvb2QgKDQ0LjMlKS4gQsOqbiBj4bqhbmggxJHDsywgxJFhIHPhu5EgaOG7jWMgc2luaCDEkeG6v24gdOG7qyBnaWEgxJHDrG5oIGPDsyB0aHUgbmjhuq1wIHRydW5nIGLDrG5oIHbDoCBuaMOgIOG7nyBkaeG7h24gdMOtY2ggduG7q2EgcGjhuqNpLCBjaG8gdGjhuqV5IG3DtGkgdHLGsOG7nW5nIGjhu41jIHThuq1wIHR1eSBraMO0bmcgcXXDoSB0aHXhuq1uIGzhu6NpIHbhu4EgduG6rXQgY2jhuqV0IG5oxrBuZyDEkcaw4bujYyBo4buXIHRy4bujIHThu5F0IHThu6sgeeG6v3UgdOG7kSB2xINuIGjDs2EgdsOgIG5o4bqtbiB0aOG7qWMgZ2nDoW8gZOG7pWMgY+G7p2EgcGjhu6UgaHV5bmguDQoNCiMjIyAqKjIuMTEgd2lsbF9nb190b19jb2xsZWdlKioNCg0KIyMjIyAqKjIuMTEuMSBUaOG7kW5nIGvDqiBU4bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCndpbGxfZ29fdG9fY29sbGVnZV9mcmVxIDwtIHRhYmxlKGRhdGEkd2lsbF9nb190b19jb2xsZWdlKQ0KDQp3aWxsX2dvX3RvX2NvbGxlZ2VfcGN0IDwtIHRhYmxlKGRhdGEkd2lsbF9nb190b19jb2xsZWdlKS9zdW0obnJvdyhkYXRhKSkqMTAwDQoNCndpbGxfZ29fdG9fY29sbGVnZV90YWJsZSA8LSBkYXRhLmZyYW1lKA0KICB3aWxsX2dvX3RvX2NvbGxlZ2UgPSBuYW1lcyh3aWxsX2dvX3RvX2NvbGxlZ2VfZnJlcSksDQogIEZyZXF1ZW5jeSA9IGFzLmludGVnZXIod2lsbF9nb190b19jb2xsZWdlX2ZyZXEpLA0KICBQZXJjZW50YWdlID0gcm91bmQod2lsbF9nb190b19jb2xsZWdlX3BjdCwgMykNCikNCmNvbG5hbWVzKHdpbGxfZ29fdG9fY29sbGVnZV90YWJsZSkgPC0gYygid2lsbF9nb190b19jb2xsZWdlIiwgIkZyZXF1ZW5jeSIsICJ3aWxsX2dvX3RvX2NvbGxlZ2UiLCAiUGVyY2VudGFnZSAoJSkiKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgxJHhurlwDQp3aWxsX2dvX3RvX2NvbGxlZ2VfdGFibGUlPiUNCiAga2FibGUoImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyAyLjExIFBow6JuIHBo4buRaSB0aGVvIGto4bqjIG7Eg25nIHF1eeG6v3QgxJHhu4tuaCB0aGVvIGjhu41jIGNhbyDEkeG6s25nIGPhu6dhIGjhu41jIHNpbmggIC0gd2lsbF9nb190b19jb2xsZWdlIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQojIyMjICoqMi4xMS4yIFRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9DQoNCiMgVuG6vSBUcuG7sWMgcXVhbiBob8OhIHRyw7JuDQpwaWUod2lsbF9nb190b19jb2xsZWdlX2ZyZXEsDQogICAgbWFpbiAgID0gIkJp4buDdSDEkeG7kyAyLjExOiBQaMOibiBwaOG7kWl0aGVvIGto4bqjIG7Eg25nIHF1eeG6v3QgxJHhu4tuaCB0aGVvIGjhu41jIGNhbyDEkeG6s25nIGPhu6dhIGjhu41jIHNpbmggIC0gd2lsbF9nb190b19jb2xsZWdlIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMod2lsbF9nb190b19jb2xsZWdlX2ZyZXEpLA0KICAgICAgICAgICAgICAgICAgICAiICgiLCByb3VuZCh3aWxsX2dvX3RvX2NvbGxlZ2VfcGN0LCAzKSwgIiUpIiksDQogICAgY29sICAgID0gYygiI0M0QzFFMSIsICIjRUVEZEI2IiwgIiNEQ0EyQTciKSkgDQpgYGANCg0KKipOSOG6rE4gWMOJVDoqKg0KDQpL4bq/dCBxdeG6oyB04burIELhuqNuZyAyLjExIGNobyB0aOG6pXkgaOG7jWMgc2luaCDEkcaw4bujYyBjaGlhIMSR4buBdSB24buBIGto4bqjIG7Eg25nIHF1eeG6v3QgxJHhu4tuaCB0aGVvIGjhu41jIGNhbyDEkeG6s25nLCB24bubaSA1MCUgdHLhuqMgbOG7nWkgY8OzIHbDoCA1MCUgdHLhuqMgbOG7nWkga2jDtG5nLCBwaOG6o24gw6FuaCBz4buxIHBow6JuIGjDs2EgcsO1IG7DqXQgdHJvbmcgxJHhu4tuaCBoxrDhu5tuZyBo4buNYyB04bqtcCB0xrDGoW5nIGxhaS4gTeG6t2MgZMO5IGThu68gbGnhu4d1IOG7nyBC4bqjbmcgMi4xMCBjaG8gdGjhuqV5IDUyJSBuZ8aw4budaSBnacOhbSBo4buZIMSRw6MgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIHRy4bufIGzDqm4sIMSRaeG7gXUgbsOgeSBraMO0bmcgxJHhu5NuZyBuZ2jEqWEgduG7m2kgdmnhu4djIGjhu41jIHNpbmggc+G6vSB0aeG6v3AgbuG7kWkgxJHhu4tuaCBoxrDhu5tuZyBo4buNYyB04bqtcCDEkcOzLiBRdXnhur90IMSR4buLbmggdGhlbyBo4buNYyBjYW8gxJHhurNuZyBjw7MgdGjhu4MgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSBuaGnhu4F1IHnhur91IHThu5Ega2jDoWMgbmhhdSBuaMawIGvhur90IHF14bqjIGjhu41jIHThuq1wIChjaOG7iSAxMy4zJSDEkeG6oXQgbG/huqFpIGdp4buPaSksIHRodSBuaOG6rXAgY+G7p2EgZ2lhIMSRw6xuaCAoxJFhIHPhu5Eg4bufIG3hu6ljIGFkZXF1YXRlIGhv4bq3YyBhdmVyYWdlKSwgdsOgIGRp4buHbiB0w61jaCBuaMOgIOG7nyAocGjhuqduIGzhu5tuIGzDoCBuaOG7jyB2w6AgduG7q2EpLCBjaG8gdGjhuqV5IG5oaeG7gXUgaOG7jWMgc2luaCB24bqrbiBjw7JuIGfhurdwIGjhuqFuIGNo4bq/IHbhu4EgxJFp4buBdSBraeG7h24gduG6rXQgY2jhuqV0IGhv4bq3YyB0aGnhur91IMSR4buZbmcgbOG7sWMuIE5nb8OgaSByYSwgZOG7ryBsaeG7h3UgdOG7qyBC4bqjbmcgMi40IHbhu4EgbeG7qWMgxJHhu5kgaOG7qW5nIHRow7ogaOG7jWMgdOG6rXAgY8WpbmcgcGjhuqNuIMOhbmggc+G7sSB0aGnhur91IGNo4bqvYyBjaOG6r24sIGtoaSBjw7MgxJHhur9uIDI2LjElIGjhu41jIHNpbmggY+G6o20gdGjhuqV5IGtow7RuZyByw7UgcsOgbmcgduG7gSBo4bupbmcgdGjDuiBo4buNYywgxJFp4buBdSBuw6B5IGPDsyB0aOG7gyBraGnhur9uIG5oaeG7gXUgZW0ga2jDtG5nIMSRxrBhIHJhIMSRxrDhu6NjIHF1eeG6v3QgxJHhu4tuaCByw7UgcsOgbmcgduG7gSB2aeG7h2MgaOG7jWMgdGnhur9wIHNhdSBwaOG7lSB0aMO0bmcuIE5oxrAgduG6rXksIG3hurdjIGTDuSBtw7RpIHRyxrDhu51uZyBnaWEgxJHDrG5oIGPDsyBwaOG6p24gaOG7lyB0cuG7oywgdGjDrCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGzDqm4gY2FvIMSR4bqzbmcgduG6q24gbMOgIG3hu5l0IHbhuqVuIMSR4buBIHBo4bupYyB04bqhcCwgxJHDsmkgaOG7j2kgc+G7sSB0xrAgduG6pW4sIMSR4buLbmggaMaw4bubbmcgdsOgIGjhu5cgdHLhu6MgbeG6oW5oIG3hur0gaMahbiB04burIHBow61hIG5ow6AgdHLGsOG7nW5nIHbDoCB4w6MgaOG7mWkuDQoNCiMjICoqUEjhuqZOIDM6xq/hu5pDIEzGr+G7ok5HIEtIT+G6ok5HIFbDgCBLSeG7gk0gxJDhu4pOSCBHSeG6oiBUSFVZ4bq+VCBDSE8gVOG7tiBM4buGIChN4buYVCBCSeG6vk4pKioNCg0KKipLaG/huqNuZyB0aW4gY+G6rXkgY2hvIHThu7cgbOG7hyAocHJvcG9ydGlvbik6KioNCg0KYGBge3J9DQojIEZ1bmN0aW9uDQpwcm9wMS5pbnRlcnZhbCA8LSBmdW5jdGlvbih4LG4sY29uZi5sZXZlbCkgIyBmdW5jdGlvbiBvZiAxLXByb3BvcnRpb24gQ0kgZm9yIHANCnsNCnAgPC0geC9uDQp6LmNyaXQgPC0gLTEqcW5vcm0oKDEtY29uZi5sZXZlbCkvMikNCm1hcmdpbi5lcnJvciA8LSB6LmNyaXQqc3FydChwKigxLXApL24pDQpjaS5sb3dlciA8LSBwIC0gbWFyZ2luLmVycm9yDQpjaS51cHBlciA8LSBwICsgbWFyZ2luLmVycm9yDQpkYXQgPC0gYyhwLCB6LmNyaXQsIG1hcmdpbi5lcnJvciwgY2kubG93ZXIsIGNpLnVwcGVyKQ0KbmFtZXMoZGF0KSA8LSBjKCJNZWFuIiwgIkNyaXRpY2FsIFZhbHVlIiwgIk1hcmdpbiBvZiBFcnJvciIsICJDSSBsb3dlciIsICJDSSB1cHBlciIpDQpyZXR1cm4oZGF0KQ0KfQ0KYGBgDQoNCiMjIyAqKjMuMSBhdmVyYWdlX2dyYWRlcy1GYWlyKioNCg0KIyMjIyAqKjMuMS4xIMav4bubYyBsxrDhu6NuZyBLaG/huqNuZyBUaW4gY+G6rXk6KioNCg0KYGBge3J9DQojIFPhu5EgbMaw4bujbmcgaOG7jWMgc2luaCBjw7Mga+G6v3QgcXXhuqMgaOG7jWMgdOG6rXAgdGh14buZYyBuaMOzbSAiRmFpciINCnhGYWlyIDwtIHN1bShkYXRhJGF2ZXJhZ2VfZ3JhZGVzID09ICJGYWlyIikNCiMgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUNCnByb3AxLmludGVydmFsKHhGYWlyLG5yb3coZGF0YSksMC45NSkgIyAxLXByb3BvcnRpb24gOTUlIENJIGZvciBwDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotIEvhur90IHF14bqjIHBow6JuIHTDrWNoIGNobyB0aOG6pXkgdOG7tyBs4buHIGjhu41jIHNpbmggY8OzIGjhu41jIGzhu7FjICJGYWlyIiB0cm9uZyBt4bqrdSBsw6AgNDIuNCUgKE1lYW4gPSAwLjQyNCkuIMSQw6J5IGzDoCDGsOG7m2MgbMaw4bujbmcgdOG7kXQgY2hvIHThu7cgbOG7hyB0aOG7sWMgdOG6vyB0cm9uZyBxdeG6p24gdGjhu4MuIEdpw6EgdHLhu4sgdOG7m2kgaOG6oW4gKENyaXRpY2FsIFZhbHVlID0gMS45NikgxJHGsOG7o2MgbOG6pXkgdOG7qyBwaMOibiBwaOG7kWkgY2h14bqpbiDhu6luZyB24bubaSBt4bupYyB0aW4gY+G6rXkgOTUlLCBkw7luZyDEkeG7gyB0w61uaCBzYWkgc+G7kSBiacOqbi4NCg0KLSBTYWkgc+G7kSBiacOqbiAoTWFyZ2luIG9mIEVycm9yID0gMC4wMzA2KSBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIGtow7RuZyBjaOG6r2MgY2jhuq9uIGtoaSBkw7luZyB0cnVuZyBiw6xuaCBt4bqrdSDEkeG7gyDGsOG7m2MgbMaw4bujbmcgdOG7tyBs4buHIHThu5VuZyB0aOG7gy4gTmjhu50gY+G7oSBt4bqrdSDEkeG7pyBs4bubbiwgc2FpIHPhu5Egbmjhu48gZ2nDunAga2hv4bqjbmcgdGluIGPhuq15IGNow61uaCB4w6FjIGjGoW4uDQoNCi0gVOG7qyDEkcOzLCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGRhbyDEkeG7mW5nIHThu6sgMzkuMzQlIMSR4bq/biA0NS40NiUgKENJIGxvd2VyID0gMC4zOTM0LCBDSSB1cHBlciA9IDAuNDU0NikuIMSQaeG7gXUgbsOgeSBuZ2jEqWEgbMOgIHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIHThu7cgbOG7hyB0aOG7sWMgc+G7sSBo4buNYyBzaW5oIGxv4bqhaSAiRmFpciIgbuG6sW0gdHJvbmcga2hv4bqjbmcgbsOgeS4gS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBj4bqnbiBjw7MgY2jDrW5oIHPDoWNoIGjhu5cgdHLhu6MgbmjDs20gaOG7jWMgc2luaCB0cnVuZyBiw6xuaCDEkeG7gyBuw6JuZyBjYW8gY2jhuqV0IGzGsOG7o25nIGdpw6FvIGThu6VjLg0KDQoNCiMjIyMgKiozLjEuMiBLaeG7g20gxJHhu4tuaCBHaeG6oyB0aHV54bq/dDoqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXDsgcCA9IDAuNCBccXVhZCBcdGV4dHsoVOG7tyBs4buHIGjhu41jIHNpbmggaOG7jWMgbOG7sWMgRmFpciB0cm9uZyB04buVbmcgdGjhu4MgbMOgIMSRw7puZyA0MCUpfSBcXCANCkhfMTogXDsgcCBcbmUgMC40IFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgaOG7jWMgc2luaCBo4buNYyBs4buxYyBGYWlyIGtow6FjIDQwJSwgY8OzIHRo4buDIGNhbyBoxqFuIGhv4bq3YyB0aOG6pXAgaMahbil9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0LiQkDQoNCg0KYGBge3J9DQpwcm9wLnRlc3QoeD14RmFpciwgbj1ucm93KGRhdGEpLCBwPTAuNCwgY29ycmVjdD1GQUxTRSkNCg0KYGBgDQotIFbhu5tpIHAtdmFsdWUgPSAwLjEyMTMgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYSA9IDUlJCwgdGEga2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMDogcCA9IDAuNCQuIE7Ds2kgY8OhY2gga2jDoWMsIGNoxrBhIHRo4buDIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcgdOG7tyBs4buHIGjhu41jIHNpbmggY8OzIGjhu41jIGzhu7FjIGxv4bqhaSAiRmFpciIga2jDoWMgNDAlIHRyb25nIHThu5VuZyB0aOG7gy4gVHV5IGdpw6EgdHLhu4sgxrDhu5tjIGzGsOG7o25nIHThu6sgbeG6q3UgbMOgIDQyLjQlIChwID0gMC40MjQpLCBuaMawbmcgc+G7sSBjaMOqbmggbOG7h2NoIG7DoHkgY2jGsGEgxJHhu6cgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyB0aOG7sWMgdOG6vyBkYW8gxJHhu5luZyB04burIDM5LjM3JSDEkeG6v24gNDUuNDklLCBuZ2jEqWEgbMOgIDQwJSB24bqrbiBu4bqxbSB0cm9uZyBraG/huqNuZyB0aW4gY+G6rXkgbsOqbiBnaeG6oyB0aHV54bq/dCAkSF8wJCBsw6AgcGjDuSBo4bujcC4gS+G6v3QgcXXhuqMgbsOgeSBjaG8gdGjhuqV5IHThu7cgbOG7hyBo4buNYyBzaW5oICJGYWlyIiBjw7MgdGjhu4MgZ+G6p24gduG7m2kgZ2nhuqMgxJHhu4tuaCBiYW4gxJHhuqd1ICg0MCUpLCB2w6AgY2jGsGEgY8OzIGLhurFuZyBjaOG7qW5nIHLDtSByw6BuZyDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIG7DsyBjYW8gaMahbiBob+G6t2MgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4MuDQoNCiMjIyAqKjMuMiBwYXJlbnRfc2FsYXJ5LWxvdyoqDQoNCiMjIyMgKiozLjIuMSDGr+G7m2MgbMaw4bujbmcgS2hv4bqjbmcgVGluIGPhuq15OioqDQoNCmBgYHtyfQ0KIyBT4buRIGzGsOG7o25nIG5nxrDhu51pIGdpw6FtIGjhu5kgY+G7p2EgaOG7jWMgc2luaCBjw7MgdGh1IG5o4bqtcCBuaMOzbSAibG93Ig0KeGxvdyA8LSBzdW0oZGF0YSRwYXJlbnRfc2FsYXJ5ID09ICJsb3ciKQ0KIyDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JQ0KcHJvcDEuaW50ZXJ2YWwoeGxvdyxucm93KGRhdGEpLDAuOTUpICMgMS1wcm9wb3J0aW9uIDk1JSBDSSBmb3IgcA0KYGBgDQoqKk5I4bqsTiBYw4lUOioqDQoNCi0gVOG7tyBs4buHIG5nxrDhu51pIGdpw6FtIGjhu5kgY8OzIHRodSBuaOG6rXAgdGh14buZYyBuaMOzbSAibG93IiB0cm9uZyBt4bqrdSBsw6AgNi43JSAoTWVhbiA9IDAuMDY3KS4gxJDDonkgbMOgIGNvbiBz4buRIHTGsMahbmcgxJHhu5FpIG5o4buPLCBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBuZ8aw4budaSBnacOhbSBo4buZIGPDsyB0aHUgbmjhuq1wIGNhbyBoxqFuIG3hu6ljIG7DoHkuIEdpw6EgdHLhu4sgdOG7m2kgaOG6oW4gKENyaXRpY2FsIFZhbHVlID0gMS45NikgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdOG7qyBwaMOibiBwaOG7kWkgY2h14bqpbiB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIG5o4bqxbSB0w61uaCBzYWkgc+G7kSBiacOqbi4NCg0KLSBTYWkgc+G7kSBiacOqbiAoTWFyZ2luIG9mIEVycm9yID0gMC4wMTU1KSBwaOG6o24gw6FuaCDEkeG7mSBraMO0bmcgY2jhuq9jIGNo4bqvbiBraGkgZMO5bmcgdOG7tyBs4buHIG3huqt1IMSR4buDIMaw4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgdOG7lW5nIHRo4buDLiBW4bubaSBzYWkgc+G7kSB0xrDGoW5nIMSR4buRaSBuaOG7jywgxrDhu5tjIGzGsOG7o25nIMSRxrDhu6NjIHhlbSBsw6AgxJHDoW5nIHRpbiBj4bqteS4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHRo4buxYyB04bq/IG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgNS4xNSUgxJHhur9uIDguMjUlIChDSSBsb3dlciA9IDAuMDUxNSwgQ0kgdXBwZXIgPSAwLjA4MjUpLg0KDQotIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHThu7cgbOG7hyBuZ8aw4budaSBnacOhbSBo4buZIHRodSBuaOG6rXAgdGjhuqVwIGzDoCB0xrDGoW5nIMSR4buRaSDDrXQsIGdpw7pwIG5ow6AgcXXhuqNuIGzDvSBoaeG7g3UgcsO1IGjGoW4gduG7gSDEkeG6t2MgxJFp4buDbSBraW5oIHThur8gY+G7p2EgxJHhu5FpIHTGsOG7o25nIMSRxrDhu6NjIGto4bqjbyBzw6F0IHbDoCB04burIMSRw7MgxJHGsGEgcmEgY2jDrW5oIHPDoWNoIGjhu5cgdHLhu6MgcGjDuSBo4bujcCBoxqFuIG7hur91IGPhuqduIHRoaeG6v3QuDQoNCiMjIyMgKiozLjIuMiBLaeG7g20gxJHhu4tuaCBHaeG6oyB0aHV54bq/dDoqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXDsgcCA9IDAuMDUgXHF1YWQgXHRleHR7KFThu7cgbOG7hyBuZ8aw4budaSBnacOhbSBo4buZIGPDsyB0aHUgbmjhuq1wIHRodeG7mWMgbmjDs20gImxvdyIgbMOgICA1JSl9IFxcIA0KSF8xOiBcOyBwID4gMC4wNSBccXVhZCBcdGV4dHsoVOG7tyBs4buHIG5nxrDhu51pIGdpw6FtIGjhu5kgY8OzIHRodSBuaOG6rXAgdGh14buZYyBuaMOzbSAibG93IiBjYW8gaMahbiA1JSl9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0LiQkDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KHg9eGxvdywgbj1ucm93KGRhdGEpLCBwPTAuMDUsYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsIGNvcnJlY3Q9RkFMU0UpDQpgYGANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggdOG7iSBs4buHIG3hu5l0IG3huqt1IGtow7RuZyBz4butIGThu6VuZyBoaeG7h3UgY2jhu4luaCBsacOqbiB04bulYyBjaG8gZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiAkXGNoaV4yID0gNi4wOCQgduG7m2kgMSBi4bqtYyB04buxIGRvIHbDoCBwLXZhbHVlID0gMC4wMDY4Miwgbmjhu48gaMahbiBt4bupYyDDvSBuZ2jEqWEgNSUuIERvIMSRw7MsIHRhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQgdsOgIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgICRIXzEkLCB04bupYyBsw6AgdOG7tyBs4buHIHRo4buxYyB04bq/IG5nxrDhu51pIGdpw6FtIGjhu5kgdGh1IG5o4bqtcCBuaMOzbSAibG93IiBjYW8gaMahbiA1JS4NCg0KxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQsIG5ow7NtIG5nxrDhu51pIGdpw6FtIGjhu5kgY8OzIHRodSBuaOG6rXAgbmjDs20gImxvdyIgY2hp4bq/bSB04bu3IGzhu4cgxJHDoW5nIGvhu4MgaMahbiBzbyB24bubaSBnaeG6oyDEkeG7i25oIHRyxrDhu5tjIMSRw7MsIHThu6sgxJHDsyBj4bqjbmggYsOhbyBy4bqxbmcgY8OhYyBjaMOtbmggc8OhY2ggaOG7lyB0cuG7oyB2w6AgY2FuIHRoaeG7h3AgdMOgaSBjaMOtbmggZMOgbmggY2hvIG5ow7NtIG7DoHkgbMOgIGPhuqduIHRoaeG6v3QgxJHhu4MgxJHhuqNtIGLhuqNvIHPhu7EgY8O0bmcgYuG6sW5nIHbDoCBuw6JuZyBjYW8gxJFp4buBdSBraeG7h24gc+G7kW5nIGPhu6dhIMSR4buRaSB0xrDhu6NuZyBjw7MgaG/DoG4gY+G6o25oIGtow7Mga2jEg24uDQoNCiMjIyAqKjMuMyBpbnRlcmVzdC1VbmNlcnRhaW4qKg0KDQojIyMjICoqMy4zLjEgxq/hu5tjIGzGsOG7o25nIEtob+G6o25nIFRpbiBj4bqteToqKg0KDQoNCmBgYHtyfQ0KIyBT4buRIGzGsOG7o25nIGjhu41jIHNpbmgga2jDtG5nIHLDtSB24buBIMSR4buZIHRow61jaCB0aMO6IHRyb25nIGjhu41jIHThuq1wDQp4VW5jZXJ0YWluIDwtIHN1bShkYXRhJGludGVyZXN0ID09ICJVbmNlcnRhaW4iKQ0KIyDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JQ0KcHJvcDEuaW50ZXJ2YWwoeFVuY2VydGFpbixucm93KGRhdGEpLDAuOTUpICMgMS1wcm9wb3J0aW9uIDk1JSBDSSBmb3IgcA0KYGBgDQoqKk5I4bqsTiBYw4lUOioqDQoNCi0gVOG7tyBs4buHIGjhu41jIHNpbmgga2jDtG5nIHLDtSB24buBIMSR4buZIHRow61jaCB0aMO6IHRyb25nIGjhu41jIHThuq1wIHRyb25nIG3huqt1IGzDoCAyNi4xJSAoTWVhbiA9IDAuMjYxKS4gxJDDonkgbMOgIG3hu5l0IHThu7cgbOG7hyBraMOhIMSRw6FuZyBr4buDLCBwaOG6o24gw6FuaCBt4buZdCBuaMOzbSBo4buNYyBzaW5oIGPDsm4gZG8gZOG7sSBob+G6t2MgY2jGsGEgeMOhYyDEkeG7i25oIMSRxrDhu6NjIG3hu6ljIMSR4buZIHF1YW4gdMOibSBj4bunYSBtw6xuaCDEkeG7kWkgduG7m2kgdmnhu4djIGjhu41jLg0KDQotIEdpw6EgdHLhu4sgdOG7m2kgaOG6oW4gKENyaXRpY2FsIFZhbHVlID0gMS45NikgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdOG7qyBwaMOibiBwaOG7kWkgY2h14bqpbiB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIG5o4bqxbSB0w61uaCBzYWkgc+G7kSBiacOqbi4gU2FpIHPhu5EgYmnDqm4gKE1hcmdpbiBvZiBFcnJvciA9IDAuMDI3MikgY2hvIGJp4bq/dCDEkeG7mSBjaMOtbmggeMOhYyBj4bunYSDGsOG7m2MgbMaw4bujbmcgdOG7tyBs4buHIG7DoHkuDQoNCi0gROG7sWEgdHLDqm4gxJHDsywga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHRo4buxYyB04bq/IGRhbyDEkeG7mW5nIHThu6sgMjMuMzglIMSR4bq/biAyOC44MiUgKENJIGxvd2VyID0gMC4yMzM4LCBDSSB1cHBlciA9IDAuMjg4MikuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIHThu7cgbOG7hyBo4buNYyBzaW5oIGtow7RuZyB4w6FjIMSR4buLbmggxJHGsOG7o2MgxJHhu5kgdGjDrWNoIHRow7ogdHJvbmcgaOG7jWMgdOG6rXAgdGjhu7FjIHThur8gbuG6sW0gdHJvbmcga2hv4bqjbmcgdHLDqm4uDQoNCi0gS+G6v3QgcXXhuqMgbsOgeSBuaOG6pW4gbeG6oW5oIHPhu7EgY+G6p24gdGhp4bq/dCBj4bunYSBjw6FjIGJp4buHbiBwaMOhcCBo4buXIHRy4bujIGdpw7pwIGjhu41jIHNpbmggaGnhu4N1IHLDtSB2w6AgeMOhYyDEkeG7i25oIMSRxrDhu6NjIHPhu58gdGjDrWNoIGjhu41jIHThuq1wLCB04burIMSRw7MgbsOibmcgY2FvIMSR4buZbmcgbOG7sWMgdsOgIGhp4buHdSBxdeG6oyBo4buNYyB04bqtcCBj4bunYSBuaMOzbSBo4buNYyBzaW5oIG7DoHkuDQoNCiMjIyMgKiozLjMuMiBLaeG7g20gxJHhu4tuaCBHaeG6oyB0aHV54bq/dDoqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXDsgcCA9IDAuMTEgXHF1YWQgXHRleHR7KFThu7cgbOG7hyBo4buNYyBzaW5oIGtow7RuZyByw7UgduG7gSDEkeG7mSB0aMOtY2ggdGjDuiB0cm9uZyBo4buNYyB04bqtcCBsw6AgIDExJSl9IFxcIA0KSF8xOiBcOyBwID4gMC4xMSBccXVhZCBcdGV4dHsoVOG7tyBs4buHIGjhu41jIHNpbmgga2jDtG5nIHLDtSB24buBIMSR4buZIHRow61jaCB0aMO6IHRyb25nIGjhu41jIHThuq1wIGzDoCAxMSUpfQ0KXGVuZHthcnJheX0NClxyaWdodC4kJA0KDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KHhVbmNlcnRhaW4sbnJvdyhkYXRhKSwgcD0wLjExLGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBjb3JyZWN0PUZBTFNFKQ0KYGBgDQotIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIHThu4kgbOG7hyBt4buZdCBt4bqrdSBraMO0bmcgc+G7rSBk4bulbmcgaGnhu4d1IGNo4buJbmggbGnDqm4gdOG7pWMgY2hvIHRo4bqleSBnacOhIHRy4buLIHRo4buRbmcga8OqICRcY2hpXjIgPSAyMzIuOSQgduG7m2kgMSBi4bqtYyB04buxIGRvIHbDoCBwLXZhbHVlIDwgMi4yIFx0aW1lcyAxMF57LTE2fSQsIG5o4buPIGjGoW4gcuG6pXQgbmhp4buBdSBt4bupYyDDvSBuZ2jEqWEgNSUuIFbDrCB24bqteSwgdGEgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJCB2w6AgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aHV54bq/dCB0aGF5IHRo4bq/ICRIXzEkLg0KDQotIFThu7cgbOG7hyBt4bqrdSDGsOG7m2MgbMaw4bujbmcgbMOgIDI2LjElIChwID0gMC4yNjEpLCBjYW8gaMahbiBuaGnhu4F1IHNvIHbhu5tpIHThu7cgbOG7hyBnaeG6oyDEkeG7i25oIDExJS4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBt4buZdCBwaMOtYSBjaG8gdOG7tyBs4buHIHRo4buxYyB04bq/IG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMjMuODglIMSR4bq/biAxMDAlLCBraOG6s25nIMSR4buLbmggdOG7tyBs4buHIGjhu41jIHNpbmgga2jDtG5nIHLDtSB24buBIMSR4buZIHRow61jaCB0aMO6IHRyb25nIGjhu41jIHThuq1wIHRo4buxYyBz4buxIGzhu5tuIGjGoW4gbeG7qWMgZ2nhuqMgxJHhu4tuaC4NCg0KLSBL4bq/dCBxdeG6oyBuw6B5IGNobyB0aOG6pXkgbeG7mXQgdOG7tyBs4buHIMSRw6FuZyBr4buDIGjhu41jIHNpbmggY8OybiBkbyBk4buxIHbhu4Egc+G7sSBo4bupbmcgdGjDuiB0cm9uZyBo4buNYyB04bqtcCwgdOG7qyDEkcOzIG5o4bqlbiBt4bqhbmggc+G7sSBj4bqnbiB0aGnhur90IGPhu6dhIGPDoWMgYmnhu4duIHBow6FwIGjhu5cgdHLhu6MgxJHhu4MgdMSDbmcgxJHhu5luZyBs4buxYyB2w6Agc+G7sSBxdWFuIHTDom0gY+G7p2EgY8OhYyBlbSDEkeG7kWkgduG7m2kgcXXDoSB0csOsbmggaOG7jWMgdOG6rXAuDQoNCiMjIyAqKjMuNCBwYXJlbnRfd2FzX2luX2NvbGxlZ2UtVFJVRSoqDQoNCiMjIyMgKiozLjQuMSDGr+G7m2MgbMaw4bujbmcgS2hv4bqjbmcgVGluIGPhuq15OioqDQoNCmBgYHtyfQ0KIyBT4buRIGzGsOG7o25nICBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHRoZW8gaOG7jWMgY2FvIMSR4bqzbmcgDQp4VFJVRXAgPC0gc3VtKGRhdGEkcGFyZW50X3dhc19pbl9jb2xsZWdlID09ICJUUlVFIikNCiMgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUNCnByb3AxLmludGVydmFsKHhUUlVFcCxucm93KGRhdGEpLDAuOTUpICMgMS1wcm9wb3J0aW9uIDk1JSBDSSBmb3IgcA0KYGBgDQoqKk5I4bqsTiBYw4lUOioqDQoNCi0gVOG7tyBs4buHIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIHRoZW8gaOG7jWMgY2FvIMSR4bqzbmcgdHJvbmcgbeG6q3UgbMOgIDUyLjAlIChNZWFuID0gMC41MiksIGNoaeG6v20gdOG7tyBs4buHIGtow6EgbOG7m24gdHJvbmcgdOG7lW5nIHPhu5EgaOG7jWMgc2luaCBraOG6o28gc8OhdC4NCg0KLSBW4bubaSBnacOhIHRy4buLIHThu5tpIGjhuqFuIChDcml0aWNhbCBWYWx1ZSkgbMOgIDEuOTYg4bufIG3hu6ljIMO9IG5naMSpYSA1JSwgc2FpIHPhu5EgYmnDqm4gKE1hcmdpbiBvZiBFcnJvcikgxJHGsOG7o2MgdMOtbmggbMOgIDMuMSUgKDAuMDMwOTYpLCB0aOG7gyBoaeG7h24gxJHhu5kgY2jDrW5oIHjDoWMgY+G7p2EgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hyBuw6B5Lg0KDQotIERvIMSRw7MsIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyB0aOG7sWMgdOG6vyBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDQ4LjklIMSR4bq/biA1NS4xJSAoQ0kgbG93ZXIgPSAwLjQ4OSwgQ0kgdXBwZXIgPSAwLjU1MSksIGNobyB0aOG6pXkgduG7m2kgxJHhu5kgdGluIGPhuq15IGNhbywgdOG7tyBs4buHIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIGRhbyDEkeG7mW5nIHRyb25nIGtob+G6o25nIG7DoHkuDQoNCi0gS+G6v3QgcXXhuqMgbsOgeSBjaG8gdGjhuqV5IGjGoW4gbeG7mXQgbuG7rWEgc+G7kSBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIGPDsyB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4g4bufIG3hu6ljIGNhbyDEkeG6s25nIHRy4bufIGzDqm4sIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgdMOtY2ggY+G7sWMgxJHhur9uIHF1w6EgdHLDrG5oIGjhu41jIHThuq1wIHbDoCBwaMOhdCB0cmnhu4NuIGPhu6dhIGjhu41jIHNpbmggdGjDtG5nIHF1YSBz4buxIGjhu5cgdHLhu6MgdsOgIHTGsCB24bqlbiB04burIGdpYSDEkcOsbmguDQoNCiMjIyMgKiozLjQuMiBLaeG7g20gxJHhu4tuaCBHaeG6oyB0aHV54bq/dDoqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXDsgcCA9IDAuNiBccXVhZCBcdGV4dHsoVOG7tyBs4buHIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIHRoZW8gaOG7jWMgY2FvIMSR4bqzbmcgbMOgIDYwJSl9IFxcIA0KSF8xOiBcOyBwIFxuZSAwLjYgXHF1YWQgXHRleHR7KFThu7cgbOG7hyBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyB0aGVvIGjhu41jIGNhbyDEkeG6s25nIGtow6FjIDYwJSl9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0LiQkDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KHg9eFRSVUVwLCBuPW5yb3coZGF0YSksIHA9MC42LCBjb3JyZWN0PUZBTFNFKQ0KDQpgYGANCg0KLSBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB04buJIGzhu4cgbeG7mXQgbeG6q3Uga2jDtG5nIHPhu60gZOG7pW5nIGhp4buHdSBjaOG7iW5oIGxpw6puIHThu6VjIGNobyBnacOhIHRy4buLIHRo4buRbmcga8OqICRcY2hpXjIgPSAyNi42NjckIHbhu5tpIDEgYuG6rWMgdOG7sSBkbyB2w6AgcC12YWx1ZSA9IDIuNDE4IFx0aW1lcyAxMF57LTd9JCwgbmjhu48gaMahbiBuaGnhu4F1IG3hu6ljIMO9IG5naMSpYSA1JS4gRG8gxJHDsywgdGEgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4NCg0KLSBU4bu3IGzhu4cgbeG6q3UgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGzDoCA1MiUgKHAgPSAwLjUyKSwgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgdOG7tyBs4buHIGdp4bqjIMSR4buLbmggNjAlLiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgdGjhu7FjIHThur8gbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA0OC45JSDEkeG6v24gNTUuMSUsIGto4bqzbmcgxJHhu4tuaCB04bu3IGzhu4cgdGjhu7FjIHThur8gaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgdGjhuqVwIGjGoW4gbeG7qWMgNjAlLg0KDQotIEvhur90IHF14bqjIG7DoHkgY2hvIHRo4bqleSB04bu3IGzhu4cgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgdGhlbyBo4buNYyBjYW8gxJHhurNuZyB0aOG7sWMgdOG6vyBraMO0bmcgxJHhuqF0IG3hu6ljIDYwJSBuaMawIGdp4bqjIMSR4buLbmggdHLGsOG7m2MgxJHDsywgxJFp4buBdSBuw6B5IGPDsyB0aOG7gyB0w6FjIMSR4buZbmcgxJHhur9uIGPDoWMgeeG6v3UgdOG7kSBsacOqbiBxdWFuIMSR4bq/biBo4buXIHRy4bujIGjhu41jIHThuq1wIHbDoCBwaMOhdCB0cmnhu4NuIGPhu6dhIGjhu41jIHNpbmgsIHThu6sgxJHDsyBn4bujaSDDvSBjaG8gdmnhu4djIHhlbSB4w6l0IGzhuqFpIGPDoWMgY2jDrW5oIHPDoWNoIHbDoCBjaMawxqFuZyB0csOsbmggaOG7lyB0cuG7oyBwaMO5IGjhu6NwLg0KDQoNCiMjICoqUEjhuqZOIDQ6IFBIw4JOIFTDjUNIIE3hu5BJIFFVQU4gSOG7hiBHSeG7rkEgSEFJIEJJ4bq+TiDEkOG7ik5IIFTDjU5IIChCSVZBUklBVEUgQU5BTFlTSVMpKioNCg0KIyMjICoqNC4xIHdpbGxfZ29fdG9fY29sbGVnZS1wYXJlbnRfd2FzX2luX2NvbGxlZ2UqKg0KDQojIyMjICoqNC4xLjEgQuG6o25nIHR14bqnbiBz4buRIGNow6lvKioNCg0KDQpgYGB7cn0NCnRhYmxlX1dQIDwtIHRhYmxlKGRhdGEkd2lsbF9nb190b19jb2xsZWdlLGRhdGEkcGFyZW50X3dhc19pbl9jb2xsZWdlKQ0KDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQprYWJsZSh0YWJsZV9XUCwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyA0LjEgVOG6p24gc+G7kSB0aGVvIHF1eeG6v3QgxJHhu4tuaCB0aGVvIGjhu41jIGNhbyDEkeG6s25nIHbDoCBuZ8aw4budaSBnacOhbSBo4buZIHRoZW8gaOG7jWMgY2FvIMSR4bqzbmciKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KQuG6o25nIHThuqduIHPhu5EgY2hvIHRo4bqleSBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBjw7MgeHUgaMaw4bubbmcgcXV54bq/dCDEkeG7i25oIHRoZW8gaOG7jWMgY2FvIMSR4bqzbmcgY2FvIGjGoW4gc28gduG7m2kgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSBraMO0bmcgaOG7jWMgY2FvIMSR4bqzbmcuIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCB2YWkgdHLDsiBxdWFuIHRy4buNbmcgY+G7p2EgbuG7gW4gdOG6o25nIGjhu41jIHbhuqVuIG5nxrDhu51pIGdpw6FtIGjhu5kgdHJvbmcgdmnhu4djIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhur90IMSR4buLbmggaOG7jWMgdOG6rXAgY+G7p2EgY29uIGVtIG3DrG5oLg0KDQojIyMjICoqNC4xLjIgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZGZfV1AgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZV9XUCkNCmNvbG5hbWVzKGRmX1dQKSA8LSBjKCJEZWNpc2lvbiIsICJQYXJlbnRDb2xsZWdlIiwgIkNvdW50IikNCmdncGxvdChkZl9XUCwgYWVzKHggPSBQYXJlbnRDb2xsZWdlLCB5ID0gQ291bnQsIGZpbGwgPSBEZWNpc2lvbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkpICsNCiAgbGFicygNCiAgICB4ID0gIk5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIiwNCiAgICB5ID0gIlPhu5EgbMaw4bujbmcgaOG7jWMgc2luaCIsDQogICAgZmlsbCA9ICJRdXnhur90IMSR4buLbmggaOG7jWMgY2FvIMSR4bqzbmciLA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyA0LjI6IFThuqduIHPhu5EgaOG7jWMgc2luaCB0aGVvIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjYW8gxJHhurNuZyB2w6AgbmfGsOG7nWkgZ2nDoW0gaOG7mSBo4buNYyBjYW8gxJHhurNuZyINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCioqTkjhuqxOIFjDiVQ6KioNCg0KLSBCaeG7g3UgxJHhu5MgdsOgICBC4bqjbmcgNC4xIGNobyB0aOG6pXkg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IGPhu6dhIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBuZ8aw4budaSBnacOhbSBo4buZIMSR4bq/biBxdXnhur90IMSR4buLbmggaOG7jWMgY2FvIMSR4bqzbmcgY+G7p2EgaOG7jWMgc2luaC4g4bueIG5ow7NtIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZywgc+G7kSBo4buNYyBzaW5oIHF1eeG6v3QgxJHhu4tuaCBo4buNYyB0aeG6v3AgKFlFUykgbMOgIDI3MiwgY2FvIGjGoW4gbmjDs20ga2jDtG5nIGjhu41jIChOTykgbMOgIDI0OC4gTmfGsOG7o2MgbOG6oWksIHbhu5tpIG5ow7NtIGtow7RuZyBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcsIHPhu5EgaOG7jWMgc2luaCBraMO0bmcgaOG7jWMgY2FvIMSR4bqzbmcgbOG6oWkgY2FvIGjGoW4gKDI1MiBzbyB24bubaSAyMjgpLg0KDQotIFPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgcGjhuqNuIMOhbmggeHUgaMaw4bubbmc6IGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIGPDsyB4dSBoxrDhu5tuZyBjaOG7jW4gaOG7jWMgdGnhur9wIGNhbyBoxqFuLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2EgbmfGsOG7nWkgZ2nDoW0gaOG7mSBjw7MgdGjhu4MgxJHDs25nIHZhaSB0csOyIHTDrWNoIGPhu7FjIHRyb25nIHZp4buHYyDEkeG7i25oIGjGsOG7m25nIGjhu41jIHThuq1wIGNobyBo4buNYyBzaW5oLCBsw6AgeeG6v3UgdOG7kSDEkcOhbmcgY8OibiBuaOG6r2MgdHJvbmcgY8OhYyBjaMOtbmggc8OhY2gga2h1eeG6v24gaOG7jWMgdsOgIGjhu5cgdHLhu6MgZ2nDoW8gZOG7pWMuDQoNCiMjIyMgKio0LjEuMyBLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqioqDQoNCkLDoGkgdG/DoW4gY8OzIGdp4bqjIHRodXnhur90IG5oxrAgc2F1OiAkJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsfQ0KSF8wOiBcOyAgXHRleHR7dHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPhu6dhIG5nxrDhu51pIGdpw6FtIGjhu5kgdsOgIHF1eeG6v3QgxJHhu4tuaCBo4buNYyB0aeG6v3AgY+G7p2EgaOG7jWMgc2luaCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdSB9IFxcIA0KSF8xOiBcOyAgXHRleHR7dHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPhu6dhIG5nxrDhu51pIGdpw6FtIGjhu5kgdsOgIHF1eeG6v3QgxJHhu4tuaCBo4buNYyB0aeG6v3AgY+G7p2EgaOG7jWMgc2luaCBjw7MgbGnDqm4gcXVhbiDEkeG6v24gbmhhdX0NClxlbmR7YXJyYXl9DQpccmlnaHQuJCQNCg0KVGEgdGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcgdsOgIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQpgYGB7cn0NCmNoaVdQIDwtIGNoaXNxLnRlc3QodGFibGVfV1ApDQpwcmludChjaGlXUCkNCmBgYA0KKipOSOG6rE4gWMOJVDoqKg0KDQpW4bubaSBiw6BpIHRvw6FuIGtp4buDbSDEkeG7i25oIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBj4bunYSBuZ8aw4budaSBnacOhbSBo4buZIHbDoCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGNhbyDEkeG6s25nIGPhu6dhIGjhu41jIHNpbmgsIHRhIHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1zcXVhcmVkIHbhu5tpIGhp4buHdSBjaOG7iW5oIFlhdGVzLiBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IHRo4buRbmcga8OqICRcY2hpXjIgPSAyLjExOTQkIHbhu5tpIDEgYuG6rWMgdOG7sSBkbyB2w6AgcC12YWx1ZSA9IDAuMTQ1NCwgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCkRvIMSRw7MsIGtow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiDEkGnhu4F1IG7DoHkgxJHhu5NuZyBuZ2jEqWEgduG7m2kgdmnhu4djIGNoxrBhIHRo4buDIGto4bqzbmcgxJHhu4tuaCBjw7MgbeG7kWkgbGnDqm4gaOG7hyByw7UgcsOgbmcgZ2nhu69hIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBj4bunYSBuZ8aw4budaSBnacOhbSBo4buZIHbDoCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGPhu6dhIGjhu41jIHNpbmggdHJvbmcgdOG7lW5nIHRo4buDLiBN4bq3YyBkw7kgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCBuaOG6uSB24buBIHThuqduIHPhu5EgdHJvbmcgYuG6o25nLCBuaMawbmcgeMOpdCB0csOqbiBraMOtYSBj4bqhbmggdGjhu5FuZyBrw6osIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgY2jGsGEgxJHhu6cgw70gbmdoxKlhIMSR4buDIHLDunQgcmEga+G6v3QgbHXhuq1uIGNo4bqvYyBjaOG6r24uIEPDoWMgeeG6v3UgdOG7kSBraMOhYyBjw7MgdGjhu4MgxJFhbmcgxJHDs25nIHZhaSB0csOyIHF1YW4gdHLhu41uZyBoxqFuIHRyb25nIHF1eeG6v3QgxJHhu4tuaCBo4buNYyB04bqtcCBj4bunYSBo4buNYyBzaW5oLg0KDQojIyMjICoqNC4xLjQgSGnhu4d1IGhhaSB04bu3IGzhu4cqKg0KDQoqKlRoaeG6v3QgbOG6rXAgdOG7tyBs4buHKioNCg0KVOG7tyBs4buHIGjhu41jIHNpbmggcXV54bq/dCDEkeG7i25oIGjhu41jIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIGjhu41jIGNhbyDEkeG6s25nOg0KDQokJA0KcF8xID0gUChcdGV4dHtwYXJlbnRzX3dhc19pbl9jb2xsZWdlfSA9IFRSVUUgXG1pZCBcdGV4dHt3aWxsX2dvX3RvX2NvbGxlZ2V9ID0gWUVTKQ0KJCQNCg0KVOG7tyBs4buHIGjhu41jIHNpbmgga2jDtG5nIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSBo4buNYyBjYW8gxJHhurNuZzoNCg0KJCQNCnBfMSA9IFAoXHRleHR7cGFyZW50c193YXNfaW5fY29sbGVnZX0gPSBUUlVFIFxtaWQgXHRleHR7d2lsbF9nb190b19jb2xsZWdlfSA9IE5PKQ0KJCQNCg0KSGnhu4d1IGNow6puaCBs4buHY2ggZ2nhu69hIGhhaSB04bu3IGzhu4c6DQoNCiQkDQpkID0gcF8xIC0gcF8yDQokJA0KDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotICoqR2nhuqMgdGh1eeG6v3QgSOKCgCoqOiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgdOG7tyBs4buHICANCiAgJCQgSF8wOiBwXzEgLSBwXzIgPSAwJCQNCg0KLSAqKkdp4bqjIHRodXnhur90IEgxKSoqOiBU4bu3IGzhu4cgaOG7jWMgc2luaCBxdXnhur90IMSR4buLbmggaOG7jWMgY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgaOG7jWMgY2FvIMSR4bqzbmcgdGjhuqVwIGjGoW4gVOG7tyBs4buHIGjhu41jIHNpbmgga2jDtG5nIHF1eeG6v3QgxJHhu4tuaCBo4buNYyBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSBo4buNYyBjYW8gxJHhurNuZzogJEhfMTogcF8xIC0gcF8yIDwgMCQNCiAgDQoNCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIHF1eeG6v3QgxJHhu4tuaCBo4buNYyB0aeG6v3AgY2FvIMSR4bqzbmcgduG7m2kgYuG7kSBt4bq5IHRoZW8gaOG7jWMgY2FvIMSR4bqzbmcNCmxpYnJhcnkoc3RhdHMpDQoNCnRlc3RXUCA8LSBwcm9wLnRlc3QoeCA9IGModGFibGVfV1BbIllFUyIsIlRSVUUiXSwgdGFibGVfV1BbIk5PIiwiVFJVRSJdKSwNCiAgICAgICAgICAgICAgICAgICAgICBuID0gYyhzdW0odGFibGVfV1BbIllFUyIsXSksIHN1bSh0YWJsZV9XUFsiTk8iLF0pKSwNCiAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgY29ycmVjdCA9IEZBTFNFKQ0KcHJpbnQodGVzdFdQKQ0KYGBgDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBoYWkgdOG7tyBs4buHIGNobyB0aOG6pXkgJFxjaGleMiA9IDIuMzA3NyQsIHbhu5tpIHAtdmFsdWUgPSAwLjkzNTYsIGzhu5tuIGjGoW4gbmhp4buBdSBzbyB24bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNS4gRG8gxJHDsywgdGEga2jDtG5nIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJCwgdOG7qWMgbMOgIGtow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyB04bu3IGzhu4cgaOG7jWMgc2luaCBxdXnhur90IMSR4buLbmggaOG7jWMgY2FvIMSR4bqzbmcgY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIHRo4bqlcCBoxqFuIG5ow7NtIGPDsm4gbOG6oWkuIE5nxrDhu6NjIGzhuqFpLCDGsOG7m2MgbMaw4bujbmcgbeG6q3UgbOG6oWkgY2hvIHRo4bqleSB04bu3IGzhu4cgbsOgeSBjYW8gaMahbiBt4buZdCBjaMO6dCAoMC41NDQgPiAwLjQ5NiksIGTDuSBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gaGnhu4d1IHPhu5EgdOG7tyBs4buHICQocF8xIC0gcF8yKSQgbMOgIHThu6sg4oCTMS4wMDAwIMSR4bq/biAwLjA5OTkxMzIxIGJhbyBn4buTbSAwLCBjw6BuZyBj4bunbmcgY+G7kSB2aeG7h2Mga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gy4gRMO5IHThu7cgbOG7hyDGsOG7m2MgbMaw4bujbmcgY+G7p2EgbmjDs20gaOG7jWMgdGnhur9wIGjhu41jIGNhbyDEkeG6s25nIGzDoCAwLjU0NCwgY2FvIGjGoW4gbmjDs20ga2jDtG5nIGjhu41jICgwLjQ5NiksIG5oxrBuZyBjaMOqbmggbOG7h2NoIG7DoHkga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCioqSGnhu4d1IGNow6puaCBs4buHY2ggZ2nhu69hIGhhaSB04bu3IGzhu4c6KioNCiQkDQpcaGF0e2R9ID0gMC41NDQgLSAwLjQ5NiA9IDAuMDQ4DQokJA0KDQojIyMjICoqNC4xLjUgIFThu7cgc+G7kSBOZ3V5IGPGoSAoUmVsYXRpdmUgUmlzayAtIFJSKSoqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJXUCA8LSByaXNrcmF0aW8odGFibGVfV1AsIG1ldGhvZCA9ICJ3YWxkIikNCnByaW50KHJXUCkNCmBgYA0KDQpE4buxYSB0csOqbiBi4bqjbmcgZOG7ryBsaeG7h3UgMsOXMiwgdOG7tyBz4buRIHLhu6dpIHJvIChyaXNrIHJhdGlvKSBnaeG7r2EgbmjDs20gaOG7jWMgc2luaCBjw7MgcXV54bq/dCDEkeG7i25oIGjhu41jIGNhbyDEkeG6s25nIHbDoCBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBsw6AgUlIgPSAxLjA5NywgdOG7qWMgY2FvIGjGoW4ga2hv4bqjbmcgOS43JSBzbyB24bubaSBuaMOzbSBxdXnhur90IMSR4buLbmgga2jDtG5nIGjhu41jLiBUdXkgbmhpw6puLCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGzDoCAoMC45NzM7IDEuMjM2KSBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAxLCBuZ2jEqWEgbMOgIGNoxrBhIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGto4bqzbmcgxJHhu4tuaCBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgdGjhu7FjIHPhu7EuDQoNCg0KfCBQaMawxqFuZyBwaMOhcCBraeG7g20gxJHhu4tuaCB8IEdpw6EgdHLhu4sgcCAodHdvLXNpZGVkKSB8DQp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8IE1pZC1wIGV4YWN0IHRlc3QgICAgICB8IDAuMTI5NSAgICAgICAgICAgICAgICB8DQp8IEZpc2hlciBleGFjdCB0ZXN0ICAgICB8IDAuMTQ1NCAgICAgICAgICAgICAgICB8DQp8IENoaS1zcXVhcmUgdGVzdCAgICAgICB8IDAuMTI4NyAgICAgICAgICAgICAgICB8DQoNCi0gVOG6pXQgY+G6oyBjw6FjIGdpw6EgdHLhu4sgcCDEkeG7gXUgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgMC4wNS4NCg0KLSDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgdGEga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAgdOG7qWMgbMOgIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSB04bu3IGzhu4cgcXV54bq/dCDEkeG7i25oIGjhu41jIHRp4bq/cCBjYW8gxJHhurNuZyBnaeG7r2EgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgdsOgIGtow7RuZyBo4buNYyBjYW8gxJHhurNuZyBk4buxYSB0csOqbiBk4buvIGxp4buHdSBuw6B5Lg0KDQotIEvhur90IGx14bqtbjogROG7ryBsaeG7h3UgY2jGsGEgY2hvIHRo4bqleSBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIHRyw6xuaCDEkeG7mSBuZ8aw4budaSBnacOhbSBo4buZIHbDoCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGPhu6dhIGjhu41jIHNpbmguDQoNCiMjIyMgKio0LjEuNiBU4bu3IHPhu5EgQ2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpOioqDQoNCmBgYHtyfQ0KbGlicmFyeShEZXNjVG9vbHMpDQpvcldQIDwtIE9kZHNSYXRpbyh0YWJsZV9XUCwgbWV0aG9kPSJ3YWxkIiwgY29uZi5sZXZlbCA9IDAuOTUpDQpwcmludChvcldQKQ0KYGBgDQotIE9SID4gMSBuZ2jEqWEgbMOgIG9kZHMgcXV54bq/dCDEkeG7i25oIGjhu41jIHRp4bq/cCBjYW8gxJHhurNuZyBj4bunYSBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBjYW8gaMahbiBvZGRzIGPhu6dhIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kga2jDtG5nIGjhu41jIGNhbyDEkeG6s25nLg0KDQotIEdpw6EgdHLhu4sgT1IgPSAxLjIxMjIgY2hvIHRo4bqleSBvZGRzIGjhu41jIHRp4bq/cCBjYW8gxJHhurNuZyBj4bunYSBuaMOzbSBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBjYW8gaMahbiBraG/huqNuZyAyMS4yMiUgc28gduG7m2kgbmjDs20gY8OybiBs4bqhaSAoMS4yMTIyIC0gMSA9IDAuMjEyMikuDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gT1IgbMOgICgwLjk0NTYsIDEuNTU0MCkgY2jhu6lhIGdpw6EgdHLhu4sgMS4NCg0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSwgduG7gSBt4bq3dCB0aOG7kW5nIGvDqiwgY2jDum5nIHRhIGtow7RuZyB0aOG7gyBraOG6s25nIMSR4buLbmggY2jhuq9jIGNo4bqvbiBz4buxIGtow6FjIGJp4buHdCB24buBIG9kZHMgZ2nhu69hIGhhaSBuaMOzbSwgdOG7qWMgY8OzIGto4bqjIG7Eg25nIG9kZHMgY+G7p2EgaGFpIG5ow7NtIGzDoCBi4bqxbmcgbmhhdSAoT1IgPSAxKS4NCg0KKipU4buUTkcgS+G6vlQqKg0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IHThu7cgc+G7kSBy4bunaSBybyAoUlIgPSAxLjA5NykgdsOgIG9kZHMgcmF0aW8gKE9SID0gMS4yMTIpIMSR4buBdSBs4bubbiBoxqFuIDEsIGNo4buJIHJhIG5ow7NtIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIGPDsyB4dSBoxrDhu5tuZyBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGNhbyDEkeG6s25nIGNhbyBoxqFuIG5ow7NtIGPDsm4gbOG6oWksIHTGsMahbmcg4bupbmcgdMSDbmcga2hv4bqjbmcgOS43JSB24buBIHThu7cgbOG7hyB2w6AgMjEuMiUgduG7gSBvZGRzLiBUdXkgbmhpw6puLCBjw6FjIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY+G7p2EgUlIgKDAuOTcz4oCTMS4yMzYpIHbDoCBPUiAoMC45NDbigJMxLjU1NCkgxJHhu4F1IGNo4bupYSBnacOhIHRy4buLIDEsIGPDuW5nIHbhu5tpIGPDoWMgZ2nDoSB0cuG7iyBwIGtp4buDbSDEkeG7i25oIGNoaS1zcXVhcmUsIEZpc2hlciwgdsOgIG1pZC1wIMSR4buBdSBs4bubbiBoxqFuIDAuMDUsIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjaMawYSDEkeG7pyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIE5oxrAgduG6rXksIGNoxrBhIGPDsyBi4bqxbmcgY2jhu6luZyByw7UgcsOgbmcga2jhurNuZyDEkeG7i25oIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHRyw6xuaCDEkeG7mSBuZ8aw4budaSBnacOhbSBo4buZIHbDoCBxdXnhur90IMSR4buLbmggaOG7jWMgdGnhur9wIGPhu6dhIGjhu41jIHNpbmguDQoNCiMjIyAqKjQuMiB0eXBlc2Nob29sLWdlbmRlcioqDQoNCiMjIyMgKio0LjIuMSBC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyoqDQoNCmBgYHtyfQ0KdGFibGVfdHlwZWdlbmRlciA8LSB0YWJsZShkYXRhJHR5cGVfc2Nob29sLGRhdGEkZ2VuZGVyKQ0KDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQprYWJsZSh0YWJsZV90eXBlZ2VuZGVyLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDQuMiBU4bqnbiBz4buRIHRoZW8gbG/huqFpIHRyxrDhu51uZyB2w6AgZ2nhu5tpIHTDrW5oIGPhu6dhIGjhu41jIHNpbmgiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KDQoqKk5I4bqsTiBYw4lUOioqDQoNCkLhuqNuZyA0LjIgdHLDrG5oIGLDoHkgdOG6p24gc+G7kSBo4buNYyBzaW5oIHRoZW8gbG/huqFpIHRyxrDhu51uZyB2w6AgZ2nhu5tpIHTDrW5oLCBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBraMOhIMSR4buTbmcgxJHhu4F1IGdp4buvYSBuYW0gdsOgIG7hu68gdHJvbmcgdOG7q25nIGxv4bqhaSBow6xuaCDEkcOgbyB04bqhby4gQ+G7pSB0aOG7gywgdHJvbmcgbmjDs20gdHLGsOG7nW5nIEFjYWRlbWljLCBz4buRIGjhu41jIHNpbmggbmFtICgzMDcpIHbDoCBu4buvICgzMDIpIGfhuqduIG5oxrAgdMawxqFuZyDEkcawxqFuZywgcGjhuqNuIMOhbmgga2jDtG5nIGPDsyBz4buxIHRoacOqbiBs4buHY2ggZ2nhu5tpIHLDtSBy4buHdC4gTmfGsOG7o2MgbOG6oWksIOG7nyBuaMOzbSBWb2NhdGlvbmFsLCBz4buRIGjhu41jIHNpbmggbmFtICgyMDgpIG5o4buJbmggaMahbiBu4buvICgxODMpLCBjaG8gdGjhuqV5IG5hbSBjw7MgeHUgaMaw4bubbmcgbOG7sWEgY2jhu41uIGjGsOG7m25nIG5naOG7gSBuaGnhu4F1IGjGoW4uDQoNCg0KIyMjIyAqKjQuMi4yIFRy4buxYyBxdWFuIGhvw6EqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmRmX3R5cGVnZW5kZXIgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZV90eXBlZ2VuZGVyKQ0KY29sbmFtZXMoZGZfdHlwZWdlbmRlcikgPC0gYygiR2VuZGVyIiwgIlNjaG9vbFR5cGUiLCAiQ291bnQiKQ0KZ2dwbG90KGRmX3R5cGVnZW5kZXIsIGFlcyh4ID0gU2Nob29sVHlwZSwgeSA9IENvdW50LCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKSArDQogIGxhYnMoDQogICAgeCA9ICJMb+G6oWkgdHLGsOG7nW5nIiwNCiAgICB5ID0gIlPhu5EgbMaw4bujbmcgaOG7jWMgc2luaCIsDQogICAgZmlsbCA9ICJRdXnhur90IMSR4buLbmggaOG7jWMgY2FvIMSR4bqzbmciLA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyA0LjI6IFThuqduIHPhu5EgaOG7jWMgc2luaCB0aGVvIGxv4bqhaSB0csaw4budbmcgdsOgIGdp4bubaSB0w61uaCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCioqTkjhuqxOIFjDiVQ6KioNCg0KLSBCaeG7g3UgxJHhu5MgNC4xIG1pbmggaOG7jWEgdOG6p24gc+G7kSBo4buNYyBzaW5oIHRoZW8gaGFpIHnhur91IHThu5E6IGxv4bqhaSB0csaw4budbmcgKEFjYWRlbWljIOKAkyBo4buNYyB0aHXhuq10IHbDoCBWb2NhdGlvbmFsIOKAkyBk4bqheSBuZ2jhu4EpIHbDoCBnaeG7m2kgdMOtbmggKE5hbSB2w6AgTuG7rykuIFF1YSBiaeG7g3UgxJHhu5MsIHRhIG5o4bqtbiB0aOG6pXkgc+G7kSBsxrDhu6NuZyBo4buNYyBzaW5oIGjhu41jIHRyxrDhu51uZyBo4buNYyB0aHXhuq10IChBY2FkZW1pYykgw6FwIMSR4bqjbyBzbyB24bubaSB0csaw4budbmcgZOG6oXkgbmdo4buBIChWb2NhdGlvbmFsKSDhu58gY+G6oyBoYWkgZ2nhu5tpLiBD4bulIHRo4buDLCB0cm9uZyBsb+G6oWkgdHLGsOG7nW5nIEFjYWRlbWljLCBz4buRIGjhu41jIHNpbmggbuG7ryBsw6AgMzAyIHbDoCBuYW0gbMOgIDMwNyDigJMgY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5Ega2jDoSDEkeG7k25nIMSR4buBdSBnaeG7r2EgaGFpIGdp4bubaS4gVHJvbmcga2hpIMSRw7MsIOG7nyBsb+G6oWkgdHLGsOG7nW5nIFZvY2F0aW9uYWwsIHPhu5EgaOG7jWMgc2luaCBuYW0gKDIwOCkgbOG6oWkgY2FvIGjGoW4gbuG7ryAoMTgzKSwgcGjhuqNuIMOhbmggbeG7mXQgc+G7sSBs4buHY2ggbmjhurkgduG7gSBnaeG7m2kgdMOtbmggdHJvbmcgeHUgaMaw4bubbmcgY2jhu41uIGjhu41jIG5naOG7gS4NCg0KLSBCaeG7g3UgxJHhu5MgZ2nDunAgbMOgbSByw7UgcuG6sW5nIGjhu41jIHNpbmgg4oCTIGLhuqV0IGvhu4MgZ2nhu5tpIHTDrW5oIOKAkyBjw7MgeHUgaMaw4bubbmcgY2jhu41uIHRyxrDhu51uZyBo4buNYyB0aHXhuq10IG5oaeG7gXUgaMahbi4gVHV5IG5oacOqbiwgdOG7iSBs4buHIGjhu41jIHNpbmggbmFtIGNo4buNbiBo4buNYyBuZ2jhu4EgY2FvIGjGoW4gbuG7rywgxJFp4buBdSBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaCBz4buxIGtow6FjIGJp4buHdCB0cm9uZyDEkeG7i25oIGjGsOG7m25nIG5naOG7gSBuZ2hp4buHcCBob+G6t2Mg4bqjbmggaMaw4bufbmcgdsSDbiBow7NhIHjDoyBo4buZaSDEkeG7kWkgduG7m2kgZ2nhu5tpLiBCaeG7g3UgxJHhu5MgNC4yIGtow7RuZyBjaOG7iSB0aOG7gyBoaeG7h24gc+G7kSBsaeG7h3UgbeG7mXQgY8OhY2ggdHLhu7FjIHF1YW4gbcOgIGPDsm4gZ2nDunAgbmfGsOG7nWkgeGVtIGThu4UgZMOgbmcgc28gc8OhbmggdsOgIHBow6JuIHTDrWNoIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBjw6FjIG5ow7NtLCB04burIMSRw7MgaOG7lyB0cuG7oyB2aeG7h2MgxJHGsGEgcmEgbmjhuq1uIMSR4buLbmgga2jDoWNoIHF1YW4gaMahbiB24buBIHh1IGjGsOG7m25nIGdpw6FvIGThu6VjIHRoZW8gZ2nhu5tpIHTDrW5oIGhp4buHbiBuYXkuDQoNCiMjIyMgKio0LjIuMyBLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqioqDQoNCkLDoGkgdG/DoW4gY8OzIGdp4bqjIHRodXnhur90IG5oxrAgc2F1OiAkJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsfQ0KSF8wOiBcOyAgXHRleHR7R2nhu5tpIHTDrW5oIHbDoCBsb+G6oWkgdHLGsOG7nW5nIHRoZW8gaOG7jWMgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUgfSBcXCANCkhfMTogXDsgIFx0ZXh0e0dp4bubaSB0w61uaCB2w6AgbG/huqFpIHRyxrDhu51uZyB0aGVvIGjhu41jIGPDsyBsacOqbiBxdWFuIMSR4bq/biBuaGF1fQ0KXGVuZHthcnJheX0NClxyaWdodC4kJA0KVGEgdGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcgdsOgIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQpgYGB7cn0NCmNoaXR5cGVnZW5kZXIgPC0gY2hpc3EudGVzdCh0YWJsZV90eXBlZ2VuZGVyKQ0KcHJpbnQoY2hpdHlwZWdlbmRlcikNCmBgYA0KDQoNCktp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyDEkeG7mWMgbOG6rXAgduG7m2kgaGnhu4d1IGNo4buJbmggbGnDqm4gdOG7pWMgY+G7p2EgWWF0ZXMgxJHGsOG7o2MgdGjhu7FjIGhp4buHbiDEkeG7gyB4ZW0geMOpdCBt4buRaSBsacOqbiBo4buHIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIGxv4bqhaSB0csaw4budbmcgaOG7jWMgc2luaCB0aGVvIGjhu41jLiBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5Og0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLXNxdWFyZWQgPSAwLjYzMjgzDQoNCi0gQuG6rWMgdOG7sSBkbyAoZGYpID0gMSAgDQoNCi0gR2nDoSB0cuG7iyBwLXZhbHVlID0gMC40MjYzDQoNClbhu5tpIHAtdmFsdWUgPSAwLjQyNjMgPiAwLjA1LCB0YSAqKmtow7RuZyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCoqIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgKipraMO0bmcgY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4bunIG3huqFuaCoqIMSR4buDIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcgZ2nhu5tpIHTDrW5oIHbDoCBsb+G6oWkgdHLGsOG7nW5nIGjhu41jIHNpbmggdGhlbyBo4buNYyBjw7MgbeG7kWkgbGnDqm4gaOG7hy4gTsOzaSBjw6FjaCBraMOhYywgc+G7sSBraMOhYyBiaeG7h3Qgc+G7kSBsxrDhu6NuZyBuYW0gdsOgIG7hu68gZ2nhu69hIHRyxrDhu51uZyBBY2FkZW1pYyB2w6AgVm9jYXRpb25hbCAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiosIHbDoCBjw7MgdGjhu4MgeOG6o3kgcmEgZG8gbmfhuqt1IG5oacOqbi4gS+G6v3QgcXXhuqMgbsOgeSBj4bunbmcgY+G7kSBuaOG6rW4gxJHhu4tuaCB04burIEJp4buDdSDEkeG7kyA0LjIgcuG6sW5nIHPhu7EgcGjDom4gYuG7kSBnaeG7m2kgdMOtbmggZ2nhu69hIGPDoWMgbG/huqFpIHRyxrDhu51uZyBsw6AgdMawxqFuZyDEkeG7kWkgxJHhu5NuZyDEkeG7gXUuDQoNCiMjIyMgKio0LjIuNCBIaeG7h3UgaGFpIHThu7cgbOG7hyoqDQoNCioqVGhp4bq/dCBs4bqtcCB04bu3IGzhu4cqKg0KDQpU4bu3IGzhu4cgaOG7jWMgc2luaCBu4buvIGjhu41jIHThuqFpIHRyxrDhu51uZyBuZ2jhu4E6DQoNCiQkDQpwXzEgPSBQKFx0ZXh0e3R5cGVzY2hvb2x9ID0gVmFjYXRpb25hbCBcbWlkIFx0ZXh0e2dlbmRlcn0gPSBGZW1hbGUpDQokJA0KVOG7tyBs4buHIGjhu41jIHNpbmggbmFtIGjhu41jIHThuqFpIHRyxrDhu51uZyBuZ2jhu4E6DQoNCiQkDQpwXzIgPSBQKFx0ZXh0e3R5cGVzY2hvb2x9ID0gVmFjYXRpb25hbCBcbWlkIFx0ZXh0e2dlbmRlcn0gPSBNYWxlKQ0KJCQNCg0KSGnhu4d1IGNow6puaCBs4buHY2ggZ2nhu69hIGhhaSB04bu3IGzhu4c6DQoNCiQkDQpkID0gcF8xIC0gcF8yDQokJA0KDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotICoqR2nhuqMgdGh1eeG6v3QgSOKCgCoqOiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgdOG7tyBs4buHICANCiAgJCQgSF8wOiBwXzEgLSBwXzIgPSAwJCQNCg0KLSAqKkdp4bqjIHRodXnhur90IEgxKSoqOiBU4bu3IGzhu4cgaOG7jWMgc2luaCBu4buvIHRoZW8gaOG7jWMgdHLGsOG7nW5nIG5naOG7gXRo4bqlcCBoxqFuIFThu7cgbOG7hyBo4buNYyBzaW5oIG5hbSB0aGVvIGjhu41jIHRyxrDhu51uZyBuZ2jhu4EgOiAkSF8xOiBwXzEgLSBwXzIgPCAwJA0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIG5hbSBu4buvIGjhu41jIHThuqFpIHRyxrDhu51uZyBuZ2jhu4ENCmxpYnJhcnkoc3RhdHMpDQoNCiMgU+G7kSBo4buNYyBzaW5oIG7hu68gaOG7jWMgbmdo4buBDQp4X2ZlbWFsZV92b2MgPC0gdGFibGVfdHlwZWdlbmRlclsiVm9jYXRpb25hbCIsICJGZW1hbGUiXSAgIyAxODMNCiMgVOG7lW5nIHPhu5EgaOG7jWMgc2luaCBu4buvDQpuX2ZlbWFsZSA8LSBzdW0odGFibGVfdHlwZWdlbmRlclssICJGZW1hbGUiXSkgICAgICAgICAgICAgIyAzMDIgKyAxODMgPSA0ODUNCg0KIyBT4buRIGjhu41jIHNpbmggbmFtIGjhu41jIG5naOG7gQ0KeF9tYWxlX3ZvYyA8LSB0YWJsZV90eXBlZ2VuZGVyWyJWb2NhdGlvbmFsIiwgIk1hbGUiXSAgICAgICMgMjA4DQojIFThu5VuZyBz4buRIGjhu41jIHNpbmggbmFtDQpuX21hbGUgPC0gc3VtKHRhYmxlX3R5cGVnZW5kZXJbLCAiTWFsZSJdKSAgICAgICAgICAgICAgICAgIyAzMDcgKyAyMDggPSA1MTUNCg0KIyBLaeG7g20gxJHhu4tuaCB04buJIGzhu4cgKHNvIHPDoW5oIHThu7cgbOG7hyBu4buvIGjhu41jIG5naOG7gSB2w6AgdOG7tyBs4buHIG5hbSBo4buNYyBuZ2jhu4EpDQp0ZXN0dHlwZWdlbmRlciA8LSBwcm9wLnRlc3QoDQogIHggPSBjKHhfZmVtYWxlX3ZvYywgeF9tYWxlX3ZvYyksDQogIG4gPSBjKG5fZmVtYWxlLCBuX21hbGUpLA0KICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgICAgIyBnaeG6oyB0aHV54bq/dCB04bu3IGzhu4cgbuG7ryBo4buNYyBuZ2jhu4EgdGjhuqVwIGjGoW4gdOG7tyBs4buHIG5hbQ0KICBjb3JyZWN0ID0gRkFMU0UNCikNCnByaW50KHRlc3R0eXBlZ2VuZGVyKQ0KYGBgDQoNCg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogXCggXGNoaV4yID0gXCkgYHIgcm91bmQodGVzdHR5cGVnZW5kZXIkc3RhdGlzdGljLCA0KWAgIA0KLSBwLXZhbHVlID0gYHIgc2lnbmlmKHRlc3R0eXBlZ2VuZGVyJHAudmFsdWUsIDQpYA0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgcC12YWx1ZSA9IGByIHNpZ25pZih0ZXN0dHlwZWdlbmRlciRwLnZhbHVlLCA0KWAgPiAwLjA1IG7Dqm4gY2jDum5nIHRhICoqa2jDtG5nIMSR4bunIGPGoSBz4bufIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcqKiBy4bqxbmcgdOG7tyBs4buHIG7hu68gaOG7jWMgbmdo4buBIHRo4bqlcCBoxqFuIHThu7cgbOG7hyBuYW0uDQoNClF1YW4gc8OhdCB04bu3IGzhu4cgaOG7jWMgbmdo4buBIHRyb25nIG3huqt1LCBu4buvIGNoaeG6v20ga2hv4bqjbmcgMzcuNzMlICgxODMvNDg1KSwgdHJvbmcga2hpIG5hbSBjaGnhur9tIGtob+G6o25nIDQwLjM5JSAoMjA4LzUxNSkuIE3hurdjIGTDuSB04bu3IGzhu4cgbuG7ryBo4buNYyBuZ2jhu4EgdGjhuqVwIGjGoW4gbmFtLCBuaMawbmcgc+G7sSBjaMOqbmggbOG7h2NoIG7DoHkga2jDtG5nIG1hbmcgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQpOaMawIHbhuq15LCBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IGdp4bubaSB0w61uaCBraMO0bmcg4bqjbmggaMaw4bufbmcgxJHDoW5nIGvhu4MgxJHhur9uIHZp4buHYyBs4buxYSBjaOG7jW4gaOG7jWMgdHLGsOG7nW5nIG5naOG7gSB0cm9uZyBt4bqrdSBuZ2hpw6puIGPhu6l1IG7DoHkuIEvhur90IGx14bqtbiBuw6B5IHBow7kgaOG7o3AgduG7m2kga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIMSR4buZYyBs4bqtcCBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBsb+G6oWkgdHLGsOG7nW5nLCBjaG8gdGjhuqV5IHBow6JuIGLhu5EgaOG7jWMgc2luaCB0aGVvIGdp4bubaSB0w61uaCDhu58gY8OhYyBsb+G6oWkgdHLGsOG7nW5nIGtow7RuZyBraMOhYyBiaeG7h3QgcsO1IHLDoG5nLg0KDQpUw7NtIGzhuqFpLCBk4buxYSB0csOqbiBk4buvIGxp4buHdSB2w6Aga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6osIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSBnaeG7r2EgdOG7tyBs4buHIGjhu41jIG5naOG7gSBj4bunYSBo4buNYyBzaW5oIG5hbSB2w6AgbuG7ry4NCg0KIyMjIyAqKjQuMi41ICBU4bu3IHPhu5EgTmd1eSBjxqEgKFJlbGF0aXZlIFJpc2sgLSBSUikqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpydHlwZWdlbmRlciA8LSByaXNrcmF0aW8odGFibGVfdHlwZWdlbmRlciwgbWV0aG9kID0gIndhbGQiKQ0KcHJpbnQocnR5cGVnZW5kZXIpDQpgYGANCg0KKipOSOG6rE4gWMOJVDoqKg0KDQpE4buxYSB0csOqbiBi4bqjbmcgZOG7ryBsaeG7h3UgMsOXMiwgdOG7tyBz4buRIHLhu6dpIHJvIChyaXNrIHJhdGlvKSBnaeG7r2EgbmjDs20gaOG7jWMgc2luaCBOQU0gdGhlbyBo4buNYyB0csaw4budbmcgbmdo4buBIChWb2NhdGlvbmFsKSBzbyB24bubaSBo4buNYyB0csaw4budbmcgaOG7jWMgdGh14bqtdCAoQWNhZGVtaWMpIGzDoCBSUiA9IDEuMDU1MywgdOG7qWMgY2FvIGjGoW4ga2hv4bqjbmcgNS41MyUuIFR1eSBuaGnDqm4sIGtob+G6o25nIHRpbiBj4bqteSA5NSUgbMOgICgwLjkzNDI7IDEuMTkyMCkgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMSwgbmdoxKlhIGzDoCBjaMawYSDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBraOG6s25nIMSR4buLbmggY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHRo4buxYyBz4buxIGdp4buvYSBoYWkgbmjDs20uDQoNCnwgUGjGsMahbmcgcGjDoXAga2nhu4NtIMSR4buLbmggIHwgR2nDoSB0cuG7iyBwICh0d28tc2lkZWQpIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8IE1pZC1wIGV4YWN0IHRlc3QgICAgICAgfCAwLjM5MDYgICAgICAgICAgICAgICAgfA0KfCBGaXNoZXIgZXhhY3QgdGVzdCAgICAgIHwgMC4zOTk5ICAgICAgICAgICAgICAgIHwNCnwgQ2hpLXNxdWFyZSB0ZXN0ICAgICAgICB8IDAuMzg5NiAgICAgICAgICAgICAgICB8DQoNCi0gVOG6pXQgY+G6oyBjw6FjIGdpw6EgdHLhu4sgcCDEkeG7gXUgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgMC4wNS4gIA0KLSDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgdGEga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcsIHThu6ljIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSB04bu3IGzhu4cgaOG7jWMgc2luaCBOQU0gdGhlbyBo4buNYyB0csaw4budbmcgbmdo4buBICB0csaw4budbmcgaOG7jWMgdGh14bqtdCBk4buxYSB0csOqbiBk4buvIGxp4buHdSBuw6B5LiAgDQoNCiMjIyMgKio0LjIuNiBU4bu3IHPhu5EgQ2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpOioqDQoNCmBgYHtyfQ0KbGlicmFyeShEZXNjVG9vbHMpDQpvcnR5cGVnZW5kZXIgPC0gT2Rkc1JhdGlvKHRhYmxlX3R5cGVnZW5kZXIsIG1ldGhvZD0id2FsZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KcHJpbnQob3J0eXBlZ2VuZGVyKQ0KYGBgDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBPZGRzIFJhdGlvIChPUikgY2hvIHRo4bqleToNCg0KLSBPUiA9IDEuMTE4MSwgDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JTogKDAuODY3MDsgMS40NDE5KS4NCg0KR2nDoSB0cuG7iyBPUiA9IDEuMTE4MSBjaG8gYmnhur90IG9kZHMgKHThu7cgbOG7hyBjaMOqbmgpIGPhu6dhIHZp4buHYyBsw6AgbmFtIOG7nyBuaMOzbSBo4buNYyBzaW5oIHRoZW8gaOG7jWMgdHLGsOG7nW5nIG5naOG7gSAoVm9jYXRpb25hbCkgY2FvIGjGoW4ga2hv4bqjbmcgMTEuOCUgc28gduG7m2kgbmjDs20gaOG7jWMgc2luaCB0aGVvIGjhu41jIHRyxrDhu51uZyBo4buNYyB0aHXhuq10IChBY2FkZW1pYykuIFR1eSBuaGnDqm4sIGtob+G6o25nIHRpbiBj4bqteSA5NSUgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMSwgxJFp4buBdSBuw6B5IGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3Qga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCk5oxrAgduG6rXksIGThu7FhIHRyw6puIGThu68gbGnhu4d1IHbDoCBr4bq/dCBxdeG6oyBPUiwga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGvhur90IGx14bqtbiBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSB04bu3IGzhu4cgaOG7jWMgc2luaCBuYW0gdsOgIG7hu68gZ2nhu69hIGhhaSBsb+G6oWkgdHLGsOG7nW5nIFZvY2F0aW9uYWwgdsOgIEFjYWRlbWljLg0KDQpL4bq/dCBsdeG6rW46IEdp4bubaSB0w61uaCBraMO0bmcg4bqjbmggaMaw4bufbmcgxJHDoW5nIGvhu4MgxJHhur9uIHZp4buHYyBs4buxYSBjaOG7jW4gbG/huqFpIHRyxrDhu51uZyBo4buNYyB0cm9uZyBt4bqrdSBuZ2hpw6puIGPhu6l1IG7DoHkuDQoNCiMjIyAqKjQuMyBzY2hvb2xhY2NyZWRpdGF0aW9uLXJlc2lkZW5jZSoqDQoNCiMjIyMgKio0LjMuMSBC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyoqDQoNCg0KDQpgYGB7cn0NCnRhYmxlX3NhcmUgPC0gdGFibGUoZGF0YSRzY2hvb2xfYWNjcmVkaXRhdGlvbixkYXRhJHJlc2lkZW5jZSkNCg0KbGlicmFyeShrYWJsZUV4dHJhKQ0Ka2FibGUodGFibGVfc2FyZSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyA0LjMgVOG6p24gc+G7kSB0aGVvIHRpw6p1IGNodeG6qW4gdHLGsOG7nW5nIGjhu41jIHbDoCBuxqFpIMSR4buLbmggY8awIGPhu6dhIGjhu41jIHNpbmgiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KQuG6o25nIHRyw6puIGNobyB0aOG6pXkgcGjDom4gYuG7kSBz4buRIGzGsOG7o25nIGjhu41jIHNpbmggdGhlbyB0acOqdSBjaHXhuqluIHRyxrDhu51uZyBo4buNYyAoQSB2w6AgQikg4bufIGhhaSBraHUgduG7sWMgbsahaSDEkeG7i25oIGPGsDogbsO0bmcgdGjDtG4gKFJ1cmFsKSB2w6AgdGjDoG5oIHRo4buLIChVcmJhbikuDQoNCi0g4bueIGtodSB24buxYyBuw7RuZyB0aMO0biwgc+G7kSBo4buNYyBzaW5oIGjhu41jIHThuqFpIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEIgKDMwNSBo4buNYyBzaW5oKSBuaGnhu4F1IGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgdHLGsOG7nW5nIHRpw6p1IGNodeG6qW4gQSAoMTU2IGjhu41jIHNpbmgpLiAgDQotIE5nxrDhu6NjIGzhuqFpLCDhu58ga2h1IHbhu7FjIHRow6BuaCB0aOG7iywgc+G7kSBo4buNYyBzaW5oIGjhu41jIHThuqFpIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEEgKDMyNSBo4buNYyBzaW5oKSB2xrDhu6N0IHRy4buZaSBzbyB24bubaSB0csaw4budbmcgdGnDqnUgY2h14bqpbiBCICgyMTQgaOG7jWMgc2luaCkuDQoNCk5o4bqtbiB4w6l0IHPGoSBi4buZIG7DoHkgZ+G7o2kgw70gcuG6sW5nIGjhu41jIHNpbmgg4bufIHRow6BuaCB0aOG7iyBjw7MgeHUgaMaw4bubbmcgdGhlbyBo4buNYyB0csaw4budbmcgdGnDqnUgY2h14bqpbiBBIG5oaeG7gXUgaMahbiwgdHJvbmcga2hpIGjhu41jIHNpbmgg4bufIG7DtG5nIHRow7RuIGzhuqFpIHThuq1wIHRydW5nIG5oaeG7gXUgaMahbiB2w6BvIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEIuDQoNCiMjIyMgKio0LjMuMiBUcuG7sWMgcXVhbiBob8OhKioNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZGZfc2FyZSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlX3NhcmUpDQpjb2xuYW1lcyhkZl9zYXJlKSA8LSBjKCJTY2hvb2xfQWNjcmVkaXRhdGlvbiIsICJSZXNpZGVuY2UiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IG5ow7NtDQpnZ3Bsb3QoZGZfc2FyZSwgYWVzKHggPSBSZXNpZGVuY2UsIHkgPSBDb3VudCwgZmlsbCA9IFNjaG9vbF9BY2NyZWRpdGF0aW9uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgdmp1c3QgPSAtMC4yNSkgKw0KICBsYWJzKA0KICAgIHggPSAiTsahaSDEkeG7i25oIGPGsCIsDQogICAgeSA9ICJT4buRIGzGsOG7o25nIGjhu41jIHNpbmgiLA0KICAgIGZpbGwgPSAiVGnDqnUgY2h14bqpbiB0csaw4budbmciLA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyA0LjM6IFThuqduIHPhu5EgaOG7jWMgc2luaCB0aGVvIHRpw6p1IGNodeG6qW4gdHLGsOG7nW5nIHbDoCBuxqFpIMSR4buLbmggY8awIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG6p24gc+G7kSBo4buNYyBzaW5oIHBow6JuIHRoZW8gdGnDqnUgY2h14bqpbiB0csaw4budbmcgaOG7jWMgKEEgdsOgIEIpIHbDoCBuxqFpIMSR4buLbmggY8awIChSdXJhbCAtIG7DtG5nIHRow7RuLCBVcmJhbiAtIHRow6BuaCB0aOG7iykuIEPDsyB0aOG7gyB0aOG6pXkgcsO1Og0KDQotIOG7niBraHUgduG7sWMgdGjDoG5oIHRo4buLIChVcmJhbiksIHPhu5EgaOG7jWMgc2luaCB0aGVvIGjhu41jIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEEgKDMyNSBo4buNYyBzaW5oKSBs4bubbiBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEIgKDIxNCBo4buNYyBzaW5oKS4NCg0KLSBOZ8aw4bujYyBs4bqhaSwg4bufIGtodSB24buxYyBuw7RuZyB0aMO0biAoUnVyYWwpLCB0csaw4budbmcgdGnDqnUgY2h14bqpbiBCIGPDsyBz4buRIGjhu41jIHNpbmggbmhp4buBdSBoxqFuICgzMDUgaOG7jWMgc2luaCksIHRyb25nIGtoaSB0csaw4budbmcgQSBjaOG7iSBjw7MgMTU2IGjhu41jIHNpbmguDQoNCi0gTcO0IGjDrG5oIHBow6JuIGLhu5EgbsOgeSBwaOG6o24gw6FuaCB4dSBoxrDhu5tuZyBs4buxYSBjaOG7jW4gdHLGsOG7nW5nIGjhu41jIGThu7FhIHRyw6puIG7GoWkgc2luaCBz4buRbmc6IGjhu41jIHNpbmggdGjDoG5oIHRo4buLIGPDsyB4dSBoxrDhu5tuZyBo4buNYyBjw6FjIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEEsIGPDsm4gaOG7jWMgc2luaCBuw7RuZyB0aMO0biBjw7MgdOG7tyBs4buHIGNhbyBoxqFuIGjhu41jIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEIuDQoNCi0gTmjhuq1uIHjDqXQgbsOgeSBwaMO5IGjhu6NwIHbhu5tpIGdp4bqjIHRodXnhur90IHBo4buVIGJp4bq/biBy4bqxbmcgY8OhYyB0csaw4budbmcgdGnDqnUgY2h14bqpbiBjYW8gaMahbiB0aMaw4budbmcgdOG6rXAgdHJ1bmcgdOG6oWkgY8OhYyB0aMOgbmggcGjhu5EgbOG7m24sIHRyb25nIGtoaSBjw6FjIGtodSB24buxYyBuw7RuZyB0aMO0biBjw7Mgbmhp4buBdSBo4buNYyBzaW5oIHRoZW8gaOG7jWMgY8OhYyB0csaw4budbmcgdGnDqnUgY2h14bqpbiB0aOG6pXAgaMahbi4NCg0KDQojIyMjICoqNC4zLjMgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6oqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXDsgIFx0ZXh0e07GoWkgxJHhu4tuaCBjxrAgdsOgIHRpw6p1IGNodeG6qW4gdHLGsOG7nW5nIHRoZW8gaOG7jWMgY+G7p2EgaOG7jWMgc2luaCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdSB9IFxcIA0KSF8xOiBcOyAgXHRleHR7TsahaSDEkeG7i25oIGPGsCB2w6AgdGnDqnUgY2h14bqpbiB0csaw4budbmcgdGhlbyBo4buNYyBj4bunYSBo4buNYyBzaW5oIGPDsyBsacOqbiBxdWFuIMSR4bq/biBuaGF1fQ0KXGVuZHthcnJheX0NClxyaWdodC4kJA0KVGEgdGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcgdsOgIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQpgYGB7cn0NCmNoaXNhcmUgPC0gY2hpc3EudGVzdCh0YWJsZV9zYXJlKQ0KcHJpbnQoY2hpc2FyZSkNCmBgYA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBDaGktc3F1YXJlZCBQZWFyc29uIHbhu5tpIMSRaeG7gXUgY2jhu4luaCBsacOqbiB04bulYyBZYXRlcyBjaG8gYuG6o25nIHBow6JuIGLhu5EgaOG7jWMgc2luaCB0aGVvIHRpw6p1IGNodeG6qW4gdHLGsOG7nW5nIHbDoCBuxqFpIMSR4buLbmggY8awIG5oxrAgc2F1Og0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogY2hpLXNxdWFyZWQgKFgtc3F1YXJlZCkgPSA2OC42MTggduG7m2kgMSBi4bqtYyB04buxIGRvIChkZiA9IDEpLg0KLSBHacOhIHRy4buLIHAtdmFsdWUgcuG6pXQgbmjhu48sIG5o4buPIGjGoW4gMi4yZS0xNiwgdOG7qWMgZ+G6p24gbmjGsCBi4bqxbmcgMC4NCg0KKipOaOG6rW4geMOpdDoqKiAgDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgdGjDtG5nIHRoxrDhu51uZyAwLjA1LCBnacOhIHRy4buLIHAtdmFsdWUgPCAwLjA1IGNobyB0aOG6pXkgY8OzIGLhurFuZyBjaOG7qW5nIHLhuqV0IG3huqFuaCDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIChIMCkgduG7gSBz4buxIMSR4buZYyBs4bqtcCBnaeG7r2EgbsahaSDEkeG7i25oIGPGsCB2w6AgdGnDqnUgY2h14bqpbiB0csaw4budbmcgaOG7jWMgY+G7p2EgaOG7jWMgc2luaC4gDQoNCk7Ds2kgY8OhY2gga2jDoWMsIGThu68gbGnhu4d1IGNobyB0aOG6pXkgY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgbsahaSDEkeG7i25oIGPGsCB2w6AgdGnDqnUgY2h14bqpbiB0csaw4budbmcgbcOgIGjhu41jIHNpbmggdGhlbyBo4buNYy4gxJBp4buBdSBuw6B5IMSR4buTbmcgbmdoxKlhIHbhu5tpIHZp4buHYyBo4buNYyBzaW5oIOG7nyBraHUgduG7sWMgdGjDoG5oIHRo4buLIHbDoCBuw7RuZyB0aMO0biBjw7MgeHUgaMaw4bubbmcgY2jhu41uIHRyxrDhu51uZyBo4buNYyBraMOhYyBuaGF1LCBwaMO5IGjhu6NwIHbhu5tpIG5o4bqtbiB4w6l0IHRyw6puIGJp4buDdSDEkeG7kyB04bqnbiBz4buRLg0KDQpL4bq/dCBsdeG6rW46ICANCk7GoWkgxJHhu4tuaCBjxrAg4bqjbmggaMaw4bufbmcgxJHDoW5nIGvhu4MgxJHhur9uIGzhu7FhIGNo4buNbiB0acOqdSBjaHXhuqluIHRyxrDhu51uZyBo4buNYyBj4bunYSBo4buNYyBzaW5oIHRyb25nIG3huqt1IGto4bqjbyBzw6F0Lg0KDQoNCiMjIyMgKio0LjMuNCBIaeG7h3UgaGFpIHThu7cgbOG7hyoqDQoNCioqVGhp4bq/dCBs4bqtcCB04bu3IGzhu4cqKg0KDQpU4bu3IGzhu4cgaOG7jWMgc2luaCDEkeG6v24gdOG7qyB0aMOgbmggdGjhu4sgaOG7jWMgdHLGsOG7nW5nIHRpw6p1IGNodeG6qW4gQToNCg0KJCQNCnBfMSA9IFAoXHRleHR7c2Nob29sX2FjY3JlZGl0YXRpb259ID0gQSBcbWlkIFx0ZXh0e3Jlc2lkZW5jZX0gPSBVcmJhbikNCiQkDQoNClThu7cgbOG7hyBo4buNYyBzaW5oIMSR4bq/biB04burIG7DtG5nIHRow7RuIGjhu41jIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEE6DQoNCiQkDQpwXzIgPSBQKFx0ZXh0e3NjaG9vbF9hY2NyZWRpdGF0aW9ufSA9IEEgXG1pZCBcdGV4dHtyZXNpZGVuY2V9ID0gVXJiYW4pDQokJA0KDQpIaeG7h3UgY2jDqm5oIGzhu4djaCBnaeG7r2EgaGFpIHThu7cgbOG7hzoNCg0KJCQNCmQgPSBwXzEgLSBwXzINCiQkDQoNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaCoqDQoNCi0gKipHaeG6oyB0aHV54bq/dCBI4oKAKio6IEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGhhaSB04bu3IGzhu4cgIA0KICAkJCBIXzA6IHBfMSAtIHBfMiA9IDAkJA0KDQotICoqR2nhuqMgdGh1eeG6v3QgSDEpKio6IFThu7cgbOG7hyBo4buNYyBzaW5oIMSR4bq/biB04burIHRow6BuaCB0aOG7iyBo4buNYyB0csaw4budbmcgdGnDqnUgY2h14bqpbiBBIGNhbyBoxqFuIFThu7cgbOG7hyBo4buNYyBzaW5oIMSR4bq/biB04burIG7DtG5nIHRow7RuIGjhu41jIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEE6ICRIXzE6IHBfMSAtIHBfMiA+IDAkDQogIA0KDQoNCmBgYHtyfQ0KbGlicmFyeShzdGF0cykNCg0KdGVzdHNhcmUgPC0gcHJvcC50ZXN0KA0KICB4ID0gYyh0YWJsZV9zYXJlWyJBIiwgIlVyYmFuIl0sIHRhYmxlX3NhcmVbIkEiLCAiUnVyYWwiXSksDQogIG4gPSBjKHN1bSh0YWJsZV9zYXJlWywgIlVyYmFuIl0pLCBzdW0odGFibGVfc2FyZVssICJSdXJhbCJdKSksDQogIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLA0KICBjb3JyZWN0ID0gRkFMU0UNCikNCnByaW50KHRlc3RzYXJlKQ0KDQpgYGANCg0KVOG7tyBs4buHIGjhu41jIHNpbmggaOG7jWMgdHLGsOG7nW5nIEEg4bufIFVyYmFuIGzDoCAqKjYwLjMlKiogKDMyNS81NDApLCBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSAqKjMzLjglKiogKDE1Ni80NjEpIOG7nyBSdXJhbC4NCi0gVGjhu5FuZyBrw6ogY2hpLXNxdWFyZWQgPSAqKjY5LjY3NCoqLCBi4bqtYyB04buxIGRvID0gMS4NCi0gR2nDoSB0cuG7iyAqKnAtdmFsdWUgPCAyLjJlLTE2KiosIGPhu7FjIGvhu7Mgbmjhu48sIGNobyB0aOG6pXkgYuG6sW5nIGNo4bupbmcgcuG6pXQgbeG6oW5oIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcuDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIGhp4buHdSBz4buRIHThu7cgbOG7hyBsw6AgKDAuMjE0NDsgMS4wMDAwKSwgaG/DoG4gdG/DoG4gbuG6sW0gcGjDrWEgZMawxqFuZywgeMOhYyBuaOG6rW4gc+G7sSBjaMOqbmggbOG7h2NoIGPDsyDDvSBuZ2jEqWEuDQoNCioqS+G6v3QgbHXhuq1uKio6IEThu68gbGnhu4d1IGNobyB0aOG6pXkgdOG7tyBs4buHIGjhu41jIHNpbmgg4bufIGtodSB24buxYyB0aMOgbmggdGjhu4sgaOG7jWMgdHLGsOG7nW5nIGxv4bqhaSBBICoqY2FvIGjGoW4gxJHDoW5nIGvhu4MqKiBzbyB24bubaSBo4buNYyBzaW5oIOG7nyBraHUgduG7sWMgbsO0bmcgdGjDtG4uIE3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIG7GoWkgxJHhu4tuaCBjxrAgdsOgIGxv4bqhaSB0csaw4budbmcgaOG7jWMgdGhlbyBo4buNYyBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KDQojIyMjICoqNC4zLjUgIFThu7cgc+G7kSBOZ3V5IGPGoSAoUmVsYXRpdmUgUmlzayAtIFJSKSoqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJzYXJlIDwtIHJpc2tyYXRpbyh0YWJsZV9zYXJlLCBtZXRob2QgPSAid2FsZCIpDQpwcmludChyc2FyZSkNCmBgYA0K4buxYSB0csOqbiBwaMOibiB0w61jaCBSaXNrIFJhdGlvIChSUikgZ2nhu69hIG7GoWkgY8awIHRyw7ogdsOgIGxv4bqhaSB0csaw4budbmcgaOG7jWMsIGvhur90IHF14bqjIGNobyB0aOG6pXk6DQoNCi0gKipSaXNrIFJhdGlvIGPhu6dhIG5ow7NtIHRyxrDhu51uZyBsb+G6oWkgQiBsw6AgMC42MTAqKiAoa2hv4bqjbmcgdGluIGPhuq15IDk1JTogKipbMC41NDE7IDAuNjg4XSoqKS4NCg0KLSDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgaOG7jWMgc2luaCDhu58ga2h1IHbhu7FjICoqVXJiYW4qKiBjw7Mgbmd1eSBjxqEgdGhlbyBo4buNYyB0csaw4budbmcgbG/huqFpIEIgKip0aOG6pXAgaMahbiAzOSUqKiBzbyB24bubaSBo4buNYyBzaW5oIOG7nyBraHUgduG7sWMgKipSdXJhbCoqLCBraGkgc28gduG7m2kgY2h14bqpbiBsw6AgdHLGsOG7nW5nIGxv4bqhaSBBIChSUiA9IDEpLg0KDQotIEtob+G6o25nIHRpbiBj4bqteSBraMO0bmcgY2jhu6lhIDEsIGNobyB0aOG6pXkgKipz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKi4NCi0gxJDhu5NuZyB0aOG7nWksIGdpw6EgdHLhu4sgcCB04burIGPDoWMga2nhu4NtIMSR4buLbmggKG1pZC1wIGV4YWN0LCBGaXNoZXIsIGNoaS1zcXVhcmUpIMSR4buBdSB44bqlcCB44buJICoqMCoqLCBj4bunbmcgY+G7kSB0aMOqbSBi4bqxbmcgY2jhu6luZyBy4bqxbmcgKipuxqFpIGPGsCB0csO6IGPDsyBsacOqbiBxdWFuIGNo4bq3dCBjaOG6vSDEkeG6v24gbG/huqFpIHRyxrDhu51uZyBo4buNYyBtw6AgaOG7jWMgc2luaCB0aGVvIGjhu41jKiouDQoNCioqS+G6v3QgbHXhuq1uKio6IEjhu41jIHNpbmgg4bufIGtodSB24buxYyB0aMOgbmggdGjhu4sgY8OzIGto4bqjIG7Eg25nIHRoZW8gaOG7jWMgdHLGsOG7nW5nIGxv4bqhaSBBIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGjhu41jIHNpbmggbsO0bmcgdGjDtG4uIFJpc2sgUmF0aW8gZ2nDunAgxJHhu4tuaCBsxrDhu6NuZyByw7UgbeG7qWMgY2jDqm5oIGzhu4djaCBy4bunaSBybyBuw6B5IHbDoCBjaG8gdGjhuqV5IMSRw6J5IGzDoCBt4buZdCBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSByw7UgcuG7h3QgduG7gSBt4bq3dCB0aOG7kW5nIGvDqi4NCg0KDQojIyMjICoqNC4zLjYgVOG7tyBz4buRIENow6puaCAoT2RkcyBSYXRpbyAtIE9SKToqKg0KDQpgYGB7cn0NCmxpYnJhcnkoRGVzY1Rvb2xzKQ0Kb3JzYXJlIDwtIE9kZHNSYXRpbyh0YWJsZV9zYXJlLCBtZXRob2Q9IndhbGQiLCBjb25mLmxldmVsID0gMC45NSkNCnByaW50KG9yc2FyZSkNCmBgYA0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBPZGRzIFJhdGlvIGNobyB0aOG6pXk6DQoNCi0gKipPZGRzIFJhdGlvID0gMC4zMzcqKiB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGzDoCAqKlswLjI2MDsgMC40MzZdKiouDQoNCi0gxJBp4buBdSBuw6B5IG5naMSpYSBsw6AgKip4w6FjIHN14bqldCoqIGjhu41jIHNpbmggKipuw7RuZyB0aMO0biAocnVyYWwpKiogdGhlbyBo4buNYyB0csaw4budbmcgbG/huqFpICoqQSoqIHNvIHbhu5tpIGxv4bqhaSAqKkIqKiBjaOG7iSBi4bqxbmcga2hv4bqjbmcgKiozMy43JSoqIHNvIHbhu5tpIGjhu41jIHNpbmggKip0aMOgbmggdGjhu4sgKHVyYmFuKSoqLg0KDQotIFbDrCBraG/huqNuZyB0aW4gY+G6rXkga2jDtG5nIGNo4bupYSAxLCBuw6puICoqc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQoNCioqS+G6v3QgbHXhuq1uKio6IEPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIGxv4bqhaSB0csaw4budbmcgaOG7jWMgZ2nhu69hIGjhu41jIHNpbmggbsO0bmcgdGjDtG4gdsOgIHRow6BuaCB0aOG7iy4gSOG7jWMgc2luaCDhu58gdGjDoG5oIHRo4buLIGPDsyB4dSBoxrDhu5tuZyB0aGVvIGjhu41jIHRyxrDhu51uZyBsb+G6oWkgQSBuaGnhu4F1IGjGoW4gcsO1IHLhu4d0IHNvIHbhu5tpIGjhu41jIHNpbmgg4bufIG7DtG5nIHRow7RuLiDEkGnhu4F1IG7DoHkgZ+G7o2kgw70gcuG6sW5nICoqbsahaSBjxrAgdHLDuiBjw7MgdGjhu4MgbMOgIG3hu5l0IHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGto4bqjIG7Eg25nIHRp4bq/cCBj4bqtbiBob+G6t2MgbOG7sWEgY2jhu41uIGxv4bqhaSB0csaw4budbmcgaOG7jWMqKi4NCg0KIyMjICoqNC40IHJlc2lkZW5jZSAtIHdpbGxfZ29fdG9fY29sbGVnZSoqDQoNCiMjIyMgKio0LjQuMSBC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyoqDQoNCmBgYHtyfQ0KdGFibGVfcmV3IDwtIHRhYmxlKGRhdGEkcGFyZW50X3dhc19pbl9jb2xsZWdlLCBkYXRhJHNjaG9vbF9hY2NyZWRpdGF0aW9uKQ0KDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQprYWJsZSh0YWJsZV9yZXcsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9ICJC4bqjbmcgNC40IFThuqduIHPhu5EgaOG7jSBzaW5oIHRoZW8gaOG7jWMgdOG6oWkgdHLGsOG7nW5nIHjDqXQgdGhlbyB0acOqdSBjaHXhuqluIHbDoCBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCBmdWxsX3dpZHRoID0gRikNCmBgYA0KDQpC4bqjbmcgNC40IHRo4buDIGhp4buHbiB04bqnbiBz4buRIGjhu41jIHNpbmggdGhlbyBo4buNYyB04bqhaSB0csaw4budbmcgbG/huqFpIEEgaG/hurdjIEIsIHBow6JuIHRoZW8gdmnhu4djIG5nxrDhu51pIGdpw6FtIGjhu5kgY8OzIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBoYXkgY2jGsGEuIEPhu6UgdGjhu4MsIHRyb25nIHPhu5EgNDgwIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgY2jGsGEgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nLCBwaOG6p24gbOG7m24gKDM2MiBlbSkgdGhlbyBo4buNYyB04bqhaSB0csaw4budbmcgbG/huqFpIEEsIGNo4buJIGPDsyAxMTggZW0gY2jhu41uIHRyxrDhu51uZyBsb+G6oWkgQi4gTmfGsOG7o2MgbOG6oWksIHRyb25nIG5ow7NtIDUyMCBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZywgY8OzIHThu5tpIDQwMSBlbSB0aGVvIGjhu41jIHRyxrDhu51uZyBsb+G6oWkgQiwgdHJvbmcga2hpIGNo4buJIDExOSBlbSBjaOG7jW4gdHLGsOG7nW5nIGxv4bqhaSBBLg0KDQrEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB4dSBoxrDhu5tuZyBraMOhIHLDtSByw6BuZzogaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgdGjGsOG7nW5nIGNo4buNbiB0csaw4budbmcgbG/huqFpIEIgbmhp4buBdSBoxqFuLCB0cm9uZyBraGkgaOG7jWMgc2luaCBraMO0bmcgY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgaOG7jWMgY2FvIMSR4bqzbmcgdGjDrCBjaOG7pyB54bq/dSBjaOG7jW4gdHLGsOG7nW5nIGxv4bqhaSBBLiBT4buxIGtow6FjIGJp4buHdCBuw6B5IGfhu6NpIMO9IHLhurFuZyB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2EgbmfGsOG7nWkgZ2nDoW0gaOG7mSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGzhu7FhIGNo4buNbiB0csaw4budbmcgaOG7jWMgY+G7p2EgaOG7jWMgc2luaCwgY8OzIHRo4buDIHRow7RuZyBxdWEgbmjhuq1uIHRo4bupYywga+G7syB24buNbmcgaG/hurdjIGto4bqjIG7Eg25nIMSR4buLbmggaMaw4bubbmcgaOG7jWMgdOG6rXAuDQoNCiMjIyMgKio0LjQuMiBUcuG7sWMgcXVhbiBob8OhKioNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZGZfcmV3IDwtIGFzLmRhdGEuZnJhbWUodGFibGVfcmV3KQ0KY29sbmFtZXMoZGZfcmV3KSA8LSBjKCJQYXJlbnRDb2xsZWdlIiwgIlNjaG9vbF9BY2NyZWRpdGF0aW9uIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kw0KZ2dwbG90KGRmX3JldywgYWVzKHggPSBQYXJlbnRDb2xsZWdlLCB5ID0gQ291bnQsIGZpbGwgPSBTY2hvb2xfQWNjcmVkaXRhdGlvbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHZqdXN0ID0gLTAuMjUpICsNCiAgbGFicygNCiAgICB4ID0gIk5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIiwNCiAgICB5ID0gIlPhu5EgbMaw4bujbmcgaOG7jWMgc2luaCIsDQogICAgZmlsbCA9ICJUacOqdSBjaHXhuqluIHRyxrDhu51uZyIsDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIDQuNDogVOG6p24gc+G7kSBo4buNYyBzaW5oIHRoZW8gdGnDqnUgY2h14bqpbiB0csaw4budbmcgdsOgIG5nxrDhu51pIGdpw6FtIGjhu5kgaOG7jWMgY2FvIMSR4bqzbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpCaeG7g3UgxJHhu5MgNC40IGNobyB0aOG6pXkgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgKFRSVUUpIGNo4bunIHnhur91IGjhu41jIHThuqFpIHRyxrDhu51uZyBsb+G6oWkgQiAoNDAxIGVtKSwgdHJvbmcga2hpIG5ow7NtIGtow7RuZyBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSBo4buNYyBjYW8gxJHhurNuZyAoRkFMU0UpIGzhuqFpIHThuq1wIHRydW5nIG5oaeG7gXUgaMahbiDhu58gdHLGsOG7nW5nIGxv4bqhaSBBICgzNjIgZW0pLiDEkGnhu4F1IG7DoHkgZ+G7o2kgw70gcuG6sW5nIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBj4bunYSBuZ8aw4budaSBnacOhbSBo4buZIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24gbOG7sWEgY2jhu41uIHRpw6p1IGNodeG6qW4gdHLGsOG7nW5nIGPhu6dhIGjhu41jIHNpbmguIEPhu6UgdGjhu4MsIGjhu41jIHNpbmggduG7m2kgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgY8OzIHh1IGjGsOG7m25nIGNo4buNbiB0csaw4budbmcgY8OzIHRpw6p1IGNodeG6qW4gY2FvIGjGoW4gKEIpLCB0cm9uZyBraGkgbmjDs20gY8OybiBs4bqhaSDGsHUgdGnDqm4gdHLGsOG7nW5nIGxv4bqhaSBBLiANCg0KDQojIyMjICoqNC4zLjMgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6oqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXHRleHR7VGnDqnUgY2h14bqpbiB0csaw4budbmcgdsOgIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIGzDoCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdX0gXFxbNnB0XQ0KSF8xOiBcdGV4dHtUacOqdSBjaHXhuqluIHRyxrDhu51uZyB2w6AgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgY8OzIGxpw6puIHF1YW4gduG7m2kgbmhhdX0NClxlbmR7YXJyYXl9DQpccmlnaHQuJCQNClRhIHRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIHbDoCDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KYGBge3J9DQpjaGlyZXcgPC0gY2hpc3EudGVzdCh0YWJsZV9yZXcpDQpwcmludChjaGlyZXcpDQpgYGANCg0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcgduG7m2kgaGnhu4d1IGNo4buJbmggWWF0ZXMgY2hvIHRo4bqleToNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIFwoXGNoaV4yID0gMjczLjgyXCkgduG7m2kgYuG6rWMgdOG7sSBkbyBcKGRmID0gMVwpLA0KDQotIEdpw6EgdHLhu4sgcC12YWx1ZSBy4bqldCBuaOG7jywgbmjhu48gaMahbiAyLjJlLTE2IChwLXZhbHVlIDwgMC4wMDAxKSwNCg0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBy4bqldCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBwaMOibiBwaOG7kWkgdGnDqnUgY2h14bqpbiB0csaw4budbmcgdGhlbyBo4buNYyBj4bunYSBo4buNYyBzaW5oIHbhu5tpIHZp4buHYyBuZ8aw4budaSBnacOhbSBo4buZIGPDsyB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgaGF5IGtow7RuZy4NCg0KTmjGsCB24bqteSwgdGEgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCDEkeG7mWMgbOG6rXAgYmFuIMSR4bqndSwga2jhurNuZyDEkeG7i25oIHLhurFuZyAqKnRpw6p1IGNodeG6qW4gdHLGsOG7nW5nIHbDoCB2aeG7h2MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgY8OzIG3hu5FpIHF1YW4gaOG7hyBwaOG7pSB0aHXhu5ljIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKiB0cm9uZyBt4bqrdSBk4buvIGxp4buHdSBuw6B5Lg0KDQojIyMjICoqNC40LjQgSGnhu4d1IGhhaSB04bu3IGzhu4cqKg0KDQoqKlRoaeG6v3QgbOG6rXAgdOG7tyBs4buHKioNCg0KVOG7tyBs4buHIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgKipraMO0bmcgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nKiogaOG7jWMgdHLGsOG7nW5nIHRpw6p1IGNodeG6qW4gQToNCg0KJCQNCnBfMSA9IFAoXHRleHR7c2Nob29sX2FjY3JlZGl0YXRpb259ID0gQSBcbWlkIFx0ZXh0e3BhcmVudF93YXNfaW5fY29sbGVnZX0gPSBcdGV4dHtGQUxTRX0pDQokJA0KDQpU4bu3IGzhu4cgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSAqKnThu6tuZyBo4buNYyBjYW8gxJHhurNuZyoqIGjhu41jIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEE6DQoNCiQkDQpwXzIgPSBQKFx0ZXh0e3NjaG9vbF9hY2NyZWRpdGF0aW9ufSA9IEEgXG1pZCBcdGV4dHtwYXJlbnRfd2FzX2luX2NvbGxlZ2V9ID0gXHRleHR7VFJVRX0pDQokJA0KDQpIaeG7h3UgY2jDqm5oIGzhu4djaCBnaeG7r2EgaGFpIHThu7cgbOG7hzoNCg0KJCQNCmQgPSBwXzEgLSBwXzINCiQkDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotICoqR2nhuqMgdGh1eeG6v3QgXChIXzBcKSoqOiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgdOG7tyBs4buHICANCiAgJCQNCiAgSF8wOiBwXzEgLSBwXzIgPSAwDQogICQkDQoNCi0gKipHaeG6oyB0aHV54bq/dCBcKEhfMVwpKio6IFThu7cgbOG7hyBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIGtow7RuZyB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgaOG7jWMgdHLGsOG7nW5nIEEgY2FvIGjGoW4gc28gduG7m2kgaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcsIHThu6ljOg0KDQogICQkDQogIEhfMTogcF8xIC0gcF8yID4gMA0KICAkJA0KYGBge3J9DQpsaWJyYXJ5KHN0YXRzKQ0KDQp0ZXN0c19yZXcgPC0gcHJvcC50ZXN0KA0KICB4ID0gYyh0YWJsZV9yZXdbIkZBTFNFIiwgIkEiXSwgdGFibGVfcmV3WyJUUlVFIiwgIkEiXSksDQogIG4gPSBjKHN1bSh0YWJsZV9yZXdbIkZBTFNFIiwgXSksIHN1bSh0YWJsZV9yZXdbIlRSVUUiLCBdKSksDQogIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCAgIyBHaeG6oyB0aHV54bq/dCB04bu3IGzhu4cgRkFMU0UgaOG7jWMgQSBjYW8gaMahbiBUUlVFDQogIGNvcnJlY3QgPSBGQUxTRQ0KKQ0KcHJpbnQodGVzdHNfcmV3KQ0KDQpgYGANCi0gVOG7tyBs4buHIGjhu41jIHNpbmggdGhlbyBo4buNYyB0csaw4budbmcgdGnDqnUgY2h14bqpbiBBIOG7nyBuaMOzbSBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIGtow7RuZyB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgKEZBTFNFKSBsw6AgNzUuNCUsIHRyb25nIGtoaSB04bu3IGzhu4cgbsOgeSDhu58gbmjDs20gaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgKFRSVUUpIGNo4buJIGzDoCAyMi45JS4gU+G7sSBraMOhYyBiaeG7h3QgbsOgeSBy4bqldCBs4bubbiB24buBIG3hurd0IHThu7cgbOG7hyBwaOG6p24gdHLEg20uDQoNCi0gS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggaGFpIHThu7cgbOG7hyBjaG8gdGjhuqV5IGdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogY2hpLXNxdWFyZSBsw6AgMjc1LjkyIHbhu5tpIDEgYuG6rWMgdOG7sSBkbywgcC12YWx1ZSBuaOG7jyBoxqFuIDIuMmUtMTYsIHThu6ljIGzDoCBy4bqldCBuaOG7jywgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyBuw6B5IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IG3huqFuaC4NCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBoaeG7h3UgZ2nhu69hIGhhaSB04bu3IGzhu4cgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAwLjQ4MSDEkeG6v24gMS4wMDAsIGhvw6BuIHRvw6BuIG7hurFtIHRyw6puIDAsIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcgdOG7tyBs4buHIGjhu41jIHNpbmggaOG7jWMgdHLGsOG7nW5nIHRpw6p1IGNodeG6qW4gQSDhu58gbmjDs20ga2jDtG5nIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBjYW8gaMahbiBuaMOzbSBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcuDQoNCi0gTmjGsCB24bqteSwgZOG7ryBsaeG7h3UgY2hvIHRo4bqleSBjw7Mgc+G7sSBsacOqbiBxdWFuIHLDtSBy4buHdCBnaeG7r2Egdmnhu4djIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIHbDoCB04bu3IGzhu4cgaOG7jWMgc2luaCBo4buNYyB0csaw4budbmcgdGnDqnUgY2h14bqpbiBBOiBuaMOzbSBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIGtow7RuZyB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgY8OzIHThu7cgbOG7hyBo4buNYyB0csaw4budbmcgQSBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaMOzbSBjw7JuIGzhuqFpLg0KDQotIEvhur90IGx14bqtbjogQ2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKAIHbhu4Egc+G7sSDEkeG7mWMgbOG6rXAgdsOgIGNo4bqlcCBuaOG6rW4gSOKCgSwgcuG6sW5na2jhuqMgbsSDbmcgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgdsOgIHRpw6p1IGNodeG6qW4gdHLGsOG7nW5nIGjhu41jIGPDsyBsacOqbiBxdWFuIMSR4bq/biBuaGF1IHRyb25nIG3huqt1IG7DoHkuDQoNCg0KIyMjIyAqKjQuNC41ICBU4bu3IHPhu5EgTmd1eSBjxqEgKFJlbGF0aXZlIFJpc2sgLSBSUikqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpycmV3IDwtIHJpc2tyYXRpbyh0YWJsZV9yZXcsIG1ldGhvZCA9ICJ3YWxkIikNCnByaW50KHJyZXcpDQpgYGANCi0gVOG7tyBz4buRIHLhu6dpIHJvIChSaXNrIFJhdGlvKSBj4bunYSBuaMOzbSBo4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyAoVFJVRSkgc28gduG7m2kgbmjDs20ga2jDtG5nIHThu6tuZyBo4buNYyAoRkFMU0UpIGzDoCBraG/huqNuZyAgMy4xMzY4OTcsIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAyLjY2MzY1MiDEkeG6v24gMy42OTQyMjIuDQoNCi0gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIG5ow7NtIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIGPDsyBraOG6oyBuxINuZyBo4buNYyB0csaw4budbmcgdGnDqnUgY2h14bqpbiBCIGNhbyBn4bqlcCBoxqFuIGtob+G6o25nIDMgbOG6p24gc28gduG7m2kgbmjDs20ga2jDtG5nIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZy4NCg0KLSBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB24bubaSBwLXZhbHVlIHLhuqV0IG5o4buPIChn4bqnbiBi4bqxbmcgMCkgdOG7qyBjw6FjIHBoxrDGoW5nIHBow6FwIG1pZC1wIGV4YWN0LCBGaXNoZXIgZXhhY3QgdsOgIENoaS1zcXVhcmUgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBuw6B5IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IG3huqFuaC4NCg0KLSBOaMawIHbhuq15LCBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyB04buTbiB04bqhaSBt4buRaSBsacOqbiBo4buHIHLDtSByw6BuZyB2w6AgbeG6oW5oIG3hur0gZ2nhu69hIHZp4buHYyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyB2w6Aga2jhuqMgbsSDbmcgaOG7jWMgc2luaCB0aGVvIGjhu41jIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIEIuDQoNCi0gS+G6v3QgbHXhuq1uOiBE4buvIGxp4buHdSBjdW5nIGPhuqVwIGLhurFuZyBjaOG7qW5nIG3huqFuaCBt4bq9IMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCDEkeG7mWMgbOG6rXAgZ2nhu69hIHRyw6xuaCDEkeG7mSBuZ8aw4budaSBnacOhbSBo4buZIHbDoCB0acOqdSBjaHXhuqluIHRyxrDhu51uZyBo4buNYywgxJHhu5NuZyB0aOG7nWkgeMOhYyBuaOG6rW4gbeG7kWkgbGnDqm4gaOG7hyB0w61jaCBj4buxYyBnaeG7r2EgaGFpIHnhur91IHThu5EgbsOgeS4NCg0KIyMjIyAqKjQuNC42IFThu7cgc+G7kSBDaMOqbmggKE9kZHMgUmF0aW8gLSBPUik6KioNCg0KYGBge3J9DQpsaWJyYXJ5KERlc2NUb29scykNCm9ycmV3IDwtIE9kZHNSYXRpbyh0YWJsZV9yZXcsIG1ldGhvZD0id2FsZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KcHJpbnQob3JyZXcpDQpgYGANCg0KLSBU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvKSBnaeG7r2EgbmjDs20gaOG7jWMgc2luaCBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgdsOgIG5ow7NtIGtow7RuZyBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgbMOgIGtob+G6o25nIDEwLjMzNzcwMSAgduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JSB04burIDcuNzIzMDAxIMSR4bq/biAxMy44Mzc2MzUgLg0KDQotIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG5ow7NtIGjhu41jIHNpbmggY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgdOG7q25nIGjhu41jIGNhbyDEkeG6s25nIGPDsyBraOG6oyBuxINuZyBo4buNYyB0csaw4budbmcgdGnDqnUgY2h14bqpbiBCIGNhbyBn4bqlcCBoxqFuIGtob+G6o25nIDEwIGzhuqduIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBjw7MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcuDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IGjhurlwIHbDoCBu4bqxbSBob8OgbiB0b8OgbiB0csOqbiAxIGNo4bupbmcgdOG7jyBr4bq/dCBxdeG6oyBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogcuG6pXQgbeG6oW5oIHbDoCBjaOG6r2MgY2jhuq9uLg0KDQotIEvhur90IHF14bqjIG7DoHkgY+G7p25nIGPhu5EgdGjDqm0gbmjhuq1uIMSR4buLbmggcuG6sW5nIHRyw6xuaCDEkeG7mSBuZ8aw4budaSBnacOhbSBo4buZIGPDsyDhuqNuaCBoxrDhu59uZyBy4bqldCBs4bubbiDEkeG6v24gcXV54bq/dCDEkeG7i25oIGjhu41jIHRyxrDhu51uZyB0acOqdSBjaHXhuqluIGPhu6dhIGjhu41jIHNpbmguDQoNCi0gVOG7lW5nIGvhur90OiBDw7MgbeG7kWkgbGnDqm4gaOG7hyB0w61jaCBj4buxYywgcuG6pXQgbeG6oW5oIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB2aeG7h2MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcgdsOgIHZp4buHYyBo4buNYyBzaW5oIHRoZW8gaOG7jWMgdHLGsOG7nW5nIHRpw6p1IGNodeG6qW4gQi4NCg0KIyMgKipQSOG6pk4gNTogVOG7lE5HIEvhur5UKioNCg0KIyMjICoqNS4xIFTDk00gVOG6rlQqKg0KDQp8ICoqTeG7kWkgcXVhbiBo4buHKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqS2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZWQqKiAgICAgICAgfCAqKnAtdmFsdWUqKiB8ICoqUmlzayBSYXRpbyAoOTUlIENJKSoqIHwgKipPZGRzIFJhdGlvICg5NSUgQ0kpKiogfCAqKk5o4bqtbiB4w6l0IGNow61uaCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgKio0LjEgd2lsbFxfZ29cX3RvXF9jb2xsZWdlIC0gcGFyZW50XF93YXNcX2luXF9jb2xsZWdlKiogfCBYwrIgPSAyLjExOTQsIGRmID0gMSwgcCA9IDAuMTQ1NCAgfCAwLjE0NTQgICAgICB8IDEuMTAgKDAuOTcg4oCTIDEuMjQpICAgICAgfCAxLjIxICgwLjk1IOKAkyAxLjU1KSAgICAgIHwgS2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyDEkeG7pyBt4bqhbmggxJHhu4Mga+G6v3QgbHXhuq1uIHPhu7EgbGnDqm4gcXVhbiBnaeG7r2EgcXV54bq/dCDEkeG7i25oIGjhu41jIGNhbyDEkeG6s25nIHbDoCB2aeG7h2MgbmfGsOG7nWkgZ2nDoW0gaOG7mSB04burbmcgaOG7jWMgY2FvIMSR4bqzbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKjQuMiB0eXBlc2Nob29sIC0gZ2VuZGVyKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFjCsiA9IDAuNjMyODMsIGRmID0gMSwgcCA9IDAuNDI2MyB8IDAuNDI2MyAgICAgIHwgMS4wNiAoMC45MyDigJMgMS4xOSkgICAgICB8IDEuMTIgKDAuODcg4oCTIDEuNDQpICAgICAgfCBLaMO0bmcgY8OzIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIHThu7cgbOG7hyBjaOG7jW4gbG/huqFpIHRyxrDhu51uZyBnaeG7r2EgaOG7jWMgc2luaCBuYW0gdsOgIG7hu68uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKjQuMyBzY2hvb2xhY2NyZWRpdGF0aW9uIC0gcmVzaWRlbmNlKiogICAgICAgICAgICAgICAgICB8IFjCsiA9IDY4LjYxOCwgZGYgPSAxLCBwIDwgMi4yZS0xNiB8IDwgMi4yZS0xNiAgIHwgMC42MSAoMC41NCDigJMgMC42OSkgICAgICB8IDAuMzQgKDAuMjYg4oCTIDAuNDQpICAgICAgfCBDw7Mgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IHbhu4EgdGnDqnUgY2h14bqpbiB0csaw4budbmcgdGhlbyBuxqFpIMSR4buLbmggY8awOyBo4buNYyBzaW5oIOG7nyB0aMOgbmggdGjhu4sgY8OzIHThu7cgbOG7hyBo4buNYyB0csaw4budbmcgdGnDqnUgY2h14bqpbiBBIGNhbyBoxqFuIHNvIHbhu5tpIG7DtG5nIHRow7RuLiAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKjQuNCByZXNpZGVuY2UgLSB3aWxsXF9nb1xfdG9cX2NvbGxlZ2UqKiAgICAgICAgICAgICAgICB8IFjCsiA9IDI3My44MiwgZGYgPSAxLCBwIDwgMi4yZS0xNiB8IDwgMi4yZS0xNiAgIHwgMy4xNCAoMi42NiDigJMgMy42OSkgICAgICB8IDEwLjM0ICg3LjcyIOKAkyAxMy44NCkgICAgfCBI4buNYyBzaW5oIGPDsyBuZ8aw4budaSBnacOhbSBo4buZIHThu6tuZyBo4buNYyBjYW8gxJHhurNuZyBjw7Mga2jhuqMgbsSDbmcgaOG7jWMgdHLGsOG7nW5nIHRpw6p1IGNodeG6qW4gQiBjYW8gZ+G6pXAgaMahbiAxMCBs4bqnbiBzbyB24bubaSBuaMOzbSBraMO0bmcgY8OzIG5nxrDhu51pIGdpw6FtIGjhu5kgaOG7jWMgY2FvIMSR4bqzbmcgKMO9IG5naMSpYSBy4bqldCBt4bqhbmgpLiB8DQoNCiMjIyAqKjUuMiBI4bqgTiBDSOG6vioqDQoNCi0gS8OtY2ggdGjGsOG7m2MgbeG6q3UgdsOgIHTDrW5oIMSR4bqhaSBkaeG7h246IDEwMDAgaOG7jWMgc2luaCBjw7MgdGjhu4MgY2jGsGEgxJHhu6cgbOG7m24gdsOgIGNoxrBhIMSR4bqhaSBkaeG7h24gdG/DoG4gZGnhu4duLCDEkeG6t2MgYmnhu4d0IG7hur91IG3huqt1IGtow7RuZyBuZ+G6q3Ugbmhpw6puLCBk4bqrbiDEkeG6v24gc2FpIHPhu5EgaOG7hyB0aOG7kW5nLg0KDQotIFRow7RuZyB0aW4gaOG6oW4gY2jhur86IFRoaeG6v3UgY8OhYyBiaeG6v24gcXVhbiB0cuG7jW5nIG5oxrAgdGh1IG5o4bqtcCBnaWEgxJHDrG5oLCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY2hhIG3hurkgY2hpIHRp4bq/dCwgY2jhuqV0IGzGsOG7o25nIGdpw6FvIGThu6VjLCB2w6AgeeG6v3UgdOG7kSB4w6MgaOG7mWkgLSB0w6JtIGzDvSDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIHdpbGxfZ29fdG9fY29sbGVnZS4NCg0KLSBHaeG7m2kgaOG6oW4gYmnhur9uIHBow6JuIGxv4bqhaTogQ8OhYyBiaeG6v24gbmjGsCBzY2hvb2xfYWNjcmVkaXRhdGlvbiwgcmVzaWRlbmNlLCBwYXJlbnRfd2FzX2luX2NvbGxlZ2UgcGjDom4gbG/huqFpIMSRxqFuIGdp4bqjbiwgY2jGsGEgcGjhuqNuIMOhbmggbeG7qWMgxJHhu5kgaGF5IGNo4bqldCBsxrDhu6NuZyB0aOG7sWMgdOG6vy4NCg0KLSBQaMOibiB0w61jaCBi4bqjbmcgMngyIHbDoCBraeG7g20gxJHhu4tuaCBDaGktc3F1YXJlOiBWaeG7h2Mgc+G7rSBk4bulbmcgYuG6o25nIDJ4MiB2w6Aga2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZSBjaOG7iSBjaG8gdGjhuqV5IG3hu5FpIGxpw6puIGjhu4cgc29uZyBwaMawxqFuZyBnaeG7r2EgYmnhur9uIHBow6JuIGxv4bqhaSB2w6Agd2lsbF9nb190b19jb2xsZWdlLCBjaMawYSBraeG7g20gc2/DoXQgxJHGsOG7o2MgY8OhYyB54bq/dSB04buRIMSR4buTbmcgYmnhur9uIGtow6FjLg0KDQotIFBow6JuIHTDrWNoIMSRYSBiaeG6v24gY+G6p24gdGhp4bq/dDogQ+G6p24gw6FwIGThu6VuZyBo4buTaSBxdXkgbG9naXN0aWMgxJFhIGJp4bq/biDEkeG7gyDEkeG7k25nIHRo4budaSB4ZW0geMOpdCBuaGnhu4F1IHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIHF1eeG6v3QgxJHhu4tuaCB3aWxsX2dvX3RvX2NvbGxlZ2UuDQoNCi0gSOG6oW4gY2jhur8gduG7gSB0aOG7nWkgZ2lhbiB2w6AgZOG7ryBsaeG7h3U6IEThu68gbGnhu4d1IGtow7RuZyB0aGVvIGTDtWkgZMOgaSBo4bqhbiwgY8OzIHRo4buDIHRoaeG6v3Ugc8OzdCBob+G6t2Mga2jDtG5nIGNow61uaCB4w6FjLCDhuqNuaCBoxrDhu59uZyDEkeG6v24gxJHhu5kgdGluIGPhuq15IGvhur90IHF14bqjLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KIyAqKlcyKioNCg0KIyMgKipQSOG6pk4gMTogVMOMTSBISeG7glUgVsOAIENIVeG6qE4gQuG7iiBE4buuIExJ4buGVSoqDQoNCiMjIyAqKjEuMSDEkOG7jWMgZOG7ryBsaeG7h3UqKg0KDQpgYGB7cn0NCmQ8LXJlYWQuY3N2KCJDOi9Vc2Vycy9ERUxML0Rvd25sb2Fkcy9TdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMuY3N2IiwgaGVhZGVyPSBUKQ0Kc3RyKGQpDQpgYGANCg0KIyMjICoqMS4yIEzDoG0gcXVlbiBk4buvIGxp4buHdSoqDQoNCmBgYHtyfQ0Kc3RyKGQpDQpgYGANCg0KLSAgIFbhu5tpIGjGoW4gMTQsMDAwIHF1YW4gc8OhdCwgZOG7ryBsaeG7h3UgxJHhu6cgbOG7m24gxJHhu4MgdGjhu7FjIGhp4buHbiBjw6FjIHBow6JuIHTDrWNoIHRo4buRbmcga8OqLCBtw7QgaMOsbmggZOG7sSDEkW/DoW4gaG/hurdjIHBow6JuIGtow7pjIGtow6FjaCBow6BuZy4NCg0KLSAgIEThu68gbGnhu4d1IGtow6FjaCBow6BuZyBwaG9uZyBwaMO6OiBDw6FjIGJp4bq/biBuaMawIEdlbmRlciwgTWFyaXRhbFN0YXR1cywgSG9tZW93bmVyLCBDaGlsZHJlbiwgQW5udWFsSW5jb21lLi4uIGN1bmcgY+G6pXAgdGjDtG5nIHRpbiBuaMOibiBraOG6qXUgaOG7jWMgaOG7r3Ugw61jaCBjaG8gdmnhu4djIHBow6JuIHTDrWNoIGjDoG5oIHZpIHRpw6p1IGTDuW5nLg0KDQotICAgQ8OzIMSR4bunIGPDoWMgYmnhur9uIHF1YW4gdHLhu41uZyBuaMawIFB1cmNoYXNlRGF0ZSwgVW5pdHNTb2xkLCBSZXZlbnVlLCB2w6AgY2hpIHRp4bq/dCBz4bqjbiBwaOG6qW0gKFByb2R1Y3RGYW1pbHksIEFubnVhbEluY29tZS4uLiksIHRodeG6rW4gdGnhu4duIMSR4buDIHBow6JuIHTDrWNoIGRvYW5oIHRodSB0aGVvIHRo4budaSBnaWFuLCBsb+G6oWkgc+G6o24gcGjhuqltLC4uLg0KDQoqKipIaeG7g24gdGjhu4sgMTAgZMOybmcgxJHhuqd1IGLhu5kgZOG7ryBsaeG7h3UqKioNCg0KYGBge3J9DQpoZWFkKGQsMTApDQpgYGANCg0KKioqSGnhu4NuIHRo4buLIDEwIGTDsm5nIGN14buRaSBi4buZIGThu68gbGnhu4d1KioqDQoNCmBgYHtyfQ0KdGFpbChkLDEwKQ0KYGBgDQoNCiMjIyAqKjEuMyBLaeG7g20gdHJhIGdpw6EgdHLhu4sgTkEqKg0KDQpgYGB7cn0NCmRuYSA8LSBzdW0oaXMubmEoZCkpDQpwcmludChkbmEpDQpgYGANCg0KVuG6rXkga2hpIGtp4buDbSB0cmEgdOG7lW5nIHPhu5EgZ2nDoSB0cuG7iyBOQSB0b8OgbiBi4buZIGRhdGEgYuG6sW5nIGPDonUgbOG7h25oIGBzdW0oaXMubmEoZCkpYCwga+G6v3QgcXXhuqMgbmjhuq1uIMSRxrDhu6NjIGzDoCAqKktIw5RORyBDw5MgR0nDgSBUUuG7iiBOQSoqIG7Dqm4gdGEgdGnhur9uIGjDoG5oIHBow6JuIHTDrWNoIHRp4bq/cC4NCg0KIyMjICoqMS40IENodXnhu4NuIMSR4buVaSB0aMOgbmggYmnhur9uIMSR4buLbmggdMOtbmgqKg0KDQpWaeG7h2MgY2h1eeG7g24gY8OhYyBiaeG6v24gbmjGsCBHZW5kZXIsIE1hcml0YWxTdGF0dXMsIEhvbWVvd25lciwgQW5udWFsSW5jb21lIHbDoCBjw6FjIGJp4bq/biBsacOqbiBxdWFuIMSR4bq/biBz4bqjbiBwaOG6qW0sIMSR4buLYSBsw70gc2FuZyBraeG7g3UgZmFjdG9yIGzDoCBixrDhu5tjIHRp4buBbiB44butIGzDvSBxdWFuIHRy4buNbmcgdHJvbmcgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UuIMSQaeG7gXUgbsOgeSBnacO6cCBSIG5o4bqtbiBkaeG7h24gxJHDum5nIGLhuqNuIGNo4bqldCBwaMOibiBsb+G6oWkgY+G7p2EgY8OhYyBiaeG6v24gbsOgeSxuw6puIHRhIHRp4bq/biBow6BuaCBjaHV54buDbiDEkeG7lWkgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaDoNCg0KYGBge3J9DQpjYXRlZ29yaWNhbF92YXJzIDwtIG5hbWVzKGQpW3NhcHBseShkLCBmdW5jdGlvbih4KSBpcy5mYWN0b3IoeCkgfHwgaXMuY2hhcmFjdGVyKHgpKV0NCnByaW50KGNhdGVnb3JpY2FsX3ZhcnMpDQpgYGANCg0KVOG7qyBr4bq/dCBxdeG6oyDEkcOjIMSRxrDhu6NjIGluIHJhLCB0YSBjw7MgdOG7lW5nIGPhu5luZyAxMCBiaeG6v24gxJHhu4tuaCB0w61uaCAoIGxv4bqhaSB0cuG7qyBiaeG6v24gUHVyY2hhc2VEYXRlIHbDrCBuw7MgY2jhu6lhIHRow7RuZyB0aW4gbGnDqm4gdOG7pWMgdGhlbyB0aOG7nWkgZ2lhbikgbmjGsCB0csOqbiwgdGnhur9wIHThu6VjIHRp4bq/biBow6BuaCBjaHV54buDbiDEkeG7lWkgdGjDoG5oIGZhY3RvcjoNCg0KYGBge3J9DQpkJEdlbmRlciA8LSBhcy5mYWN0b3IoZCRHZW5kZXIpDQpkJE1hcml0YWxTdGF0dXMgPC0gYXMuZmFjdG9yKGQkTWFyaXRhbFN0YXR1cykNCmQkSG9tZW93bmVyIDwtIGFzLmZhY3RvcihkJEhvbWVvd25lcikNCmQkQW5udWFsSW5jb21lIDwtIGFzLmZhY3RvcihkJEFubnVhbEluY29tZSkNCg0KZCRQcm9kdWN0RmFtaWx5IDwtIGFzLmZhY3RvcihkJFByb2R1Y3RGYW1pbHkpDQpkJFByb2R1Y3REZXBhcnRtZW50IDwtIGFzLmZhY3RvcihkJFByb2R1Y3REZXBhcnRtZW50KQ0KZCRBbm51YWxJbmNvbWUgPC0gYXMuZmFjdG9yKGQkQW5udWFsSW5jb21lKQ0KDQpkJENpdHkgPC0gYXMuZmFjdG9yKGQkQ2l0eSkNCmQkU3RhdGVvclByb3ZpbmNlIDwtIGFzLmZhY3RvcihkJFN0YXRlb3JQcm92aW5jZSkNCmQkQ291bnRyeSA8LSBhcy5mYWN0b3IoZCRDb3VudHJ5KQ0KDQpgYGANCg0KLSAgIEPDoWMgYmnhur9uIG5oxrAgR2VuZGVyLCBNYXJpdGFsU3RhdHVzLCBIb21lb3duZXIsIEFubnVhbEluY29tZSBnaeG7nSDEkcOjIMSRxrDhu6NjIHjhu60gbMO9IMSRw7puZyBjaHXhuqluIMSR4buDIFIgaGnhu4N1IHLDtSDEkcOieSBsw6AgY8OhYyBuaMOzbSBwaMOibiBsb+G6oWksIGdpw7pwIHBow6JuIHTDrWNoIHbDoCBtw7QgaMOsbmggaMOzYSBjaMOtbmggeMOhYyBoxqFuLg0KDQotICAgVmnhu4djIGNodXnhu4NuIMSR4buVaSBjw6FjIGJp4bq/biBsacOqbiBxdWFuIMSR4bq/biBz4bqjbiBwaOG6qW0gKFByb2R1Y3RGYW1pbHksIFByb2R1Y3REZXBhcnRtZW50LCBQcm9kdWN0Q2F0ZWdvcnkpIHbDoCDEkeG7i2EgbMO9IChDaXR5LCBTdGF0ZW9yUHJvdmluY2UsIENvdW50cnkpIHNhbmcgZmFjdG9yIGPFqW5nIHLhuqV0IGPhuqduIHRoaeG6v3QgdsOsIGNow7puZyBjxaluZyBsw6AgY8OhYyBiaeG6v24gcGjDom4gbG/huqFpLCBraMO0bmcgcGjhuqNpIGThu68gbGnhu4d1IHPhu5EgaGF5IGxpw6puIHThu6VjLg0KDQojIyAqKlBI4bqmTiAyOiBQSMOCTiBUw41DSCBNw5QgVOG6oiBN4buYVCBCSeG6vk4gxJDhu4pOSCBUw41OSCAtIFVOSVZBUklBVEUgREVTQ1JJUFRJVkUgQU5BTFlTSVMqKg0KDQojIyMgKioyLjEgR2VuZGVyKioNCg0KIyMjIyAqKjIuMS4xIFRo4buRbmcga8OqIFThuqduIHN14bqldCoqDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KbGlicmFyeShkcGx5cikNCg0KZ2VuZGVyX2ZyZXEgPC0gdGFibGUoZCRHZW5kZXIpDQoNCmdlbmRlcl9wY3QgPC0gdGFibGUoZCRHZW5kZXIpL3N1bShucm93KGQpKSoxMDANCg0KZ2VuZGVyX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIEdlbmRlciA9IG5hbWVzKGdlbmRlcl9mcmVxKSwNCiAgRnJlcXVlbmN5ID0gYXMuaW50ZWdlcihnZW5kZXJfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChnZW5kZXJfcGN0LCAzKQ0KKQ0KY29sbmFtZXMoZ2VuZGVyX3RhYmxlKSA8LSBjKCJHZW5kZXIiLCAiRnJlcXVlbmN5IiwgIkdlbmRlciIsICJQZXJjZW50YWdlICglKSIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgxJHhurlwDQpnZW5kZXJfdGFibGUgJT4lDQogIGthYmxlKCJodG1sIiwgY2FwdGlvbiA9ICJC4bqjbmcgMi4xIFBow6JuIHBo4buRaSBnaeG7m2kgdMOtbmggLSBHRU5ERVIiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KDQpgYGANCg0KVuG6rXkgdHJvbmcgZGF0YSBuw6B5IGPDsyBgciB0YWJsZShkJEdlbmRlcilbMV0vc3VtKG5yb3coZCkpKjEwMGAlIG7hu68gdsOgIGByIHRhYmxlKGQkR2VuZGVyKVsyXS9zdW0obnJvdyhkKSkqMTAwYCUgbmFtLiBU4bu3IGzhu4cgbmFtIHbDoCBu4buvIHRyb25nIGRhdGEgZ+G6p24gbmjGsCBjw6JuIGLhurFuZywgY2jhu4kgY2jDqm5oIGzhu4djaCBuaOG6uSBraG/huqNuZyAxJS4NCg0KIyMjIyAqKjIuMS4yIFRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9DQojIFbhur0gVHLhu7FjIHF1YW4gaG/DoSB0csOybg0KcGllKGdlbmRlcl9mcmVxLA0KICAgIG1haW4gICA9ICJCaeG7g3UgxJHhu5MgMi4xOiBQaMOibiBi4buRIGdp4bubaSB0w61uaCAoR2VuZGVyKSIsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKGdlbmRlcl9mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQoZ2VuZGVyX3BjdCwgMyksICIlKSIpLA0KICAgIGNvbCAgICA9IGMoIiNEQ0IwQzMiLCAiIzU5NkNBRCIpKSAgIA0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogROG7sWEgdHLDqm4gYuG6o25nIHThuqduIHN14bqldCB2w6AgVHLhu7FjIHF1YW4gaG/DoSB0csOybiBwaMOibiBi4buRIGdp4bubaSB0w61uaCwgbmjDs20gbuG7ryBjaGnhur9tIMawdSB0aOG6vyBuaOG6uSB24bubaSB04bu3IGzhu4cga2hv4bqjbmcgNTElLCB0cm9uZyBraGkgbmjDs20gbmFtIGNoaeG6v20ga2hv4bqjbmcgNDklLiBN4bupYyBjaMOqbmggbOG7h2NoIG5o4buPIG7DoHkgY2hvIHRo4bqleSBt4bqrdSBk4buvIGxp4buHdSBjw7Mgc+G7sSBjw6JuIGLhurFuZyBnaeG7m2kgdMOtbmggdMawxqFuZyDEkeG7kWkgdOG7kXQsIMSR4bqjbSBi4bqjbyB0w61uaCDEkeG6oWkgZGnhu4duIGNobyBj4bqjIGhhaSBnaeG7m2kgdHJvbmcgY8OhYyBwaMOibiB0w61jaCB0aeG6v3AgdGhlby4gVHLhu7FjIHF1YW4gaG/DoSB0csOybiBtaW5oIGjhu41hIHLDtSByw6BuZyBz4buxIHBow6JuIGLhu5UgbsOgeSB24bubaSBtw6B1IHPhuq9jIHbDoCBuaMOjbiBwaOG6p24gdHLEg20gdHLhu7FjIHF1YW4sIGdpw7pwIG5nxrDhu51pIMSR4buNYyBk4buFIGTDoG5nIG7huq9tIGLhuq90IHRow7RuZyB0aW4uIERvIMSRw7MsIGtow7RuZyBj4bqnbiDEkWnhu4F1IGNo4buJbmggbeG6q3UgdGhlbyBnaeG7m2kgdMOtbmgga2hpIHRo4buxYyBoaeG7h24gY8OhYyBwaMOibiB0w61jaCBsacOqbiBxdWFuLg0KDQojIyMgKioyLjIgSG9tZW93bmVyKioNCg0KIyMjIyAqKjIuMi4xIFRo4buRbmcga8OqIFThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KaG9tZW93bmVyX2ZyZXEgPC0gdGFibGUoZCRIb21lb3duZXIpDQoNCmhvbWVvd25lcl9wY3QgPC0gdGFibGUoZCRIb21lb3duZXIpL3N1bShucm93KGQpKSoxMDANCg0KaG9tZW93bmVyX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIEhvbWVvd25lciA9IG5hbWVzKGhvbWVvd25lcl9mcmVxKSwNCiAgRnJlcXVlbmN5ID0gYXMuaW50ZWdlcihob21lb3duZXJfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChob21lb3duZXJfcGN0LCAzKQ0KKQ0KY29sbmFtZXMoaG9tZW93bmVyX3RhYmxlKSA8LSBjKCJIb21lb3duZXIiLCAiRnJlcXVlbmN5IiwgIkhvbWVvd25lciIsICJQZXJjZW50YWdlICglKSIpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyDEkeG6uXANCmhvbWVvd25lcl90YWJsZSAlPiUNCiAga2FibGUoImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyAyLjIgUGjDom4gcGjhu5FpIGPDoSBuaMOibiBz4bufIGjhu691IG5ow6AgLSBIT01FT1dORVIiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNClbhuq15IHRyb25nIGRhdGEgbsOgeSBjw7MgYHIgdGFibGUoZCRIb21lb3duZXIpWzFdL3N1bShucm93KGQpKSoxMDBgJSBraMO0bmcgc+G7nyBo4buvdSBjxINuIG5ow6AgbsOgbyB2w6AgYHIgdGFibGUoZCRIb21lb3duZXIpWzJdL3N1bShucm93KGQpKSoxMDBgJSBjw7Mgc+G7nyBo4buvdSBuaMOgLg0KDQojIyMjICoqMi4yLjIgVHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCiMgVuG6vSBUcuG7sWMgcXVhbiBob8OhIHRyw7JuDQpwaWUoaG9tZW93bmVyX2ZyZXEsDQogICAgbWFpbiAgID0gIkJp4buDdSDEkeG7kyAyLjI6IFBow6JuIHBo4buRaSBjw6EgbmjDom4gc+G7nyBo4buvdSBuaMOgIC0gSE9NRU9XTkVSIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoaG9tZW93bmVyX2ZyZXEpLA0KICAgICAgICAgICAgICAgICAgICAiICgiLCByb3VuZChob21lb3duZXJfcGN0LCAzKSwgIiUpIiksDQogICAgY29sICAgID0gYygiI0ZFRjlEQiIsICIjNEM2ODlCIikpICAgDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotICAgVHLhu7FjIHF1YW4gaG/DoSB0csOybiBjaG8gdGjhuqV5IG5ow7NtIG5nxrDhu51pIGPDsyBz4bufIGjhu691IG5ow6AgKCJZIikgY2hp4bq/bSDEkWEgc+G7kSB24bubaSA2MC4xJSwgdHJvbmcga2hpIG5ow7NtIGtow7RuZyBz4bufIGjhu691IG5ow6AgKCJOIikgY2jhu4kgY2hp4bq/bSAzOS45JS4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIHLhurFuZyBwaOG6p24gbOG7m24gbmfGsOG7nWkgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgY8OzIHTDoGkgc+G6o24gbmjDoCDhu58sIGPDsyB0aOG7gyBn4bujaSDDvSB24buBIG3hu6ljIMSR4buZIOG7lW4gxJHhu4tuaCB0w6BpIGNow61uaCB0cm9uZyBj4buZbmcgxJHhu5NuZyBuw6B5Lg0KDQotICAgQ2jDqm5oIGzhu4djaCBsw6A6IDg0NDQgLSA1NjE1ID0gMjgyOSBuZ8aw4budaSwgdOG7qWMgbMOgIHPhu5EgbmfGsOG7nWkgY8OzIG5ow6AgY2FvIGjGoW4gZ+G6p24gNTAlIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBjw7MgbmjDoC4NCg0KIyMjICoqMi4zIE1hcml0YWxTdGF0dXMqKg0KDQojIyMjICoqMi4zLjEgVGjhu5FuZyBrw6ogVOG6p24gc3XhuqV0KioNCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUV9DQpNYXJpdGFsU3RhdHVzX2ZyZXEgPC0gdGFibGUoZCRNYXJpdGFsU3RhdHVzKQ0KDQpNYXJpdGFsU3RhdHVzX3BjdCA8LSB0YWJsZShkJE1hcml0YWxTdGF0dXMpL3N1bShucm93KGQpKSoxMDANCg0KTWFyaXRhbFN0YXR1c190YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBNYXJpdGFsU3RhdHVzID0gbmFtZXMoTWFyaXRhbFN0YXR1c19mcmVxKSwNCiAgRnJlcXVlbmN5ID0gYXMuaW50ZWdlcihNYXJpdGFsU3RhdHVzX2ZyZXEpLA0KICBQZXJjZW50YWdlID0gcm91bmQoTWFyaXRhbFN0YXR1c19wY3QsIDMpDQopDQpjb2xuYW1lcyhNYXJpdGFsU3RhdHVzX3RhYmxlKSA8LSBjKCJNYXJpdGFsU3RhdHVzIiwgIkZyZXF1ZW5jeSIsICJNYXJpdGFsU3RhdHVzIiwgIlBlcmNlbnRhZ2UgKCUpIikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIMSR4bq5cA0KTWFyaXRhbFN0YXR1c190YWJsZSAlPiUNCiAga2FibGUoImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyAyLjMgUGjDom4gcGjhu5FpIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAtIE1hcml0YWxTdGF0dXMiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNClbhuq15IHRyb25nIGRhdGEgbsOgeSBjw7MgYHIgdGFibGUoZCRNYXJpdGFsU3RhdHVzKVsxXS9zdW0obnJvdyhkKSkqMTAwYCUga+G6v3QgaMO0biB2w6AgYHIgdGFibGUoZCRNYXJpdGFsU3RhdHVzKVsyXS9zdW0obnJvdyhkKSkqMTAwYCUgxJHhu5ljIHRow6JuLg0KDQojIyMjICoqMi4zLjIgVHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCnBpZShNYXJpdGFsU3RhdHVzX2ZyZXEsDQogICAgbWFpbiAgID0gIkJp4buDdSDEkeG7kyAyLjM6IFBow6JuIHBo4buRaSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gLSBNYXJpdGFsU3RhdHVzIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoTWFyaXRhbFN0YXR1c19mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQoTWFyaXRhbFN0YXR1c19wY3QsIDMpLCAiJSkiKSwNCiAgICBjb2wgICAgPSBjKCIjRjdFNEUyIiwgIiM2Mzg0N0QiKSkgDQpgYGANCg0KKipOSOG6rE4gWMOJVDoqKg0KDQotICAgUGjDom4gYuG7kSBn4bqnbiBjw6JuIGLhurFuZzogVOG7tyBs4buHIG5nxrDhu51pIMSR4buZYyB0aMOibiAoNTEuMTYlKSB2w6AgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuICg0OC44NCUpIHLhuqV0IGfhuqduIG5oYXUsIGNobyB0aOG6pXkgbeG6q3Uga2jhuqNvIHPDoXQga2jDtG5nIHRoacOqbiBs4buHY2ggbeG6oW5oIHbhu4EgbeG7mXQgbmjDs20uDQoNCi0gICBOaMOzbSDEkeG7mWMgdGjDom4gY2hp4bq/bSDGsHUgdGjhur8gbmjhurk6IFbhu5tpIHThu7cgbOG7hyBjYW8gaMahbiAyLjMlLCBuaMOzbSDEkeG7mWMgdGjDom4gY2hp4bq/bSDGsHUgdGjhur8gbmjhurkgdHJvbmcgbeG6q3UuDQoNCi0gICBE4buFIGTDoG5nIG5o4bqtbiB0aOG6pXkgbmjDs20gxJHhu5ljIHRow6JuIGNoaeG6v20gcGjhuqduIGzhu5tuIG5o4bq5IHNvIHbhu5tpIG5ow7NtIMSRw6Mga+G6v3QgaMO0biBraGkgcXVhbiBzw6F0IFRy4buxYyBxdWFuIGhvw6EuDQoNCiMjIyAqKjIuNCBDaXR5KioNCg0KIyMjIyAqKjIuNC4xIFRo4buRbmcga8OqIFThuqduIHN14bqldCoqDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KQ2l0eV9mcmVxIDwtIHRhYmxlKGQkQ2l0eSkNCg0KQ2l0eV9wY3QgPC0gdGFibGUoZCRDaXR5KS9zdW0obnJvdyhkKSkqMTAwDQoNCkNpdHlfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgQ2l0eSA9IG5hbWVzKENpdHlfZnJlcSksDQogIEZyZXF1ZW5jeSA9IGFzLmludGVnZXIoQ2l0eV9mcmVxKSwNCiAgUGVyY2VudGFnZSA9IHJvdW5kKENpdHlfcGN0LCAzKQ0KKQ0KY29sbmFtZXMoQ2l0eV90YWJsZSkgPC0gYygiQ2l0eSIsICJGcmVxdWVuY3kiLCAiQ2l0eSIsICJQZXJjZW50YWdlICglKSIpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyDEkeG6uXANCkNpdHlfdGFibGUgJT4lDQogIGthYmxlKCJodG1sIiwgY2FwdGlvbiA9ICJC4bqjbmcgMi40IFBow6JuIHBo4buRaSDEkeG7i25oIGPGsCBjw6FjIHRow6BuaCBwaOG7kSAtIENpdHkiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNClbhuq15IHRyb25nIGRhdGEgbsOgeSBjw7MgYHIgdGFibGUoZCRDaXR5KVsxXS9zdW0obnJvdyhkKSkqMTAwYCUgc+G7kW5nIOG7nyBBY2FwdWxjbyB2w6AgYHIgdGFibGUoZCRDaXR5KVsyXS9zdW0obnJvdyhkKSkqMTAwYCUgc+G7kW5nIOG7nyBCZWxsaW5naGFtLg0KDQpUaeG6v3AgdGhlbywgY8OzIGByIHJvdW5kKHRhYmxlKGQkQ2l0eSlbIkJldmVybHkgSGlsbHMiXSAvIG5yb3coZCkgKiAxMDAsIDIpYCUgc+G7kW5nIOG7nyBCZXZlcmx5IEhpbGxzLCBgciByb3VuZCh0YWJsZShkJENpdHkpWyJCcmVtZXJ0b24iXSAvIG5yb3coZCkgKiAxMDAsIDIpYCUg4bufIEJyZW1lcnRvbiwgdsOgIGByIHJvdW5kKHRhYmxlKGQkQ2l0eSlbIkNhbWFjaG8iXSAvIG5yb3coZCkgKiAxMDAsIDIpYCUg4bufIENhbWFjaG8uDQoNClRyb25nIGtoaSDEkcOzLCBjaOG7iSBgciB0YWJsZShkJENpdHkpWyJHdWFkYWxhamFyYSJdL3N1bShucm93KGQpKSAqIDEwMGAlIGPGsCBkw6JuIHPhu5FuZyDhu58gR3VhZGFsYWphcmEgdsOgIGByIHRhYmxlKGQkQ2l0eSlbIkhpZGFsZ28iXS9zdW0obnJvdyhkKSkgKiAxMDBgJSDhu58gSGlkYWxnby4gTG9zIEFuZ2VsZXMgY8OzIHThu7cgbOG7hyBjYW8gaMahbiB24bubaSBgciB0YWJsZShkJENpdHkpWyJMb3MgQW5nZWxlcyJdL3N1bShucm93KGQpKSAqIDEwMGAlLg0KDQpNZXhpY28gQ2l0eSBjaGnhur9tIGByIHRhYmxlKGQkQ2l0eSlbIk1leGljbyBDaXR5Il0vc3VtKG5yb3coZCkpICogMTAwYCUsIHRo4bqlcCBoxqFuIHNvIHbhu5tpIFBvcnRsYW5kIChgciB0YWJsZShkJENpdHkpWyJQb3J0bGFuZCJdL3N1bShucm93KGQpKSAqIDEwMGAlKSB2w6AgU2FsZW0gKGByIHRhYmxlKGQkQ2l0eSlbIlNhbGVtIl0vc3VtKG5yb3coZCkpICogMTAwYCUpLg0KDQpDw6FjIHRow6BuaCBwaOG7kSB04bqhaSBXYXNoaW5ndG9uIG5oxrAgU2VhdHRsZSAoYHIgdGFibGUoZCRDaXR5KVsiU2VhdHRsZSJdL3N1bShucm93KGQpKSAqIDEwMGAlKSwgU3Bva2FuZSAoYHIgdGFibGUoZCRDaXR5KVsiU3Bva2FuZSJdL3N1bShucm93KGQpKSAqIDEwMGAlKSwgdsOgIFRhY29tYSAoYHIgdGFibGUoZCRDaXR5KVsiVGFjb21hIl0vc3VtKG5yb3coZCkpICogMTAwYCUpIGPDsyB04bu3IGzhu4cgxJHDoW5nIGvhu4MuDQoNCkN14buRaSBjw7luZywgY8OhYyBraHUgduG7sWMgbmjhu48gbmjGsCBWaWN0b3JpYSAoYHIgdGFibGUoZCRDaXR5KVsiVmljdG9yaWEiXS9zdW0obnJvdyhkKSkgKiAxMDBgJSksIFdhbGxhIFdhbGxhIChgciB0YWJsZShkJENpdHkpWyJXYWxsYSBXYWxsYSJdL3N1bShucm93KGQpKSAqIDEwMGAlKSB2w6AgWWFraW1hIChgciB0YWJsZShkJENpdHkpWyJZYWtpbWEiXS9zdW0obnJvdyhkKSkgKiAxMDBgJSkgY2jhu4kgY2hp4bq/bSBwaOG6p24gbmjhu48uDQoNCiMjIyMgKioyLjQuMiBUcuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04fQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCkNpdHlfZGYgPC0gYXMuZGF0YS5mcmFtZShDaXR5X3BjdCkNCmNvbG5hbWVzKENpdHlfZGYpIDwtIGMoIkNpdHkiLCAiUGVyY2VudGFnZSIpDQoNCmdncGxvdChDaXR5X2RmLCBhZXMoeCA9IHJlb3JkZXIoQ2l0eSwgLVBlcmNlbnRhZ2UpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IENpdHkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIDIuNDogUGjDom4gcGjhu5FpIMSR4buLbmggY8awIHRoZW8gdGjDoG5oIHBo4buRIiwNCiAgICAgICB4ID0gIlRow6BuaCBwaOG7kSIsIHkgPSAiVOG7tyBs4buHICUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQoNCmBgYA0KDQoqKk5I4bqsTiBYw4lUKioNCg0KLSAgIMSQw6FuZyBjaMO6IMO9IG5o4bqldCBsw6AgdGjDoG5oIHBo4buRIFNhbGVtLCBuxqFpIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgduG7m2kgOS44NTglIHThu5VuZyBkw6JuIHPhu5EuIFRp4bq/cCB0aGVvIGzDoCBUYWNvbWEgduG7m2kgOC45NDElLCB2w6AgTG9zIEFuZ2VsZXMsIFNlYXR0bGUsIFNhbiBEaWVnbyDigJMgxJHhu4F1IGRhbyDEkeG7mW5nIHF1YW5oIG3hu6ljIDYl4oCTNi41JS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbeG7mXQgeHUgaMaw4bubbmcgZMOibiBz4buRIHF1YW4gdHLhu41uZzogbmfGsOG7nWkgZMOibiBjw7MgeHUgaMaw4bubbmcgdOG6rXAgdHJ1bmcgc+G7kW5nIHThuqFpIGPDoWMgdGjDoG5oIHBo4buRIGzhu5tuLCBuxqFpIGPDsyBuaGnhu4F1IGPGoSBo4buZaSB2aeG7h2MgbMOgbSwgY8ahIHPhu58gaOG6oSB04bqnbmcgdOG7kXQgdsOgIMSRaeG7gXUga2nhu4duIHPhu5FuZyB0aHXhuq1uIGzhu6NpLg0KDQotICAgTmfGsOG7o2MgbOG6oWksIOG7nyBwaMOtYSBkxrDhu5tpIGPhu6dhIGLhuqNuZyB2w6AgVHLhu7FjIHF1YW4gaG/DoSBsw6AgY8OhYyB0aMOgbmggcGjhu5EgY8OzIHThu7cgbOG7hyBkw6JuIGPGsCBy4bqldCB0aOG6pXAuIENo4bqzbmcgaOG6oW4gbmjGsCBHdWFkYWxhamFyYSAoMC41MzMlKSwgU2FuIEZyYW5jaXNjbyAoMC45MjUlKSwgVmljdG9yaWEgKDEuMjUyJSkgdsOgIFdhbGxhIFdhbGxhICgxLjEzOCUpLiBOaOG7r25nIHRow6BuaCBwaOG7kSBuw6B5IGPDsyB0aOG7gyBsw6Agbmjhu69uZyBraHUgduG7sWMgdsO5bmcgdmVuLCDEkeG7i2EgYsOgbiBuaOG7jywgaG/hurdjIMSRxqFuIGdp4bqjbiBsw6Aga2jDtG5nIHBo4bqjaSBsw6AgbsahaSBjxrAgdHLDuiBwaOG7lSBiaeG6v24gdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQuDQoNCi0gICBN4buZdCDEkWnhu4F1IGtow7RuZyB0aOG7gyBi4buPIHF1YSBsw6Agc+G7sSBjaMOqbmggbOG7h2NoIHLDtSBy4buHdCBnaeG7r2EgbmjDs20gdGjDoG5oIHBo4buRIMSRw7RuZyBkw6JuIHbDoCBuaMOzbSBjw7JuIGzhuqFpLiBO4bq/dSBuaMawIFNhbGVtIGNoaeG6v20gZ+G6p24gMTAlIHThu5VuZyBjxrAgZMOibiwgdGjDrCBoxqFuIG3hu5l0IG7hu61hIHPhu5EgdGjDoG5oIHBo4buRIHRyb25nIGRhbmggc8OhY2ggY2jhu4kgY2hp4bq/bSBkxrDhu5tpIDMlLCBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIHBow6JuIGLhu5EgZMOibiBjxrAga2jDtG5nIMSR4buTbmcgxJHhu4F1DQoNCiMjIyAqKjIuNSBTdGF0ZW9yUHJvdmluY2UqKg0KDQojIyMjICoqMi41LjEgVGjhu5FuZyBrw6ogVOG6p24gc3XhuqV0KioNCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUV9DQpTdGF0ZW9yUHJvdmluY2VfZnJlcSA8LSB0YWJsZShkJFN0YXRlb3JQcm92aW5jZSkNCg0KU3RhdGVvclByb3ZpbmNlX3BjdCA8LSB0YWJsZShkJFN0YXRlb3JQcm92aW5jZSkvc3VtKG5yb3coZCkpKjEwMA0KDQpTdGF0ZW9yUHJvdmluY2VfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgU3RhdGVvclByb3ZpbmNlID0gbmFtZXMoU3RhdGVvclByb3ZpbmNlX2ZyZXEpLA0KICBGcmVxdWVuY3kgPSBhcy5pbnRlZ2VyKFN0YXRlb3JQcm92aW5jZV9mcmVxKSwNCiAgUGVyY2VudGFnZSA9IHJvdW5kKFN0YXRlb3JQcm92aW5jZV9wY3QsIDMpDQopDQpjb2xuYW1lcyhTdGF0ZW9yUHJvdmluY2VfdGFibGUpIDwtIGMoIlN0YXRlb3JQcm92aW5jZSIsICJGcmVxdWVuY3kiLCAiU3RhdGVvclByb3ZpbmNlIiwgIlBlcmNlbnRhZ2UgKCUpIikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIMSR4bq5cA0KU3RhdGVvclByb3ZpbmNlX3RhYmxlICU+JQ0KICBrYWJsZSgiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDIuNSBQaMOibiBwaOG7kWkgxJHhu4tuaCBjxrAgY8OhYyBCYW5nIC0gU3RhdGVvclByb3ZpbmNlIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQpUcm9uZyBk4buvIGxp4buHdSBuw6B5LCBiYW5nICoqV2FzaGluZ3RvbiAoV0EpKiogY2hp4bq/bSBgciB0YWJsZShkJFN0YXRlb3JQcm92aW5jZSlbIldBIl0gL3N1bShucm93KGQpKSogMTAwYCUsIGNhbyBuaOG6pXQgdHJvbmcgY8OhYyBiYW5nLg0KDQpUaGVvIHNhdSBsw6AgKipDYWxpZm9ybmlhIChDQSkqKiB24bubaSBgciB0YWJsZShkJFN0YXRlb3JQcm92aW5jZSlbIkNBIl0gL3N1bShucm93KGQpKSogMTAwYCUgdsOgICoqT3JlZ29uIChPUikqKiB24bubaSBgciB0YWJsZShkJFN0YXRlb3JQcm92aW5jZSlbIk9SIl0vc3VtKG5yb3coZCkpICogMTAwYCUuDQoNCk3hu5l0IHPhu5EgYmFuZyBraMOhYyBjw7MgdOG7tyBs4buHIHRo4bqlcCBoxqFuIG5oxrA6DQoNCi0gICAqKkJDKio6IGByIHRhYmxlKGQkU3RhdGVvclByb3ZpbmNlKVsiQkMiXS9zdW0obnJvdyhkKSkgKiAxMDBgJQ0KDQotICAgKipERioqOiBgciB0YWJsZShkJFN0YXRlb3JQcm92aW5jZSlbIkRGIl0vc3VtKG5yb3coZCkpICogMTAwYCUNCg0KLSAgICoqR3VlcnJlcm8qKjogYHIgdGFibGUoZCRTdGF0ZW9yUHJvdmluY2UpWyJHdWVycmVybyJdL3N1bShucm93KGQpKSAqIDEwMGAlDQoNCi0gICAqKkphbGlzY28qKjogYHIgdGFibGUoZCRTdGF0ZW9yUHJvdmluY2UpWyJKYWxpc2NvIl0vc3VtKG5yb3coZCkpICogMTAwYCUNCg0KLSAgICoqVmVyYWNydXoqKjogYHIgdGFibGUoZCRTdGF0ZW9yUHJvdmluY2UpWyJWZXJhY3J1eiJdL3N1bShucm93KGQpKSAqIDEwMGAlDQoNCi0gICAqKll1Y2F0YW4qKjogYHIgdGFibGUoZCRTdGF0ZW9yUHJvdmluY2UpWyJZdWNhdGFuIl0vc3VtKG5yb3coZCkpICogMTAwYCUNCg0KLSAgICoqWmFjYXRlY2FzKio6IGByIHRhYmxlKGQkU3RhdGVvclByb3ZpbmNlKVsiWmFjYXRlY2FzIl0gL3N1bShucm93KGQpKSogMTAwYCUNCg0KIyMjIyAqKjIuNS4yIFRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9DQpsaWJyYXJ5KGdncGxvdDIpDQoNClN0YXRlb3JQcm92aW5jZV9kZiA8LSBhcy5kYXRhLmZyYW1lKFN0YXRlb3JQcm92aW5jZV9wY3QpDQpjb2xuYW1lcyhTdGF0ZW9yUHJvdmluY2VfZGYpIDwtIGMoIlN0YXRlb3JQcm92aW5jZSIsICJQZXJjZW50YWdlIikNCg0KZ2dwbG90KFN0YXRlb3JQcm92aW5jZV9kZiwgYWVzKHggPSByZW9yZGVyKFN0YXRlb3JQcm92aW5jZSwgLVBlcmNlbnRhZ2UpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IFN0YXRlb3JQcm92aW5jZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgMi41OiBQaMOibiBwaOG7kWkgxJHhu4tuaCBjxrAgdGhlbyBCYW5nIiwNCiAgICAgICB4ID0gIkJhbmciLCB5ID0gIlThu7cgbOG7hyAlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCioqTkjhuqxOIFjDiVQ6KiogROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc3XhuqV0IHbDoCBUcuG7sWMgcXVhbiBob8OhIGPhu5l0IG1pbmggaOG7jWEsIHRhIHRo4bqleSBz4buxIHBow6JuIGLhu5EgZMOibiBjxrAgZ2nhu69hIGPDoWMgYmFuZy904buJbmggbMOgIHLhuqV0IGtow7RuZyDEkeG7k25nIMSR4buBdToNCg0KLSAgIFdBIG7hu5VpIGLhuq10IHLDtSBy4buHdCwgduG7m2kgY+G7mXQgY2FvIHbGsOG7o3QgdHLhu5lpIHNvIHbhu5tpIHBo4bqnbiBjw7JuIGzhuqFpLCB24bubaSA0LjU2NyBuZ8aw4budaSAoMzIuNDklKSDigJMgY2FvIGfhuqduIGfhuqVwIMSRw7RpIHNvIHbhu5tpIGJhbmcgxJHhu6luZyB0aOG7qSBoYWkgbMOgIENhbGlmb3JuaWEgKENBKSwgY2jhu4kgY8OzIDIuNzMzIG5nxrDhu51pICgxOS40NCUpLiBDaMOqbmggbOG7h2NoIGdp4buvYSBXQSB2w6AgQ0EgbMOgIDEzLjA1ICUg4oCTIG3hu5l0IGtob+G6o25nIGPDoWNoIHLhuqV0IGzhu5tuLCBjYW8gZ+G6pXAgXH42MSBs4bqnbiBzbyB24bubaSBKYWxpc2NvLCB2w6AgY2FvIGjGoW4gXH4xMiBs4bqnbiBHdWVycmVyby4gY2hvIHRo4bqleSBXQSBsw6AgxJFp4buDbSDEkeG7i25oIGPGsCDGsHUgdGnDqm4gaMOgbmcgxJHhuqd1Lg0KDQotICAgQmFuZyBPcmVnb24gKE9SKSBjxaluZyBjw7Mgc+G7kSBsxrDhu6NuZyBjxrAgZMOibiDEkcOhbmcga+G7gywgduG7m2kgMi4yNjIgbmfGsOG7nWkgKDE2LjA5JSksIGNo4buJIGvDqW0gQ0Ega2hv4bqjbmcgMy4zNSDEkWnhu4NtIHBo4bqnbiB0csSDbS4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIG3hu6ljIMSR4buZIHRodSBow7p0IGTDom4gY8awIGNhbyDhu58gY8OhYyBiYW5nIHZlbiBUaMOhaSBCw6xuaCBExrDGoW5nIChXQSwgQ0EsIE9SKQ0KDQotICAgTmfGsOG7o2MgbOG6oWksIGPDoWMgdOG7iW5oIG5oxrAgSmFsaXNjbyAoMC41MyUpLCBHdWVycmVybyAoMi43MiUpIHbDoCBWZXJhY3J1eiAoMy4zMCUpIGPDsyBz4buRIGzGsOG7o25nIGPGsCBkw6JuIHLhuqV0IHRo4bqlcC4NCg0KLSAgIFphY2F0ZWNhcyAoOS4yMyUpIGzDoCB04buJbmggbmdvw6BpIHRvcCAzIG5oxrBuZyB24bqrbiDEkcOhbmcgY2jDuiDDvSwgdsaw4bujdCBxdWEgY8OhYyBraHUgduG7sWMgbmjGsCBCQyAoNS43NSUpIHbDoCBERiAoNS44MCUpLg0KDQojIyMgKioyLjYgQ291bnRyeSoqDQoNCiMjIyMgKioyLjYuMSBUaOG7kW5nIGvDqiBU4bqnbiBzdeG6pXQqKg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gVFJVRX0NCkNvdW50cnlfZnJlcSA8LSB0YWJsZShkJENvdW50cnkpDQoNCkNvdW50cnlfcGN0IDwtIHRhYmxlKGQkQ291bnRyeSkvc3VtKG5yb3coZCkpKjEwMA0KDQpDb3VudHJ5X3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIENvdW50cnkgPSBuYW1lcyhDb3VudHJ5X2ZyZXEpLA0KICBGcmVxdWVuY3kgPSBhcy5pbnRlZ2VyKENvdW50cnlfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChDb3VudHJ5X3BjdCwgMykNCikNCmNvbG5hbWVzKENvdW50cnlfdGFibGUpIDwtIGMoIkNvdW50cnkiLCAiRnJlcXVlbmN5IiwgIkNvdW50cnkiLCAiUGVyY2VudGFnZSAoJSkiKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgxJHhurlwDQpDb3VudHJ5X3RhYmxlICU+JQ0KICBrYWJsZSgiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDIuNiBQaMOibiBwaOG7kWkgxJHhu4tuaCBjxrAgdOG6oWkgY8OhYyBuxrDhu5tjIC0gQ291bnRyeSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCg0KVuG6rXkgdHJvbmcgZGF0YSBuw6B5IGPDsyBgciB0YWJsZShkJENvdW50cnkpWzFdL3N1bShucm93KGQpKSoxMDBgJSB04burIENhbmFkYSwgYHIgdGFibGUoZCRDb3VudHJ5KVsyXS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBNZXhpY28gdsOgIGByIHRhYmxlKGQkQ291bnRyeSlbM10vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgVVNBLg0KDQojIyMjICoqMi42LjIgVHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCg0KIyBW4bq9IFRy4buxYyBxdWFuIGhvw6EgdHLDsm4NCnBpZShDb3VudHJ5X2ZyZXEsDQogICAgbWFpbiAgID0gIkJp4buDdSDEkeG7kyAyLjY6IFBow6JuIHBo4buRaSDEkeG7i25oIGPGsCB04bqhaSBjw6FjIG7GsOG7m2MgKENvdW50cnkpIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoQ291bnRyeV9mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQoQ291bnRyeV9wY3QsIDMpLCAiJSkiKSwNCiAgICBjb2wgICAgPSBjKCIjQzRDMUUxIiwgIiNFRURkQjYiLCAiI0RDQTJBNyIpKSANCmBgYA0KDQoqKk5I4bqsTiBYw4lUOioqDQoNCi0gICBIb2EgS+G7syAoVVNBKSBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0LCB24bubaSA5LjU2MiBuZ8aw4budaSwgdMawxqFuZyDhu6luZyA2OC4wMSUgdOG7lW5nIHPhu5EgY8awIGTDom4gdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQuIMSQw6J5IGzDoCBxdeG7kWMgZ2lhIGPDsyBz4buRIGzGsOG7o25nIG5nxrDhu51pIMSR4buLbmggY8awIHbGsOG7o3QgdHLhu5lpIOKAlCBjYW8gZ+G6pXAgZ+G6p24gMi42IGzhuqduIHNvIHbhu5tpIE1leGljbyB2w6AgaMahbiAxMSBs4bqnbiBzbyB24bubaSBDYW5hZGEuDQoNCi0gICBNZXhpY28gxJHhu6luZyB0aOG7qSBoYWkgduG7m2kgMy42ODggbmfGsOG7nWkgKDI2LjIzJSkuIENhbmFkYSBjw7Mgc+G7kSBjxrAgZMOibiB0aOG6pXAgbmjhuqV0LCBjaOG7iSA4MDkgbmfGsOG7nWkgKDUuNzUlKSwgY2hvIHRo4bqleSBt4bupYyDEkeG7mSDEkeG7i25oIGPGsCB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBoYWkgcXXhu5FjIGdpYSBjw7JuIGzhuqFpLiBVU0EgY8OzIHThu7cgbOG7hyBjxrAgZMOibiBjYW8gaMahbiBcfjYyLjI2ICUgc28gduG7m2kgQ2FuYWRhLg0KDQotICAgVHLhu7FjIHF1YW4gaG/DoSB0csOybiBz4bq9IHRo4buDIGhp4buHbiByw7Ugc+G7sSDDoXAgxJHhuqNvIGPhu6dhIFVTQSwgY2hp4bq/bSBoxqFuIDIvMyBow6xuaCB0csOybiwgdHJvbmcga2hpIHBo4bqnbiBj4bunYSBDYW5hZGEgbMOgIHLhuqV0IG5o4buPLCBk4buFIGTDoG5nIG5o4bqtbiB0aOG6pXkgYuG6sW5nIHRy4buxYyBxdWFuLg0KDQojIyMgKioyLjcgUHJvZHVjdEZhbWlseSoqDQoNCiMjIyMgKioyLjcuMSBUaOG7kW5nIGvDqiBU4bqnbiBzdeG6pXQqKg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gVFJVRX0NClByb2R1Y3RGYW1pbHlfZnJlcSA8LSB0YWJsZShkJFByb2R1Y3RGYW1pbHkpDQoNClByb2R1Y3RGYW1pbHlfcGN0IDwtIHRhYmxlKGQkUHJvZHVjdEZhbWlseSkvc3VtKG5yb3coZCkpKjEwMA0KDQpQcm9kdWN0RmFtaWx5X3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIFByb2R1Y3RGYW1pbHkgPSBuYW1lcyhQcm9kdWN0RmFtaWx5X2ZyZXEpLA0KICBGcmVxdWVuY3kgPSBhcy5pbnRlZ2VyKFByb2R1Y3RGYW1pbHlfZnJlcSksDQogIFBlcmNlbnRhZ2UgPSByb3VuZChQcm9kdWN0RmFtaWx5X3BjdCwgMykNCikNCmNvbG5hbWVzKFByb2R1Y3RGYW1pbHlfdGFibGUpIDwtIGMoIlByb2R1Y3RGYW1pbHkiLCAiRnJlcXVlbmN5IiwgIlByb2R1Y3RGYW1pbHkiLCAiUGVyY2VudGFnZSAoJSkiKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgxJHhurlwDQpQcm9kdWN0RmFtaWx5X3RhYmxlICU+JQ0KICBrYWJsZSgiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDIuNyBQaMOibiBwaOG7kWkgdGhlbyBz4bqjbSBwaOG6qW0gdGnDqnUgZMO5bmcgY2hvIGdpYSDEkcOsbmggLSBQcm9kdWN0RmFtaWx5IikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQpW4bqteSB0cm9uZyBkYXRhIG7DoHkgY8OzIGByIHRhYmxlKGQkUHJvZHVjdEZhbWlseSlbMV0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgRHJpbmssIGByIHRhYmxlKGQkUHJvZHVjdEZhbWlseSlbMl0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgRm9vZCB2w6AgYHIgdGFibGUoZCRQcm9kdWN0RmFtaWx5KVszXS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBOb24tQ29uc3VtYWJsZS4NCg0KIyMjIyAqKjIuNy4yIFRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9DQojIFbhur0gVHLhu7FjIHF1YW4gaG/DoSB0csOybg0KcGllKFByb2R1Y3RGYW1pbHlfZnJlcSwNCiAgICBtYWluICAgPSAiQmnhu4N1IMSR4buTIDIuNzogUGjDom4gcGjhu5FpIHRoZXAgc+G6o24gcGjhuqltIHRpw6p1IGTDuW5nIGNobyBnaWEgxJHDrG5oIC0gUHJvZHVjdEZhbWlseSIsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKFByb2R1Y3RGYW1pbHlfZnJlcSksDQogICAgICAgICAgICAgICAgICAgICIgKCIsIHJvdW5kKFByb2R1Y3RGYW1pbHlfcGN0LCAzKSwgIiUpIiksDQogICAgY29sICAgID0gYygiI0YxRjBGNyIsICIjQUFFMEMyIiwgIiNCOUNERjEiKSkgDQpgYGANCg0KKipOSOG6rE4gWMOJVDoqKiBC4bqjbmcgMi43IHRo4buDIGhp4buHbiByw7Ugc+G7sSBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDIHRyb25nIHZp4buHYyBwaMOibiBwaOG7kWkgY8OhYyBsb+G6oWkgc+G6o24gcGjhuqltIHRpw6p1IGTDuW5nIHRyb25nIGdpYSDEkcOsbmggZ2nhu69hIGJhIG5ow7NtIGNow61uaDogRm9vZCwgRHJpbmssIHbDoCBOb24tQ29uc3VtYWJsZS4NCg0KLSAgIE5ow7NtIHPhuqNuIHBo4bqpbSBGb29kIChUaOG7sWMgcGjhuqltKSBjaGnhur9tIMawdSB0aOG6vyB0dXnhu4d0IMSR4buRaSB24bubaSAxMC4xNTMgc+G6o24gcGjhuqltLCB0xrDGoW5nIOG7qW5nIHbhu5tpIDcyLjIyJSxjaGnhur9tIGfhuqduIDMvNCB04buVbmcgc+G7kSBz4bqjbiBwaOG6qW0sIHbGsOG7o3QgdHLhu5lpIHNvIHbhu5tpIGPDoWMgbmjDs20gY8OybiBs4bqhaS4NCg0KLSAgIE5ow7NtIE5vbi1Db25zdW1hYmxlIChLaMO0bmcgdGnDqnUgZMO5bmcgdGjGsOG7nW5nIHh1ecOqbikgxJHhu6luZyB0aOG7qSBoYWkgduG7m2kgMi42NTYgc+G6o24gcGjhuqltLCBjaGnhur9tIDE4Ljg5JSB2w6AgbmjDs20gRHJpbmsgKMSQ4buTIHXhu5FuZyksIGNo4buJIGNoaeG6v20gOC44OSUgdMawxqFuZyDEkcawxqFuZyAxLjI1MCBz4bqjbiBwaOG6qW0uDQoNCi0gICBUcuG7sWMgcXVhbiBob8OhIHRyw7JuIHRo4buDIGhp4buHbiByw7Ugc+G7sSBjaMOqbmggbOG7h2NoIHbhu5tpIHBo4bqnbiBGb29kIGzhu5tuIMOhcCDEkeG6o28sIGNoaeG6v20gcGjhuqduIGzhu5tuIGRp4buHbiB0w61jaCBow6xuaCB0csOybiwgY8OybiBEcmluayBn4bqnbiBuaMawIGzDoCBt4buZdCBwaOG6p24gbmjhu48uDQoNCiMjIyAqKjIuOCBQcm9kdWN0RGVwYXJ0bWVudCoqDQoNCiMjIyMgKioyLjguMSBUaOG7kW5nIGvDqiBU4bqnbiBzdeG6pXQqKg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gVFJVRX0NClByb2R1Y3REZXBhcnRtZW50X2ZyZXEgPC0gdGFibGUoZCRQcm9kdWN0RGVwYXJ0bWVudCkNCg0KUHJvZHVjdERlcGFydG1lbnRfcGN0IDwtIHRhYmxlKGQkUHJvZHVjdERlcGFydG1lbnQpL3N1bShucm93KGQpKSoxMDANCg0KUHJvZHVjdERlcGFydG1lbnRfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgUHJvZHVjdERlcGFydG1lbnQgPSBuYW1lcyhQcm9kdWN0RGVwYXJ0bWVudF9mcmVxKSwNCiAgRnJlcXVlbmN5ID0gYXMuaW50ZWdlcihQcm9kdWN0RGVwYXJ0bWVudF9mcmVxKSwNCiAgUGVyY2VudGFnZSA9IHJvdW5kKFByb2R1Y3REZXBhcnRtZW50X3BjdCwgMykNCikNCmNvbG5hbWVzKFByb2R1Y3REZXBhcnRtZW50X3RhYmxlKSA8LSBjKCJQcm9kdWN0RGVwYXJ0bWVudCIsICJGcmVxdWVuY3kiLCAiUHJvZHVjdERlcGFydG1lbnQiLCAiUGVyY2VudGFnZSAoJSkiKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgxJHhurlwDQpQcm9kdWN0RGVwYXJ0bWVudF90YWJsZSAlPiUNCiAga2FibGUoImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyAyLjggUGjDom4gcGjhu5FpIHRoZW8gc+G6o20gcGjhuqltIHRpw6p1IGTDuW5nIGNobyBjxINuIGjhu5kgLSBQcm9kdWN0RGVwYXJ0bWVudCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCg0KVuG6rXkgdHJvbmcgZGF0YSBuw6B5IGPDszogLSBgciB0YWJsZShkJFByb2R1Y3REZXBhcnRtZW50KVsxXS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBBbGNvaG9saWMgQmV2ZXJhZ2VzDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3REZXBhcnRtZW50KVsyXS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBCYWtlZCBHb29kcw0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0RGVwYXJ0bWVudClbM10vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgQmFraW5nIEdvb2RzDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3REZXBhcnRtZW50KVs0XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBCZXZlcmFnZXMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdERlcGFydG1lbnQpWzVdL3N1bShucm93KGQpKSoxMDBgJSB04burIEJyZWFrZmFzdCBGb29kcw0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0RGVwYXJ0bWVudClbNl0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgQ2FubmVkIEZvb2RzDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3REZXBhcnRtZW50KVs3XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBDYW5uZWQgUHJvZHVjdHMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdERlcGFydG1lbnQpWzhdL3N1bShucm93KGQpKSoxMDBgJSB04burIENhcm91c2VsDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3REZXBhcnRtZW50KVs5XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBDaGVja291dA0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0RGVwYXJ0bWVudClbMTBdL3N1bShucm93KGQpKSoxMDBgJSB04burIERhaXJ5DQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3REZXBhcnRtZW50KVsxMV0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgRGVsaQ0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0RGVwYXJ0bWVudClbMTJdL3N1bShucm93KGQpKSoxMDBgJSB04burIEVnZ3MNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdERlcGFydG1lbnQpWzEzXS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBGcm96ZW4gRm9vZHMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdERlcGFydG1lbnQpWzE0XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBIZWFsdGggYW5kIEh5Z2llbmUNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdERlcGFydG1lbnQpWzE1XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBIb3VzZWhvbGQNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdERlcGFydG1lbnQpWzE2XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBNZWF0DQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3REZXBhcnRtZW50KVsxN10vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgUGVyaW9kaWNhbHMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdERlcGFydG1lbnQpWzE4XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBQcm9kdWNlDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3REZXBhcnRtZW50KVsxOV0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgU2VhZm9vZA0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0RGVwYXJ0bWVudClbMjBdL3N1bShucm93KGQpKSoxMDBgJSB04burIFNuYWNrIEZvb2RzDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3REZXBhcnRtZW50KVsyMV0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgU25hY2tzDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3REZXBhcnRtZW50KVsyMl0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgU3RhcmNoeSBGb29kcw0KDQojIyMjICoqMi44LjIgVHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCmxpYnJhcnkoZ2dwbG90MikNCg0KUHJvZHVjdERlcGFydG1lbnRfZGYgPC0gYXMuZGF0YS5mcmFtZShQcm9kdWN0RGVwYXJ0bWVudF9wY3QpDQpjb2xuYW1lcyhQcm9kdWN0RGVwYXJ0bWVudF9kZikgPC0gYygiUHJvZHVjdERlcGFydG1lbnQiLCAiUGVyY2VudGFnZSIpDQoNCmdncGxvdChQcm9kdWN0RGVwYXJ0bWVudF9kZiwgYWVzKHggPSByZW9yZGVyKFByb2R1Y3REZXBhcnRtZW50LCAtUGVyY2VudGFnZSksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gUHJvZHVjdERlcGFydG1lbnQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQknhu4N1IMSR4buTIDIuODogUGjDom4gcGjhu5FpIHPhuqNuIHBo4bqpbSB0acOqdSBkw7luZyB0cm9uZyBo4buZIGdpYSDEkcOsbmgiLA0KICAgIHggPSAiUHJvZHVjdCBEZXBhcnRtZW50IiwNCiAgICB5ID0gIlThu7cgbOG7hyAoJSkiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQoNCmBgYA0KDQoqKk5I4bqsTiBYw4lUOioqIELhuqNuZyAyLjggY3VuZyBj4bqlcCBjw6FpIG5ow6xuIHThu5VuZyB0aOG7gyB24buBIGPDoWNoIGPDoWMgc+G6o24gcGjhuqltIMSRxrDhu6NjIHBow6JuIHBo4buRaSB0aGVvIGPDoWMgYuG7mSBwaOG6rW4gc+G6o24gcGjhuqltIHRyb25nIGjhu5kgZ2lhIMSRw6xuaC4gQ8OzIHRo4buDIHRo4bqleSByw7Ugc+G7sSBjaMOqbmggbOG7h2NoIGzhu5tuIGdp4buvYSBjw6FjIG5ow7NtIGjDoG5nLCBwaOG6o24gw6FuaCBz4buxIMawdSB0acOqbiB0acOqdSBkw7luZyBjxaluZyBuaMawIGPGoSBj4bqldSBz4bqjbiBwaOG6qW0gcGjhu5UgYmnhur9uIHRyb25nIGjhu4cgdGjhu5FuZyBiw6FuIGzhursuDQoNCi0gICBQcm9kdWNlIChSYXUgcXXhuqMgdMawxqFpKSDEkeG7qW5nIMSR4bqndSB24bubaSAxLjk5NCBsxrDhu6N0LCBjaGnhur9tIDE0LjE4MyUgdOG7lW5nIHPhu5Egc+G6o24gcGjhuqltLCBjaG8gdGjhuqV5IHh1IGjGsOG7m25nIHRpw6p1IGTDuW5nIHRo4buxYyBwaOG6qW0gdMawxqFpIHPhu5FuZyBjaGnhur9tIMawdSB0aOG6vyB0cm9uZyBjw6FjIGjhu5kgZ2lhIMSRw6xuaC4NCg0KLSAgIFNuYWNrIEZvb2RzICjEkOG7kyDEg24gduG6t3QpIMSR4bupbmcgdGjhu6kgaGFpIHbhu5tpIDEuNjAwIHPhuqNuIHBo4bqpbSwgY2hp4bq/bSAxMS4zODElLCBwaOG6o24gw6FuaCBt4bupYyDEkeG7mSBwaOG7lSBiaeG6v24gY+G7p2EgxJHhu5MgxINuIHRp4buHbiBs4bujaSB0cm9uZyDEkeG7nWkgc+G7kW5nIGhp4buHbiDEkeG6oWkuDQoNCi0gICBIb3VzZWhvbGQgKMSQ4buTIGdpYSBk4bulbmcpIGPFqW5nIGPDsyB04bu3IGzhu4cgY2FvIHbhu5tpIDEuNDIwIHPhuqNuIHBo4bqpbSAoMTAuMTAwJSksIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgcXVhbiB0w6JtIMSR4bq/biBjw6FjIHPhuqNuIHBo4bqpbSBwaOG7pWMgduG7pSBzaW5oIGhv4bqhdCBow6BuZyBuZ8OgeS4NCg0KLSAgIEZyb3plbiBGb29kcyAoVGjhu7FjIHBo4bqpbSDEkcO0bmcgbOG6oW5oKSBjaGnhur9tIDkuODMwJSwgdGnhur9wIHThu6VjIG5o4bqlbiBt4bqhbmggeHUgaMaw4bubbmcgdGnDqnUgZMO5bmcgdGnhu4duIGzhu6NpLg0KDQotICAgUHJvZHVjZSAoMTQuMTglKSBjYW8gZ+G6pXAgXH4zNCBs4bqnbiBzbyB24bubaSBDYXJvdXNlbCAoMC40MiUpLCBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIGtow7RuZyDEkeG7k25nIMSR4buBdSBy4bqldCByw7UgZ2nhu69hIGPDoWMgbmjDs20gc+G6o24gcGjhuqltLg0KDQotICAgTmjDs20gU25hY2sgRm9vZHMgKDExLjM4JSkgY2FvIGfhuqduIDE4IGzhuqduIHNvIHbhu5tpIE1lYXQgKDAuNjMlKSDigJQgxJFp4buBdSBuw6B5IMSR4bq3dCByYSBjw6J1IGjhu49pIHbhu4Egbmh1IGPhuqd1IHRo4buxYyBwaOG6qW0gY2jhur8gYmnhur9uIHPhurVuIHRoYXkgdsOsIHTGsMahaSBz4buRbmcgdHJvbmcgbmjDs20gdGjhu4t0Lg0KDQojIyMgKioyLjkgQmnhur9uIFByb2R1Y3RDYXRlZ29yeSoqDQoNCiMjIyMgKioyLjkuMSBUaOG7kW5nIGvDqiBU4bqnbiBzdeG6pXQqKg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gVFJVRX0NClByb2R1Y3RDYXRlZ29yeV9mcmVxIDwtIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KQ0KDQpQcm9kdWN0Q2F0ZWdvcnlfcGN0IDwtIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KS9zdW0obnJvdyhkKSkqMTAwDQoNClByb2R1Y3RDYXRlZ29yeV90YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBQcm9kdWN0Q2F0ZWdvcnkgPSBuYW1lcyhQcm9kdWN0Q2F0ZWdvcnlfZnJlcSksDQogIEZyZXF1ZW5jeSA9IGFzLmludGVnZXIoUHJvZHVjdENhdGVnb3J5X2ZyZXEpLA0KICBQZXJjZW50YWdlID0gcm91bmQoUHJvZHVjdENhdGVnb3J5X3BjdCwgMykNCikNCmNvbG5hbWVzKFByb2R1Y3RDYXRlZ29yeV90YWJsZSkgPC0gYygiUHJvZHVjdENhdGVnb3J5IiwgIkZyZXF1ZW5jeSIsICJQcm9kdWN0Q2F0ZWdvcnkiLCAiUGVyY2VudGFnZSAoJSkiKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgxJHhurlwDQpQcm9kdWN0Q2F0ZWdvcnlfdGFibGUgJT4lDQogIGthYmxlKCJodG1sIiwgY2FwdGlvbiA9ICJC4bqjbmcgMi45IFBow6JuIHBo4buRaSB0aGVvIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIC0gUHJvZHVjdENhdGVnb3J5IikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQpW4bqteSB0cm9uZyBkYXRhIG7DoHkgY8OzOiAtIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVsxXS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBCYWtpbmcgR29vZHMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVsyXS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBCYXRocm9vbSBQcm9kdWN0cw0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0Q2F0ZWdvcnkpWzNdL3N1bShucm93KGQpKSoxMDBgJSB04burIEJlZXIgYW5kIFdpbmUNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVs0XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBCcmVhZA0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0Q2F0ZWdvcnkpWzVdL3N1bShucm93KGQpKSoxMDBgJSB04burIEJyZWFrZmFzdCBGb29kcw0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0Q2F0ZWdvcnkpWzZdL3N1bShucm93KGQpKSoxMDBgJSB04burIENhbmRsZXMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVs3XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBDYW5keQ0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0Q2F0ZWdvcnkpWzhdL3N1bShucm93KGQpKSoxMDBgJSB04burIENhbm5lZCBBbmNob3ZpZXMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVs5XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBDYW5uZWQgQ2xhbXMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVsxMF0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgQ2FubmVkIE95c3RlcnMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVsxMV0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgQ2FubmVkIFNhcmRpbmVzDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3RDYXRlZ29yeSlbMTJdL3N1bShucm93KGQpKSoxMDBgJSB04burIENhbm5lZCBTaHJpbXANCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVsxM10vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgQ2FubmVkIFNvdXANCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVsxNF0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgQ2FubmVkIFR1bmENCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVsxNV0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgQ2FyYm9uYXRlZCBCZXZlcmFnZXMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVsxNl0vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgQ2xlYW5pbmcgU3VwcGxpZXMNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVsxN10vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgQ29sZCBSZW1lZGllcw0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0Q2F0ZWdvcnkpWzE4XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBEYWlyeQ0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0Q2F0ZWdvcnkpWzE5XS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBEZWNvbmdlc3RhbnRzDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3RDYXRlZ29yeSlbMjBdL3N1bShucm93KGQpKSoxMDBgJSB04burIERyaW5rcw0KDQotICAgYHIgdGFibGUoZCRQcm9kdWN0Q2F0ZWdvcnkpWzIxXS9zdW0obnJvdyhkKSkqMTAwYCUgdOG7qyBFZ2dzDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3RDYXRlZ29yeSlbMjJdL3N1bShucm93KGQpKSoxMDBgJSB04burIEVsZWN0cmljYWwNCg0KLSAgIGByIHRhYmxlKGQkUHJvZHVjdENhdGVnb3J5KVsyM10vc3VtKG5yb3coZCkpKjEwMGAlIHThu6sgRnJvemVuIERlc3NlcnRzDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3RDYXRlZ29yeSlbMjRdL3N1bShucm93KGQpKSoxMDBgJSB04burIEZyb3plbiBFbnRyZWVzDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3RDYXRlZ29yeSlbMjVdL3N1bShucm93KGQpKSoxMDBgJSB04burIEZydWl0DQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3RDYXRlZ29yeSlbMjZdL3N1bShucm93KGQpKSoxMDBgJSB04burIEhhcmR3YXJlDQoNCi0gICBgciB0YWJsZShkJFByb2R1Y3RDYXRlZ29yeSlbMjddL3N1bShucm93KGQpKSoxMDBgJSB04burIEhvdCBCZXZlcmFnZXMNCg0KLSAgIFbDoCBjw6FjIHPhuqNuIHBo4bqpbSBjw7JuIGzhuqFpLi4uLi4uDQoNCiMjIyMgKioyLjkuMiBUcuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04fQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpQcm9kdWN0Q2F0ZWdvcnlfZGYgPC0gYXMuZGF0YS5mcmFtZShQcm9kdWN0Q2F0ZWdvcnlfcGN0KQ0KY29sbmFtZXMoUHJvZHVjdENhdGVnb3J5X2RmKSA8LSBjKCJQcm9kdWN0Q2F0ZWdvcnkiLCAiUGVyY2VudGFnZSIpDQoNCmdncGxvdChQcm9kdWN0Q2F0ZWdvcnlfZGYsIGFlcyh4ID0gcmVvcmRlcihQcm9kdWN0Q2F0ZWdvcnksIC1QZXJjZW50YWdlKSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBQcm9kdWN0Q2F0ZWdvcnkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIDIuOTogUGjDom4gcGjhu5FpIG3hu6VjIHPhuqNuIHBo4bqpbSB0acOqdSBkw7luZyBwaOG7lSBiaeG6v24iLA0KICAgIHggPSAiUHJvZHVjdCBDYXRlZ29yeSIsDQogICAgeSA9ICJQZXJjZW50YWdlICglKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpIA0KYGBgDQoNCioqTkjhuqxOIFjDiVQ6KioNCg0KLSAgIFZlZ2V0YWJsZXMgKFJhdSBj4bunKSBsw6AgZGFuaCBt4bulYyBjaGnhur9tIHThu7cgdHLhu41uZyBjYW8gbmjhuqV0LCB24bubaSAxLjcyOCBsxrDhu6N0IG11YSwgdMawxqFuZyDEkcawxqFuZyAxMi4yOTElIHThu5VuZyBz4buRIHPhuqNuIHBo4bqpbS4gU25hY2sgRm9vZHMgKMSQ4buTIMSDbiB24bq3dCkgxJHhu6luZyB0aOG7qSBoYWkgduG7m2kgMS42MDAgbMaw4bujdCwgY2hp4bq/bSAxMS4zODElLg0KDQotICAgRGFpcnkgKFPhuqNuIHBo4bqpbSB04burIHPhu69hKSB24bubaSA5MDMgbMaw4bujdCwgdMawxqFuZyDhu6luZyA2LjQyMyUsIGNobyB0aOG6pXkgxJHDonkgbMOgIG5ow7NtIHRoaeG6v3QgeeG6v3UgdsOgIMSRxrDhu6NjIG11YSB0aMaw4budbmcgeHV5w6puLiBGcnVpdCAoVHLDoWkgY8OieSkgdsOgIE1lYXQgKFRo4buLdCkgbOG6p24gbMaw4bujdCBjaGnhur9tIDUuNDQxJSB2w6AgNS40MTMlLCB0aeG6v3AgdOG7pWMga2jhurNuZyDEkeG7i25oIHZhaSB0csOyIHF1YW4gdHLhu41uZyBj4bunYSB0aOG7sWMgcGjhuqltIHTGsMahaSB0cm9uZyBjaGkgdGnDqnUgY+G7p2EgY8OhYyBo4buZLg0KDQotICAgQ8OhYyBuaMOzbSBuaMawIENhbmRsZXMgKE7hur9uKSwgTWlzY2VsbGFuZW91cyAoS2jDoWMpLCB2w6AgY8OhYyBsb+G6oWkgdGjhu6d5IGjhuqNpIHPhuqNuIMSRw7NuZyBo4buZcCBuaMawIENhbm5lZCBBbmNob3ZpZXMsIE95c3RlcnMsIFNocmltcCwgY2jhu4kgY2hp4bq/bSBkxrDhu5tpIDAuMzUlIG3hu5dpIGxv4bqhaS4NCg0KLSAgIENhbm5lZCBTYXJkaW5lcywgQ2xhbXMsIHbDoCBjw6FjIHPhuqNuIHBo4bqpbSBwaOG7pSBraMOhYyBjxaluZyBjw7MgdOG6p24gc3XhuqV0IHLhuqV0IHRo4bqlcCwgY2hvIHRo4bqleSBt4bupYyDEkeG7mSDGsHUgdGnDqm4gdGnDqnUgZMO5bmcga2jDtG5nIGNhbywgY8OzIHRo4buDIGzDoCB2w6wgbmh1IGPhuqd1IHPhu60gZOG7pW5nIHRo4bqlcCBob+G6t2Mga2jDtG5nIHBo4buVIGJp4bq/biB0cm9uZyB0aMOzaSBxdWVuIHRpw6p1IGTDuW5nLg0KDQojIyMgKioyLjEwIEFubnVhbEluY29tZSoqDQoNCiMjIyMgKioyLjEwLjEgVGjhu5FuZyBrw6ogVOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpBbm51YWxJbmNvbWVfZnJlcSA8LSB0YWJsZShkJEFubnVhbEluY29tZSkNCg0KQW5udWFsSW5jb21lX3BjdCA8LSB0YWJsZShkJEFubnVhbEluY29tZSkvc3VtKG5yb3coZCkpKjEwMA0KDQpBbm51YWxJbmNvbWVfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgQW5udWFsSW5jb21lID0gbmFtZXMoQW5udWFsSW5jb21lX2ZyZXEpLA0KICBGcmVxdWVuY3kgPSBhcy5pbnRlZ2VyKEFubnVhbEluY29tZV9mcmVxKSwNCiAgUGVyY2VudGFnZSA9IHJvdW5kKEFubnVhbEluY29tZV9wY3QsIDMpDQopDQpjb2xuYW1lcyhBbm51YWxJbmNvbWVfdGFibGUpIDwtIGMoIkFubnVhbEluY29tZSIsICJGcmVxdWVuY3kiLCAiQW5udWFsSW5jb21lIiwgIlBlcmNlbnRhZ2UgKCUpIikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIMSR4bq5cA0KQW5udWFsSW5jb21lX3RhYmxlJT4lDQogIGthYmxlKCJodG1sIiwgY2FwdGlvbiA9ICJC4bqjbmcgMi4xMCBQaMOibiBwaOG7kWkgdGhlbyBraG/huqNuZyB0aHUgbmjhuq1wIC0gQW5udWFsSW5jb21lIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQojIyMjICoqMi4xMC4yIFRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCkFubnVhbEluY29tZV9kZiA8LSBhcy5kYXRhLmZyYW1lKEFubnVhbEluY29tZV9wY3QpDQpjb2xuYW1lcyhBbm51YWxJbmNvbWVfZGYpIDwtIGMoIkFubnVhbEluY29tZSIsICJQZXJjZW50YWdlIikNCg0KZ2dwbG90KEFubnVhbEluY29tZV9kZiwgYWVzKHggPSByZW9yZGVyKEFubnVhbEluY29tZSwgLVBlcmNlbnRhZ2UpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IEFubnVhbEluY29tZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgMi4xMDogUGjDom4gcGjhu5FpIGPDoWMgbmjDs20gdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCIsDQogICAgeCA9ICJBbm51YWwgSW5jb21lIiwNCiAgICB5ID0gIlBlcmNlbnRhZ2UgKCUpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQoqKk5I4bqsTiBYw4lUOioqDQoNCi0gICBLaG/huqNuZyBjw6FjaCBs4bubbiBuaOG6pXQgbMOgIGdp4buvYSBuaMOzbSB0aHUgbmjhuq1wIHBo4buVIGJp4bq/biBuaOG6pXQgKDMwS+KIkjUwSykgdsOgIG5ow7NtIHRodSBuaOG6rXAgY2FvIG5o4bqldCAoXCQxNTBLKykgduG7m2kgY2jDqm5oIGzhu4djaCBsw6puIMSR4bq/biBn4bqnbiAzMSUgxJFp4buDbSBwaOG6p24gdHLEg20uDQoNCi0gICBDw6FjIG5ow7NtIHRodSBuaOG6rXAgY2FvIGjGoW4gOTBLIChiYW8gZ+G7k20gOTBL4oiSMTEwSywgMTEwS+KIkjEzMEssIDEzMEviiJIxNTBLLCB2w6AgXCQxNTBLKykgxJHhu4F1IGPDsyB04bu3IGzhu4cgdGjhuqVwIGjGoW4gbmjDs20gdHJ1bmcgYsOsbmggMzBL4oiSNTBLIMOtdCBuaOG6pXQga2hv4bqjbmcgMjclIMSRaeG7g20gcGjhuqduIHRyxINtLg0KDQotICAgU+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIG5ow7NtIHRodSBuaOG6rXAgdGjhuqVwICgxMEviiJIzMEspIHbDoCBuaMOzbSB0cnVuZyBiw6xuaCAoMzBL4oiSNTBLKSBsw6Aga2hv4bqjbmcgMTAuNyUsIGPFqW5nIMSRw6FuZyBr4buDIG5oxrBuZyBuaOG7jyBoxqFuIG5oaeG7gXUgc28gduG7m2kga2hv4bqjbmcgY8OhY2ggZ2nhu69hIG5ow7NtIHRydW5nIGLDrG5oIHbDoCBuaMOzbSBjYW8uDQoNCi0gICBLaG/huqNuZyBjw6FjaCBjaMOqbmggbOG7h2NoIG7DoHkgdGjhu4MgaGnhu4duIG3hu5l0IGLhu6ljIHRyYW5oIGtow6EgcsO1IHbhu4Egc+G7sSBwaMOibiBow7NhIHRodSBuaOG6rXAgdHJvbmcgY+G7mW5nIMSR4buTbmc6IHBo4bqnbiDEkcO0bmcgbmfGsOG7nWkgZMOibiB04bqtcCB0cnVuZyDhu58gbmjDs20gdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCB0aOG6pXAsIHRyb25nIGtoaSBz4buRIG5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIHLhuqV0IGNhbyBsw6AgcuG6pXQgw610LCB04bqhbyByYSBt4buZdCBz4buxIHBow6JuIGLhu5Ega2jDtG5nIMSR4buTbmcgxJHhu4F1LCB24bubaSBz4buxIGtow6FjIGJp4buHdCBy4bqldCBs4bubbiBnaeG7r2EgY8OhYyBuaMOzbSB0aHUgbmjhuq1wLg0KDQojIyAqKlBI4bqmTiAzOsav4buaQyBMxq/hu6JORyBLSE/huqJORyBWw4AgS0nhu4JNIMSQ4buKTkggR0nhuqIgVEhVWeG6vlQgQ0hPIFThu7YgTOG7hiAoTeG7mFQgQknhur5OKSoqDQoNCkdp4bqjIHPhu60gJFogXHNpbSBOKDAsMSkkIChiaeG6v24gbmfhuqt1IG5oacOqbiBjaHXhuqluIHThuq9jIGNodeG6qW4pLCB2w6AgJHAkIGzDoCBt4buZdCBz4buRIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMCDEkeG6v24gMS4NCg0KR2nDoSB0cuG7iyB04bubaSBo4bqhbiB6IChjcml0aWNhbCB6LXZhbHVlKSAkel9wJCBsw6Agc+G7kSB0aOG7j2EgbcOjbjoNCg0KJCQNClAoWiA+IHpfcCkgPSAxIC0gXFBoaSh6X3ApID0gcA0KJCQNCg0KVHJvbmcgxJHDsywgJFxQaGkoel9wKSQgbMOgIGjDoG0gcGjDom4gcGjhu5FpIHTDrWNoIGzFqXkgKENERikgY+G7p2EgcGjDom4gcGjhu5FpIGNodeG6qW4uDQoNCioqS2hv4bqjbmcgdGluIGPhuq15IGNobyB04bu3IGzhu4cgKHByb3BvcnRpb24pOioqDQoNCmBgYHtyfQ0KIyBGdW5jdGlvbg0KcHJvcDEuaW50ZXJ2YWwgPC0gZnVuY3Rpb24oeCxuLGNvbmYubGV2ZWwpICMgZnVuY3Rpb24gb2YgMS1wcm9wb3J0aW9uIENJIGZvciBwDQp7DQpwIDwtIHgvbg0Kei5jcml0IDwtIC0xKnFub3JtKCgxLWNvbmYubGV2ZWwpLzIpDQptYXJnaW4uZXJyb3IgPC0gei5jcml0KnNxcnQocCooMS1wKS9uKQ0KY2kubG93ZXIgPC0gcCAtIG1hcmdpbi5lcnJvcg0KY2kudXBwZXIgPC0gcCArIG1hcmdpbi5lcnJvcg0KZGF0IDwtIGMocCwgei5jcml0LCBtYXJnaW4uZXJyb3IsIGNpLmxvd2VyLCBjaS51cHBlcikNCm5hbWVzKGRhdCkgPC0gYygiTWVhbiIsICJDcml0aWNhbCBWYWx1ZSIsICJNYXJnaW4gb2YgRXJyb3IiLCAiQ0kgbG93ZXIiLCAiQ0kgdXBwZXIiKQ0KcmV0dXJuKGRhdCkNCn0NCmBgYA0KDQpHaeG6oyBz4butOg0KDQotICAgJHgkOiBz4buRIGzhuqduIHRow6BuaCBjw7RuZyB0cm9uZyAkbiQgbOG6p24gdGjhu60gbmdoaeG7h20gQmVybm91bGxpIChjw7MgeMOhYyBzdeG6pXQgdGjDoG5oIGPDtG5nIGNoxrBhIGJp4bq/dCBsw6AgJHAkKSwNCi0gICAkXGhhdHtwfSA9IFxmcmFje3h9e259JDogdOG7tyBs4buHIG3huqt1IChzYW1wbGUgcHJvcG9ydGlvbiksDQotICAgJFxhbHBoYSBcaW4gKDAsMSkkOiBt4bupYyDDvSBuZ2jEqWEgKHNpZ25pZmljYW5jZSBsZXZlbCksIHbDrSBk4bulICRcYWxwaGEgPSAwLjA1JCBjaG8ga2hv4bqjbmcgdGluIGPhuq15IDk1JS4NCg0KS2hv4bqjbmcgdGluIGPhuq15IDEwMCgx4oiSzrEpJSBjaG8gdOG7tyBs4buHICRwJCBsw6A6DQoNCiQkDQpcaGF0e3B9IFxwbSB6X3tcYWxwaGEvMn0gXGNkb3QgXHNxcnR7XGZyYWN7XGhhdHtwfSgxLVxoYXR7cH0pfXtufX0NCiQkDQoNClThu6ljIGzDoDoNCg0KJCQNClxsZWZ0Ww0KXGhhdHtwfSAtIHpfe1xhbHBoYS8yfSBcY2RvdCBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fSwgXHF1YWQNClxoYXR7cH0gKyB6X3tcYWxwaGEvMn0gXGNkb3QgXHNxcnR7XGZyYWN7XGhhdHtwfSgxLVxoYXR7cH0pfXtufX0NClxyaWdodF0NCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gICAkRSA9IHpfe1xhbHBoYS8yfSBcY2RvdCBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fSQ6IGzDoCBiacOqbiBzYWkgc+G7kSAobWFyZ2luIG9mIGVycm9yKSwNCi0gICAkXHNxcnR7XGZyYWN7XGhhdHtwfSgxLVxoYXR7cH0pfXtufX0kOiBsw6AgxJHhu5kgbOG7h2NoIGNodeG6qW4gY+G7p2EgdOG7tyBs4buHIG3huqt1IChzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHByb3BvcnRpb24pLg0KDQoqKkPDoWMgZOG6oW5nIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IGNobyB04bu3IGzhu4cqKg0KDQp8ICoqS2nhu4N1IGtp4buDbSDEkeG7i25oKiogfCAqKkdp4bqjIHRodXnhur90IGtow7RuZyAoSOKCgCkqKiB8ICoqR2nhuqMgdGh1eeG6v3QgxJHhu5FpIChI4oKQKSoqIHwgKipUw6puIGtp4buDbSDEkeG7i25oKiogfCAqKsOdIG5naMSpYSBraW5oIHThur8gbMaw4bujbmcqKiB8DQp8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwNCnwgSGFpIHBow61hIChUd28tc2lkZWQpIHwgJHAgPSBwXzAkIHwgJHAgXG5lIHBfMCQgfCBLaeG7g20gxJHhu4tuaCBoYWkgcGjDrWEgfCBLaeG7g20gdHJhIHhlbSB04bu3IGzhu4cgcXVhbiBzw6F0IGPDsyBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBzbyB24bubaSBnacOhIHRy4buLIGdp4bqjIMSR4buLbmggJHBfMCQuIHwNCnwgTeG7mXQgcGjDrWEsIHBow61hIHRyw6puIHwgJHAgPSBwXzAkIHwgJHAgPiBwXzAkIHwgS2nhu4NtIMSR4buLbmggbeG7mXQgcGjDrWEgKHBo4bqnbiDEkXXDtGkgdHLDqm4pIHwgS2nhu4NtIHRyYSB4ZW0gdOG7tyBs4buHIHF1YW4gc8OhdCBjw7MgbOG7m24gaMahbiBt4buZdCBjw6FjaCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHNvIHbhu5tpICRwXzAkLiB8DQp8IE3hu5l0IHBow61hLCBwaMOtYSBkxrDhu5tpIHwgJHAgPSBwXzAkIHwgJHAgPCBwXzAkIHwgS2nhu4NtIMSR4buLbmggbeG7mXQgcGjDrWEgKHBo4bqnbiDEkXXDtGkgZMaw4bubaSkgfCBLaeG7g20gdHJhIHhlbSB04bu3IGzhu4cgcXVhbiBzw6F0IGPDsyB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBnacOhIHRy4buLIGvhu7MgduG7jW5nICRwXzAkLiB8DQoNCiMjIyAqKjMuMSBQcm9kdWN0RmFtaWx5LUZvb2QqKg0KDQojIyMjICoqMy4xLjEgxq/hu5tjIGzGsOG7o25nIEtob+G6o25nIFRpbiBj4bqteToqKg0KDQpgYGB7cn0NCiMgU+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gdGh14buZYyBuaMOzbSAiRm9vZCINCnhGb29kIDwtIHN1bShkJFByb2R1Y3RGYW1pbHkgPT0gIkZvb2QiKQ0KIyDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JQ0KcHJvcDEuaW50ZXJ2YWwoeEZvb2QsbnJvdyhkKSwwLjk1KSAjIDEtcHJvcG9ydGlvbiA5NSUgQ0kgZm9yIHANCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCi0gICBLaG/huqNuZyA3Mi4yMiUgY8OhYyBz4bqjbiBwaOG6qW0gdHJvbmcgdOG7lW5nIHRo4buDIHRodeG7mWMgbmjDs20gRm9vZC4NCg0KLSAgIEtob+G6o25nIHRpbiBj4bqteSDEkcaw4bujYyB0w61uaCBjaG8gdOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5ow7NtIEZvb2QgdHJvbmcgdOG7lW5nIHRo4buDIGRhbyDEkeG7mW5nIHThu6sga2hv4bqjbmcgNzEuNDglIMSR4bq/biA3Mi45NiUuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBu4bq/dSB0YSBs4bqleSBuaGnhu4F1IG3huqt1IG5n4bqrdSBuaGnDqm4gdOG7qyB04buVbmcgdGjhu4MgbsOgeSwgdGjDrCBraG/huqNuZyA5NSUgY8OhYyBraG/huqNuZyB0aW4gY+G6rXkgxJHGsOG7o2MgeMOieSBk4buxbmcgdOG7qyBjw6FjIG3huqt1IMSRw7Mgc+G6vSBjaOG7qWEgdOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5ow7NtIEZvb2QuDQoNCi0gICBCacOqbiBzYWkgc+G7kSBraG/huqNuZyAwLjc0JSBy4bqldCBuaOG7jywgY2hvIHRo4bqleSDGsOG7m2MgbMaw4bujbmcgdOG7tyBs4buHIG7DoHkgcuG6pXQgY2jDrW5oIHjDoWMuDQoNCiMjIyMgKiozLjEuMiBLaeG7g20gxJHhu4tuaCBHaeG6oyB0aHV54bq/dDoqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXDsgcCA9IDAuNyBccXVhZCBcdGV4dHsoVOG7tyBs4buHIHPhuqNuIHBo4bqpbSB0aHXhu5ljIGRhbmggbeG7pWMgRm9vZCB0cm9uZyB04buVbmcgdGjhu4MgbMOgIMSRw7puZyA3MCUpfSBcXCANCkhfMTogXDsgcCBcbmUgMC43IFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgc+G6o24gcGjhuqltIEZvb2Qga2jDoWMgNzAlLCBjw7MgdGjhu4MgY2FvIGjGoW4gaG/hurdjIHRo4bqlcCBoxqFuKX0NClxlbmR7YXJyYXl9DQpccmlnaHQuJCQNCg0KYGBge3J9DQpwcm9wLnRlc3QoeD14Rm9vZCwgbj1ucm93KGQpLCBwPTAuNywgY29ycmVjdD1GQUxTRSkNCg0KYGBgDQoNClbhu5tpIHAtdmFsdWUgPSA5LjY2M2UtMDkgbmjhu48gaMahbiBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYSA9IDUkJSAsIHRhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMDogcCA9IDAuNyQuIEPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu4kgbOG7hyBz4bqjbiBwaOG6qW0gdGh14buZYyBkYW5oIG3hu6VjIEZvb2QgdHJvbmcgdOG7lW5nIHRo4buDIGtow7RuZyBwaOG6o2kgY2jDrW5oIHjDoWMgNzAlIG3DoCB0aOG7sWMgdOG6vyBjYW8gaMahbiBt4buZdCBjaMO6dCwga2hv4bqjbmcgdOG7qyA3MS40NyUgxJHhur9uIDcyLjk1JS4gxJBp4buBdSBuw6B5IGdpw7pwIGRvYW5oIG5naGnhu4dwIGhp4buDdSByw7UgaMahbiB24buBIHBow6JuIGLhu5Egc+G6o24gcGjhuqltIHRyb25nIGRhbmggbeG7pWMgRm9vZCwgdOG7qyDEkcOzIGPDsyB0aOG7gyDEkWnhu4F1IGNo4buJbmggY2hp4bq/biBsxrDhu6NjIGtpbmggZG9hbmggaG/hurdjIHF14bqjbiBsw70gaMOgbmcgaMOzYSBwaMO5IGjhu6NwIHbhu5tpIHRo4buxYyB04bq/IGjGoW4uDQoNCiMjIyAqKjMuMiBDb3VudHJ5LVVTQSoqDQoNCiMjIyMgKiozLjIuMSDGr+G7m2MgbMaw4bujbmcgS2hv4bqjbmcgVGluIGPhuq15OioqDQoNCmBgYHtyfQ0KIyBT4buRIGzGsOG7o25nICBuaMOzbSAiVVNBIg0KeFVTQSA8LSBzdW0oZCRDb3VudHJ5ID09ICJVU0EiKQ0KIyDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JQ0KcHJvcDEuaW50ZXJ2YWwoeFVTQSxucm93KGQpLDAuOTUpICMgMS1wcm9wb3J0aW9uIDk1JSBDSSBmb3IgcA0KYGBgDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIHThu7cgbOG7hyBt4bqrdSBjaG8gYmnhur9uICoqQ291bnRyeSA9IFVTQSoqIGNobyB0aOG6pXk6DQoNCi0gICBU4bu3IGzhu4cgbeG6q3UgKE1lYW4pIGzDoCAqKjAuNjgwMSoqLCB04bupYyBraG/huqNuZyA2OC4wMSUgdHJvbmcgbeG6q3UgdGh14buZYyB24buBIG7GsOG7m2MgTeG7uS4NCi0gICBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbsOgeSBsw6AgdOG7qyAqKjY3LjI0JSDEkeG6v24gNjguNzglKiogKENJIGxvd2VyID0gMC42NzI0LCBDSSB1cHBlciA9IDAuNjg3OCkuDQotICAgR2nDoSB0cuG7iyB04bubaSBo4bqhbiAoQ3JpdGljYWwgVmFsdWUpIGTDuW5nIHRyb25nIHTDrW5oIHRvw6FuIGtob+G6o25nIHRpbiBj4bqteSBsw6AgKioxLjk2KiouDQotICAgQmnDqm4gc2FpIHPhu5EgKE1hcmdpbiBvZiBFcnJvcikgbMOgICoqMC4wMDc3KiouDQoNCsOdIG5naMSpYSBraW5oIHThur8gbMaw4bujbmc6XA0KS2hv4bqjbmcgdGluIGPhuq15IGNobyB0aOG6pXkgdOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIGPDoWMgcXVhbiBzw6F0IHRodeG7mWMgcXXhu5FjIGdpYSBN4bu5IHRyb25nIHThu5VuZyB0aOG7gyBy4bqldCBjw7MgdGjhu4MgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA2Ny4yNCUgxJHhur9uIDY4Ljc4JSB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLiDEkGnhu4F1IG7DoHkgZ2nDunAgY2jDum5nIHRhIGhp4buDdSByw7UgaMahbiB24buBIMSR4bq3YyDEkWnhu4NtIHBow6JuIGLhu5EgbeG6q3UgdGhlbyBxdeG7kWMgZ2lhIHbDoCBo4buXIHRy4bujIHZp4buHYyByYSBxdXnhur90IMSR4buLbmggaG/hurdjIHBow6JuIHTDrWNoIHPDonUgaMahbiB24buBIMSR4bq3YyB0csawbmcgY+G7p2EgdOG7q25nIG5ow7NtIHRyb25nIGThu68gbGnhu4d1Lg0KDQojIyMjICoqMy4yLjIgS2nhu4NtIMSR4buLbmggR2nhuqMgdGh1eeG6v3Q6KioNCg0KQsOgaSB0b8OhbiBjw7MgZ2nhuqMgdGh1eeG6v3QgbmjGsCBzYXU6ICQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2x9DQpIXzA6IFw7IHAgPSAwLjY3NSBccXVhZCBcdGV4dHsoVOG7tyBs4buHIG5nxrDhu51pIGTDom4gxJHhu4tuaCBjxrAgdOG6oWkgTeG7uSBsw6AgIDY3LjUlKX0gXFwgDQpIXzE6IFw7IHAgPiAwLjY3NSBccXVhZCBcdGV4dHsoVOG7tyBs4buHIG5nxrDhu51pIGTDom4gxJHhu4tuaCBjxrAgdOG6oWkgTeG7uSBjIGFvIGjGoW4gNjcuNSUpfQ0KXGVuZHthcnJheX0NClxyaWdodC4kJA0KDQpgYGB7cn0NCnByb3AudGVzdCh4PXhVU0EsIG49bnJvdyhkKSwgcD0wLjY3NSxhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgY29ycmVjdD1GQUxTRSkNCg0KYGBgDQoNClbhu5tpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhID0gMC4wNSQsIHRhIHRo4bqleSAkcFx0ZXh0ey12YWx1ZX0gPSAwLjA5Njg3ID4gMC4wNSQsIG7Dqm4ga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgJEhfMDogcCA9IDAuNjc1JC4NCg0KxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGThu68gbGnhu4d1IGNobyB0aOG6pXkgdOG7iSBs4buHIHPhuqNuIHBo4bqpbSB0aHXhu5ljIG3hu6VjICJVU0EiIHRyb25nIHThu5VuZyB0aOG7gyBsw6AgNjcuNSUgbeG7mXQgY8OhY2ggY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSwgZMO5IHThu7cgbOG7hyBt4bqrdSBsw6Aga2hv4bqjbmcgNjglLCBjaMO6bmcgdGEgY8OzIHRo4buDIGNo4bqvYyBjaOG6r24gcuG6sW5nIHThu7cgbOG7hyB0aOG7sWMgc+G7sSB0cm9uZyB04buVbmcgdGjhu4MgeOG6pXAgeOG7iSA2Ny41JS4gxJBp4buBdSBuw6B5IGfhu6NpIMO9IHLhurFuZyBjw6FjIHF1eeG6v3QgxJHhu4tuaCBob+G6t2MgY2jDrW5oIHPDoWNoIGThu7FhIHRyw6puIGdp4bqjIMSR4buLbmggdOG7tyBs4buHIG7DoHkgY2FvIGjGoW4gbeG7qWMgNjcuNSUgY+G6p24gxJHGsOG7o2MgeGVtIHjDqXQgbOG6oWkgaG/hurdjIHRodSB0aOG6rXAgdGjDqm0gZOG7ryBsaeG7h3UgxJHhu4MgY8OzIGvhur90IGx14bqtbiBjaOG6r2MgY2jhuq9uIGjGoW4uDQoNCiMjIyAqKjMuMyBBbm51YWxJbmNvbWUtXCQ3MEsgLSBcJDkwSyoqDQoNCiMjIyMgKiozLjMuMSDGr+G7m2MgbMaw4bujbmcgS2hv4bqjbmcgVGluIGPhuq15OioqDQoNCmBgYHtyfQ0KIyBT4buRIGzGsOG7o25nICBuaMOzbSB0aGh1IG5o4bqtcCAiJDcwSyAtICQ5MEsiDQp4NzA5MCA8LSBzdW0oZCRBbm51YWxJbmNvbWUgPT0gIiQ3MEsgLSAkOTBLIikNCiMgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUNCnByb3AxLmludGVydmFsKHg3MDkwLG5yb3coZCksMC45NSkgIyAxLXByb3BvcnRpb24gOTUlIENJIGZvciBwDQpgYGANCg0KLSAgICoqVOG7tyBs4buHIG3huqt1IDEyLjE2JSoqIGNobyB0aOG6pXkga2hv4bqjbmcgaMahbiAxMiUgZMOibiBz4buRIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IHRodeG7mWMgbmjDs20gdGh1IG5o4bqtcCB04burIFwkNzBLIMSR4bq/biBcJDkwSy4gxJDDonkgbMOgIG5ow7NtIHRodSBuaOG6rXAgdHJ1bmcgYsOsbmgga2jDoSB0cm9uZyBwaMOibiBi4buRIHRodSBuaOG6rXAgY+G7p2EgbeG6q3UuDQoNCi0gICAqKktob+G6o25nIHRpbiBj4bqteSA5NSUgWzExLjYyJSwgMTIuNzAlXSoqIHRo4buDIGhp4buHbiBy4bqxbmcgbuG6v3UgdGjhu7FjIGhp4buHbiBuaGnhu4F1IGzhuqduIGto4bqjbyBzw6F0IHTGsMahbmcgdOG7sSwgdGjDrCBraG/huqNuZyA5NSUgY8OhYyBraG/huqNuZyB0aW4gY+G6rXkgxrDhu5tjIGzGsOG7o25nIHPhur0gY2jhu6lhIGdpw6EgdHLhu4sgdOG7tyBs4buHIHRo4buxYyBz4buxIGPhu6dhIG5ow7NtIHRodSBuaOG6rXAgbsOgeSB0cm9uZyB04buVbmcgdGjhu4MuIEtob+G6o25nIHRpbiBj4bqteSBo4bq5cCBjaG8gdGjhuqV5IHPhu7EgY2jDrW5oIHjDoWMgdsOgIMSR4buZIHRpbiBj4bqteSBjYW8gY+G7p2EgxrDhu5tjIGzGsOG7o25nLg0KDQotICAgKipCacOqbiBzYWkgc+G7kSDCsTAuNTQlKiogY2hvIHRo4bqleSBt4bupYyBkYW8gxJHhu5luZyBjw7MgdGjhu4MgY8OzIGPhu6dhIHThu7cgbOG7hyBt4bqrdSBzbyB24bubaSB04bu3IGzhu4cgdGjhu7FjLCB0xrDGoW5nIMSR4buRaSBuaOG7jywgY2jhu6luZyB04buPIG3huqt1IMSR4bunIGzhu5tuIHbDoCDEkeG6oWkgZGnhu4duIHThu5F0Lg0KDQojIyMjICoqMy4zLjIgS2nhu4NtIMSR4buLbmggR2nhuqMgdGh1eeG6v3Q6KioNCg0KQsOgaSB0b8OhbiBjw7MgZ2nhuqMgdGh1eeG6v3QgbmjGsCBzYXU6ICQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2x9DQpIXzA6IFw7IHAgPSAwLjExIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgY8OhIG5ow6JuIGPDsyB0aHUgbmjhuq1wIHThu6sga2hv4bqjbmcgNzBLLTkwSyBsw6AgIDExJSl9IFxcIA0KSF8xOiBcOyBwID4gMC4xMSBccXVhZCBcdGV4dHsoVOG7tyBs4buHIGPDoSBuaMOibiBjw7MgdGh1IG5o4bqtcCBjYW8gaMahbiBraG/huqNuZyA3MEstOTBLIGzDoDExJSl9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0LiQkDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KHg9eDcwOTAsIG49bnJvdyhkKSwgcD0wLjExLGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBjb3JyZWN0PUZBTFNFKQ0KDQpgYGANCg0KLSAgIFbhu5tpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhID0gMC4wNSQsIGdpw6EgdHLhu4sgJHAkLXZhbHVlIHLhuqV0IG5o4buPICgwLjAwMDAwNTkyNCkgbmjhu48gaMahbiBt4bupYyAkXGFscGhhJCwgbsOqbiBjaMO6bmcgdGEgY8OzIGLhurFuZyBjaOG7qW5nIMSR4bqneSDEkeG7pyDEkeG7gyAqKmLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcqKiAkSF8wOiBwID0gMC4xMSQuDQoNCi0gICDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgdOG7tyBs4buHIGPDoSBuaMOibiBjw7MgdGh1IG5o4bqtcCB04burIGtob+G6o25nIFwkNzBLIC0gXCQ5MEsgdHJvbmcgdOG7lW5nIHRo4buDICoqY2FvIGjGoW4gMTElKiogbeG7mXQgY8OhY2ggY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gS2hv4bqjbmcgdGluIGPhuq15IGPFqW5nIGNobyB0aOG6pXkgdOG7tyBs4buHIHRo4buxYyB04bq/IG7hurFtIHRyb25nIGtob+G6o25nIHThu6sga2hv4bqjbmcgMTEuNyUgdHLhu58gbMOqbi4NCg0KLSAgIEvhur90IHF14bqjIG7DoHkgY2hvIHRo4bqleSBuaMOzbSBjw6EgbmjDom4gY8OzIHRodSBuaOG6rXAgdOG7qyBcJDcwSyDEkeG6v24gXCQ5MEsgY2hp4bq/bSB04bu3IGzhu4cgdGjhu7FjIHPhu7EgY2FvIGjGoW4gZ2nhuqMgxJHhu4tuaCBiYW4gxJHhuqd1IDExJSwgcGjhuqNuIMOhbmggc+G7sSBwaMOibiBi4buRIHRodSBuaOG6rXAgdOG6rXAgdHJ1bmcgbmhp4buBdSBoxqFuIOG7nyBuaMOzbSB0aHUgbmjhuq1wIG7DoHkuDQoNCi0gICBUaMO0bmcgdGluIG7DoHkgY8OzIHRo4buDIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIGPDoWMgbcO0IGjDrG5oIHBow6JuIHTDrWNoIOG6o25oIGjGsOG7n25nIGPhu6dhIHRodSBuaOG6rXAgxJHhur9uIGPDoWMgYmnhur9uIGtpbmggdOG6vyAtIHjDoyBo4buZaSBraMOhYywgaGF5IHRyb25nIGNow61uaCBzw6FjaCBwaMOhdCB0cmnhu4NuIGtpbmggdOG6vyBuaOG6sW0gaOG7lyB0cuG7oyBuaMOzbSB0aHUgbmjhuq1wIHRydW5nIGLDrG5oIGtow6EuDQoNCiMjIyAqKjMuNCBTdGF0ZW9yUHJvdmluY2UtV0EqKg0KDQojIyMjICoqMy40LjEgxq/hu5tjIGzGsOG7o25nIEtob+G6o25nIFRpbiBj4bqteToqKg0KDQpgYGB7cn0NCiMgU+G7kSBsxrDhu6NuZyAgxJHhu4tuaCBjxrAgdOG6oWkgICJXQSINCnhXQSA8LSBzdW0oZCRTdGF0ZW9yUHJvdmluY2UgPT0gIldBIikNCiMgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUNCnByb3AxLmludGVydmFsKHhXQSxucm93KGQpLDAuOTUpICMgMS1wcm9wb3J0aW9uIDk1JSBDSSBmb3IgcA0KYGBgDQoNCi0gICBU4bu3IGzhu4cgbeG6q3UgY+G7p2EgbmjDs20gV0EgdHJvbmcgdOG7lW5nIHRo4buDIGzDoCBraG/huqNuZyAzMi40OCUuDQoNCi0gICBW4bubaSBiacOqbiBzYWkgc+G7kSAwLjAwNzc0LCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbmjDs20gV0EgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAzMS43MSUgxJHhur9uIDMzLjI2JS4NCg0KLSAgIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCwgbuG6v3UgdGEgbOG6pXkgbmhp4buBdSBt4bqrdSBraMOhYyBuaGF1IHThu6sgdOG7lW5nIHRo4buDLCBraG/huqNuZyA5NSUgY8OhYyBraG/huqNuZyB0aW4gY+G6rXkgdGh1IMSRxrDhu6NjIHPhur0gY2jhu6lhIHThu7cgbOG7hyB0aOG7sWMgc+G7sSBj4bunYSBuaMOzbSBXQSB0cm9uZyB04buVbmcgdGjhu4MuDQoNCi0gICBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IG5ow7NtIFdBIGNoaeG6v20ga2hv4bqjbmcgbeG7mXQgcGjhuqduIGJhIHThu5VuZyBz4buRIHRyb25nIGJp4bq/biBgU3RhdGVvclByb3ZpbmNlYCB24bubaSDEkeG7mSB0aW4gY+G6rXkgY2FvLg0KDQojIyMjICoqMy40LjIgS2nhu4NtIMSR4buLbmggR2nhuqMgdGh1eeG6v3Q6KioNCg0KQsOgaSB0b8OhbiBjw7MgZ2nhuqMgdGh1eeG6v3QgbmjGsCBzYXU6ICQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2x9DQpIXzA6IFw7IHAgPSAwLjMyIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgxJHhu4tuaCBjxrAgdOG6oWkgV0EgbMOgIDMyJSl9IFxcIA0KSF8xOiBcOyBwIFxuZSAwLjMyIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgxJHhu4tuaCBjxrAgdOG6oWkgV0Ega2jDoWMgMzIpfQ0KXGVuZHthcnJheX0NClxyaWdodC4kJA0KDQpgYGB7cn0NCnByb3AudGVzdCh4PXhXQSwgbj1ucm93KGQpLCBwPTAuMzIsIGNvcnJlY3Q9RkFMU0UpDQoNCmBgYA0KDQotICAgVuG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGEgPSAwLjA1JCwgdGEgdGjhuqV5IHLhurFuZzogJHBcdGV4dHstdmFsdWV9ID0gMC4yMTgxID4gMC4wNSQNCg0KPVw+IEtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nICRIXzAkLg0KDQotICAgTuG6v3UgbeG7pWMgdGnDqnUgbMOgIMSRw6FuaCBnacOhIG3hu6ljIMSR4buZIHThuq1wIHRydW5nIGTDom4gY8awIHThuqFpIFdBIMSR4buDIMSRxrBhIHJhIGNow61uaCBzw6FjaCBtYXJrZXRpbmcsIHBow6JuIHBo4buRaSBz4bqjbiBwaOG6qW0gaGF5IGThu4tjaCB24bulIOKAlCB0aMOsIGvhur90IHF14bqjIG7DoHkgY2hvIHRo4bqleSBraMO0bmcgY8OzIHPhu7EgbOG7h2NoIMSRw6FuZyBr4buDIHNvIHbhu5tpIG3hu6ljIGNodeG6qW4gxJHDoyBnaeG6oyDEkeG7i25oLg0KDQotQ2jDrW5oIHBo4bunIGhv4bq3YyBkb2FuaCBuZ2hp4buHcCBraMO0bmcgbmjhuqV0IHRoaeG6v3QgcGjhuqNpIMawdSB0acOqbiBXQSBuaMawIG3hu5l0IGtodSB24buxYyBjw7MgdOG7tyBs4buHIGPGsCBkw6JuIGNhbyBi4bqldCB0aMaw4budbmcsIHbDrCB04bu3IGzhu4cgbsOgeSBwaMO5IGjhu6NwIHbhu5tpIGvhu7MgduG7jW5nIGJhbiDEkeG6p3UuDQoNCiMjICoqUEjhuqZOIDQ6IFBIw4JOIFTDjUNIIE3hu5BJIFFVQU4gSOG7hiBHSeG7rkEgSEFJIEJJ4bq+TiDEkOG7ik5IIFTDjU5IIChCSVZBUklBVEUgQU5BTFlTSVMpKioNCg0KIyMjICoqNC4xIEFubnVhbEluY29tZS1Qcm9kdWN0RGVwYXJ0bWVudCoqDQoNCiMjIyMgKio0LjEuMSBC4bqjbmcgdHXhuqduIHN14bqldCBjaMOpbyoqDQoNCmBgYHtyfQ0KdGFibGVfQVAgPC0gdGFibGUoZCRBbm51YWxJbmNvbWUsZCRQcm9kdWN0RGVwYXJ0bWVudCkNCg0KdGFibGVfQVBwYyA8LSBhcy5kYXRhLmZyYW1lLm1hdHJpeChyb3VuZCgxMDAgKiBwcm9wLnRhYmxlKHRhYmxlX0FQLCBtYXJnaW4gPSAxKSwgMikpIA0KbGlicmFyeShrYWJsZUV4dHJhKQ0Ka2FibGUodGFibGVfQVBwYywgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyA0LjFU4bu3IGzhu4cgcGjhuqduIHRyxINtIHRoZW8gbeG7qWMgdGh1IG5o4bqtcCB2w6AgYuG7mSBwaOG6rW4gc+G6o24gcGjhuqltIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIGZ1bGxfd2lkdGggPSBGKQ0KYGBgDQoNCkLhuqNuZyB04bqnbiBz4buRIGNow6lvICJU4bu3IGzhu4cgcGjhuqduIHRyxINtIHRoZW8gbeG7qWMgdGh1bmjhuq1wIHbDoCBi4buZIHBo4bqtbiBz4bqjbiBwaOG6qW0iIMSRxrDhu6NjIGzhuq1wIG7Dqm4gdsOsIG7DsyBjdW5nIGPhuqVwIGPDoWkgbmjDrG4gcsO1IHLDoG5nIHbhu4EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBt4bupYyB0aHUgbmjhuq1wIHbDoCBsb+G6oWkgc+G6o24gcGjhuqltIMSRxrDhu6NjIGNoaSB0acOqdSBuaGnhu4F1IG5o4bqldC4gTmjhu50gYuG6o25nIG7DoHksIHRhIGPDsyB0aOG7gyB4w6FjIMSR4buLbmggxJHGsOG7o2MgbmjDs20gdGh1IG5o4bqtcCBuw6BvIMawdSB0acOqbiBjaGkgdGnDqnUgY2hvIHPhuqNuIHBo4bqpbSBuw6BvLCB04burIMSRw7MgdHLhuqMgbOG7nWkgdHLhu7FjIHRp4bq/cCBjw6J1IGjhu49pIMSR4bq3dCByYS4NCg0KIyMjIyAqKjQuMS4yIFRy4buxYyBxdWFuIGhvw6EqKg0KDQoqKk5ow7NtIHRodSBuaOG6rXAgY2hpIHRpw6p1IG5oaeG7gXUgbmjhuqV0IGNobyBz4bqjbSBwaOG6qW0gbsOgbz8qKg0KDQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9DQojIMSQxrBhIGLhuqNuZyB04burIGThuqFuZyBy4buZbmcgc2FuZyBk4bqhbmcgZMOgaSAobG9uZyBmb3JtYXQpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2d0aGVtZXMpDQp0YWJsZV9BUHBjX2xvbmcgPC0gdGFibGVfQVBwYyAlPiUNCiAgcm93bmFtZXNfdG9fY29sdW1uKCJBbm51YWxJbmNvbWUiKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC1Bbm51YWxJbmNvbWUsIG5hbWVzX3RvID0gIlByb2R1Y3REZXBhcnRtZW50IiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2UiKQ0KDQp0b3A1X3Blcl9pbmNvbWUgPC0gdGFibGVfQVBwY19sb25nICU+JQ0KICBncm91cF9ieShBbm51YWxJbmNvbWUpICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBQZXJjZW50YWdlLCBuID0gNSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQoNCmdncGxvdCh0b3A1X3Blcl9pbmNvbWUsIGFlcyh4ID0gUHJvZHVjdERlcGFydG1lbnQsIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gUHJvZHVjdERlcGFydG1lbnQpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoUGVyY2VudGFnZSwgIiUiKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4xLCBzaXplID0gMykgKw0KICBjb29yZF9mbGlwKCkgKyAgDQogIGZhY2V0X3dyYXAofiBBbm51YWxJbmNvbWUsIHNjYWxlcyA9ICJmcmVlX3kiKSArICANCiAgbGFicygNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgNC4xIFRvcCA1IHPhuqNuIHBo4bqpbSBjaGkgdGnDqnUgbmhp4buBdSBuaOG6pXQgdGhlbyBuaMOzbSB0aHUgbmjhuq1wIiwNCiAgICB4ID0gIiBz4bqjbiBwaOG6qW0iLA0KICAgIHkgPSAiVOG7tyBs4buHIGNoaSB0acOqdSAoJSkiDQogICkgKw0KICB0aGVtZV90dWZ0ZSgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpKQ0KDQoNCg0KYGBgDQoNCioqTmjDs20gdGh1IG5o4bqtcCBjaGkgdGnDqnUgbmhp4buBdSBuaOG6pXQgY2hvIHPhuqNtIHBo4bqpbSBuw6BvPyoqDQoNCi0gICBE4buxYSB2w6BvIGJp4buDdSDEkeG7kyAiVG9wIDUgc+G6o24gcGjhuqltIGNoaSB0acOqdSBuaGnhu4F1IG5o4bqldCB0aGVvIG5ow7NtIHRodSBuaOG6rXAiLCBjw7MgdGjhu4MgdGjhuqV5IHLDtSBz4buxIGtow6FjIGJp4buHdCB0cm9uZyDGsHUgdGnDqm4gY2hpIHRpw6p1IGdp4buvYSBjw6FjIG5ow7NtIHRodSBuaOG6rXAuIFbhu5tpIG5o4buvbmcgbmfGsOG7nWkgY8OzIHRodSBuaOG6rXAgdOG7qyB0aOG6pXAgxJHhur9uIHRydW5nIGLDrG5oICh04burIFwkMTBLIMSR4bq/biBcJDkwSyksIHPhuqNuIHBo4bqpbSDEkcaw4bujYyBjaGkgdGnDqnUgbmhp4buBdSBuaOG6pXQgbMOgIFByb2R1Y2UgKHJhdSBxdeG6oyB0xrDGoWkpIOKAkyDEkcOieSBsw6Agbmh1IGPhuqd1IHRoaeG6v3QgeeG6v3UgcGjhu6VjIHbhu6UgY3Xhu5ljIHPhu5FuZyBow6BuZyBuZ8OgeSwgcGjhuqNuIMOhbmggeHUgaMaw4bubbmcgxrB1IHRpw6puIHRo4buxYyBwaOG6qW0gdMawxqFpIHPhu5FuZyDhu58gY8OhYyBo4buZIGdpYSDEkcOsbmggY8OzIG5nw6JuIHPDoWNoIGjhuqFuIGNo4bq/LiBU4bu3IGzhu4cgY2hpIHRpw6p1IGNobyBQcm9kdWNlIHRo4bqtbSBjaMOtIMSR4bqhdCDEkeG6v24gMTQuNTElIOG7nyBuaMOzbSBcJDcwS+KAk1wkOTBLLg0KDQotICAgTmfGsOG7o2MgbOG6oWksIOG7nyBjw6FjIG5ow7NtIHRodSBuaOG6rXAgY2FvIGjGoW4sIHh1IGjGsOG7m25nIGNoaSB0acOqdSBjw7Mgc+G7sSB0aGF5IMSR4buVaSByw7UgcuG7h3QuIE5o4buvbmcgbmfGsOG7nWkgY8OzIHRodSBuaOG6rXAgdOG7qyBcJDkwSyB0cuG7nyBsw6puIGLhuq90IMSR4bqndSDGsHUgdGnDqm4gaMahbiBjaG8gY8OhYyBz4bqjbiBwaOG6qW0gdGnhu4duIGzhu6NpIG5oxrAgU25hY2sgRm9vZHMgKMSR4buTIMSDbiBuaOG6uSkgdsOgIEZyb3plbiBGb29kcyAodGjhu7FjIHBo4bqpbSDEkcO0bmcgbOG6oW5oKS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbmjDs20gdGh1IG5o4bqtcCBjYW8gY8OzIGto4bqjIG7Eg25nIHTDoGkgY2jDrW5oIMSR4buDIGNoaSB0acOqdSBjaG8gc+G7sSB0aeG7h24gbOG7o2ksIMSRYSBk4bqhbmcgdGjhu7FjIHBo4bqpbSB2w6AgY2jhuqV0IGzGsOG7o25nIGN14buZYyBz4buRbmcuIE5nb8OgaSByYSwg4bufIG5ow7NtIFwkOTBL4oCTXCQxMTBLLCBuaMOzbSBz4bqjbiBwaOG6qW0gSGVhbHRoIGFuZCBIeWdpZW5lIChz4bupYyBraOG7j2UgJiB24buHIHNpbmgpIGPFqW5nIGzhu410IHbDoG8gdG9wIDUsIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgcXVhbiB0w6JtIMSR4bq/biBz4bupYyBraOG7j2UgY8OhIG5ow6JuIGLhuq90IMSR4bqndSBnaWEgdMSDbmcga2hpIHRodSBuaOG6rXAgY+G6o2kgdGhp4buHbi4NCg0KLSAgIFThu5VuZyB0aOG7gywgYmnhu4N1IMSR4buTIGNobyB0aOG6pXkgbeG7kWkgbGnDqm4gaOG7hyB0xrDGoW5nIMSR4buRaSByw7UgcsOgbmcgZ2nhu69hIG3hu6ljIHRodSBuaOG6rXAgdsOgIGxv4bqhaSBz4bqjbiBwaOG6qW0gY2hpIHRpw6p1IG5oaeG7gXUgbmjhuqV0LiBOaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCB2w6AgdHJ1bmcgYsOsbmggdOG6rXAgdHJ1bmcgdsOgbyBuaHUgY+G6p3UgdGhp4bq/dCB54bq/dSwgdHJvbmcga2hpIG5ow7NtIHRodSBuaOG6rXAgY2FvIGPDsyB4dSBoxrDhu5tuZyBt4bufIHLhu5luZyBzYW5nIGPDoWMgc+G6o24gcGjhuqltIHRp4buHbiBs4bujaSB2w6AgY2jEg20gc8OzYyBi4bqjbiB0aMOibi4gxJDDonkgbMOgIG3hu5l0IHh1IGjGsOG7m25nIGjhu6NwIGzDvSBwaOG6o24gw6FuaCB0aGF5IMSR4buVaSB0cm9uZyBow6BuaCB2aSB0acOqdSBkw7luZyB0aGVvIMSRaeG7gXUga2nhu4duIGtpbmggdOG6vy4NCg0KIyMjIyAqKjQuMS4zIEtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqKioNCg0KQsOgaSB0b8OhbiBjw7MgZ2nhuqMgdGh1eeG6v3QgbmjGsCBzYXU6ICQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2x9DQpIXzA6IFw7ICBcdGV4dHtN4bupYyB0aHUgbmjhuq1wIHbDoCBi4buZIHBo4bqtbiBz4bqjbiBwaOG6qW0gxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUgfSBcXCANCkhfMTogXDsgIFx0ZXh0e03hu6ljIHRodSBuaOG6rXAgdsOgIGLhu5kgcGjhuq1uIHPhuqNuIHBo4bqpbSBjw7MgbGnDqm4gcXVhbiDEkeG6v24gbmhhdX0NClxlbmR7YXJyYXl9DQpccmlnaHQuJCQNCg0KVGEgdGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcgdsOgIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQpgYGB7cn0NCmNoaUFQIDwtIGNoaXNxLnRlc3QodGFibGVfQVApDQpwcmludChjaGlBUCkNCmBgYA0KDQotICAgR2nDoSB0cuG7iyBDaGktc3F1YXJlZDogYHIgcm91bmQoY2hpQVAkc3RhdGlzdGljLCAyKWANCg0KLSAgIELhuq1jIHThu7EgZG86IGByIGNoaUFQJHBhcmFtZXRlcmANCg0KLSAgIEdpw6EgdHLhu4sgcDogYHIgc2lnbmlmKGNoaUFQJHAudmFsdWUsIDQpYCBcPiBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYSQgPSA1JSDihpIgS2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgKEjigoApIHThu6ljIGhhaSBiaeG6v24gxJHGsOG7o2MgY29pIGzDoCDEkeG7mWMgbOG6rXAgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlLg0KDQotICAgTeG6t2MgZMO5IGvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGtow7RuZyBjaG8gdGjhuqV5IG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgJFxhbHBoYSQgPSA1JSwgbmjGsG5nIGdpw6EgdHLhu4sgcCBjxaluZyBraMO0bmcgcXXDoSBs4bubbiAo4omIIDAuMDkzKS4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBn4bujaSDDvSBy4bqxbmcgY8OzIHRo4buDIHThu5NuIHThuqFpIHh1IGjGsOG7m25nLCB0aOG6pXkgcsO1IG5o4bqldCBsw6AgcGjhuqduIGzhu5tuIGPDoWMgbmjDs20gdGh1IG5o4bqtcCDEkeG7gXUgY8OzIHh1IGjGsOG7m25nIMawdSB0acOqbiBjaGkgdGnDqnUgY2hvIHPhuqNuIHBo4bqpbSBQcm9kdWNlLg0KDQojIyMgKio0LjIgQW5udWFsSW5jb21lLUNpdHkqKg0KDQojIyMjICoqNC4yLjEgQuG6o25nIHR14bqnbiBzdeG6pXQgY2jDqW8qKg0KDQpgYGB7cn0NCnRhYmxlX0FDIDwtIHRhYmxlKGQkQW5udWFsSW5jb21lLGQkQ2l0eSkNCg0KdGFibGVfQUNwYyA8LSBhcy5kYXRhLmZyYW1lLm1hdHJpeChyb3VuZCgxMDAgKiBwcm9wLnRhYmxlKHRhYmxlX0FDLCBtYXJnaW4gPSAxKSwgMikpIA0KbGlicmFyeShrYWJsZUV4dHJhKQ0Ka2FibGUodGFibGVfQUNwYywgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gIkLhuqNuZyA0LjIgVOG7tyBs4buHIHBo4bqnbiB0csSDbSB0aGVvIG3hu6ljIHRodSBuaOG6rXAgdsOgIMSR4buLbmggY8awIHThuqFpIHRow6BuaCBwaOG7kSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCBmdWxsX3dpZHRoID0gRikNCmBgYA0KDQpC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyAiIFThu7cgbOG7hyBwaOG6p24gdHLEg20gdGhlbyBt4bupYyB0aHUgbmjhuq1wIHbDoCDEkeG7i25oIGPGsCB04bqhaSB0aMOgbmggcGjhu5EiIMSRxrDhu6NjIGzhuq1wIG7Dqm4gdsOsIG7DsyBjdW5nIGPhuqVwIGPDoWkgbmjDrG4gcsO1IHLDoG5nIHbhu4EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBt4bupYyB0aHUgbmjhuq1wIHbDoCB0aMOgbmggcGjhu5EgxJHGsOG7o2MgxrB1IHRpw6puIHNpbmggc+G7kW5nIG5oaeG7gXUgbmjhuqV0LiBOaOG7nSBi4bqjbmcgbsOgeSwgdGEgY8OzIHRo4buDIHjDoWMgxJHhu4tuaCDEkcaw4bujYyBuaMOzbSB0aHUgbmjhuq1wIG7DoG8gdOG6rXAgdHJ1bmcgxJHhu4tuaCBjxrAgdOG6oWkgdGjDoG5oIHBo4buRIG7DoG8sIHThu6sgxJHDsyB0cuG6oyBs4budaSB0cuG7sWMgdGnhur9wIGPDonUgaOG7j2kgxJHhurd0IHJhLg0KDQojIyMjICoqNC4yLjIgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCioqTmjDs20gdGh1IG5o4bqtcCB04bqtcCB0cnVuZyDEkeG7i25oIGPGsCBjaG8gNSB0aMOgbmggcGjhu5EgbsOgbyDEkcO0bmcgbmjhuqV0PyoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCiMgxJDGsGEgYuG6o25nIHThu6sgZOG6oW5nIHLhu5luZyBzYW5nIGThuqFuZyBkw6BpIChsb25nIGZvcm1hdCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3RoZW1lcykNCnRhYmxlX0FDcGNfbG9uZyA8LSB0YWJsZV9BQ3BjICU+JQ0KICByb3duYW1lc190b19jb2x1bW4oIkFubnVhbEluY29tZSIpICU+JQ0KICBwaXZvdF9sb25nZXIoLUFubnVhbEluY29tZSwgbmFtZXNfdG8gPSAiQ2l0eSIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIikNCg0KdG9wNV9wZXJfY2l0eSA8LSB0YWJsZV9BQ3BjX2xvbmcgJT4lDQogIGdyb3VwX2J5KEFubnVhbEluY29tZSkgJT4lDQogIHNsaWNlX21heChvcmRlcl9ieSA9IFBlcmNlbnRhZ2UsIG4gPSA1KSAlPiUNCiAgdW5ncm91cCgpDQoNCg0KZ2dwbG90KHRvcDVfcGVyX2NpdHksIGFlcyh4ID0gcmVvcmRlcihDaXR5LCAtUGVyY2VudGFnZSksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gQ2l0eSkpICsNCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChQZXJjZW50YWdlLCAiJSIpKSwgDQogICAgICAgICAgICBoanVzdCA9IC0wLjEsIHNpemUgPSAzKSArDQogIGNvb3JkX2ZsaXAoKSArICANCiAgZmFjZXRfd3JhcCh+IEFubnVhbEluY29tZSwgc2NhbGVzID0gImZyZWVfeSIpICsgIA0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyA0LjIgVG9wIDUgdGjDoG5oIHBo4buRIHThuq1wIHRydW5nIMSR4buLbmggY8awIMSRw7RuZyDEkcO6YyBuaOG6pXQgdGhlbyBuaMOzbSB0aHUgbmjhuq1wIiwNCiAgICB4ID0gIiBUaMOgbmggcGjhu5EiLA0KICAgIHkgPSAiVOG7tyBs4buHIMSR4buLbmggY8awICglKSINCiAgKSArDQogIHRoZW1lX3NvbGFyaXplZCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpKQ0KYGBgDQoNCi0gICBjw7MgdGjhu4MgdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCB0cm9uZyBwaMOibiBi4buRIGTDom4gY8awIHRoZW8gdOG7q25nIG5ow7NtIHRodSBuaOG6rXAuIFbhu5tpIG5ow7NtIHRodSBuaOG6rXAgdGjhuqVwICgxMEvigJMzMEspLCBjxrAgZMOibiBjaOG7pyB54bq/dSB04bqtcCB0cnVuZyB04bqhaSBjw6FjIHRow6BuaCBwaOG7kSBuaMawIFNhbGVtICg5Ljk3JSksIFRhY29tYSAoOS40NSUpLCBTZWF0dGxlICg2LjUwJSksIExvcyBBbmdlbGVzICg2LjMxJSkgdsOgIFNhbiBEaWVnbyAoNi44MCUpLiDEkMOieSDEkeG7gXUgbMOgIG5o4buvbmcgdGjDoG5oIHBo4buRIGPDsyBt4bupYyBz4buRbmcga2jDtG5nIHF1w6EgY2FvIGhv4bq3YyBjw7MgY8OhYyBraHUgZMOibiBjxrAgcGjDuSBo4bujcCB24bubaSB0aHUgbmjhuq1wIHRo4bqlcCwgY2hvIHBow6lwIGPGsCBkw6JuIGPDsyBuZ8OibiBzw6FjaCBo4bqhbiBjaOG6vyB0aeG6v3AgY+G6rW4gxJHGsOG7o2MgduG7m2kgY8ahIHPhu58gaOG6oSB04bqnbmcgY8ahIGLhuqNuIHbDoCBjaGkgcGjDrSBzaW5oIGhv4bqhdCB24burYSBwaOG6o2kuIFZp4buHYyBTYWxlbSB2w6AgVGFjb21hIGNoaeG6v20gZ+G6p24gMTAlIGPGsCBkw6JuIHRyb25nIG5ow7NtIHRodSBuaOG6rXAgdGjhuqVwIGNobyB0aOG6pXkgxJHDonkgbMOgIMSRaeG7g20gxJHhur9uIHBo4buVIGJp4bq/biBj4bunYSBuZ8aw4budaSB0aHUgbmjhuq1wIHRo4bqlcC4NCg0KLSAgIEtoaSB0aHUgbmjhuq1wIHTEg25nIGzDqm4sIHh1IGjGsOG7m25nIHBow6JuIGLhu5EgZMOibiBjxrAgY8WpbmcgY8OzIHPhu7EgdGhheSDEkeG7lWkgxJHDoW5nIGvhu4MuIOG7niBuaMOzbSB0aHUgbmjhuq1wIHThu6sgOTBL4oCTMTEwSywgNSB0aMOgbmggcGjhu5EgY8OzIHThu7cgbOG7hyBjxrAgZMOibiBjYW8gbmjhuqV0IGzDoCBTYWxlbSAoMTMuNTQlKSwgTG9zIEFuZ2VsZXMgKDYuODUlKSwgU2FuIERpZWdvICg3LjAxJSksIFRhY29tYSAoOC4zMiUpIHbDoCBTZWF0dGxlICg0Ljg5JSkuIE5ow7NtIG7DoHkgYuG6r3QgxJHhuqd1IGNodXnhu4NuIGjGsOG7m25nIHNhbmcgY8OhYyB0aMOgbmggcGjhu5EgbOG7m24sIHPDtGkgxJHhu5luZyB2w6AgcGjDoXQgdHJp4buDbiBoxqFuLiDEkOG6t2MgYmnhu4d0LCDhu58gbmjDs20gdGh1IG5o4bqtcCBy4bqldCBjYW8gKFwkMTUwSyspLCA1IHRow6BuaCBwaOG7kSBjw7MgdOG7tyBs4buHIGNhbyBuaOG6pXQgbOG6p24gbMaw4bujdCBsw6AgQnJlbWVydG9uICgxMi44MiUpLCBCZXZlcmx5IEhpbGxzICg4LjQyJSksIFNlYXR0bGUgKDguNzklKSwgTG9zIEFuZ2VsZXMgKDcuMzMlKSB2w6AgU3Bva2FuZSAoNy4zMyUpLiBDw6FjIHRow6BuaCBwaOG7kSBuw6B5IHRoxrDhu51uZyBjw7MgY2jhuqV0IGzGsOG7o25nIHPhu5FuZyBjYW8sIGThu4tjaCB24bulIGhp4buHbiDEkeG6oWksIG5oaeG7gXUgY8ahIGjhu5lpIHZp4buHYyBsw6BtIGNo4bqldCBsxrDhu6NuZyB2w6AgY8OhYyB0aeG7h24gw61jaCBwaOG7pWMgduG7pSBjaG8gbOG7kWkgc+G7kW5nIGNhbyBj4bqlcC4NCg0KLSAgIEThu7FhIHRyw6puIGJp4buDdSDEkeG7kyAiVG9wIDUgdGjDoG5oIHBo4buRIHThuq1wIHRydW5nIMSR4buLbmggY8awIMSRw7RuZyDEkcO6YyBuaOG6pXQgdGhlbyBuaMOzbSB0aHUgbmjhuq1wIixjw7MgdGjhu4MgcXVhbiBzw6F0IMSRxrDhu6NjIG3hu5l0IHh1IGjGsOG7m25nIHLDtSBy4buHdCBnaeG7r2EgbeG7qWMgdGh1IG5o4bqtcCB2w6AgdGjDoG5oIHBo4buRIGPGsCB0csO6LiBOaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCBjw7MgeHUgaMaw4bubbmcgc+G7kW5nIHThuqFpIGPDoWMga2h1IHbhu7FjIG5nb+G6oWkgw7QsIGNoaSBwaMOtIHRo4bqlcCBob+G6t2MgduG7q2EgcGjhuqNpLiBUcm9uZyBraGkgxJHDsywgbmjDs20gdGh1IG5o4bqtcCBjYW8gbOG6oWkgdOG6rXAgdHJ1bmcg4bufIGPDoWMgdGjDoG5oIHBo4buRIHBow6F0IHRyaeG7g24sIGhp4buHbiDEkeG6oWkg4oCTIHBo4bqjbiDDoW5oIG3hu6ljIMSR4buZIHRp4bq/cCBj4bqtbiB2w6AgbOG7sWEgY2jhu41uIGtow7RuZyBnaWFuIHPhu5FuZyB0aGVvIG7Eg25nIGzhu7FjIHTDoGkgY2jDrW5oLg0KDQojIyMjICoqNC4yLjMgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6oqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXDsgIFx0ZXh0e03hu6ljIHRodSBuaOG6rXAgdsOgIHRow6BuaCBwaOG7kSDEkeG7i25oIGPGsCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdSB9IFxcIA0KSF8xOiBcOyAgXHRleHR7TeG7qWMgdGh1IG5o4bqtcCB2w6AgdGjDoG5oIHBo4buRIMSR4buLbmggY8awIGPDsyBsacOqbiBxdWFuIMSR4bq/biBuaGF1fQ0KXGVuZHthcnJheX0NClxyaWdodC4kJA0KDQpUYSB0aOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZyB2w6AgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXU6DQoNCmBgYHtyfQ0KY2hpQUMgPC0gY2hpc3EudGVzdCh0YWJsZV9BQykNCnByaW50KGNoaUFDKQ0KYGBgDQoNCi0gICBHacOhIHRy4buLIENoaS1zcXVhcmVkOiBgciByb3VuZChjaGlBQyRzdGF0aXN0aWMsIDIpYA0KDQotICAgQuG6rWMgdOG7sSBkbzogYHIgY2hpQUMkcGFyYW1ldGVyYA0KDQotICAgR2nDoSB0cuG7iyBwOiBgciBzaWduaWYoY2hpQUMkcC52YWx1ZSwgNClgIFw8IG3hu6ljIMO9IG5naMSpYSAkXGFscGhhJCA9IDUlIOKGkiDEkOG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIChI4oKAKSB04bupYyBoYWkgYmnhur9uIMSRxrDhu6NjIGNvaSBsw6AgY8OzIG3hu5FpIGxpw6puIGjhu4cgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlLiBOw7NpIGPDoWNoIGtow6FjLCB2aeG7h2MgbeG7mXQgbmfGsOG7nWkgY8awIHRyw7og4bufIHRow6BuaCBwaOG7kSBuw6BvIGPDsyBsacOqbiBxdWFuIMSR4bq/biBt4bupYyB0aHUgbmjhuq1wIGPhu6dhIGjhu40uDQoNCi0gICBDw7MgdGjhu4MgdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCB0cm9uZyBwaMOibiBi4buRIGTDom4gY8awIHRoZW8gdOG7q25nIG5ow7NtIHRodSBuaOG6rXAuIFbhu5tpIG5ow7NtIHRodSBuaOG6rXAgdGjhuqVwICgxMEvigJMzMEspLCBjxrAgZMOibiBjaOG7pyB54bq/dSB04bqtcCB0cnVuZyB04bqhaSBjw6FjIHRow6BuaCBwaOG7kSBuaMawIFNhbGVtICg5Ljk3JSksIFRhY29tYSAoOS40NSUpLCBTZWF0dGxlICg2LjUwJSksIExvcyBBbmdlbGVzICg2LjMxJSkgdsOgIFNhbiBEaWVnbyAoNi44MCUpLiDEkMOieSDEkeG7gXUgbMOgIG5o4buvbmcgdGjDoG5oIHBo4buRIGPDsyBt4bupYyBz4buRbmcga2jDtG5nIHF1w6EgY2FvIGhv4bq3YyBjw7MgY8OhYyBraHUgZMOibiBjxrAgcGjDuSBo4bujcCB24bubaSB0aHUgbmjhuq1wIHRo4bqlcCwgY2hvIHBow6lwIGPGsCBkw6JuIGPDsyBuZ8OibiBzw6FjaCBo4bqhbiBjaOG6vyB0aeG6v3AgY+G6rW4gxJHGsOG7o2MgduG7m2kgY8ahIHPhu58gaOG6oSB04bqnbmcgY8ahIGLhuqNuIHbDoCBjaGkgcGjDrSBzaW5oIGhv4bqhdCB24burYSBwaOG6o2kuIFZp4buHYyBTYWxlbSB2w6AgVGFjb21hIGNoaeG6v20gZ+G6p24gMTAlIGPGsCBkw6JuIHRyb25nIG5ow7NtIHRodSBuaOG6rXAgdGjhuqVwIGNobyB0aOG6pXkgxJHDonkgbMOgIMSRaeG7g20gxJHhur9uIHBo4buVIGJp4bq/biBj4bunYSBuZ8aw4budaSB0aHUgbmjhuq1wIHRo4bqlcC4g4oaSIE5ow7NtIHRodSBuaOG6rXAgdGjhuqVwIGPDsyB4dSBoxrDhu5tuZyBjaOG7jW4gdGjDoG5oIHBo4buRIGPDsyBjaGkgcGjDrSBzaW5oIGhv4bqhdCB0aOG6pXAsIGThu4UgdGnhur9wIGPhuq1uIG5ow6Ag4bufIGhv4bq3YyBk4buLY2ggduG7pSBjw7RuZyBj4buZbmcgY8ahIGLhuqNuLg0KDQotICAgS2hpIHRodSBuaOG6rXAgdMSDbmcgbMOqbiwgeHUgaMaw4bubbmcgcGjDom4gYuG7kSBkw6JuIGPGsCBjxaluZyBjw7Mgc+G7sSB0aGF5IMSR4buVaSDEkcOhbmcga+G7gy4g4bueIG5ow7NtIHRodSBuaOG6rXAgdOG7qyA5MEvigJMxMTBLLCA1IHRow6BuaCBwaOG7kSBjw7MgdOG7tyBs4buHIGPGsCBkw6JuIGNhbyBuaOG6pXQgbMOgIFNhbGVtICgxMy41NCUpLCBMb3MgQW5nZWxlcyAoNi44NSUpLCBTYW4gRGllZ28gKDcuMDElKSwgVGFjb21hICg4LjMyJSkgdsOgIFNlYXR0bGUgKDQuODklKS4gTmjDs20gbsOgeSBi4bqvdCDEkeG6p3UgY2h1eeG7g24gaMaw4bubbmcgc2FuZyBjw6FjIHRow6BuaCBwaOG7kSBs4bubbiwgc8O0aSDEkeG7mW5nIHbDoCBwaMOhdCB0cmnhu4NuIGjGoW4uIMSQ4bq3YyBiaeG7h3QsIOG7nyBuaMOzbSB0aHUgbmjhuq1wIHLhuqV0IGNhbyAoXCQxNTBLKyksIDUgdGjDoG5oIHBo4buRIGPDsyB04bu3IGzhu4cgY2FvIG5o4bqldCBs4bqnbiBsxrDhu6N0IGzDoCBCcmVtZXJ0b24gKDEyLjgyJSksIEJldmVybHkgSGlsbHMgKDguNDIlKSwgU2VhdHRsZSAoOC43OSUpLCBMb3MgQW5nZWxlcyAoNy4zMyUpIHbDoCBTcG9rYW5lICg3LjMzJSkuIEPDoWMgdGjDoG5oIHBo4buRIG7DoHkgdGjGsOG7nW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgc+G7kW5nIGNhbywgZOG7i2NoIHbhu6UgaGnhu4duIMSR4bqhaSwgbmhp4buBdSBjxqEgaOG7mWkgdmnhu4djIGzDoG0gY2jhuqV0IGzGsOG7o25nIHbDoCBjw6FjIHRp4buHbiDDrWNoIHBo4bulYyB24bulIGNobyBs4buRaSBz4buRbmcgY2FvIGPhuqVwLiDihpIgTmjDs20gdGh1IG5o4bqtcCBjYW8gY8OzIHh1IGjGsOG7m25nIGNo4buNbiBraHUgduG7sWMgcGjDoXQgdHJp4buDbiwgaGnhu4duIMSR4bqhaSwgdsOgIGdpw6B1IHRp4buHbiDDrWNoIHPhu5FuZy4NCg0KLSAgIE5ow7NtIHRodSBuaOG6rXAgdHJ1bmcgYsOsbmggKHThu6sgNTBLIMSR4bq/biA5MEspIGPDsyBwaMOibiBi4buRIHTGsMahbmcgxJHhu5FpIHLhu5luZyB2w6AgxJFhIGThuqFuZywgbmjGsG5nIGPDoWMgdGjDoG5oIHBo4buRIG5oxrAgTG9zIEFuZ2VsZXMsIFNhbiBEaWVnbywgVGFjb21hLCBTZWF0dGxlLCB2w6AgU2FsZW0gduG6q24gZHV5IHRyw6wgduG7iyB0csOtIG7hu5VpIGLhuq10LiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBuaMOzbSBuw6B5IGPDsyBz4buxIGxpbmggaG/huqF0IGNhbyBoxqFuIHRyb25nIGzhu7FhIGNo4buNbiBuxqFpIGPGsCB0csO6Lg0KDQoqKipN4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3hu6ljIHRodSBuaOG6rXAgdsOgIHRow6BuaCBwaOG7kSBjxrAgdHLDuiBwaOG6o24gw6FuaCBz4buxIHBow6JuIHThuqduZyBraW5oIHThur/igJN4w6MgaOG7mWkgdHJvbmcga2jDtG5nIGdpYW4gxJHDtCB0aOG7iy4gQ8OhYyBuaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCBi4buLIGdp4bubaSBo4bqhbiB0cm9uZyBs4buxYSBjaOG7jW4gdsOgIHRoxrDhu51uZyBjaOG7jW4gbmjhu69uZyBuxqFpIGNoaSBwaMOtIHLhurssIHRyb25nIGtoaSBjw6FjIG5ow7NtIHRodSBuaOG6rXAgY2FvIGPDsyBraOG6oyBuxINuZyB0aeG6v3AgY+G6rW4gY8OhYyBraHUgduG7sWMgcGjDoXQgdHJp4buDbiBoxqFuLiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiDEkcOjIHjDoWMgbmjhuq1uIHLhurFuZyBz4buxIHBow6JuIGLhu5EgbsOgeSBraMO0bmcgcGjhuqNpIG5n4bqrdSBuaGnDqm4sIG3DoCBjw7MgbGnDqm4gaOG7hyByw7UgcsOgbmcgZ2nhu69hIHRodSBuaOG6rXAgdsOgIG7GoWkgc+G7kW5nLioqKg0KDQojIyMgKio0LjMgTWFyaXRhbFN0YXR1cy1TYXRlb3JQcm92aW5jZSoqDQoNCiMjIyMgKio0LjMuMSBC4bqjbmcgdHXhuqduIHN14bqldCBjaMOpbyoqDQoNCmBgYHtyfQ0KdGFibGVfQ29QQyA8LSB0YWJsZShkJE1hcml0YWxTdGF0dXMsZCRTdGF0ZW9yUHJvdmluY2UpDQoNCnRhYmxlX0NvUENwYyA8LSBhcy5kYXRhLmZyYW1lLm1hdHJpeChyb3VuZCgxMDAgKiBwcm9wLnRhYmxlKHRhYmxlX0NvUEMsIG1hcmdpbiA9IDEpLCAyKSkgDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQprYWJsZSh0YWJsZV9Db1BDcGMsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9ICJC4bqjbmcgNC4zIFThu7cgbOG7hyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIMSR4buLbmggY+G7sSB04bqhaSBjw6FjIEJhbmciKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KLSAgIELhuqNuZyB04bu3IGzhu4cgY2hvIHRo4bqleSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gIk1hcnJpZWQgKE0pIiB2w6AgIlNpbmdsZSAoUykiIHBow6JuIGLhu5Ega2jDoSB0xrDGoW5nIMSR4buTbmcgdOG6oWkgY8OhYyBiYW5nLCDEkeG6t2MgYmnhu4d0IGzDoCDhu58gV0EgKFdhc2hpbmd0b24pIHbDoCBDQSAoQ2FsaWZvcm5pYSkg4oCTIGhhaSBiYW5nIGPDsyB04bu3IGzhu4cgZMOibiBjxrAgY2FvIG5o4bqldCB0cm9uZyBj4bqjIGhhaSBuaMOzbS4gV0EgZOG6q24gxJHhuqd1IHbhu5tpIHThu7cgbOG7hyBr4bq/dCBow7RuIDMzLjg4JSB2w6AgxJHhu5ljIHRow6JuIDMxLjE2JSwgY2hvIHRo4bqleSBuxqFpIMSRw6J5IHThuq1wIHRydW5nIGTDom4gY8awIMSRw7RuZyB2w6AgxJFhIGThuqFuZyB24buBIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibi4gTmfGsOG7o2MgbOG6oWksIGPDoWMgYmFuZyBuaMawIEphbGlzY28gdsOgIEd1ZXJyZXJvIGPDsyB04bu3IGzhu4cgcuG6pXQgdGjhuqVwLCBwaOG6o24gw6FuaCBt4bqtdCDEkeG7mSBkw6JuIGPGsCBob+G6t2MgbeG7qWMgxJHhu5kgZGkgY8awIHRo4bqlcCBoxqFuLiBT4buxIHBow6JuIGLhu5EgZ+G6p24gdMawxqFuZyDEkeG7k25nIGdp4buvYSBNIHbDoCBTIHRyb25nIHThu6tuZyBiYW5nIGPFqW5nIGfhu6NpIMO9IHLhurFuZyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4ga2jDtG5nIHF1w6EgdGhpw6puIGzhu4djaCB0aGVvIHbDuW5nLg0KDQojIyMjICoqNC4zLjIgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCioqVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHThuq1wIHRydW5nIHThuqFpIEJhbmcgbsOgbyDEkcO0bmcgbmjhuqV0PyoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3RoZW1lcykNCnRhYmxlX0NvUENwY19sb25nIDwtIHRhYmxlX0NvUENwYyAlPiUNCiAgcm93bmFtZXNfdG9fY29sdW1uKCJNYXJpdGFsU3RhdHVzIikgJT4lDQogIHBpdm90X2xvbmdlcigtTWFyaXRhbFN0YXR1cywgbmFtZXNfdG8gPSJTdGF0ZW9yUHJvdmluY2UiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSIpDQoNCnRvcDVfcGVyX1BDIDwtIHRhYmxlX0NvUENwY19sb25nICU+JQ0KICBncm91cF9ieShNYXJpdGFsU3RhdHVzKSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gUGVyY2VudGFnZSwgbiA9IDcpICU+JQ0KICB1bmdyb3VwKCkNCg0KDQpnZ3Bsb3QodG9wNV9wZXJfUEMsIGFlcyh4ID0gcmVvcmRlcihTdGF0ZW9yUHJvdmluY2UsIC1QZXJjZW50YWdlKSwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBTdGF0ZW9yUHJvdmluY2UpKSArDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoUGVyY2VudGFnZSwgIiUiKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4yLCBzaXplID0gMykgKw0KICAgIGNvb3JkX2ZsaXAoKSArDQogIGZhY2V0X3dyYXAofiBNYXJpdGFsU3RhdHVzLCBzY2FsZXMgPSAiZnJlZV95IikgKyAgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIDQuMyBUb3AgNyBCYW5nIHThuq1wIHRydW5nIGTDom4gY8awIGvhur90IGjDtG4gdsOgIMSR4buZYyB0aMOibiDEkcO0bmcgbmjhuqV0ICIsDQogICAgeCA9ICIgQmFuZyIsDQogICAgeSA9ICJU4bu3IGzhu4cgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuICglKSINCiAgKSArDQogIHRoZW1lX2NsZWFuKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSkpDQpgYGANCg0KLSAgIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gcsO1IHLhurFuZyBt4buZdCBz4buRIGJhbmcgbmjGsCBXYXNoaW5ndG9uIChXQSksIENhbGlmb3JuaWEgKENBKSwgdsOgIE9yZWdvbiAoT1IpIGPDsyB04bu3IGzhu4cgZMOibiBjxrAgY2FvIHRyb25nIGPhuqMgaGFpIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiDigJQgduG7q2Ega+G6v3QgaMO0biB24burYSDEkeG7mWMgdGjDom4uIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY2FvIGhv4bq3YyBxdXkgbcO0IGTDom4gY8awIGzhu5tuLCBk4bqrbiDEkeG6v24gc+G7kSBsxrDhu6NuZyBj4bqjIGhhaSBuaMOzbSDEkeG7gXUgdsaw4bujdCB0cuG7mWkuDQoNCi0gICBDw6FjIGJhbmcgbmjGsCBaYWNhdGVjYXMsIERGLCBCQyB2w6AgWXVjYXRhbiBjw7MgdOG7tyBs4buHIG5o4buPIGjGoW4gdsOgIHTGsMahbmcgxJHhu5FpIGPDom4gYuG6sW5nIGdp4buvYSBoYWkgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLg0KDQotICAgV2FzaGluZ3RvbiAoV0EpIGzDoCBiYW5nIGPDsyBkw6JuIGPGsCDEkcO0bmcgbmjhuqV0IHRyb25nIGPhuqMgaGFpIG5ow7NtIChNYXJyaWVkICYgU2luZ2xlKSwgY2hvIHRo4bqleSBuxqFpIMSRw6J5IHThuq1wIHRydW5nIMSRw7RuZyBkw6JuIHbDoCDEkWEgZOG6oW5nIHbhu4EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLg0KDQojIyMjICoqNC4zLjMgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6oqKg0KDQpCw6BpIHRvw6FuIGPDsyBnaeG6oyB0aHV54bq/dCBuaMawIHNhdTogJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bH0NCkhfMDogXDsgIFx0ZXh0e1TDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6AgQmFuZyDEkeG7i25oIGPGsCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdSB9IFxcIA0KSF8xOiBcOyAgXHRleHR7VMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBCYW5nIMSR4buLbmggY8awIGPDsyBsacOqbiBxdWFuIMSR4bq/biBuaGF1fQ0KXGVuZHthcnJheX0NClxyaWdodC4kJA0KDQpUYSB0aOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZyB2w6AgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXU6DQoNCmBgYHtyfQ0KY2hpU29QIDwtIGNoaXNxLnRlc3QodGFibGVfQ29QQykNCnByaW50KGNoaVNvUCkNCmBgYA0KDQotICAgR2nDoSB0cuG7iyBDaGktc3F1YXJlZDogYHIgcm91bmQoY2hpU29QJHN0YXRpc3RpYywgMilgDQoNCi0gICBC4bqtYyB04buxIGRvOiBgciBjaGlTb1AkcGFyYW1ldGVyYA0KDQotICAgR2nDoSB0cuG7iyBwOiBgciBzaWduaWYoY2hpU29QJHAudmFsdWUsIDQpYCBcPCBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYSQgPSA1JSDihpIgxJDhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyAoSOKCgCkgdOG7qWMgaGFpIGJp4bq/biDEkcaw4bujYyBjb2kgbMOgIGPDsyBt4buRaSBsacOqbiBo4buHIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1JS4gTsOzaSBjw6FjaCBraMOhYywgdmnhu4djIG3hu5l0IG5nxrDhu51pIGPGsCB0csO6IOG7nyB0aMOgbmggcGjhu5EgbsOgbyBjw7MgbGnDqm4gcXVhbiDEkeG6v24gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPhu6dhIGjhu40uDQoNCi0gICDEkGnhu4F1IG7DoHkgxJHGsOG7o2MgY+G7p25nIGPhu5EgcsO1IHF1YSBiaeG7g3UgxJHhu5MgIlRvcCA3IGJhbmcgdOG6rXAgdHJ1bmcgZMOibiBjxrAga+G6v3QgaMO0biB2w6AgxJHhu5ljIHRow6JuIMSRw7RuZyBuaOG6pXQiIHbDoCBi4bqjbmcgZOG7ryBsaeG7h3UgxJFpIGvDqG0uIFRyb25nIGLhuqNuZyB04bu3IGzhu4csIFdhc2hpbmd0b24gKFdBKSBk4bqrbiDEkeG6p3UgduG7gSB04bu3IGzhu4cgZMOibiBjxrAga+G6v3QgaMO0biAoMzMuODglKSB2w6AgY8WpbmcgcuG6pXQgY2FvIOG7nyBuaMOzbSDEkeG7mWMgdGjDom4gKDMxLjE2JSkuIENhbGlmb3JuaWEgKENBKSBjxaluZyB0xrDGoW5nIHThu7EsIGzhuqduIGzGsOG7o3QgY2hp4bq/bSAxOS4zNyUgKE0pIHbDoCAxOS41MSUgKFMpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBoYWkgYmFuZyBuw6B5IHRodSBow7p0IMSRw7RuZyDEkeG6o28gY+G6oyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gdsOgIG5nxrDhu51pIMSR4buZYyB0aMOibiwgY8OzIHRo4buDIGRvIMSR4bq3YyDEkWnhu4NtIGtpbmggdOG6vywgY8ahIGjhu5lpIG5naOG7gSBuZ2hp4buHcCBob+G6t2MgbeG7qWMgxJHhu5kgxJHDtCB0aOG7iyBow7NhIGNhby4gTmfGsOG7o2MgbOG6oWksIGPDoWMgYmFuZyBuaMawIEphbGlzY28gdsOgIEd1ZXJyZXJvIGPDsyB04bu3IGzhu4cgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mg4bufIGPhuqMgaGFpIG5ow7NtIChKYWxpc2NvIGNo4buJIGNoaeG6v20gMC4yOSUgTSB2w6AgMC43NiUgUykuDQoNCioqKlThu6sgY8OhYyBz4buRIGxp4buHdSBuw6B5LCBjw7MgdGjhu4MgdGjhuqV5IHLDtSB4dSBoxrDhu5tuZyBwaMOibiBi4buRIGtow7RuZyDEkeG7k25nIMSR4buBdSB24buBIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBnaeG7r2EgY8OhYyBiYW5nLiBN4buZdCBz4buRIGJhbmcgY8OzIHbhursgbMOgIHRydW5nIHTDom0gdGh1IGjDunQgZMOibiBz4buRIHRyb25nIMSR4buZIHR14buVaSBr4bq/dCBow7RuLCB0cm9uZyBraGkgbeG7mXQgc+G7kSBiYW5nIGtow6FjIGzhuqFpIGPDsyBt4bqtdCDEkeG7mSBkw6JuIGPGsCB0aOG6pXAgaG/hurdjIMOtdCBuZ8aw4budaSB0cuG6uyB0deG7lWkuIFTDs20gbOG6oWksIGPDsyBt4buRaSBsacOqbiBo4buHIGNo4bq3dCBjaOG6vSBnaeG7r2EgbsahaSBjxrAgdHLDuiB2w6AgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLCBwaOG6o24gw6FuaCBuaOG7r25nIHnhur91IHThu5EgeMOjIGjhu5lpIHbDoCBraW5oIHThur8gdGnhu4FtIOG6qW4g4bqjbmggaMaw4bufbmcgxJHhur9uIGzhu7FhIGNo4buNbiBow7RuIG5ow6JuIHbDoCBuxqFpIHPhu5FuZyBj4bunYSBjxrAgZMOibi4qKioNCg0KIyMjICoqNC40IEhvbWVvd25lci1Db3VudHJ5KioNCg0KIyMjIyAqKjQuNC4xIELhuqNuZyB0deG6p24gc3XhuqV0IGNow6lvKioNCg0KYGBge3J9DQp0YWJsZV9IQyA8LSB0YWJsZShkJEhvbWVvd25lcixkJFByb2R1Y3REZXBhcnRtZW50KQ0KDQp0YWJsZV9IQ3BjIDwtIGFzLmRhdGEuZnJhbWUubWF0cml4KHJvdW5kKDEwMCAqIHByb3AudGFibGUodGFibGVfSEMsIG1hcmdpbiA9IDEpLCAyKSkgDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQprYWJsZSh0YWJsZV9IQ3BjLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDQuNCBU4bu3IGzhu4cgY8OhIG5ow6JuIHPhu58gaOG7r3UgbmjDoCDhu58gdsOgIHPhuqNuIHBo4bqpbSBjaGkgdGnDqnUiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KLSAgIE5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjw7MgeHUgaMaw4bubbmcgdGnDqnUgdGjhu6Ugbmhp4buBdSBz4bqjbiBwaOG6qW0gdGnhu4duIGzhu6NpIHbDoCBjYW8gY+G6pXAgaMahbiwgdsOtIGThu6UgbmjGsCDEkeG7kyB14buRbmcgY8OzIGPhu5NuLCBjw6FjIHPhuqNuIHBo4bqpbSBkZWxpLCB0cuG7qW5nIHbDoCBzbmFjay4NCg0KLSAgIE5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgY8OzIHRo4buDIMawdSB0acOqbiBjw6FjIHPhuqNuIHBo4bqpbSB0xrDGoWkgdsOgIG5ndXnDqm4gbGnhu4d1IHRow7QsIHbDrSBk4bulIHJhdSBxdeG6oyAoUHJvZHVjZSkgdsOgIGPDoWMgc+G6o24gcGjhuqltIGzDoG0gYsOhbmggKEJha2luZyBHb29kcykgbmhp4buBdSBoxqFuLCBjw7MgdGjhu4MgdsOsIGjhu40gdGjDrWNoIHThu7EgbuG6pXUgbsaw4bubbmcgdOG6oWkgbmjDoCBob+G6t2MgdGnhur90IGtp4buHbSBoxqFuLg0KDQotICAgU+G7sSBraMOhYyBiaeG7h3QgdHJvbmcgbmjDs20gc+G6o24gcGjhuqltIEhvdXNlaG9sZCAoZ2lhIGThu6VuZykgY8OzIHRo4buDIGRvIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgY8OzIG5odSBj4bqndSB0cmFuZyBi4buLIHRoaeG6v3QgeeG6v3UgY2hvIGN14buZYyBz4buRbmcgdGh1w6ogdHLhu40gaG/hurdjIHThuqFtIHRo4budaS4NCg0KIyMjIyAqKjQuNC4yIFRy4buxYyBxdWFuIGhvw6EqKg0KDQoqKlPhuqNuIHBo4bqpbSDEkcaw4bujYyBtdWEgbmhp4buBdSBuaOG6pXQgZ2nhu69hIMSR4buRaSB0xrDGoW5nIGPDsyBuaMOgIOG7nyB2w6Aga2jDtG5nIGPDsyoqDQoNCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3RoZW1lcykNCnRhYmxlX0hDcGNfbG9uZyA8LSB0YWJsZV9IQ3BjICU+JQ0KICByb3duYW1lc190b19jb2x1bW4oIkhvbWVvd25lciIpICU+JQ0KICBwaXZvdF9sb25nZXIoLUhvbWVvd25lciwgbmFtZXNfdG8gPSJQcm9kdWN0Q2F0ZWdvcnkiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSIpDQoNCnRvcDVfcGVyX0hDIDwtIHRhYmxlX0hDcGNfbG9uZyAlPiUNCiAgZ3JvdXBfYnkoSG9tZW93bmVyKSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gUGVyY2VudGFnZSwgbiA9IDEwKSAlPiUNCiAgdW5ncm91cCgpDQoNCg0KZ2dwbG90KHRvcDVfcGVyX0hDLCBhZXMoeCA9IHJlb3JkZXIoUHJvZHVjdENhdGVnb3J5LCAtUGVyY2VudGFnZSksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gUHJvZHVjdENhdGVnb3J5KSkgKw0KICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKFBlcmNlbnRhZ2UsICIlIikpLCANCiAgICAgICAgICAgIGhqdXN0ID0gLTAuMiwgc2l6ZSA9IDMpICsNCiAgICBjb29yZF9mbGlwKCkgKw0KICBmYWNldF93cmFwKH4gSG9tZW93bmVyLCBzY2FsZXMgPSAiZnJlZV95IikgKyAgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIDQuNCBUb3AgMTAgc+G6o24gcGjhuqltIMSRxrDhu6NjIG11YSBuaGnhu4F1IG5o4bqldCBxdWEgaGFpIHTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgIOG7nyBwaOG7lSBiaeG6v24gIiwNCiAgICB4ID0gIiBT4bqjbiBwaOG6qW0iLA0KICAgIHkgPSAiVOG7tyBs4buHIGNoaSB0acOqdSAoJSkiDQogICkgKw0KICB0aGVtZV9jbGVhbigpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpKQ0KYGBgDQoNCi0gICBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIFRvcCAxMCBz4bqjbiBwaOG6qW0gxJHGsOG7o2MgbXVhIG5oaeG7gXUgbmjhuqV0IHRoZW8gaGFpIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBwaOG7lSBiaeG6v246IMSRw6Mga+G6v3QgaMO0biAoWSkgdsOgIGNoxrBhIGvhur90IGjDtG4gKE4pLiBD4bqjIGhhaSBuaMOzbSDEkeG7gXUgY8OzIHh1IGjGsOG7m25nIGNoaSB0acOqdSBjYW8gbmjhuqV0IGNobyByYXUgY+G7pyBxdeG6oyAoUHJvZHVjZSksIHbhu5tpIHThu7cgbOG7hyBs4bqnbiBsxrDhu6N0IGzDoCAxNC4xJSAoY2jGsGEga+G6v3QgaMO0bikgdsOgIDEzLjY5JSAoxJHDoyBr4bq/dCBow7RuKS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIHRo4buxYyBwaOG6qW0gdMawxqFpIHPhu5FuZyBsw6AgxrB1IHRpw6puIGjDoG5nIMSR4bqndSB0cm9uZyBow6BuaCB2aSB0acOqdSBkw7luZyBjaHVuZywgYuG6pXQga+G7gyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4uIE5nb8OgaSByYSwgY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gbmjGsCBGcm96ZW4gRm9vZHMgKHRo4buxYyBwaOG6qW0gxJHDtG5nIGzhuqFuaCksIEJha2luZyBHb29kcyAoxJHhu5MgbMOgbSBiw6FuaCksIHbDoCBDYW5uZWQgRm9vZHMgKMSR4buTIGjhu5lwKSBjxaluZyDEkcaw4bujYyB0acOqdSB0aOG7pSBraMOhIHTGsMahbmcgxJHhu5NuZyDhu58gY+G6oyBoYWkgbmjDs20sIHBo4bqjbiDDoW5oIG5odSBj4bqndSBjxqEgYuG6o24gdHJvbmcgdmnhu4djIG7huqV1IG7GsOG7m25nIHbDoCBzaW5oIGhv4bqhdCBow6BuZyBuZ8OgeS4NCg0KLSAgIFR1eSBuaGnDqm4sIG3hu5l0IHPhu5Ega2jDoWMgYmnhu4d0IMSRw6FuZyBjaMO6IMO9IMSRw6MgeHXhuqV0IGhp4buHbi4gTmjDs20gxJHDoyBr4bq/dCBow7RuIChZKSBjw7MgbeG7qWMgY2hpIHRpw6p1IGNhbyBoxqFuIHLDtSBy4buHdCDhu58gY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gbmjGsCBTbmFjayBGb29kcyAoMTIlIHNvIHbhu5tpIDEwLjQ1JSkgdsOgIEhvdXNlaG9sZCAoOS44NCUgc28gduG7m2kgMTAuNDklKS4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyDEkcaw4bujYyBsw70gZ2nhuqNpIGLhu59pIHZp4buHYyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gdGjGsOG7nW5nIHPhu5FuZyB0cm9uZyBo4buZIGdpYSDEkcOsbmggY8OzIG5oaeG7gXUgdGjDoG5oIHZpw6puIGjGoW4sIHThu6sgxJHDsyBwaMOhdCBzaW5oIG5odSBj4bqndSBz4butIGThu6VuZyBuaGnhu4F1IHPhuqNuIHBo4bqpbSDEg24gbmjhurkgaG/hurdjIMSR4buTIGdpYSBk4bulbmcgcGjhu6VjIHbhu6UgY2hvIGdpYSDEkcOsbmguIE5nxrDhu6NjIGzhuqFpLCBuaMOzbSBjaMawYSBr4bq/dCBow7RuIChOKSBjw7MgdOG7tyBs4buHIGNoaSB0acOqdSBjYW8gaMahbiBjaG8gUHJvZHVjZSB2w6AgRnJvemVuIEZvb2RzLCBjaG8gdGjhuqV5IGPDsyB0aOG7gyBo4buNIMawdSB0acOqbiBjw6FjIHPhuqNuIHBo4bqpbSB0aeG7h24gbOG7o2kgdsOgIGzDoG5oIG3huqFuaCBwaOG7pWMgduG7pSBuaHUgY+G6p3UgY8OhIG5ow6JuLg0KDQotICAgVOG7qyBiaeG7g3UgxJHhu5MsIHRhIGPDsyB0aOG7gyByw7p0IHJhIHLhurFuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBuaOG6pXQgxJHhu4tuaCBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBow6BuaCB2aSB0acOqdSBkw7luZy4gTmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyBjaGkgdGnDqnUgbmhp4buBdSBoxqFuIGNobyBjw6FjIHPhuqNuIHBo4bqpbSBwaOG7pWMgduG7pSBnaWEgxJHDrG5oIGhv4bq3YyB0acOqdSBkw7luZyBjaHVuZywgdHJvbmcga2hpIG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4gY8OzIHh1IGjGsOG7m25nIHThuq1wIHRydW5nIHbDoG8gY8OhYyBt4bq3dCBow6BuZyBwaOG7pWMgduG7pSBjw6EgbmjDom4gaG/hurdjIGLhu69hIMSDbiBuaGFuaCwgxJHGoW4gZ2nhuqNuLiBN4bq3YyBkw7kgc+G7sSBraMOhYyBiaeG7h3Qga2jDtG5nIHF1w6EgbOG7m24sIG5oxrBuZyBjw6FjIHh1IGjGsOG7m25nIG7DoHkgY8OzIHRo4buDIGN1bmcgY+G6pXAgdGjDtG5nIHRpbiBo4buvdSDDrWNoIGNobyBjw6FjIG5ow6AgYsOhbiBs4bq7IHbDoCBuaMOgIHRp4bq/cCB0aOG7iyBraGkgeMOieSBk4buxbmcgY2hp4bq/biBsxrDhu6NjIHBow6JuIGtow7pjIGtow6FjaCBow6BuZyB0aGVvIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibi4NCg0KIyMjIyAqKjQuNC4zIEtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqKioNCg0KQsOgaSB0b8OhbiBjw7MgZ2nhuqMgdGh1eeG6v3QgbmjGsCBzYXU6ICQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2x9DQpIXzA6IFw7ICBcdGV4dHtLaOG6oyBuxINuZyBz4bufIGjhu691IG5ow6Ag4bufIHbDoCBz4bqjbiBwaOG6qW0gdGnDqnUgZMO5bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXV9IFxcIA0KSF8xOiBcOyAgXHRleHR7S2jhuqMgbsSDbmcgc+G7nyBo4buvdSBuaMOgIOG7nyB2w6Agc+G6o24gcGjhuqltIHRpw6p1IGTDuW5nY8OzIGxpw6puIHF1YW4gxJHhur9uIG5oYXV9DQpcZW5ke2FycmF5fQ0KXHJpZ2h0LiQkDQoNClRhIHRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIHbDoCDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KYGBge3J9DQpjaGlIQyA8LSBjaGlzcS50ZXN0KHRhYmxlX0hDKQ0KcHJpbnQoY2hpSEMpDQpgYGANCg0KLSAgIEdpw6EgdHLhu4sgQ2hpLXNxdWFyZWQ6IGByIHJvdW5kKGNoaUhDJHN0YXRpc3RpYywgMilgDQoNCi0gICBC4bqtYyB04buxIGRvOiBgciBjaGlIQyRwYXJhbWV0ZXJgDQoNCi0gICBHacOhIHRy4buLIHA6IGByIHNpZ25pZihjaGlIQyRwLnZhbHVlLCA0KWAgXDwgbeG7qWMgw70gbmdoxKlhICRcYWxwaGEkID0gNSUg4oaSIMSQ4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgKEjigoApIHThu6ljIGhhaSBiaeG6v24gxJHGsOG7o2MgY29pIGzDoCBjw7MgbeG7kWkgbGnDqm4gaOG7hyB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUuIC4gTsOzaSBjw6FjaCBraMOhYywgdmnhu4djIG3hu5l0IG5nxrDhu51pIHPhu58gaOG7r3UgaGF5IGtow7RuZyBz4bufIGjhu691IG5ow6Ag4bufIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gbG/huqFpIHPhuqNuIHBo4bqpbSBo4buNIHRoxrDhu51uZyBtdWEuDQoNCi0gICBUw6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCDhu58ga2jDtG5nIGNo4buJIHBo4bqjbiDDoW5oIGtow61hIGPhuqFuaCB0w6BpIHPhuqNuIG3DoCBjw7JuIGxpw6puIHF1YW4gxJHhur9uIHBob25nIGPDoWNoIHPhu5FuZywgbeG7qWMgxJHhu5kg4buVbiDEkeG7i25oIHbDoCBxdXkgbcO0IGjhu5kgZ2lhIMSRw6xuaC4gTmjDs20gbmfGsOG7nWkgY8OzIG5ow6Ag4bufIChIb21lb3duZXIgPSBZKSB0aMaw4budbmcgxJHhuqFpIGRp4buHbiBjaG8gY8OhYyBo4buZIGdpYSDEkcOsbmgg4buVbiDEkeG7i25oLCBz4buRbmcgY+G7kSDEkeG7i25oIGzDonUgZMOgaSwgY8OzIHRo4buDIGJhbyBn4buTbSBuaGnhu4F1IHRow6BuaCB2acOqbi4gRG8gxJHDsywgaOG7jSBjw7MgeHUgaMaw4bubbmcgbXVhIGPDoWMgc+G6o24gcGjhuqltIHBo4bulYyB24bulIGNobyBzaW5oIGhv4bqhdCBnaWEgxJHDrG5oIG5oxrAgU25hY2sgRm9vZHMgKDEyLjAwJSksIEhvdXNlaG9sZCAoOS44NCUpLCBEZWxpICg1LjIzJSksIHbDoCBEYWlyeSAoNi41MSUpLCBjYW8gaMahbiBzbyB24bubaSBuaMOzbSBraMO0bmcgY8OzIG5ow6AuIEPDoWMgc+G6o24gcGjhuqltIG7DoHkgdGjGsOG7nW5nIMSRxrDhu6NjIHRpw6p1IGTDuW5nIHRyb25nIGdpYSDEkcOsbmgsIHBo4bulYyB24bulIG5odSBj4bqndSB0aeG7h24gbOG7o2kgdsOgIHTDrWNoIHRy4buvLg0KDQotICAgTmfGsOG7o2MgbOG6oWksIG5ow7NtIGtow7RuZyBz4bufIGjhu691IG5ow6Ag4bufIChIb21lb3duZXIgPSBOKSBjw7MgdGjhu4MgYmFvIGfhu5NtIHNpbmggdmnDqm4sIG5nxrDhu51pIMSR4buZYyB0aMOibiwgaG/hurdjIG5nxrDhu51pIHRodcOqIG5ow6Ag4oCTIG5o4buvbmcgbmfGsOG7nWkgY8OzIHh1IGjGsOG7m25nIGRpIGNodXnhu4NuLCBz4buRbmcgbeG7mXQgbcOsbmggaG/hurdjIMOtdCB0aMOgbmggdmnDqm4gaMahbi4gRG8gxJHDsywgaOG7jSBjaGkgdGnDqnUgY2FvIGjGoW4gY2hvIGPDoWMgc+G6o24gcGjhuqltIG5oxrAgUHJvZHVjZSAoMTQuOTIlKSwgRnJvemVuIEZvb2RzICg5Ljk3JSksIHbDoCBCZXZlcmFnZXMgKDUuMjIlKSwgduG7kW4gZOG7hSBjaOG6vyBiaeG6v24sIHRp4buHbiBs4bujaSB2w6AgcGjDuSBo4bujcCB24bubaSBjw6FjIGLhu69hIMSDbiBjw6EgbmjDom4uIEjhu40gY8WpbmcgY8OzIHh1IGjGsOG7m25nIGNoaSDDrXQgaMahbiBjaG8gY8OhYyBkYW5oIG3hu6VjIGPDsyB0w61uaCDhu5VuIMSR4buLbmggaG/hurdjIHBo4bulYyB24bulIHF1eSBtw7QgbOG7m24gbmjGsCBIb3VzZWhvbGQgaGF5IFNuYWNrIEZvb2RzLg0KDQoqKipUw7NtIGzhuqFpLCBz4bufIGjhu691IG5ow6Ag4bufIOG6o25oIGjGsOG7n25nIMSR4bq/biBsb+G6oWkgc+G6o24gcGjhuqltIG11YSBkbyBsacOqbiBxdWFuIMSR4bq/biBt4bupYyDEkeG7mSDhu5VuIMSR4buLbmgsIHF1eSBtw7QgaOG7mSBnaWEgxJHDrG5oIHbDoCBwaG9uZyBjw6FjaCBz4buRbmcuIE5o4buvbmcgbmfGsOG7nWkgY8OzIG5ow6AgdGjGsOG7nW5nIMSR4bqndSB0xrAgdsOgbyBjw6FjIHPhuqNuIHBo4bqpbSBwaOG7pWMgduG7pSBnaWEgxJHDrG5oIGzDonUgZMOgaSB2w6Agc2luaCBob+G6oXQgbmjDs20sIHRyb25nIGtoaSBuZ8aw4budaSBraMO0bmcgY8OzIG5ow6AgxrB1IHRpw6puIHPhu7EgdGnhu4duIGzhu6NpLCBuaGFuaCBjaMOzbmcgdsOgIGxpbmggaG/huqF0IHRyb25nIHRpw6p1IGTDuW5nLiDEkGnhu4F1IG7DoHkgZ2nhuqNpIHRow61jaCB2w6wgc2FvIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIGNobyB0aOG6pXkgbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgZ2nhu69hIGhhaSBiaeG6v24uKioqDQoNCiMjICoqUEjhuqZOIDU6IFThu5RORyBL4bq+VCBWw4AgVEjhuqJPIExV4bqsTioqDQoNCiMjIyAqKjUuMSBUw7NtIHThuq90KioNCg0KVOG7lW5nIGjhu6NwIHThu6sgdOG6pXQgY+G6oyBjw6FjIHBow6JuIHTDrWNoIHRyw6puLCBjaMO6bmcgdGEgcsO6dCByYSBuaOG7r25nIGhp4buDdSBiaeG6v3Qgc8OidSBz4bqvYyB2w6AgZ2nDoSB0cuG7iyB24buBIGNow6JuIGR1bmcga2jDoWNoIGjDoG5nIHbDoCB0aMOzaSBxdWVuIG11YSBz4bqvbSBj4bunYSBo4buNIHRow7RuZyBxdWEgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaC4gQ+G7pSB0aOG7gywgY8OhYyB54bq/dSB04buRIG5oxrAgdMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6Ag4bufIGhheSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4ga2jDtG5nIGNo4buJIMSRxqFuIHRodeG6p24gbMOgIHRow7RuZyB0aW4gY8OhIG5ow6JuIOKAkyBtw6AgY8OybiBwaOG6o24gw6FuaCByw7UgcuG7h3QgcGhvbmcgY8OhY2ggc+G7kW5nLCBuaHUgY+G6p3UgdGnDqnUgZMO5bmcsIHbDoCDGsHUgdGnDqm4gc+G6o24gcGjhuqltIGPhu6dhIHThu6tuZyBuaMOzbSBraMOhY2ggaMOgbmcuIE5o4buvbmcga2jDoWMgYmnhu4d0IHRpbmggdOG6vyBuaMawbmcgxJHDoW5nIGvhu4MgbsOgeSBjaMOtbmggbMOgIGNow6xhIGtow7NhIMSR4buDIGPDoWMgbmjDoCBiw6FuIGzhursgdGjhuqV1IGhp4buDdSBow6BuaCB2aSBraMOhY2ggaMOgbmcgdsOgIHjDonkgZOG7sW5nIGPDoWMgY2hp4bq/biBsxrDhu6NjIHRp4bq/cCB0aOG7iywgcGjDom4gcGjhu5FpIHPhuqNuIHBo4bqpbSBoaeG7h3UgcXXhuqMgdsOgIHPDoXQgdGjhu7FjIHThur8gaMahbi4NCg0KLSAgIOG7niBuaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCDEkeG6v24gdHJ1bmcgYsOsbmggKFwkMTBL4oCTXCQ5MEspLCBz4bqjbiBwaOG6qW0gY2hpIHRpw6p1IG5oaeG7gXUgbmjhuqV0IGzDoCByYXUgcXXhuqMgdMawxqFpIChQcm9kdWNlKSwgY2hp4bq/bSB04burIDEzLjU5JSDEkeG6v24gMTUuNDUlLCBwaOG6o24gw6FuaCBuaHUgY+G6p3UgdGhp4bq/dCB54bq/dSB2w6AgxrB1IHRpw6puIHRo4buxYyBwaOG6qW0gdMawxqFpIHPhu5FuZyBwaOG7pWMgduG7pSBjdeG7mWMgc+G7kW5nIGjDoG5nIG5nw6B5LiBDw6FjIHPhuqNuIHBo4bqpbSBuaMawIHPhu69hIChEYWlyeSksIHRo4buxYyBwaOG6qW0gxJHDtG5nIGzhuqFuaCAoRnJvemVuIEZvb2RzKSB2w6AgxJHhu5MgxINuIG5o4bq5IChTbmFjayBGb29kcykgY8WpbmcgY2hp4bq/bSB04bu3IGzhu4cgxJHDoW5nIGvhu4MgdHJvbmcgY2hpIHRpw6p1LCBkbyBuaMOzbSBuw6B5IMawdSB0acOqbiB0aeG6v3Qga2nhu4dtIHbDoCBs4buxYSBjaOG7jW4gdGjhu7FjIHBo4bqpbSBjw7MgZ2nDoSB0cuG7iyBkaW5oIGTGsOG7oW5nIGNhbyB24bubaSBjaGkgcGjDrSBo4bujcCBsw70uIE5nxrDhu6NjIGzhuqFpLCBuaMOzbSB0aHUgbmjhuq1wIGNhbyBoxqFuIChcJDkwSyB0cuG7nyBsw6puKSBjw7MgeHUgaMaw4bubbmcgY2hpIHRpw6p1IG5oaeG7gXUgaMahbiB2w6BvIGPDoWMgc+G6o24gcGjhuqltIHRp4buHbiBs4bujaSBuaMawIEZyb3plbiBGb29kcyB2w6AgU25hY2sgRm9vZHMsIGNoaeG6v20ga2hv4bqjbmcgMTLigJMxMyUsIGPDuW5nIHbhu5tpIHPhu6ljIGto4buPZSB2w6AgduG7hyBzaW5oIGPDoSBuaMOibiAoSGVhbHRoIGFuZCBIeWdpZW5lKSBjaGnhur9tIHThu6sgNSUgxJHhur9uIDclLiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmgga2jhuqMgbsSDbmcgdMOgaSBjaMOtbmggdOG7kXQgaMahbiwgZ2nDunAgaOG7jSDEkeG6p3UgdMawIHbDoG8gc+G7sSB0aeG7h24gbOG7o2ksIMSRYSBk4bqhbmcgdGjhu7FjIHBo4bqpbSB2w6AgY2jEg20gc8OzYyBz4bupYyBraOG7j2UuIELDqm4gY+G6oW5oIMSRw7MsIMOhcCBs4buxYyBjw7RuZyB2aeG7h2MgdsOgIGzhu5FpIHPhu5FuZyBi4bqtbiBy4buZbiBjxaluZyB0aMO6YyDEkeG6qXkgbmjDs20gdGh1IG5o4bqtcCBjYW8gbOG7sWEgY2jhu41uIGPDoWMgc+G6o24gcGjhuqltIGdpw7pwIHRp4bq/dCBraeG7h20gdGjhu51pIGdpYW4gbcOgIHbhuqtuIMSR4bqjbSBi4bqjbyBjaOG6pXQgbMaw4bujbmcgY3Xhu5ljIHPhu5FuZy4NCg0KKioqLVw+IE5ow7NtIHRodSBuaOG6rXAgdGjhuqVwIMSR4bq/biB0cnVuZyBiw6xuaCDGsHUgdGnDqm4gY2hpIHRpw6p1IHbDoG8gY8OhYyBz4bqjbiBwaOG6qW0gdGhp4bq/dCB54bq/dSB2w6AgY8OzIGdpw6EgdHLhu4sgZGluaCBkxrDhu6FuZyBjYW8gduG7m2kgY2hpIHBow60gaOG7o3AgbMO9IG5oxrAgcmF1IHF14bqjIHTGsMahaSwgdHJvbmcga2hpIG5ow7NtIHRodSBuaOG6rXAgY2FvIMawdSB0acOqbiBjw6FjIHPhuqNuIHBo4bqpbSB0aeG7h24gbOG7o2kgdsOgIGNoxINtIHPDs2Mgc+G7qWMga2jhu49lIGRvIGto4bqjIG7Eg25nIHTDoGkgY2jDrW5oIHThu5F0IGjGoW4gdsOgIGzhu5FpIHPhu5FuZyBi4bqtbiBy4buZbi4qKioNCg0KLSAgIFBow6JuIGLhu5EgZMOibiBjxrAgdGhlbyBuaMOzbSB0aHUgbmjhuq1wIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0LiDhu54gbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAgKDEwS+KAkzMwSyksIGPGsCBkw6JuIGNo4bunIHnhur91IHThuq1wIHRydW5nIHThuqFpIGPDoWMgdGjDoG5oIHBo4buRIG5oxrAgU2FsZW0gKDkuOTclKSwgVGFjb21hICg5LjQ1JSksIFNlYXR0bGUgKDYuNTAlKSwgTG9zIEFuZ2VsZXMgKDYuMzElKSB2w6AgU2FuIERpZWdvICg2LjgwJSkuIE5o4buvbmcgdGjDoG5oIHBo4buRIG7DoHkgY8OzIG3hu6ljIHPhu5FuZyBwaMO5IGjhu6NwIHbhu5tpIG5nw6JuIHPDoWNoIGjhuqFuIGNo4bq/LCBjdW5nIGPhuqVwIGPGoSBz4bufIGjhuqEgdOG6p25nIGPGoSBi4bqjbiB2w6AgY2hpIHBow60gc2luaCBob+G6oXQgduG7q2EgcGjhuqNpLCBnacO6cCBuZ8aw4budaSB0aHUgbmjhuq1wIHRo4bqlcCBk4buFIGTDoG5nIHRp4bq/cCBj4bqtbi4gU2FsZW0gdsOgIFRhY29tYSDEkeG6t2MgYmnhu4d0IHRodSBow7p0IGfhuqduIDEwJSBjxrAgZMOibiB0aHUgbmjhuq1wIHRo4bqlcCwgY2hvIHRo4bqleSDEkcOieSBsw6Agbmjhu69uZyDEkWnhu4NtIMSR4bq/biBwaOG7lSBiaeG6v24uIEtoaSB0aHUgbmjhuq1wIHTEg25nIGzDqm4sIGPGsCBkw6JuIGNodXnhu4NuIGThu4tjaCBzYW5nIGPDoWMgdGjDoG5oIHBo4buRIGzhu5tuLCBwaMOhdCB0cmnhu4NuIGjGoW4uIE5ow7NtIHRodSBuaOG6rXAgOTBL4oCTMTEwSyB24bqrbiB04bqtcCB0cnVuZyDhu58gU2FsZW0gKDEzLjU0JSkgdsOgIGPDoWMgdGjDoG5oIHBo4buRIGzhu5tuIGtow6FjIG5oxrAgTG9zIEFuZ2VsZXMsIFNhbiBEaWVnbywgVGFjb21hIHbDoCBTZWF0dGxlLCBuaMawbmcgdOG7tyBs4buHIOG7nyBjw6FjIHRow6BuaCBwaOG7kSBuw6B5IHRoYXkgxJHhu5VpLCBwaOG6o24gw6FuaCB4dSBoxrDhu5tuZyBjaOG7jW4gbsahaSBjw7Mgbmhp4buBdSBjxqEgaOG7mWkgdmnhu4djIGzDoG0gdsOgIHRp4buHbiDDrWNoIGjGoW4uIE5ow7NtIHRodSBuaOG6rXAgcuG6pXQgY2FvICgxNTBLKykgcGjDom4gYuG7kSBjaOG7pyB54bq/dSB04bqhaSBjw6FjIHRow6BuaCBwaOG7kSBjaOG6pXQgbMaw4bujbmcgc+G7kW5nIGNhbyBuaMawIEJyZW1lcnRvbiAoMTIuODIlKSwgQmV2ZXJseSBIaWxscyAoOC40MiUpLCBTZWF0dGxlICg4Ljc5JSkgdsOgIExvcyBBbmdlbGVzICg3LjMzJSksIG7GoWkgY8OzIGThu4tjaCB24bulIGhp4buHbiDEkeG6oWksIG3DtGkgdHLGsOG7nW5nIHPhu5FuZyBzYW5nIHRy4buNbmcgdsOgIG5oaeG7gXUgdGnhu4duIMOtY2ggcGjhu6VjIHbhu6UgbOG7kWkgc+G7kW5nIGNhbyBj4bqlcC4NCg0KKioqLVw+IFRodSBuaOG6rXAg4bqjbmggaMaw4bufbmcgdHLhu7FjIHRp4bq/cCDEkeG6v24ga2jhuqMgbsSDbmcgY2hpIHRy4bqjIGNoaSBwaMOtIHNpbmggaG/huqF0IHbDoCBs4buxYSBjaOG7jW4gbcO0aSB0csaw4budbmcgc+G7kW5nOyBuaMOzbSB0aHUgbmjhuq1wIGNhbyBjw7MgxJFp4buBdSBraeG7h24gdMOgaSBjaMOtbmggdsOgIG5odSBj4bqndSBoxrDhu59uZyB0aOG7pSBjdeG7mWMgc+G7kW5nIHThu5F0IGjGoW4gbsOqbiB0aMaw4budbmcgxrB1IHRpw6puIGPDoWMga2h1IHbhu7FjIHNhbmcgdHLhu41uZywgdGnhu4duIG5naGksIGPDsm4gbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAgxrB1IHRpw6puIGPDoWMga2h1IHbhu7FjIHBow7kgaOG7o3AgduG7m2kgbmfDom4gc8OhY2ggdsOgIG5odSBj4bqndSBjxqEgYuG6o24uKioqDQoNCi0gICBN4buZdCBz4buRIGJhbmcgbmjGsCBXYXNoaW5ndG9uIChXQSksIENhbGlmb3JuaWEgKENBKSwgdsOgIE9yZWdvbiAoT1IpIGPDsyB04bu3IGzhu4cgZMOibiBjxrAgY2FvIHRyb25nIGPhuqMgaGFpIG5ow7NtIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibjoga+G6v3QgaMO0biAoTWFycmllZCkgdsOgIMSR4buZYyB0aMOibiAoU2luZ2xlKS4gQ+G7pSB0aOG7gywgV2FzaGluZ3RvbiBjaGnhur9tIHThu7cgbOG7hyBs4bubbiBuaOG6pXQgduG7m2kgMzMuODglIGTDom4gY8awIGvhur90IGjDtG4gdsOgIDMxLjE2JSDEkeG7mWMgdGjDom4sIENhbGlmb3JuaWEgY8WpbmcgY8OzIHThu7cgbOG7hyBjYW8gdMawxqFuZyDhu6luZyBsw6AgMTkuMzclIHbDoCAxOS41MSUsIHRyb25nIGtoaSBPcmVnb24gxJHhu6luZyDhu58gbeG7qWMgMTQuOTElIHbDoCAxNy4yMSUuIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCBxdXkgbcO0IGTDom4gc+G7kSBs4bubbiB2w6AgbeG6rXQgxJHhu5kgZMOibiBjxrAgY2FvIHThuqFpIG5o4buvbmcgYmFuZyBuw6B5LCBk4bqrbiDEkeG6v24gc+G7sSDEkWEgZOG6oW5nIHbhu4EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLiBOZ8aw4bujYyBs4bqhaSwgY8OhYyBiYW5nIG5oxrAgWmFjYXRlY2FzLCBERiwgQkMgdsOgIFl1Y2F0YW4gY8OzIHThu7cgbOG7hyBkw6JuIGPGsCB0aOG6pXAgaMahbiB2w6Agc+G7sSBwaMOibiBi4buRIGPDom4gYuG6sW5nIGdp4buvYSBoYWkgbmjDs20sIHbDrSBk4bulIFphY2F0ZWNhcyBsw6AgOS4xOSUgKGvhur90IGjDtG4pIHbDoCA5LjI2JSAoxJHhu5ljIHRow6JuKS4gU+G7sSBjw6JuIGLhurFuZyBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaCDEkeG6t2MgxJFp4buDbSBkw6JuIHPhu5Egw610IMSRw7RuZyB2w6AgxJHhu5NuZyDEkeG7gXUgaMahbiB0cm9uZyBjw6FjIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibi4NCg0KKioqLVw+IFF1eSBtw7QgZMOibiBz4buRIHbDoCBt4bqtdCDEkeG7mSBjxrAgdHLDuiDhuqNuaCBoxrDhu59uZyDEkeG6v24gc+G7kSBsxrDhu6NuZyB2w6AgxJFhIGThuqFuZyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdOG6oWkgdOG7q25nIGJhbmc7IGJhbmcgxJHDtG5nIGTDom4gc+G6vSBjw7Mgc+G7kSBsxrDhu6NuZyBs4bubbiBuZ8aw4budaSB0cm9uZyBt4buNaSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4sIGPDsm4gYmFuZyDDrXQgZMOibiB0aMaw4budbmcgY8OzIHPhu7EgcGjDom4gYuG7kSBjw6JuIGLhurFuZyB2w6AgdOG7tyBs4buHIHRo4bqlcCBoxqFuLioqKg0KDQotICAgQ+G6oyBoYWkgbmjDs20gY2jGsGEga+G6v3QgaMO0biAoTikgdsOgIMSRw6Mga+G6v3QgaMO0biAoWSkgxJHhu4F1IMawdSB0acOqbiBjaGkgdGnDqnUgY2hvIHJhdSBj4bunIHF14bqjIHTGsMahaSAoUHJvZHVjZSkgduG7m2kgdOG7tyBs4buHIGNhbywgbOG6p24gbMaw4bujdCBsw6AgMTQuOTIlIChjaMawYSBr4bq/dCBow7RuKSB2w6AgMTMuNjklICjEkcOjIGvhur90IGjDtG4pLCBjaG8gdGjhuqV5IHRo4buxYyBwaOG6qW0gdMawxqFpIHPhu5FuZyBsw6AgbeG6t3QgaMOgbmcgdGhp4bq/dCB54bq/dSBjaHVuZyBjaG8gbeG7jWkgbmfGsOG7nWkuIEPDoWMgbmjDs20gc+G6o24gcGjhuqltIG5oxrAgRnJvemVuIEZvb2RzICh0aOG7sWMgcGjhuqltIMSRw7RuZyBs4bqhbmgpIGPFqW5nIMSRxrDhu6NjIHRpw6p1IGTDuW5nIHTGsMahbmcgxJHhu5NuZywgY2hp4bq/bSA5Ljk3JSDhu58gbmjDs20gY2jGsGEga+G6v3QgaMO0biB2w6AgOS43MyUg4bufIG5ow7NtIMSRw6Mga+G6v3QgaMO0bi4gVHV5IG5oacOqbiwgbmjDs20gxJHDoyBr4bq/dCBow7RuIGNoaSB0acOqdSBuaGnhu4F1IGjGoW4gY2hvIFNuYWNrIEZvb2RzICgxMiUgc28gduG7m2kgMTAuNDUlKSB2w6AgSG91c2Vob2xkICg5Ljg0JSBzbyB24bubaSAxMC40OSUpLCBwaOG6o24gw6FuaCBuaHUgY+G6p3UgZMO5bmcgbmhp4buBdSBz4bqjbiBwaOG6qW0gxINuIG5o4bq5IHbDoCDEkeG7kyBnaWEgZOG7pW5nIHBo4bulYyB24bulIGNobyBnaWEgxJHDrG5oIMSRw7RuZyB0aMOgbmggdmnDqm4uIE5nxrDhu6NjIGzhuqFpLCBuaMOzbSBjaMawYSBr4bq/dCBow7RuIMawdSB0acOqbiBoxqFuIGNobyBQcm9kdWNlIHbDoCBGcm96ZW4gRm9vZHMsIGNobyB0aOG6pXkgeHUgaMaw4bubbmcgbOG7sWEgY2jhu41uIGPDoWMgc+G6o24gcGjhuqltIHRp4buHbiBs4bujaSB2w6AgbMOgbmggbeG6oW5oIHBow7kgaOG7o3AgduG7m2kgbmh1IGPhuqd1IGPDoSBuaMOibi4NCg0KKioqLVw+IFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV5IG3DtCB2w6AgxJHhurdjIMSRaeG7g20gbmh1IGPhuqd1IHRpw6p1IGTDuW5nLCBraGkgaOG7mSBnaWEgxJHDrG5oIG5oaeG7gXUgbmfGsOG7nWkgY+G6p24gxJFhIGThuqFuZyB2w6Agc+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gbOG7m24gaMahbiwgY8OybiBjw6EgbmjDom4gxrB1IHRpw6puIHPhu7EgdGnhu4duIGzhu6NpIHbDoCBkaW5oIGTGsOG7oW5nIHBow7kgaOG7o3AgY2hvIGLhuqNuIHRow6JuLiBWw6wgduG6rXksIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgcGjhuqNuIMOhbmggxJHhurdjIMSRaeG7g20gc2luaCBob+G6oXQgdsOgIG5odSBj4bqndSB0acOqdSBkw7luZyBk4buxYSB0csOqbiB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIHF1eSBtw7QgaOG7mSBnaWEgxJHDrG5oLioqKg0KDQojIyMgKio1LjIgSOG6oW4gY2jhur8gY+G7p2EgcGjDom4gdMOtY2g6KioNCg0KLSAgIEThu68gbGnhu4d1IGPDsyB0aOG7gyBraMO0bmcgxJHhu5NuZyDEkeG7gXUgduG7gSDEkeG7mSB0aW4gY+G6rXksIG3hu5l0IHPhu5EgbmjDs20gbmjhu48gKHbDrSBk4bulIG5ow7NtIHRodSBuaOG6rXAgcuG6pXQgY2FvIGhv4bq3YyBjw6FjIHRow6BuaCBwaOG7kSBuaOG7jykgY8OzIGvDrWNoIHRoxrDhu5tjIG3huqt1IGjhuqFuIGNo4bq/LCBk4bqrbiDEkeG6v24ga+G6v3QgcXXhuqMgY8OzIHRo4buDIGtow7RuZyDEkeG6oWkgZGnhu4duIGhvw6BuIHRvw6BuLg0KDQotICAgUGjDom4gdMOtY2ggY2jhu4kgZOG7sWEgdHLDqm4gYmnhur9uIMSR4buLbmggdMOtbmggbcOgIGtow7RuZyB4w6l0IMSR4bq/biBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGhv4bq3YyBjw6FjIHnhur91IHThu5EgbmjGsCB0deG7lWkgdMOhYywgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuLCBuZ2jhu4EgbmdoaeG7h3AsIGhv4bq3YyB0aMOzaSBxdWVuIG11YSBz4bqvbSBjaGkgdGnhur90LCBsw6BtIGjhuqFuIGNo4bq/IMSR4buZIHPDonUgc+G6r2MgY+G7p2EgaGnhu4N1IGJp4bq/dCB24buBIGtow6FjaCBow6BuZy4NCg0KLSAgIEPDoWMgYmnhur9uIG5oxrAgTWFyaXRhbFN0YXR1cywgSG9tZW93bmVyLCBBbm51YWxJbmNvbWUgdsOgIENpdHkgY8OzIHRo4buDIHTGsMahbmcgcXVhbiB24bubaSBuaGF1LCBnw6J5IGtow7Mga2jEg24gdHJvbmcgdmnhu4djIHBow6JuIHTDoWNoIGNow61uaCB4w6FjIOG6o25oIGjGsOG7n25nIHJpw6puZyBiaeG7h3QgY+G7p2EgdOG7q25nIHnhur91IHThu5EgbMOqbiB0aMOzaSBxdWVuIHRpw6p1IGTDuW5nLg0KDQotICAgUGjDom4gdMOtY2ggY2jhu6cgeeG6v3UgZOG7sWEgdHLDqm4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBuaMawIE1hcml0YWxTdGF0dXMsIEhvbWVvd25lciwgQW5udWFsSW5jb21lIChwaMOibiBuaMOzbSB0aHUgbmjhuq1wIHRoZW8ga2hv4bqjbmcpLCBDaXR5LCBTdGF0ZW9yUHJvdmluY2UsIFByb2R1Y3RGYW1pbHkgdsOgIGPDoWMgYmnhur9uIGxpw6puIHF1YW4gxJHhur9uIHPhuqNuIHBo4bqpbS4gVmnhu4djIHRoaeG6v3UgY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyBjaGkgdGnhur90IG5oxrAgdHXhu5VpIHTDoWMsIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiwgbmdo4buBIG5naGnhu4dwLCBt4bupYyBjaGkgdGnDqnUgY+G7pSB0aOG7gyBoYXkgdGjDs2kgcXVlbiBtdWEgc+G6r20gdOG7q25nIGxv4bqhaSBz4bqjbiBwaOG6qW0gbMOgbSBo4bqhbiBjaOG6vyBraOG6oyBuxINuZyBwaMOibiB0w61jaCBzw6J1IHPhuq9jIHbhu4EgxJHhu5luZyBs4buxYyB0acOqdSBkw7luZy4NCg0KLSAgIEtow7RuZyB4w6l0IHnhur91IHThu5EgZ2nhu5tpIHTDrW5oIChHZW5kZXIpIGPDsyB0aOG7gyBsw6BtIG3huqV0IMSRaSBjw6FjIGtow6FjIGJp4buHdCBxdWFuIHRy4buNbmcgdHJvbmcgaMOgbmggdmkgdGnDqnUgZMO5bmcgZ2nhu69hIG5hbSB2w6AgbuG7ry4gQ8OhYyB54bq/dSB04buRIHjDoyBo4buZaSwgdsSDbiBow7NhIG5oxrAgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuLCBuZ2jhu4EgbmdoaeG7h3AsIHRow6BuaCBwaOG6p24gaOG7mSBnaWEgxJHDrG5oIGtow7RuZyDEkcaw4bujYyB4w6l0IMSR4bq/biwgbMOgbSBo4bqhbiBjaOG6vyBraOG6oyBuxINuZyBk4buxIMSRb8OhbiB2w6AgcGjDom4gdMOtY2ggxJHhurdjIMSRaeG7g20ga2jDoWNoIGjDoG5nIGNow61uaCB4w6FjIGjGoW4uDQoNCiMjIyAqKjUuMyDEkOG7gSB4deG6pXQqKg0KDQotICAgROG7sWEgdHLDqm4gcGjDom4gdMOtY2ggaMOgbmggdmkgdGnDqnUgZMO5bmcgdGhlbyB0aHUgbmjhuq1wIHbDoCB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4sIGRvYW5oIG5naGnhu4dwIG7Dqm4gcGjDom4ga2jDumMga2jDoWNoIGjDoG5nIHLDtSByw6BuZyDEkeG7gyB04buRaSDGsHUgaMOzYSBjaGnhur9uIGzGsOG7o2MgbWFya2V0aW5nLiBOaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCDEkeG6v24gdHJ1bmcgYsOsbmggxrB1IHRpw6puIHPhuqNuIHBo4bqpbSB0aGnhur90IHnhur91LCBnacOhIGjhu6NwIGzDvSBuaMawIHJhdSBxdeG6oyB0xrDGoWksIHPhu69hIHbDoCB0aOG7sWMgcGjhuqltIMSRw7RuZyBs4bqhbmgsIHbDrCB24bqteSBj4bqnbiB04bqtcCB0cnVuZyBraHV54bq/biBtw6NpLCBxdeG6o25nIGPDoW8gbmjhuqVuIG3huqFuaCBnacOhIHRy4buLIGRpbmggZMaw4buhbmcgdsOgIHRp4bq/dCBraeG7h20uIE5ow7NtIHRodSBuaOG6rXAgY2FvIGPDsyB4dSBoxrDhu5tuZyBjaGkgdGnDqnUgY2hvIGPDoWMgc+G6o24gcGjhuqltIHRp4buHbiBs4bujaSwgxJFhIGThuqFuZyB2w6AgY2jEg20gc8OzYyBz4bupYyBraOG7j2UgaMahbiwgbsOqbiB04bqtcCB0cnVuZyBwaMOhdCB0cmnhu4NuIHPhuqNuIHBo4bqpbSBjYW8gY+G6pXAsIGThu4tjaCB24bulIGdpYW8gaMOgbmcgbmhhbmggdsOgIHRy4bqjaSBuZ2hp4buHbSBtdWEgc+G6r20gdGh14bqtbiB0aeG7h24uIFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjxaluZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gbmh1IGPhuqd1OiBo4buZIGdpYSDEkcOsbmggxJHDoyBr4bq/dCBow7RuIGPhuqduIHPhuqNuIHBo4bqpbSDEkWEgZOG6oW5nLCBz4buRIGzGsOG7o25nIGzhu5tuLCB0cm9uZyBraGkga2jDoWNoIGjDoG5nIMSR4buZYyB0aMOibiDGsHUgdGnDqm4gY8OhYyBz4bqjbiBwaOG6qW0gY8OhIG5ow6JuLCB0aeG7h24gbOG7o2kgdsOgIGzDoG5oIG3huqFuaC4NCg0KLSAgIFbhu4EgcGjDom4gcGjhu5FpLCBkb2FuaCBuZ2hp4buHcCBuw6puIHThuq1wIHRydW5nIHBow6F0IHRyaeG7g24gaOG7hyB0aOG7kW5nIHThuqFpIGPDoWMgdGjDoG5oIHBo4buRIGPDsyBt4bqtdCDEkeG7mSBkw6JuIGPGsCBjYW8gdsOgIMSRYSBk4bqhbmcgdGh1IG5o4bqtcCBuaMawIFdhc2hpbmd0b24sIENhbGlmb3JuaWEgdsOgIE9yZWdvbiwgxJHhu5NuZyB0aOG7nWkgeMOieSBk4buxbmcgY8OhYyBj4butYSBow6BuZyBwaMO5IGjhu6NwIHbhu5tpIMSR4bq3YyDEkWnhu4NtIHThu6tuZyBuaMOzbSB0aHUgbmjhuq1wIHThuqFpIGPDoWMga2h1IHbhu7FjIGtow6FjIG5oYXUuIEPhuqduIHBow6F0IHRyaeG7g24gdGjDqm0gY8OhYyBkw7JuZyBz4bqjbiBwaOG6qW0gcmF1IHF14bqjIHTGsMahaSwgdGjhu7FjIHBo4bqpbSDEkcO0bmcgbOG6oW5oLCBzbmFjayB2w6Agc+G6o24gcGjhuqltIGNoxINtIHPDs2Mgc+G7qWMga2jhu49lIHBow7kgaOG7o3AgduG7m2kgdOG7q25nIHBow6JuIGtow7pjLiBTb25nIHNvbmcgxJHDsywgZG9hbmggbmdoaeG7h3AgbsOqbiDhu6luZyBk4bulbmcgY8O0bmcgbmdo4buHIHbDoCBo4buHIHRo4buRbmcgQ1JNIMSR4buDIGPDoSBuaMOibiBow7NhIGNoaeG6v24gZOG7i2NoIG1hcmtldGluZywgdGhlbyBkw7VpIGjDoG5oIHZpIGtow6FjaCBow6BuZyB2w6AgbsOibmcgY2FvIHRy4bqjaSBuZ2hp4buHbSBtdWEgc+G6r20sIHThu6sgxJHDsyB0xINuZyBoaeG7h3UgcXXhuqMga2luaCBkb2FuaCB2w6AgZ2nhu68gY2jDom4ga2jDoWNoIGjDoG5nIGzDonUgZMOgaS4NCg0KIyMjICoqNS40IEjGsOG7m25nIG5naGnDqm4gY+G7qXUgdGnhur9wIHRoZW8qKg0KDQotICAgTmjDs20gbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuLCBjw7MgbmjDoCB2w6AgdGh1IG5o4bqtcCBjYW8gY8OzIMSR4bq3YyDEkWnhu4NtIGNoaSB0acOqdSBraMOhYyBuaMOzbSDEkeG7mWMgdGjDom4gdsOgIGNoxrBhIHPhu58gaOG7r3UgbmjDoCBraMO0bmc/DQoNCi0gICBUaHUgbmjhuq1wIHbDoCB0w6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCDhuqNuaCBoxrDhu59uZyByYSBzYW8gxJHhur9uIHZp4buHYyDGsHUgdGnDqm4gY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gdGhp4bq/dCB54bq/dSBzbyB24bubaSBz4bqjbiBwaOG6qW0gdGnhu4duIGzhu6NpPw0KDQotICAgQ8OzIHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIGjDoG5oIHZpIHRpw6p1IGTDuW5nIHRoZW8gZ2nhu5tpIHTDrW5oIGtoaSBr4bq/dCBo4bujcCB24bubaSBjw6FjIGJp4bq/biBuaMawIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6AgdGh1IG5o4bqtcCBraMO0bmc/DQoNCi0gICBOaMOzbSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4sIGPDsyBuaMOgIHbDoCB0aHUgbmjhuq1wIGNhbyBjw7MgxJHhurdjIMSRaeG7g20gY2hpIHRpw6p1IGtow6FjIG5ow7NtIMSR4buZYyB0aMOibiB2w6AgY2jGsGEgc+G7nyBo4buvdSBuaMOgIGtow7RuZz8NCg0KLSAgIE3hu6ljIMSR4buZIOG6o25oIGjGsOG7n25nIGPhu6dhIHRodSBuaOG6rXAga+G6v3QgaOG7o3AgduG7m2kgdMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6AgxJHhur9uIMawdSB0acOqbiBtdWEgY8OhYyBz4bqjbiBwaOG6qW0gdGhp4bq/dCB54bq/dSAocmF1IGPhu6cgcXXhuqMsIHPhu69hLC4uLikgc28gduG7m2kgc+G6o24gcGjhuqltIHRp4buHbiBs4bujaSAodGjhu7FjIHBo4bqpbSDEkcO0bmcgbOG6oW5oLCDEkeG7kyDEg24gbmjhurkpIG5o4bqxbSB4w6FjIMSR4buLbmggcsO1IMSR4buZbmcgbOG7sWMgY2hpIHRpw6p1IHRoZW8gcGjDom4ga2jDumMga2jDoWNoIGjDoG5nLg0KDQojICoqVzMqKg0KDQojIyAqKlBI4bqmTiA2OiBMw40gVEhVWeG6vlQqKg0KDQojIyMgKio2LjEgUkVMQVRJVkUgUklTSyoqDQoNCioqTmd1eSBjxqEgdMawxqFuZyDEkeG7kWkgKFJSKSoqIGzDoCBt4buZdCAqdOG7tyBz4buRIGdp4buvYSBoYWkgdOG7tyBs4buHIChwcm9wb3J0aW9ucykqLg0KDQokJA0KUlIgPSBcZnJhY3tFRVJ9e0NFUn0NCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gICAqKkVFUiAoRXhwZXJpbWVudGFsIEV2ZW50IFJhdGUpKio6IFThu7cgbOG7hyB44bqjeSByYSBz4buxIGtp4buHbiDhu58gbmjDs20gY2FuIHRoaeG7h3BcDQotICAgKipDRVIgKENvbnRyb2wgRXZlbnQgUmF0ZSkqKjogVOG7tyBs4buHIHjhuqN5IHJhIHPhu7Ega2nhu4duIOG7nyBuaMOzbSDEkeG7kWkgY2jhu6luZw0KDQoqKlJSIFw8IDEqKiBu4bq/dSBuaMOzbSBu4bqxbSDhu58gKip04butIHPhu5EqKiBjw7Mgbmd1eSBjxqEgeOG6o3kgcmEgc+G7sSBraeG7h24gKip0aOG6pXAgaMahbioqLlwNCvCfkYkgxJDDonkgbMOgIMSRaeG7gXUgKiptb25nIG114buRbioqIG7hur91IHPhu7Ega2nhu4duIGzDoCAqKmvhur90IGPhu6VjIHjhuqV1KiogKHbDrSBk4bulOiB04butIHZvbmcpLg0KDQotICAgKipSUiBcPiAxKiogbuG6v3UgbmjDs20gbuG6sW0g4bufICoqdOG7rSBz4buRKiogY8OzIG5ndXkgY8ahIHjhuqN5IHJhIHPhu7Ega2nhu4duICoqY2FvIGjGoW4qKi5cDQogICAg8J+RiSDEkMOieSBsw6AgxJFp4buBdSAqKm1vbmcgbXXhu5FuKiogbuG6v3Ugc+G7sSBraeG7h24gbMOgICoqa+G6v3QgY+G7pWMgdOG7kXQqKiAodsOtIGThu6U6IGLhu48gdGh14buRYyBsw6EgdGjDoG5oIGPDtG5nKS4NCg0KIyMjICoqNi4yIEPhuqV1IHRyw7pjIHjDoWMgc3XhuqV0IGPhu6dhIGLhuqNuZyBuZ+G6q3Ugbmhpw6puOioqDQoNClRyb25nIHBow6JuIHTDrWNoIGLhuqNuZyB04bqnbiBz4buRIChjb250aW5nZW5jeSB0YWJsZSksIGhhaSBsb+G6oWkgcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0IHRoxrDhu51uZyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBtw7QgaMOsbmggaMOzYSBjw6FjaCBi4bqjbmcgbmfhuqt1IG5oacOqbiDEkcaw4bujYyBzaW5oIHJhIGzDoCAqKnBow6JuIHBo4buRaSDEkWEgdGjhu6ljIChNdWx0aW5vbWlhbCkqKiB2w6AgKipwaMOibiBwaOG7kWkgUG9pc3NvbioqLg0KDQojIyMjICoqNi4yLjEuIFBow6JuIHBo4buRaSDEkGEgdGjhu6ljIChNdWx0aW5vbWlhbCBEaXN0cmlidXRpb24pKioNCg0KKirEkOG6t2MgxJFp4buDbToqKg0KDQotIEzDoCBwaOG6p24gbeG7nyBy4buZbmcgY+G7p2EgcGjDom4gcGjhu5FpIG5o4buLIHRo4bupYyAoYmlub21pYWwpIGNobyB0csaw4budbmcgaOG7o3Agbmhp4buBdSBkYW5oIG3hu6VjLg0KLSBU4buVbmcgc+G7kSBxdWFuIHPDoXQgJG4kIGzDoCBj4buRIMSR4buLbmguDQotIE3hu5dpIHF1YW4gc8OhdCByxqFpIHbDoG8gxJHDum5nIG3hu5l0IGRhbmggbeG7pWMgKMO0IHRyb25nIGLhuqNuZykuDQoNCioqTcO0IGjDrG5oOioqDQoNCkdp4bqjIHPhu60gYuG6o25nIGPDsyAkayQgw7QsIHRow6wgc+G7kSDEkeG6v20gdHJvbmcgdOG7q25nIMO0ICQoWF8xLCBYXzIsIFxsZG90cywgWF9rKSQgdHXDom4gdGhlbzoNCg0KJCQNCihYXzEsIFhfMiwgXGxkb3RzLCBYX2spIFxzaW0gXHRleHR7TXVsdGlub21pYWx9KG47IHBfMSwgcF8yLCBcbGRvdHMsIHBfaykNCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gJG4kOiB04buVbmcgc+G7kSBxdWFuIHPDoXQgIA0KLSAkcF9pJDogeMOhYyBzdeG6pXQgcsahaSB2w6BvIMO0IHRo4bupICRpJCwgduG7m2kgJFxzdW1fe2k9MX1eayBwX2kgPSAxJCAgDQotICRcc3VtX3tpPTF9XmsgWF9pID0gbiQNCg0KKirhu6huZyBk4bulbmc6KioNCg0KLSBEw7luZyBraGkgdGjhu7FjIGhp4buHbiBraOG6o28gc8OhdCBob+G6t2MgdGjDrSBuZ2hp4buHbSB24bubaSB04buVbmcgc+G7kSBt4bqrdSBj4buRIMSR4buLbmguDQotIFBow6JuIGxv4bqhaSDEkeG7kWkgdMaw4bujbmcgdGhlbyBuaMOzbS4NCg0KKipWw60gZOG7pToqKg0KDQpLaOG6o28gc8OhdCAyMDAgbmfGsOG7nWkgduG7gSBsb+G6oWkgxJHhu5MgdeG7kW5nIHnDqnUgdGjDrWNoIChjw6AgcGjDqiwgdHLDoCwgbsaw4bubYyBs4buNYyksIHPhu5EgbmfGsOG7nWkgY2jhu41uIHThu6tuZyBsb+G6oWkgxJHGsOG7o2MgbcO0IGjDrG5oIGjDs2EgdGhlbyBwaMOibiBwaOG7kWkgxJFhIHRo4bupYy4NCg0KDQoNCiMjIyMgKio2LjIuMyBQaMOibiBwaOG7kWkgUG9pc3NvbiAoUG9pc3NvbiBEaXN0cmlidXRpb24pKioNCg0KKirEkOG6t2MgxJFp4buDbToqKg0KDQotIE3DtCBow6xuaCBow7NhIHPhu5EgbOG6p24geOG6o3kgcmEgY+G7p2EgbeG7mXQgc+G7sSBraeG7h24gbmfhuqt1IG5oacOqbiB0cm9uZyBraMO0bmcgZ2lhbiwgdGjhu51pIGdpYW4gaG/hurdjIMSRxqFuIHbhu4sgbmjhuqV0IMSR4buLbmguDQotIEPDoWMgc+G7kSDEkeG6v20gdHJvbmcgdOG7q25nIMO0IMSRxrDhu6NjIGNvaSBsw6AgxJHhu5ljIGzhuq1wLg0KLSBLaMO0bmcgY8OzIHLDoG5nIGJ14buZYyB24buBIHThu5VuZyBz4buRIHF1YW4gc8OhdC4NCg0KKipNw7QgaMOsbmg6KioNCg0KU+G7kSDEkeG6v20gdHJvbmcgbeG7l2kgw7QgJFhfaSQgdHXDom4gdGhlbzoNCg0KJCQNClhfaSBcc2ltIFx0ZXh0e1BvaXNzb259KFxtdV9pKQ0KJCQNCg0KVHJvbmcgxJHDszoNCg0KLSAkXG11X2kkOiBr4buzIHbhu41uZyAodHJ1bmcgYsOsbmgpIHPhu5EgxJHhur9tIOG7nyDDtCB0aOG7qSAkaSQNCi0gQ8OhYyAkWF9pJCBsw6AgxJHhu5ljIGzhuq1wDQoNCioq4buobmcgZOG7pW5nOioqDQoNCi0gUGjDom4gdMOtY2ggc+G7kSBz4buxIGtp4buHbiBuZ+G6q3Ugbmhpw6puIG5oxrA6IGNhIGLhu4duaCwgc+G7sSBj4buRIGvhu7kgdGh14bqtdCwgdGFpIG7huqFuLCB2LnYuDQotIEThu68gbGnhu4d1IGtow7RuZyBjw7MgdOG7lW5nIHPhu5EgbeG6q3UgY+G7kSDEkeG7i25oLg0KDQoqKlbDrSBk4bulOioqDQoNClPhu5EgY2EgbeG6r2MgYuG7h25oIHRoZW8gdOG7q25nIHThu4luaCBob+G6t2Mgc+G7kSBjdeG7mWMgZ+G7jWkgxJHhur9uIHRydW5nIHTDom0gZOG7i2NoIHbhu6UgdHJvbmcgbeG7l2kgZ2nhu50gxJHGsOG7o2MgbcO0IGjDrG5oIGjDs2EgdGhlbyBwaMOibiBwaOG7kWkgUG9pc3Nvbi4NCg0KDQoNCiMjIyMgKio2LjIuNCBTbyBzw6FuaCBwaMOibiBwaOG7kWkgTXVsdGlub21pYWwgdsOgIFBvaXNzb24qKg0KDQp8IFRpw6p1IGNow60gICAgICAgICAgICAgICAgICB8IE11bHRpbm9taWFsICAgICAgICAgICAgICAgICAgICAgICAgIHwgUG9pc3NvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IFThu5VuZyBz4buRIMSR4bq/bSAkbiQgICAgICAgICAgfCBD4buRIMSR4buLbmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS2jDtG5nIGPhu5EgxJHhu4tuaCAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBQaOG7pSB0aHXhu5ljIGdp4buvYSBjw6FjIMO0ICAgICB8IEPDsyAodsOsICRcc3VtIFhfaSA9IG4kKSAgICAgICAgICAgICAgfCBLaMO0bmcgKGPDoWMgw7QgxJHhu5ljIGzhuq1wKSAgICAgICAgICAgICAgIHwNCnwgTG/huqFpIGThu68gbGnhu4d1IHRoxrDhu51uZyBn4bq3cCAgfCBLaOG6o28gc8OhdCwgcGjDom4gbG/huqFpICAgICAgICAgICAgICAgICB8IEThu68gbGnhu4d1IMSR4bq/bSwgcXVhbiBzw6F0IHPhu7Ega2nhu4duICAgICAgfA0KfCBN4bulYyB0acOqdSBwaMOibiB0w61jaCAgICAgICB8IFBow6JuIHBo4buRaSB4w6FjIHN14bqldCBnaeG7r2EgY8OhYyBkYW5oIG3hu6VjIHwgU+G7sSBraeG7h24geOG6o3kgcmEgbmfhuqt1IG5oacOqbiwgaGnhur9tIGfhurdwIHwNCg0KDQoqKkvhur90IGx14bqtbioqDQoNCkhhaSBsb+G6oWkgcGjDom4gcGjhu5FpIHBo4buVIGJp4bq/biBzaW5oIHJhIGLhuqNuZyBuZ+G6q3Ugbmhpw6puIGzDoDoNCg0KLSAqKk11bHRpbm9taWFsKio6IETDuW5nIGtoaSB04buVbmcgc+G7kSBxdWFuIHPDoXQgY+G7kSDEkeG7i25oIHbDoCBjw6FjIHF1YW4gc8OhdCByxqFpIHbDoG8gY8OhYyBkYW5oIG3hu6VjIHLhu51pIHLhuqFjLg0KLSAqKlBvaXNzb24qKjogRMO5bmcga2hpIGPDoWMgc+G7kSDEkeG6v20gbMOgIMSR4buZYyBs4bqtcCB2w6AgdOG7lW5nIHPhu5EgcXVhbiBzw6F0IGtow7RuZyBi4buLIHLDoG5nIGJ14buZYy4NCg0KVMO5eSB0aGVvIGPDoWNoIGThu68gbGnhu4d1IMSRxrDhu6NjIHRodSB0aOG6rXAsIHRhIGNo4buNbiBtw7QgaMOsbmggcGjDuSBo4bujcCDEkeG7gyBwaMOibiB0w61jaCBi4bqjbmcgdOG6p24gc+G7kSwga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgaG/hurdjIMaw4bubYyBsxrDhu6NuZyB0aGFtIHPhu5EuDQoNCmBgYHtyfQ0KdGFibGVfSG9DIDwtIHRhYmxlKGQkR2VuZGVyLGQkSG9tZW93bmVyKQ0KDQp0YWJsZV9Ib0Nfd2l0aF90b3RhbCA8LSBjYmluZCh0YWJsZV9Ib0MsIFRvdGFsID0gcm93U3Vtcyh0YWJsZV9Ib0MpKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0Ka2FibGUodGFibGVfSG9DX3dpdGhfdG90YWwsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9ICJC4bqjbmcgNC4xIFPhu5EgbMaw4bujbmcgY8OzIG5ow6AgZ2nhu69hIGPDoWMgZ2nhu5tpIHTDrW5oIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIGZ1bGxfd2lkdGggPSBGKQ0KYGBgDQojIyMgKio2LjMuIEhp4buHdSBoYWkgdOG7tyBs4buHKioNCg0KVOG7tyBs4buHIHPhu7Ega2nhu4duIOG7nyBt4buXaSBuaMOzbToNCg0KLSBOaMOzbSBO4buvOiAkcF8xID0gXGRmcmFje2F9e2EgKyBifT1cZGZyYWN7NDM0NH17MjgyNiArIDQzNDR9PSAwLjYwNiQNCg0KLSBOaMOzbSBOYW06ICRwXzIgPSBcZGZyYWN7Y317YyArIGR9PVxkZnJhY3s0MTAwfXs0MTAwICsgMjc4OX09MC41OTUkDQoNCg0KDQokJA0KXERlbHRhIHAgPSBwXzEgLSBwXzIgPSBcZGZyYWN7YX17YSArIGJ9IC0gXGRmcmFje2N9e2MgKyBkfT0wLjYwNi0wLjU5NT0wLjAxMQ0KJCQNCg0KKirDnSBuZ2jEqWE6KioNCi0gxJBvIG3hu6ljIGNow6puaCBs4buHY2ggdHV54buHdCDEkeG7kWkgZ2nhu69hIGhhaSB04bu3IGzhu4cuDQotIE7hur91ICRcRGVsdGEgcCA9IDAkOiBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0Lg0KLSDEkMahbiB24buLOiBwaOG6p24gdHLEg20gaG/hurdjIHThu7cgbOG7hyAoMCDEkeG6v24gMSkuDQoNCg0KDQojIyMgKio2LjQgVOG7tyBz4buRIG5ndXkgY8ahIChSZWxhdGl2ZSBSaXNrIC0gUlIpKioNCg0KJCQNClx0ZXh0e1JSfSA9IFxkZnJhY3twXzF9e3BfMn0gPSBcZGZyYWN7YSAvIChhICsgYil9e2MgLyAoYyArIGQpfQ0KJCQNCg0KKirDnSBuZ2jEqWE6KioNCi0gxJBvIHThu7cgbOG7hyB44bqjeSByYSBz4buxIGtp4buHbiDhu58gTmjDs20gMSBzbyB24bubaSBOaMOzbSAyLg0KLSBO4bq/dSBSUiA9IDE6IG5ndXkgY8ahIGLhurFuZyBuaGF1Lg0KLSBO4bq/dSBSUiA+IDE6IG5ndXkgY8ahIOG7nyBOaMOzbSAxIGNhbyBoxqFuIE5ow7NtIDIuDQotIE7hur91IFJSIDwgMTogbmd1eSBjxqEg4bufIE5ow7NtIDEgdGjhuqVwIGjGoW4gTmjDs20gMi4NCg0KKirhu6huZyBk4bulbmc6KioNCi0gUGjDom4gdMOtY2ggcuG7p2kgcm8gdHJvbmcgbmdoacOqbiBj4bupdSDEkW/DoG4gaOG7hyAoY29ob3J0IHN0dWR5KS4NCi0gVsOtIGThu6U6IHThu7cgbOG7hyBt4bqvYyBi4buHbmgg4bufIG5ow7NtIGTDuW5nIHRodeG7kWMgc28gduG7m2kgbmjDs20ga2jDtG5nIGTDuW5nLg0KDQoNCg0KIyMjICoqNi41IFThu7cgc+G7kSBjaMOqbmggKE9kZHMgUmF0aW8gLSBPUikqKg0KDQoqKlTDrW5oIG9kZHMg4bufIG3hu5dpIG5ow7NtOioqDQoNCi0gTmjDs20gMTogJFx0ZXh0e29kZHN9XzEgPSBcZGZyYWN7YX17Yn0kDQotIE5ow7NtIDI6ICRcdGV4dHtvZGRzfV8yID0gXGRmcmFje2N9e2R9JA0KDQoqKlThu7cgc+G7kSBjaMOqbmggKE9SKToqKg0KDQokJA0KXHRleHR7T1J9ID0gXGRmcmFje2EgLyBifXtjIC8gZH0gPSBcZGZyYWN7YSBcY2RvdCBkfXtiIFxjZG90IGN9DQokJA0KDQoqKsOdIG5naMSpYToqKg0KLSBTbyBzw6FuaCDigJxjxqEgbWF5IHjhuqN5IHJhIHPhu7Ega2nhu4du4oCdIGdp4buvYSBoYWkgbmjDs20uDQotIE7hur91IE9SID0gMToga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdC4NCi0gTuG6v3UgT1IgPiAxOiBOaMOzbSAxIGPDsyBjxqEgbWF5IHjhuqN5IHJhIHPhu7Ega2nhu4duIGNhbyBoxqFuLg0KLSBO4bq/dSBPUiA8IDE6IE5ow7NtIDEgY8OzIGPGoSBtYXkgeOG6o3kgcmEgc+G7sSBraeG7h24gdGjhuqVwIGjGoW4uDQoNCioq4buobmcgZOG7pW5nOioqDQotIE5naGnDqm4gY+G7qXUgYuG7h25oIGNo4bupbmcgKGNhc2UtY29udHJvbCBzdHVkeSkuDQotIFBow7kgaOG7o3Aga2hpIGtow7RuZyBiaeG6v3QgdOG7lW5nIHPhu5EgxJHhu5FpIHTGsOG7o25nIOG7nyB04burbmcgbmjDs20uDQoNCg0KICoqKlNvIHPDoW5oIFJSIHbDoCBPUioqKg0KDQp8IMSQ4bq3YyDEkWnhu4NtICAgICAgICAgICAgICB8IFJlbGF0aXZlIFJpc2sgKFJSKSAgICAgICAgICAgICAgfCBPZGRzIFJhdGlvIChPUikgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgROG7hSBoaeG7g3UgICAgICAgICAgICAgIHwgQ8OzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDDjXQgdHLhu7FjIHF1YW4gaMahbiAgICAgICAgICAgICAgICAgICAgIHwNCnwgRMO5bmcgdHJvbmcgICAgICAgICAgIHwgTmdoacOqbiBj4bupdSDEkW/DoG4gaOG7hyAgICAgICAgICAgICAgfCBOZ2hpw6puIGPhu6l1IGLhu4duaCBjaOG7qW5nICAgICAgICAgICAgICAgIHwNCnwgQ8OzIHRo4buDID4gMSAgICAgICAgICAgfCBDw7MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEPDsyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBDw7MgdGjhu4MgZMO5bmcgbG9naXN0aWMgfCBLaMO0bmcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEPDsyAobG9naXN0aWMgcmVncmVzc2lvbikgICAgICAgICAgICAgfA0KDQoNCioqS+G6v3QgbHXhuq1uKioNCg0KLSAqKkhp4buHdSB04bu3IGzhu4cqKiBwaOG6o24gw6FuaCBz4buxIGNow6puaCBs4buHY2ggdHV54buHdCDEkeG7kWkgZ2nhu69hIGhhaSBuaMOzbS4NCi0gKipU4bu3IHPhu5Egbmd1eSBjxqEgKFJSKSoqIHBo4bqjbiDDoW5oIHPhu7EgY2jDqm5oIGzhu4djaCB0xrDGoW5nIMSR4buRaSB24buBIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHPhu7Ega2nhu4duLg0KLSAqKlThu7cgc+G7kSBjaMOqbmggKE9SKSoqIHNvIHPDoW5oIOKAnGPGoSBo4buZaSB44bqjeSByYSBz4buxIGtp4buHbuKAnSB2w6AgcuG6pXQgcGjhu5UgYmnhur9uIHRyb25nIGPDoWMgcGjDom4gdMOtY2ggaOG7k2kgcXV5IGxvZ2lzdGljLg0KDQpLaGkgcGjDom4gdMOtY2ggYuG6o25nIDJ4Miwgdmnhu4djIGNo4buNbiBjaOG7iSBz4buRIG7DoG8gdMO5eSB0aHXhu5ljIHbDoG8gKipt4bulYyB0acOqdSBuZ2hpw6puIGPhu6l1KiosICoqa2nhu4N1IGThu68gbGnhu4d1KiosIHbDoCAqKnRoaeG6v3Qga+G6vyBuZ2hpw6puIGPhu6l1KiouDQoNCiMjIyAqKjYuNiBLaG/huqNuZyB0aW4gY+G6rXkgY2hvIGPDoWMgdGhhbSBz4buRIMSRbyBt4buRaSBsacOqbiBo4buHICjEkOG6t2MgYmnhu4d0IGzDoCBPZGRzIFJhdGlvKSoqDQoNCiMjIyMgKio2LjYuMSBU4buVbmcgcXVhbioqDQoNClRyb25nIHBow6JuIHTDrWNoIGPDoWMgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/biBuaOG7iyBwaMOibiwgY8OhYyB0aGFtIHPhu5EgxJFvIG3hu5FpIGxpw6puIGjhu4cgcGjhu5UgYmnhur9uIGJhbyBn4buTbToNCg0KLSAqKkhp4buHdSB04bu3IGzhu4cgKFJpc2sgRGlmZmVyZW5jZSkqKg0KLSAqKlThu7cgc+G7kSBuZ3V5IGPGoSAoUmVsYXRpdmUgUmlzaywgUlIpKioNCi0gKipU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvLCBPUikqKg0KDQrEkOG7gyDEkcOhbmggZ2nDoSDEkeG7mSBjaMOtbmggeMOhYyBj4bunYSBjw6FjIHRoYW0gc+G7kSBuw6B5LCBuZ8aw4budaSB0YSBz4butIGThu6VuZyAqKmtob+G6o25nIHRpbiBj4bqteSAoQ29uZmlkZW5jZSBJbnRlcnZhbCAtIENJKSoqLiBLaG/huqNuZyB0aW4gY+G6rXkgY2hvIGJp4bq/dCBk4bqjaSBnacOhIHRy4buLIG3DoCB0aGFtIHPhu5EgdGjhu7FjIHThur8gY+G7p2EgcXXhuqduIHRo4buDIHLhuqV0IGPDsyB0aOG7gyBu4bqxbSB0cm9uZyDEkcOzIHbhu5tpIG3hu5l0IG3hu6ljIMSR4buZIHRpbiBj4bqteSBuaOG6pXQgxJHhu4tuaCAodGjGsOG7nW5nIGzDoCA5NSUpLg0KDQoNCg0KIyMjIyAqKjYuNi4yLiBLaG/huqNuZyB0aW4gY+G6rXkgY2hvIE9kZHMgUmF0aW8gKE9SKSoqDQoNCiMjIyMjICoqNi42LjIuMSDEkOG7i25oIG5naMSpYSBPZGRzIFJhdGlvIChPUikqKg0KDQpDaG8gYuG6o25nIHBow6JuIHBo4buRaSAyeDI6DQoNCnwgICAgICAgICAgICAgICAgfCBDw7Mgc+G7sSBraeG7h24gKDEpIHwgS2jDtG5nIGPDsyBz4buxIGtp4buHbiAoMCkgfA0KfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IE5ow7NtIGPDsyBz4buxIGtp4buHbiAoRXZlbnQ9MSkgfCAkYSQgICAgICAgICAgICB8ICRiJCAgICAgICAgICAgICAgICAgfA0KfCBOaMOzbSBraMO0bmcgY8OzIHPhu7Ega2nhu4duIChFdmVudD0wKSB8ICRjJCAgICAgICAgICAgIHwgJGQkICAgICAgICAgICAgICAgICB8DQoNCk9kZHMgUmF0aW8gxJHGsOG7o2MgdMOtbmggbmjGsCBzYXU6DQoNCiQkDQpcdGV4dHtPUn0gPSBcZnJhY3thIC8gYn17YyAvIGR9ID0gXGZyYWN7YSBcdGltZXMgZH17YiBcdGltZXMgY30NCiQkDQoNCk9SIMSRbyBsxrDhu51uZyB04bu3IGzhu4cgb2RkcyB44bqjeSByYSBz4buxIGtp4buHbiDhu58gbmjDs20gY8OzIHPhu7Ega2nhu4duIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBjw7Mgc+G7sSBraeG7h24uDQoNCg0KIyMjIyMgKio2LjYuMi4yIEzDvSBkbyBz4butIGThu6VuZyBsb2coT1IpIMSR4buDIHjDonkgZOG7sW5nIGtob+G6o25nIHRpbiBj4bqteSoqDQoNCi0gUGjDom4gcGjhu5FpIGPhu6dhIE9SIGtow7RuZyDEkeG7kWkgeOG7qW5nIHbDoCBraMO0bmcgY2h14bqpbi4NCi0gTG9nYXJpdGhtIHThu7Egbmhpw6puIGPhu6dhIE9SLCB04bupYyAkXGxvZyhcdGV4dHtPUn0pJCwgY8OzIHBow6JuIHBo4buRaSBn4bqnbiBjaHXhuqluICjEkeG6t2MgYmnhu4d0IGtoaSBrw61jaCB0aMaw4bubYyBt4bqrdSBs4bubbikuDQotIERvIMSRw7MsIHjDonkgZOG7sW5nIGtob+G6o25nIHRpbiBj4bqteSB0csOqbiB0aGFuZyBsb2coT1IpIGdpw7pwIHPhu60gZOG7pW5nIGPDoWMgcGjGsMahbmcgcGjDoXAgdGjhu5FuZyBrw6ogY2h14bqpbi4NCg0KDQoNCiMjIyMjICoqNi42LjIuMyBDw7RuZyB0aOG7qWMgdMOtbmgga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gT1IqKg0KDQpCxrDhu5tjIDE6IFTDrW5oIGxvZy1PUg0KDQokJA0KXGhhdHtcdGhldGF9ID0gXGxvZyhcd2lkZWhhdHtcdGV4dHtPUn19KSA9IFxsb2dcbGVmdChcZnJhY3thIGR9e2IgY31ccmlnaHQpDQokJA0KDQpCxrDhu5tjIDI6IFTDrW5oIHNhaSBz4buRIGNodeG6qW4gKFN0YW5kYXJkIEVycm9yIC0gU0UpIGPhu6dhIGxvZy1PUg0KDQokJA0KU0UgPSBcc3FydHtcZnJhY3sxfXthfSArIFxmcmFjezF9e2J9ICsgXGZyYWN7MX17Y30gKyBcZnJhY3sxfXtkfX0NCiQkDQoNCkLGsOG7m2MgMzogVMOtbmgga2hv4bqjbmcgdGluIGPhuq15IHRyw6puIGxvZy1PUg0KDQokJA0KXGhhdHtcdGhldGF9IFxwbSB6X3sxLVxhbHBoYS8yfSBcdGltZXMgU0UNCiQkDQoNClRyb25nIMSRw7M6DQoNCi0gJHpfezEtXGFscGhhLzJ9JCBsw6AgZ2nDoSB0cuG7iyB04bubaSBo4bqhbiBwaMOibiBwaOG7kWkgY2h14bqpbiAodsOtIGThu6UsICR6X3swLjk3NX0gXGFwcHJveCAxLjk2JCB24bubaSBt4bupYyB0aW4gY+G6rXkgOTUlKS4NCg0KQsaw4bubYyA0OiBDaHV54buDbiB24buBIGtob+G6o25nIHRpbiBj4bqteSBjaG8gT1IgYuG6sW5nIGPDoWNoIGzhuqV5IG3FqQ0KDQokJA0KXGxlZnRbDQpcZXhwXGxlZnQoXGhhdHtcdGhldGF9IC0gel97MS1cYWxwaGEvMn0gXHRpbWVzIFNFIFxyaWdodCksXHF1YWQNClxleHBcbGVmdChcaGF0e1x0aGV0YX0gKyB6X3sxLVxhbHBoYS8yfSBcdGltZXMgU0UgXHJpZ2h0KQ0KXHJpZ2h0XQ0KJCQNCg0KDQoNCiMjIyMgKio2LjYuMyDDnSBuZ2jEqWEgdsOgIOG7qW5nIGThu6VuZyoqDQoNCi0gKipLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBPUioqIGN1bmcgY+G6pXAgbeG7mXQgcGjhuqFtIHZpIGPDoWMgZ2nDoSB0cuG7iyBo4bujcCBsw70gbmjhuqV0IGNobyBPUiB0aOG7sWMgdHJvbmcgcXXhuqduIHRo4buDLg0KLSBO4bq/dSBraG/huqNuZyB0aW4gY+G6rXkga2jDtG5nIGNo4bupYSBnacOhIHRy4buLIDEsIHRhIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgYmnhur9uIGPDsyBz4buxIGtp4buHbiB2w6AgYmnhur9uIGvhur90IHF14bqjIGzDoCAqKmPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKiDhu58gbeG7qWMgNSUuDQotIEtob+G6o25nIHRpbiBj4bqteSBjw6BuZyBo4bq5cCBjaG8gdGjhuqV5IMaw4bubYyBsxrDhu6NuZyBPUiBjw6BuZyBjaMOtbmggeMOhYy4NCi0gUGjGsMahbmcgcGjDoXAgbsOgeSDDoXAgZOG7pW5nIHBo4buVIGJp4bq/biB0cm9uZyBuZ2hpw6puIGPhu6l1IHkgaOG7jWMsIGThu4tjaCB04buFLCBraW5oIHThur8gaOG7jWMgdsOgIGPDoWMgbmfDoG5oIHjDoyBo4buZaS4NCg0KDQoNCiMjIyAqKjYuNyBCw6FvIGPDoW8gIkdFTkRFUiBESVNQQVJJVElFU0lOIEZJTkFOQ0lBTCBXRUxMLUJFSU5HIioqDQoNCmPhu6dhIEZlcm5hbmRleiB2w6AgVHJhbmZhZ2xpYSB04burIE5nw6JuIGjDoG5nIEThu7EgdHLhu68gTGnDqm4gYmFuZyBQaGlsYWRlbHBoaWEgKHRow6FuZyAxMCBuxINtIDIwMjApLiBCw6FvIGPDoW8gbsOgeSBwaMOibiB0w61jaCBk4buvIGxp4buHdSB04burIEto4bqjbyBzw6F0IEtpbmggdOG6vyBI4buZIGdpYSDEkcOsbmggdsOgIFJhIHF1eeG6v3QgxJHhu4tuaCAoU0hFRCkgbsSDbSAyMDE4IMSR4buDIHTDrG0gaGnhu4N1IHPhu7Ega2jDoWMgYmnhu4d0IGdp4bubaSB0cm9uZyBjw6FjIGzEqW5oIHbhu7FjIHTDoGkgY2jDrW5oIGNow61uaDogbmfDom4gaMOgbmcsIHRp4bq/cCBj4bqtbiB0w61uIGThu6VuZyB2w6Aga+G6vyBob+G6oWNoIG5naOG7iSBoxrB1LCDEkeG7k25nIHRo4budaSDEkeG6t2MgYmnhu4d0IHhlbSB4w6l0IHZhaSB0csOyIGPhu6dhIGtp4bq/biB0aOG7qWMgdMOgaSBjaMOtbmguDQoNCkvhur90IHF14bqjIENow61uaCAoVOG6rXAgdHJ1bmcgdsOgbyBU4bu3IGzhu4cgQ2jDqm5oIC0gT1IgdOG7qyBNw7QgaMOsbmggxJDhuqd5IMSR4bunKToNCg0KKioxLiBOZ8OibiBow6BuZzoqKg0KLSBGdWxseSBCYW5rZWQgKE3DtCBow6xuaCA0LCBC4bqjbmcgMSwgUGjhu6UgbOG7pWMgQik6DQogUGjhu6UgbuG7rzogT1IgPSAxLjA1MTEgKEtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIC0gS1lZVEspLiBTYXUga2hpIGtp4buDbSBzb8OhdCBraeG6v24gdGjhu6ljIHTDoGkgY2jDrW5oIHbDoCBjw6FjIHnhur91IHThu5Ega2jDoWMsIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSBnaeG7m2kgdHJvbmcgdmnhu4djICJmdWxseSBiYW5rZWQiLg0KDQotIEtp4bq/biB0aOG7qWMgdMOgaSBjaMOtbmggY2FvIChzbyB24bubaSB0aOG6pXApOiBPUiA9IDEuOTkzNyoqIChwPDAuMDEpLCBjaG8gdGjhuqV5IG5o4buvbmcgbmfGsOG7nWkgY8OzIGtp4bq/biB0aOG7qWMgdMOgaSBjaMOtbmggY2FvIGPDsyBraOG6oyBuxINuZyAiZnVsbHkgYmFua2VkIiBjYW8gZ+G6p24gZ+G6pXAgxJHDtGkuDQoNClPhu60gZOG7pW5nIEThu4tjaCB24bulIFTDoGkgY2jDrW5oIFRoYXkgdGjhur8gLSBBRlMgKE3DtCBow6xuaCA4LCBC4bqjbmcgMSwgUGjhu6UgbOG7pWMgQik6DQpQaOG7pSBu4buvOiBPUiA9IDEuMDMwNS4gS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIGdp4bubaSB0cm9uZyB2aeG7h2Mgc+G7rSBk4bulbmcgQUZTIHNhdSBraGkga2nhu4NtIHNvw6F0IMSR4bqneSDEkeG7p0tp4bq/biB0aOG7qWMgdMOgaSBjaMOtbmggY2FvOiBPUiA9IDAuNjc2OCoqIChwPDAuMDEpLCBjaG8gdGjhuqV5IG5o4buvbmcgbmfGsOG7nWkgY8OzIGtp4bq/biB0aOG7qWMgdMOgaSBjaMOtbmggY2FvIMOtdCBjw7Mga2jhuqMgbsSDbmcgc+G7rSBk4bulbmcgQUZTIGjGoW4gKGNo4buJIGLhurFuZyAwLjY3IGzhuqduKS4NCg0KKioyLiBUw61uIGThu6VuZzoqKg0KDQotU+G7nyBo4buvdSDDjXQgbmjhuqV0IE3hu5l0IFRo4bq7IFTDrW4gZOG7pW5nIChNw7QgaMOsbmggMTIsIELhuqNuZyAyLCBQaOG7pSBs4bulYyBCKToNClBo4bulIG7hu686IE9SID0gMS40MzIyIChwPDAuMDEpLiDEkMOieSBsw6AgbeG7mXQga+G6v3QgcXXhuqMgcXVhbiB0cuG7jW5nLiBOZ2F5IGPhuqMgc2F1IGtoaSBraeG7g20gc2/DoXQgdOG6pXQgY+G6oyBjw6FjIHnhur91IHThu5EsIHBo4bulIG7hu68gY8OzIGto4bqjIG7Eg25nIHPhu58gaOG7r3Ugw610IG5o4bqldCBt4buZdCB0aOG6uyB0w61uIGThu6VuZyBjYW8gaMahbiA0MyUgc28gduG7m2kgbmFtIGdp4bubaS4gS2nhur9uIHRo4bupYyB0w6BpIGNow61uaCBjYW86IE9SID0gMi4yNTA5KiogKHA8MC4wMSksIG5nxrDhu51pIGPDsyBraeG6v24gdGjhu6ljIHTDoGkgY2jDrW5oIGNhbyBjw7Mga2jhuqMgbsSDbmcgc+G7nyBo4buvdSB0aOG6uyB0w61uIGThu6VuZyBjYW8gaMahbiAyLjI1IGzhuqduLg0KDQotIELhu4sgVOG7qyBjaOG7kWkgVMOtbiBk4bulbmcgKHRyb25nIDEyIHRow6FuZyBxdWEpIChNw7QgaMOsbmggMTYsIELhuqNuZyAyLCBQaOG7pSBs4bulYyBCKToNClBo4bulIG7hu686IE9SID0gMS4wNjkxIChLWVlUSykuIEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSBnaeG7m2kgc2F1IGtoaSBraeG7g20gc2/DoXQuIEtp4bq/biB0aOG7qWMgdMOgaSBjaMOtbmggY2FvOiBPUiA9IDAuNTkyNioqIChwPDAuMDEpLCBuZ8aw4budaSBjw7Mga2nhur9uIHRo4bupYyB0w6BpIGNow61uaCBjYW8gw610IGPDsyBraOG6oyBuxINuZyBi4buLIHThu6sgY2jhu5FpIHTDrW4gZOG7pW5nIGjGoW4uDQoNCi0gVOG7sSB0aW4ga2hpIMSQxINuZyBrw70gVGjhursgVMOtbiBk4bulbmcgTeG7m2kgKE3DtCBow6xuaCAyMCwgQuG6o25nIDIsIFBo4bulIGzhu6VjIEIpOg0KUGjhu6UgbuG7rzogT1IgPSAwLjk4NTYgKEtZWVRLKS4gS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIGdp4bubaSBzYXUga2hpIGtp4buDbSBzb8OhdC4gS2nhur9uIHRo4bupYyB0w6BpIGNow61uaCBjYW86IE9SID0gMS44ODg1KiogKHA8MC4wMSksIG5nxrDhu51pIGPDsyBraeG6v24gdGjhu6ljIHTDoGkgY2jDrW5oIGNhbyB04buxIHRpbiBoxqFuIGfhuqduIGfhuqVwIMSRw7RpLg0KDQoqKjMuS+G6vyBob+G6oWNoIE5naOG7iSBoxrB1IChjaOG7iSBuaOG7r25nIG5nxrDhu51pIGNoxrBhIG5naOG7iSBoxrB1KToqKg0KDQotIFRob+G6o2kgbcOhaSBraGkgxJDGsGEgcmEgUXV54bq/dCDEkeG7i25oIMSQ4bqndSB0xrAgSMawdSB0csOtIChNw7QgaMOsbmggMjQsIELhuqNuZyAzLCBQaOG7pSBs4bulYyBCKToNClBo4bulIG7hu686IE9SID0gMC40NzEzIChwPDAuMDEpLiDEkMOieSBsw6AgbeG7mXQga+G6v3QgcXXhuqMgcXVhbiB0cuG7jW5nIGtow6FjLiBQaOG7pSBu4buvIGPDsyBraOG6oyBuxINuZyBj4bqjbSB0aOG6pXkgdGhv4bqjaSBtw6FpIGtoaSDEkcawYSByYSBxdXnhur90IMSR4buLbmggxJHhuqd1IHTGsCBoxrB1IHRyw60gY2jhu4kgYuG6sW5nIDQ3JSBzbyB24bubaSBuYW0gZ2nhu5tpLCBuZ2F5IGPhuqMgc2F1IGtoaSBraeG7g20gc2/DoXQga2nhur9uIHRo4bupYyB0w6BpIGNow61uaCB2w6AgY8OhYyB54bq/dSB04buRIGtow6FjLiDEkMOieSBsw6AgY2jDqm5oIGzhu4djaCBs4bubbiBuaOG6pXQgdsOgIHThu5NuIHThuqFpIGRhaSBk4bqzbmcgbmjhuqV0LiBLaeG6v24gdGjhu6ljIHTDoGkgY2jDrW5oIGNhbzogT1IgPSAxLjM5OTQqKiAocDwwLjAxKSwgbmfGsOG7nWkgY8OzIGtp4bq/biB0aOG7qWMgdMOgaSBjaMOtbmggY2FvIHRob+G6o2kgbcOhaSBoxqFuIDEuNCBs4bqnbi4NCg0KLSBUaW4gcuG6sW5nIEvhur8gaG/huqFjaCBUaeG6v3Qga2nhu4dtIEjGsHUgdHLDrSDEkGFuZyDEkGkgxJDDum5nIEjGsOG7m25nIChNw7QgaMOsbmggMjgsIELhuqNuZyAzLCBQaOG7pSBs4bulYyBCKToNClBo4bulIG7hu686IE9SID0gMC45MDk4IChLWVlUSykuIEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSBnaeG7m2kgc2F1IGtoaSBraeG7g20gc2/DoXQuS2nhur9uIHRo4bupYyB0w6BpIGNow61uaCBjYW86IE9SID0gMS42MTA3KiogKHA8MC4wMSksIG5nxrDhu51pIGPDsyBraeG6v24gdGjhu6ljIHTDoGkgY2jDrW5oIGNhbyBjw7Mga2jhuqMgbsSDbmcgdGluIHLhurFuZyBr4bq/IGhv4bqhY2ggY+G7p2EgaOG7jSDEkcO6bmcgaMaw4bubbmcgY2FvIGjGoW4gMS42IGzhuqduLg0KDQojIyMgKio2LjggUGjDom4gdMOtY2g6IExp4buHdSB2aeG7h2MgbMOgIE7hu68gKHNvIHbhu5tpIE5hbSkgY8OzIGzDoG0gdMSDbmcgb2RkcyBz4bufIGjhu691IG5ow6A/KioNCg0KICoqMS4gVMOzbSB04bqvdCBi4bqjbmcgZOG7ryBsaeG7h3UqKg0KDQp8IEdp4bubaSB0w61uaCB8IEtow7RuZyBjw7MgbmjDoCAoYE5gKSB8IEPDsyBuaMOgIChgWWApIHwgVOG7lW5nIHwNCnwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLXwNCnwgTuG7ryAoRikgICAgfCAyODI2ICAgICAgICAgICAgICAgIHwgNDM0NCAgICAgICAgIHwgNzE3MCAgfA0KfCBOYW0gKE0pICAgfCAyNzg5ICAgICAgICAgICAgICAgIHwgNDEwMCAgICAgICAgIHwgNjg4OSAgfA0KDQoqKjIuIFTDrW5oIE9kZHMgdsOgIE9kZHMgUmF0aW8qKg0KDQotIE9kZHMgKHThu7cgc+G7kSBjaMOqbmgpIHPhu58gaOG7r3UgbmjDoCDhu58gKipu4buvKio6DQoNCiQkDQpcdGV4dHtPZGRzfV97XHRleHR7TuG7r319ID0gXGZyYWN7NDM0NH17MjgyNn0gXGFwcHJveCAxLjUzNzYNCiQkDQoNCi0gT2RkcyBz4bufIGjhu691IG5ow6Ag4bufICoqbmFtKio6DQoNCiQkDQpcdGV4dHtPZGRzfV97XHRleHR7TmFtfX0gPSBcZnJhY3s0MTAwfXsyNzg5fSBcYXBwcm94IDEuNDcwOQ0KJCQNCg0KLSBU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvLCBPUikgY+G7p2EgKipu4buvIHNvIHbhu5tpIG5hbSoqOg0KDQokJA0KXHRleHR7T1J9ID0gXGZyYWN7XHRleHR7T2Rkc31fe1x0ZXh0e07hu699fX17XHRleHR7T2Rkc31fe1x0ZXh0e05hbX19fSA9IFxmcmFjezEuNTM3Nn17MS40NzA5fSBcYXBwcm94IDEuMDQ1NA0KJCQNCg0KKiozLiBEaeG7hW4gZ2nhuqNpIGvhur90IHF14bqjKioNCg0KVOG7tyBz4buRIGNow6puaCBcKCBcdGV4dHtPUn0gXGFwcHJveCAxLjA0NTQgXCkgPiAxIGNobyB0aOG6pXkgKipwaOG7pSBu4buvIGPDsyBvZGRzIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbiBt4buZdCBjaMO6dCoqIHNvIHbhu5tpIG5hbSBnaeG7m2kuDQoNClR1eSBuaGnDqm4sIG3hu6ljIGNow6puaCBs4buHY2ggbMOgICoqbmjhu48gKH40LjUlKSoqLCB2w6AgxJHhu4Mga2jhurNuZyDEkeG7i25oIGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGhheSBraMO0bmcsIGPhuqduIHTDrW5oICoqa2hv4bqjbmcgdGluIGPhuq15IGNobyBPUioqIGhv4bq3YyB0aeG6v24gaMOgbmggKipraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqioqLg0KDQoqKjQuIEvhur90IGx14bqtbiBzxqEgYuG7mSAobcO0IHThuqMpKioNCg0KROG7sWEgdHLDqm4gc+G7kSBsaeG7h3UgdOG7qyBi4buZIGThu68gbGnhu4d1ICoqU3VwZXJtYXJrZXQgVHJhbnNhY3Rpb25zKiosIHBo4bulIG7hu68gY8OzICoqdOG7tyBz4buRIGNow6puaCAob2RkcykqKiBz4bufIGjhu691IG5ow6AgKipjYW8gaMahbiBuYW0gZ2nhu5tpIG3hu5l0IGNow7p0KiouIEPhu6UgdGjhu4M6DQoNCi0gT2RkcyBz4bufIGjhu691IG5ow6Ag4bufIHBo4bulIG7hu68gY2FvIGjGoW4ga2hv4bqjbmcgKio0LjUlKiogc28gduG7m2kgbmFtIGdp4bubaSAoXCggXHRleHR7T1J9IFxhcHByb3ggMS4wNDUgXCkpLg0KLSBUdXkgbmhpw6puLCBz4buxIGtow6FjIGJp4buHdCBsw6AgKipuaOG7jyoqLCB2w6AgY+G6p24gdGjDqm0gKipwaMOibiB0w61jaCB0aOG7kW5nIGvDqioqICh2w60gZOG7pToga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gT1IgaG/hurdjIGtp4buDbSDEkeG7i25oIFdhbGQpIMSR4buDIGvhur90IGx14bqtbiB24buBICoqw70gbmdoxKlhIHRo4buxYyB0aeG7hW4qKi4NCg0KIyMgKipQSOG6pk4gNzogVEjhu7BDIEjDgE5IIMav4buaQyBMxq/hu6JORyoqDQoNCiMjIyAqKjcuMSBIaeG7h3UgaGFpIHThu7cgbOG7hyoqDQoNCioqQuG6o25nIGNow6lvIGdp4buvYSBHZW5kZXIgdsOgIEhvbWVvd25lcioqDQpgYGB7cn0NCnRhYmxlX0hvQyA8LSB0YWJsZShkJEdlbmRlcixkJEhvbWVvd25lcikNCg0KdGFibGVfSG9DX3dpdGhfdG90YWwgPC0gY2JpbmQodGFibGVfSG9DLCBUb3RhbCA9IHJvd1N1bXModGFibGVfSG9DKSkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmthYmxlKHRhYmxlX0hvQ193aXRoX3RvdGFsLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiQuG6o25nIDcuMSBC4bqjbmcgY2jDqW8gZ2nhu69hIGJp4bq/biBHZW5kZXIgdsOgIEhvbWVvd25lciIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCBmdWxsX3dpZHRoID0gRikNCmBgYA0KKipN4bulYyB0acOqdSBraeG7g20gxJHhu4tuaCoqDQoNCljDoWMgxJHhu4tuaCB4ZW0gcGjhu6UgbuG7ryBjw7Mgc+G7nyBo4buvdSBuaMOgICoqw610IGjGoW4qKiBuYW0gZ2nhu5tpIGhheSBraMO0bmcuDQoNCg0KKipUaGnhur90IGzhuq1wIHThu7cgbOG7hyoqDQoNClThu7cgbOG7hyBu4buvIHPhu58gaOG7r3UgbmjDoDoNCg0KJCQNCnBfMSA9IFAoXHRleHR7SG9tZW93bmVyfSA9IFkgXG1pZCBcdGV4dHtHZW5kZXJ9ID0gRikNCiQkDQoNClThu7cgbOG7hyBuYW0gc+G7nyBo4buvdSBuaMOgOg0KDQokJA0KcF8yID0gUChcdGV4dHtIb21lb3duZXJ9ID0gWSBcbWlkIFx0ZXh0e0dlbmRlcn0gPSBNKQ0KJCQNCg0KSGnhu4d1IGNow6puaCBs4buHY2ggZ2nhu69hIGhhaSB04bu3IGzhu4c6DQoNCiQkDQpkID0gcF8xIC0gcF8yDQokJA0KDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotICoqR2nhuqMgdGh1eeG6v3QgSOKCgCoqOiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgdOG7tyBs4buHICANCiAgJCQgSF8wOiBwXzEgLSBwXzIgPSAwJCQNCg0KLSAqKkdp4bqjIHRodXnhur90IEgxKSoqOiBU4bu3IGzhu4cgbuG7ryBz4bufIGjhu691IG5ow6AgdGjhuqVwIGjGoW4gbmFtOiAkSF8xOiBwXzEgLSBwXzIgPCAwJA0KICANCg0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggc+G7sSBraMOhYyBiaeG7h3QgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBnaeG7r2EgbuG7ryB2w6AgbmFtDQpsaWJyYXJ5KHN0YXRzKQ0KZ2VobyA8LSB0YWJsZShkJEdlbmRlcixkJEhvbWVvd25lcikNCnRlc3RnZWhvIDwtIHByb3AudGVzdCh4ID0gYyhnZWhvWyJGIiwiWSJdLCBnZWhvWyJNIiwiWSJdKSwNCiAgICAgICAgICAgICAgICAgICAgICBuID0gYyhzdW0oZ2Vob1siRiIsXSksIHN1bShnZWhvWyJNIixdKSksDQogICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIsIGNvcnJlY3QgPSBGQUxTRSkNCnByaW50KHRlc3RnZWhvKQ0KYGBgDQoNCg0KIA0KDQoqKlThu7cgbOG7hyDGsOG7m2MgbMaw4bujbmcgdOG7qyBk4buvIGxp4buHdToqKg0KDQogVOG7tyBs4buHIG7hu68gc+G7nyBo4buvdSBuaMOgOiAgcHJvYjEgPSAwLjYwNTg1Nzc3DQogIA0KIFThu7cgbOG7hyBuYW0gc+G7nyBo4buvdSBuaMOgOiBwcm9iMiA9IDAuNTk1MTUxNw0KIA0KKipIaeG7h3UgY2jDqm5oIGzhu4djaCBnaeG7r2EgaGFpIHThu7cgbOG7hzoqKg0KJCQNClxoYXR7ZH0gPSBcaGF0e3B9X0YgLSBcaGF0e3B9X00gPSAwLjYwNTkgLSAwLjU5NTIgPSAwLjAxMDcNCiQkDQoNCkvhur90IHF14bqjIHRodSDEkcaw4bujYzoNCg0KLSBcKCBYXjIgPSAxLjY3ODggXCksIGRmID0gMSAgDQotIEdpw6EgdHLhu4sgcDogXCggcFx0ZXh0ey12YWx1ZX0gPSAwLjkwMjUgXCkgIA0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBcKCBwX0YgLSBwX00gXCk6ICANCiAgJCQgKC0xLjAwMCxcOyAwLjAyNDMpICQkDQogIA0KKipL4bq/dCBsdeG6rW4qKg0KDQpW4bubaSBcKCBwXHRleHR7LXZhbHVlfSA9IDAuOTAyNSBcKSwgdGEgKipraMO0bmcgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IFwoIEhfMCBcKSoqLiAgDQrEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSAqKmtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6oqKiDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nICoqdOG7tyBs4buHIG7hu68gc+G7nyBo4buvdSBuaMOgIHRo4bqlcCBoxqFuIG5hbSBnaeG7m2kqKi4NCg0KTmfGsOG7o2MgbOG6oWksIHThu7cgbOG7hyBu4buvIGPDsm4gKipuaOG7iW5oIGjGoW4gbmFtIG3hu5l0IGNow7p0KiosIG5oxrBuZyAqKmtow6FjIGJp4buHdCBuw6B5IGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQoNCiMjIyAqKjcuMiBU4bu3IHPhu5EgTmd1eSBjxqEgKFJlbGF0aXZlIFJpc2sgLSBSUik6KioNCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0KcmdlaG8gPC0gcmlza3JhdGlvKGdlaG8sIG1ldGhvZCA9ICJ3YWxkIikNCnByaW50KHJnZWhvKQ0KYGBgDQoqKkvhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZyB04bu3IHPhu5EgcuG7p2kgcm8gKHJpc2sgcmF0aW8pKioNCg0KfCBHaeG7m2kgdMOtbmggfCDGr+G7m2MgbMaw4bujbmcgUmlzayBSYXRpbyB8IEtob+G6o25nIHRpbiBj4bqteSA5NSUgKExvd2VyIC0gVXBwZXIpIHwNCnwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBO4buvIChGKSAgICB8IDEuMDAwMCAgICAgICAgICAgICAgfCBOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgTmFtIChNKSAgIHwgMC45ODIzICAgICAgICAgICAgICB8IDAuOTU2MiDigJMgMS4wMDkyICAgICAgICAgICAgICAgICAgICB8DQoNCioqR2nhuqNpIHRow61jaDoqKiAgDQotIFJpc2sgUmF0aW8gKFJSKSBj4bunYSBuaMOzbSBuYW0gc28gduG7m2kgbuG7ryBsw6AgMC45ODIzLCBn4bqnbiBi4bqxbmcgMSwgY2hvIHRo4bqleSB04bu3IGzhu4cgbmFtIHPhu58gaOG7r3UgbmjDoCB0aOG6pXAgaMahbiBu4buvIGtob+G6o25nIDEuNzclLiAgDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSUgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMSwgbmdoxKlhIGzDoCBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgZ2nhu69hIGhhaSBnaeG7m2kga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggw70gbmdoxKlhIHRo4buRbmcga8OqKioNCg0KfCBQaMawxqFuZyBwaMOhcCBraeG7g20gxJHhu4tuaCB8IEdpw6EgdHLhu4sgcCAodHdvLXNpZGVkKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgTWlkLXAgZXhhY3QgdGVzdCAgICAgIHwgMC4xOTUyICAgICAgICAgICAgICAgIHwNCnwgRmlzaGVyIGV4YWN0IHRlc3QgICAgIHwgMC4xOTY1ICAgICAgICAgICAgICAgIHwNCnwgQ2hpLXNxdWFyZSB0ZXN0ICAgICAgIHwgMC4xOTUxICAgICAgICAgICAgICAgIHwNCg0KKipHaeG6o2kgdGjDrWNoOioqICANCi0gVOG6pXQgY+G6oyBjw6FjIGdpw6EgdHLhu4sgcCDEkeG7gXUgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgMC4wNS4gIA0KLSDEkGnhu4F1IG7DoHkgbmdoxKlhIGzDoCB0YSBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IFwoIEhfMCBcKSB04bupYyBsw6AgKipraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIHbhu4EgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBnaeG7r2EgaGFpIGdp4bubaSB0w61uaCoqIGThu7FhIHRyw6puIGThu68gbGnhu4d1IG7DoHkuDQoNCiMjIyAqKjcuMyBU4bu3IHPhu5EgQ2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpOioqDQoNCmBgYHtyfQ0KbGlicmFyeShEZXNjVG9vbHMpDQpvcmdlaG8gPC0gT2Rkc1JhdGlvKGdlaG8sIG1ldGhvZD0id2FsZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KcHJpbnQob3JnZWhvKQ0KYGBgDQotICoqT1IgPCAxKiogbmdoxKlhIGzDoCBvZGRzIHPhu58gaOG7r3UgbmjDoCBj4bunYSBu4buvIHRo4bqlcCBoxqFuIG9kZHMgc+G7nyBo4buvdSBuaMOgIGPhu6dhIG5hbS4gIA0KDQotIEdpw6EgdHLhu4sgT1IgPSAwLjk1NjQgY2hvIHRo4bqleSBvZGRzIHPhu58gaOG7r3UgbmjDoCBj4bunYSBu4buvIGNo4buJIHRo4bqlcCBoxqFuIGtob+G6o25nIDQuMzYlIHNvIHbhu5tpIG5hbSAoMSAtIDAuOTU2NCA9IDAuMDQzNikuDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gT1IgbMOgICgwLjg5MzksIDEuMDIzMSkgY2jhu6lhIGdpw6EgdHLhu4sgMS4gIA0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSwgduG7gSBt4bq3dCB0aOG7kW5nIGvDqiwgY2jDum5nIHRhIGtow7RuZyB0aOG7gyBsb+G6oWkgdHLhu6sga2jhuqMgbsSDbmcgb2RkcyBz4bufIGjhu691IG5ow6AgY+G7p2EgbuG7ryB2w6AgbmFtIGzDoCBi4bqxbmcgbmhhdSAoT1IgPSAxKS4NCg0KDQoqKlThu5VuZyBr4bq/dDoqKg0KDQotIE9kZHMgUmF0aW8gY3VuZyBj4bqlcCBt4buZdCB0aMaw4bubYyDEkW8gbeG6oW5oIG3hur0gxJHhu4Mgc28gc8Ohbmgga2jhuqMgbsSDbmcgKG9kZHMpIHjhuqN5IHJhIHPhu7Ega2nhu4duIGdp4buvYSBoYWkgbmjDs20uDQoNCi0gVHV5IG5oacOqbiwga2hpIGtob+G6o25nIHRpbiBj4bqteSBjaOG7qWEgZ2nDoSB0cuG7iyAxLCB0YSBj4bqnbiB0aOG6rW4gdHLhu41uZyBraGkga+G6v3QgbHXhuq1uIGPDsyBz4buxIGtow6FjIGJp4buHdC4NCg0KLSBL4bq/dCBxdeG6oyBwaMO5IGjhu6NwIHbhu5tpIHBow6JuIHTDrWNoIHThu7cgc+G7kSBy4bunaSBybyAoUmlzayBSYXRpbykgxJHDoyB0csOsbmggYsOgeSB0csaw4bubYyDEkcOzLCBj4bunbmcgY+G7kSB0aMOqbSBr4bq/dCBsdeG6rW4gcuG6sW5nICoqa2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIHPhu58gaOG7r3UgbmjDoCBnaeG7r2EgbuG7ryB2w6AgbmFtKiogdHJvbmcgZOG7ryBsaeG7h3UgbsOgeS4NCg0KDQoNCg0K