Phần 1: Tìm hiểu và Chuẩn bị Dữ liệu

Dataset được sử dụng trong nghiên cứu này có tên là “Indicators of Heart Disease”, bao gồm 319.795 quan sát và 19 biến. Bộ dữ liệu này chứa thông tin sức khỏe của các cá nhân, được sử dụng nhằm hỗ trợ phân tích và dự đoán khả năng mắc bệnh tim mạch dựa trên các chỉ số lối sống và sức khỏe.

Tập dữ liệu gồm 18 biến, bao gồm: 14 biến định tính và 4 biến định lượng. Dưới đây là mô tả khái quát:

Biến định tính:

  • HeartDisease: Có mắc bệnh tim hay không.

  • Smoking: Có hút thuốc lá hay không.

  • AlcoholDrinking: Có uống rượu bia quá mức hay không.

  • Stroke: Có bị đột quỵ hay không.

  • DiffWalking: Có gặp khó khăn trong việc đi lại hay không.

  • Sex: Giới tính của người tham gia khảo sát.

  • AgeCategory: Nhóm tuổi của người tham gia.

  • Race: Chủng tộc của người tham gia khảo sát.

  • Diabetic: Có bị tiểu đường hay không.

  • PhysicalActivity: Có hoạt động thể chất trong 30 ngày qua hay không.

  • GenHealth: Đánh giá tổng quát về tình trạng sức khỏe bản thân.

  • Asthma: Có bị hen suyễn hay không.

  • KidneyDisease: Có bị bệnh thận hay không.

  • SkinCancer: Có bị ung thư da hay không.

Biến định lượng:

  • BMI: Chỉ số khối cơ thể (Body Mass Index).

  • PhysicalHealth: Số ngày trong 30 ngày qua mà thể chất không khỏe.

  • MentalHealth: Số ngày trong 30 ngày qua mà tinh thần không khỏe.

  • SleepTime: Số giờ ngủ trung bình mỗi đêm.

1.1 Đọc file dữ liệu

d <- read.csv("D:/PTDLDT/Indicators of Heart Disease.csv")
str(d)
## 'data.frame':    319795 obs. of  19 variables:
##  $ X               : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ HeartDisease    : chr  "No" "No" "No" "No" ...
##  $ BMI             : num  16.6 20.3 26.6 24.2 23.7 ...
##  $ Smoking         : chr  "Yes" "No" "Yes" "No" ...
##  $ AlcoholDrinking : chr  "No" "No" "No" "No" ...
##  $ Stroke          : chr  "No" "Yes" "No" "No" ...
##  $ PhysicalHealth  : int  3 0 20 0 28 6 15 5 0 0 ...
##  $ MentalHealth    : int  30 0 30 0 0 0 0 0 0 0 ...
##  $ DiffWalking     : chr  "No" "No" "No" "No" ...
##  $ Sex             : chr  "Female" "Female" "Male" "Female" ...
##  $ AgeCategory     : chr  "55-59" "80 or older" "65-69" "75-79" ...
##  $ Race            : chr  "White" "White" "White" "White" ...
##  $ Diabetic        : chr  "Yes" "No" "Yes" "No" ...
##  $ PhysicalActivity: chr  "Yes" "Yes" "Yes" "No" ...
##  $ GenHealth       : chr  "Very good" "Very good" "Fair" "Good" ...
##  $ SleepTime       : int  5 7 8 6 8 12 4 9 5 10 ...
##  $ Asthma          : chr  "Yes" "No" "Yes" "No" ...
##  $ KidneyDisease   : chr  "No" "No" "No" "No" ...
##  $ SkinCancer      : chr  "Yes" "No" "No" "Yes" ...
  • Trong đó có 14 biến định tính
dldt <- c("HeartDisease", "Smoking","AlcoholDrinking", "Stroke" ,"DiffWalking","Sex","AgeCategory","Race","Diabetic", "PhysicalActivity", "GenHealth","Asthma","KidneyDisease","SkinCancer")
dldt
##  [1] "HeartDisease"     "Smoking"          "AlcoholDrinking"  "Stroke"          
##  [5] "DiffWalking"      "Sex"              "AgeCategory"      "Race"            
##  [9] "Diabetic"         "PhysicalActivity" "GenHealth"        "Asthma"          
## [13] "KidneyDisease"    "SkinCancer"
library(epitools)
dt <- d[, dldt]
  • Chọn biến HeartDiseaseStroke làm biến phụ thuộc để phân tích
dt <- data.frame(lapply(dt, as.factor))

Tác giả chọn biến HeartDisease và biến Stroke là 2 biến phụ thuộc. Tiếp theo, tác giả chọn biến Smoking và biến Diabetic là biến tác động đến HeartDisease, còn Stroke bị tác động bởi biến Smoking và KidneyDisease.

# Phần 2: Phân tích Mô tả Một biến Định tính (Univariate Descriptive Analysis)

2.1 Biến HeartDisease

Bảng tần số

#Lập bảng tần số biến HeartDisease
table(dt$HeartDisease)
## 
##     No    Yes 
## 292422  27373

Bảng tần suất

#Lập bảng tần suất của biến HeartDisease
table(dt$HeartDisease)/sum(nrow(dt))
## 
##         No        Yes 
## 0.91440454 0.08559546

Biểu đồ

# Bảng tần suất và tỷ lệ %
HeartDisease_freq  <- table(dt$HeartDisease)
HeartDisease_pct   <- HeartDisease_freq / nrow(dt)

# Vẽ biểu đồ tròn
pie(HeartDisease_freq,
    main   = ".",
    labels = paste0(names(HeartDisease_freq),
                    " (", round(HeartDisease_pct*100, 1), "%)"),
    col    = c("lightpink","lightblue"))

Nhận xét

Vậy trong bộ dữ liệu này có 91,4% người không mắc bệnh tim và 8,6% người mắc bệnh tim.

2.2 Biến Smoking

Bảng tần số

#Lập bảng tần số biến Smoking
table(dt$Smoking)
## 
##     No    Yes 
## 187887 131908

Bảng tần suất

#Lập bảng tần suất của biến Smoking
table(dt$Smoking)/sum(nrow(dt))
## 
##        No       Yes 
## 0.5875233 0.4124767

Biểu đồ

# Bảng tần suất và tỷ lệ %
Smoking_freq  <- table(dt$Smoking)
Smoking_pct   <- Smoking_freq / nrow(dt)

# Vẽ biểu đồ tròn
pie(Smoking_freq,
    main   = ".",
    labels = paste0(names(Smoking_freq),
                    " (", round(Smoking_pct*100, 1), "%)"),
    col    = c("white","lightblue"))

Nhận xét Vậy trong bộ dữ liệu này có 58,8% người không hút thuốc và 41,2% người hút thuốc.

2.3 Biến Diabetic

Bảng tần số

#Lập bảng tần số biến Diabetic
table(dt$Diabetic)
## 
##     No    Yes 
## 276434  43361

Bảng tần suất

#Lập bảng tần suất của biến Diabetic
table(dt$Diabetic)/sum(nrow(dt))
## 
##      No     Yes 
## 0.86441 0.13559

Biểu đồ

# Bảng tần suất và tỷ lệ %
Diabetic_freq  <- table(dt$Diabetic)
Diabetic_pct   <- Diabetic_freq / nrow(dt)

# Vẽ biểu đồ tròn
pie(Diabetic_freq,
    main   = ".",
    labels = paste0(names(Diabetic_freq),
                    " (", round(Diabetic_pct*100, 1), "%)"),
    col    = c("red","blue"))

Nhận xét

Vậy trong bộ dữ liệu này có 86,4% người không bị tiểu đường và 13,6% người bị tiểu đường.

2.4 Biến Stroke

Bảng tần số

#Lập bảng tần số biến Stroke
table(dt$Stroke)
## 
##     No    Yes 
## 307726  12069

Bảng tần suất

#Lập bảng tần suất của biến Stroke
table(dt$Stroke)/sum(nrow(dt))
## 
##        No       Yes 
## 0.9622602 0.0377398

Biểu đồ

# Bảng tần suất và tỷ lệ %
Stroke_freq  <- table(dt$Stroke)
Stroke_pct   <- Stroke_freq / nrow(dt)

# Vẽ biểu đồ tròn
pie(Stroke_freq,
    main   = ".",
    labels = paste0(names(Stroke_freq),
                    " (", round(Stroke_pct*100, 1), "%)"),
    col    = c("lightgreen","lightblue"))

Nhận xét Vậy trong bộ dữ liệu này có 96,2% người không bị đột quỵ và 3,8% người bị đột quỵ.

2.5 Biến KidneyDisease

Bảng tần số

#Lập bảng tần số biến KidneyDisease
table(dt$KidneyDisease)
## 
##     No    Yes 
## 308016  11779

Bảng tần suất

#Lập bảng tần suất của biến KidneyDisease
table(dt$KidneyDisease)/sum(nrow(dt))
## 
##         No        Yes 
## 0.96316703 0.03683297

Biểu đồ

# Bảng tần suất và tỷ lệ %
KidneyDisease_freq  <- table(dt$KidneyDisease)
KidneyDisease_pct   <- KidneyDisease_freq / nrow(dt)

# Vẽ biểu đồ tròn
pie(KidneyDisease_freq,
    main   = ".",
    labels = paste0(names(KidneyDisease_freq),
                    " (", round(KidneyDisease_pct*100, 1), "%)"),
    col    = c("orange", "purple"))

Nhận xét

Vậy trong bộ dữ liệu này có 96,3% người không bị bệnh thận và 3,7% người bị bệnh thận.

Phần 3: Phân tích Mối quan hệ giữa Hai biến Định tính (Bivariate Analysis)

3.1 HeartDisease và Smoking

3.1.1. Bảng tần số và tần suất

Bảng tần số

# Gán nhãn rõ ràng cho các biến
dt$HeartDisease <- factor(dt$HeartDisease,
                       levels = c("No", "Yes"),
                       labels = c("Không bệnh tim", "Bệnh tim"))

dt$Smoking <- factor(dt$Smoking,
                                levels = c("No", "Yes"),
                                labels = c("Không hút thuốc", "Hút thuốc"))
# Lập bảng tần số chéo giữa HeartDisease và Smoking
he_sm <- table(dt$HeartDisease, dt$Smoking)

# Thêm tổng hàng và tổng cột
he_sm1 <- addmargins(he_sm)

# Hiển thị bảng với nhãn rõ ràng
he_sm1
##                 
##                  Không hút thuốc Hút thuốc    Sum
##   Không bệnh tim          176551    115871 292422
##   Bệnh tim                 11336     16037  27373
##   Sum                     187887    131908 319795

Bảng tần suất

# Lập bảng tần suất theo hàng (theo tình trạng bị bệnh tim hay không)
he_sm_prop <- prop.table(he_sm, margin = 1)

# Làm tròn 
he_sm_prop_rounded <- round(he_sm_prop, 4)

# Hiển thị bảng tần suất
he_sm_prop_rounded
##                 
##                  Không hút thuốc Hút thuốc
##   Không bệnh tim          0.6038    0.3962
##   Bệnh tim                0.4141    0.5859

Biểu đồ

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
# Chuyển bảng sang dạng data frame
he_sm_df <- as.data.frame(he_sm)

# Đổi tên cột cho rõ ràng
colnames(he_sm_df) <- c("HeartDisease", "Smoking", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(he_sm_df, aes(x = Smoking, y = Count, fill = HeartDisease)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Số lượng mắc bệnh tim theo việc hút thuốc",
    x = "Hút thuốc",
    y = "Số lượng",
    fill = "Bệnh tim"
  ) +
  theme_minimal() +
  scale_fill_brewer(palette = "Pastel2")

Nhận xét

Dữ liệu cho thấy một mối liên hệ rất mạnh mẽ giữa việc hút thuốc và nguy cơ mắc bệnh tim. Trong khi người không hút thuốc chiếm đa số ở nhóm khỏe mạnh (60.38%), thì ở nhóm có bệnh tim, người hút thuốc lại chiếm tỷ lệ vượt trội (58.59%). Sự đảo ngược tỷ lệ này khẳng định rằng hút thuốc là một yếu tố nguy cơ chính, làm tăng đáng kể khả năng mắc các bệnh lý về tim. Vì vậy, việc từ bỏ thuốc lá là biện pháp phòng ngừa bệnh tim mạch vô cùng quan trọng.

3.1.2. Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀: Hút thuốc và bệnh tim là hai biến độc lập.

  • H₁: Hút thuốc và bệnh tim có liên quan.

# Thực hiện kiểm định Chi bình phương
chi_he_sm <- chisq.test(he_sm)
print(chi_he_sm)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  he_sm
## X-squared = 3713, df = 1, p-value < 2.2e-16

Nhận xét kết quả kiểm định:

  • Giá trị Chi-bình phương (X²): 3713

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

  • Giá trị p: < 2.2e-16

Kết luận:

  • Dựa vào giá trị p (< 2.2e-16) và mức ý nghĩa α = 0.05, ta bác bỏ giả thuyết H₀. Điều này cho thấy có mối liên hệ thống kê ý nghĩa giữa tình trạng hút thuốc và bệnh tim mạch.
  • Bên cạnh đó, giá trị Chi-bình phương cực kỳ lớn (X² = 3713) chính là minh chứng cho mức độ chặt chẽ của mối quan hệ này. Kết quả này nhấn mạnh rằng việc hút thuốc có ảnh hưởng đến nguy cơ mắc bệnh tim mạch trong nhóm nghiên cứu.

3.1.3 Hiệu tỷ lệ (Risk Difference - RD)

# Lập bảng tần số chéo giữa HeartDisease và Smoking
he_sm <- table(dt$HeartDisease, dt$Smoking)

# Thêm tổng hàng và tổng cột
addmargins(he_sm)
##                 
##                  Không hút thuốc Hút thuốc    Sum
##   Không bệnh tim          176551    115871 292422
##   Bệnh tim                 11336     16037  27373
##   Sum                     187887    131908 319795

\[ p_1 = P(\text{HeartDisease} = \text{Yes} \mid \text{Smoking} = \text{Không hút thuốc}) \quad \text{(Tỷ lệ bệnh tim ở nhóm không hút thuốc)} \]

\[ p_2 = P(\text{HeartDisease} = \text{Yes} \mid \text{Smoking} = \text{Hút thuốc}) \quad \text{(Tỷ lệ bệnh tim ở nhóm hút thuốc)} \]

Giả thuyết kiểm định:

Kiểm định: - H₀: Tỷ lệ mắc bệnh tim giữa không hút thuốc và hút thuốc là bằng nhau. (p₁ - p₂ =0 ) - H₁: Tỷ lệ mắc bệnh tim giữa không hút thuốc bé hơn hút thuốc(p₁ - p₂ < 0)

# Số người mắc bệnh tim trong từng nhóm hút thuốc
counts_heart <- c(he_sm["Bệnh tim", "Không hút thuốc"], he_sm["Bệnh tim", "Hút thuốc"])

# Tổng số người trong từng nhóm hút thuốc
totals_heart <- c(sum(he_sm[, "Không hút thuốc"]), sum(he_sm[, "Hút thuốc"]))

# Kiểm định tỉ lệ một phía: p1 < p2
test_heart_less <- prop.test(counts_heart, totals_heart, alternative = "less", correct = FALSE)
test_heart_less
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_heart out of totals_heart
## X-squared = 3713.8, df = 1, p-value < 2.2e-16
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000 -0.05950899
## sample estimates:
##     prop 1     prop 2 
## 0.06033414 0.12157716

Kết quả kiểm định tỷ lệ hai mẫu cho thấy:

Tỷ lệ mắc bệnh tim ở nhóm không hút thuốc (prop 1) là khoảng 6.03%. Tỷ lệ mắc bệnh tim ở nhóm hút thuốc (prop 2) là khoảng 12.16%. Giá trị thống kê Chi bình phương là 3713.8 với bậc tự do 1 và p-value nhỏ hơn 2.2e-16.

Vì p-value rất nhỏ, chúng ta bác bỏ giả thuyết rằng tỷ lệ mắc bệnh tim ở hai nhóm là bằng nhau.

Khoảng tin cậy 95% cho hiệu hai tỷ lệ từ -1 đến -0.0595 cho thấy sự khác biệt giữa hai tỷ lệ là có ý nghĩa thống kê.

3.1.4. Rủi ro tương đối(Relative Risk - RR):

riskratio(he_sm, method="wald")
## $data
##                 
##                  Không hút thuốc Hút thuốc  Total
##   Không bệnh tim          176551    115871 292422
##   Bệnh tim                 11336     16037  27373
##   Total                   187887    131908 319795
## 
## $measure
##                 risk ratio with 95% C.I.
##                  estimate    lower    upper
##   Không bệnh tim  1.00000       NA       NA
##   Bệnh tim        1.47855 1.462494 1.494782
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Không bệnh tim         NA           NA         NA
##   Bệnh tim                0            0          0
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Ta thấy RR = 1.4786, tức là tỷ lệ mắc bệnh tim ở nhóm hút thuốc cao hơn khoảng 47.86% so với nhóm không hút thuốc.

Khoảng tin cậy 95% cho RR là từ 1.4625 đến 1.4948, cho thấy kết quả có ý nghĩa thống kê.

Có thể hiểu rằng, trong mẫu dữ liệu này, hút thuốc làm tăng đáng kể nguy cơ mắc bệnh tim.

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

or_result1 <- oddsratio(he_sm)
print(or_result1)
## $data
##                 
##                  Không hút thuốc Hút thuốc  Total
##   Không bệnh tim          176551    115871 292422
##   Bệnh tim                 11336     16037  27373
##   Total                   187887    131908 319795
## 
## $measure
##                 odds ratio with 95% C.I.
##                  estimate    lower    upper
##   Không bệnh tim 1.000000       NA       NA
##   Bệnh tim       2.155552 2.102007 2.210524
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Không bệnh tim         NA           NA         NA
##   Bệnh tim                0            0          0
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Giá trị odds ratio (OR) = 2.156 cho thấy rằng khả năng mắc bệnh tim ở nhóm hút thuốc cao hơn khoảng 115.6% so với nhóm không hút thuốc trong cùng điều kiện.

Khoảng tin cậy 95% cho OR nằm trong khoảng từ 2.102 đến 2.211, và p-value ≈ 0 cho thấy kết quả có ý nghĩa thống kê.

Nói cách khác, trong mẫu dữ liệu này, người hút thuốc có khả năng mắc bệnh tim cao hơn gấp đôi so với người không hút thuốc.

3.2. HeartDisease và Diabetic

3.2.1. Bảng tần số và tần suất

Bảng tần số

# Gán nhãn cho biến Diabetic
dt$Diabetic <- factor(dt$Diabetic,
                            levels = c("No", "Yes"),
                            labels = c("Không tiểu đường", "Tiểu đường"))
he_di <- table(dt$HeartDisease, dt$Diabetic)
he_di1 <- addmargins(he_di)
he_di1 
##                 
##                  Không tiểu đường Tiểu đường    Sum
##   Không bệnh tim           258126      34296 292422
##   Bệnh tim                  18308       9065  27373
##   Sum                      276434      43361 319795

Bảng tần suất

# Tính tỷ lệ theo hàng
he_di_prop <- prop.table(he_di, margin = 1)

# Làm tròn để hiển thị đẹp
he_di_prop_rounded <- round(he_di_prop, 4)

# Hiển thị bảng
he_di_prop_rounded
##                 
##                  Không tiểu đường Tiểu đường
##   Không bệnh tim           0.8827     0.1173
##   Bệnh tim                 0.6688     0.3312

Biểu đồ

# Chuyển bảng sang data frame
df <- as.data.frame(he_di)
colnames(df) <- c("HeartDisease", "Diabetic", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(df, aes(x = HeartDisease, y = Count, fill = Diabetic)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Số lượng mắc bệnh tim theo bệnh tiểu đường",
       x = "Bệnh tim",
       y = "Số lượng",
       fill = "Bệnh tiểu đường") +
  theme_minimal()

Nhận xét

Dữ liệu cho thấy một mối tương quan rõ rệt giữa bệnh tiểu đường và bệnh tim. Cụ thể, tỷ lệ người mắc bệnh tiểu đường ở nhóm có bệnh tim (33.12%) cao gần gấp ba lần so với nhóm không có bệnh tim (11.73%). Sự chênh lệch lớn này khẳng định rằng bệnh tiểu đường là một yếu tố liên quan chặt chẽ và là một yếu tố nguy cơ quan trọng đối với bệnh tim. Do đó, việc tầm soát chéo giữa hai bệnh lý này là vô cùng cần thiết để phát hiện và điều trị sớm.

3.2.2. Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀: Bệnh tim và bệnh tiểu đường là hai biến độc lập.

  • H₁: Bệnh tim và bệnh tiểu đường có liên quan.

# Kiểm định Chi bình phương
chi_he_di <- chisq.test(he_di)
print(chi_he_di)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  he_di
## X-squared = 9767.5, df = 1, p-value < 2.2e-16

Kết quả kiểm định:

  • Giá trị thống kê Chi bình phương: X² = 10850

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

  • p-value = < 2.2e-16

Với p-value < 2.2e-16 nhỏ hơn mức ý nghĩa phổ biến α = 0.05, ta bác bỏ giả thuyết H₀. Điều này khẳng định rằng có một mối liên hệ có ý nghĩa thống kê rất cao giữa tình trạng mắc bệnh tim và tình trạng mắc bệnh tiểu đường. ### 3.2.3 Hiệu tỷ lệ (Risk Difference - RD)

he_di <- table(dt$HeartDisease, dt$Diabetic)
he_di1 <- addmargins(he_di)
he_di1 
##                 
##                  Không tiểu đường Tiểu đường    Sum
##   Không bệnh tim           258126      34296 292422
##   Bệnh tim                  18308       9065  27373
##   Sum                      276434      43361 319795

\[ p_1 = P(\text{HeartDisease} = \text{Bệnh tim} \mid \text{Diabetic} = \text{Không tiểu đường}) \quad \text{(Tỷ lệ bệnh tim ở nhóm không tiểu đường)} \] \[ p_2 = P(\text{HeartDisease} = \text{Bệnh tim} \mid \text{Diabetic} = \text{Tiểu đường}) \quad \text{(Tỷ lệ bệnh tim ở nhóm tiểu đường)} \]

Giả thiết kiểm định

\[ H_0: p_1 - p_2 = 0 \quad \text{(Tỷ lệ bệnh tim ở nhóm không tiểu đường bằng tỷ lệ bệnh tim ở nhóm có tiểu đường)} \] \[ H_1: p_1 - p_2 > 0 \quad \text{(Tỷ lệ bệnh tim ở nhóm không tiểu đường lớn hơn tỷ lệ bệnh tim ở nhóm có tiểu đường)} \]

# Số người bệnh tim trong từng nhóm tiểu đường
counts_heart1 <- c(he_di["Bệnh tim", "Không tiểu đường"],
            he_di["Bệnh tim", "Tiểu đường"])

# Tổng số người trong từng nhóm tiểu đường
totals_heart1 <- c(sum(he_di[, "Không tiểu đường"]),
            sum(he_di[, "Tiểu đường"]))

# Kiểm định một phía: Tỷ lệ bệnh tim nhóm không tiểu đường < nhóm tiểu đường
test_heart_greater <- prop.test(counts_heart1, totals_heart1, alternative = "greater", correct = FALSE)

# Xem kết quả
print(test_heart_greater)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_heart1 out of totals_heart1
## X-squared = 9769.4, df = 1, p-value = 1
## alternative hypothesis: greater
## 95 percent confidence interval:
##  -0.1461346  1.0000000
## sample estimates:
##     prop 1     prop 2 
## 0.06622919 0.20905883

Giá trị thống kê kiểm định (Chi-squared): 10,852 Giá trị p-value = 1

Với mức ý nghĩa 5% (α = 0.05), ta có: p-value = 1 > 0.05

⇒ Không có đủ bằng chứng để bác bỏ giả thuyết không.

Kết luận: Không có đủ bằng chứng thống kê để khẳng định rằng tỷ lệ mắc bệnh tim ở nhóm thứ nhất (prop 1 = 6.50%) cao hơn so với nhóm thứ hai (prop 2 = 21.95%), mặc dù tỷ lệ thực tế ở nhóm 2 cao hơn.

Kết quả p-value = 1 cho thấy dữ liệu hoàn toàn không ủng hộ giả thuyết đối rằng tỷ lệ ở nhóm 1 lớn hơn nhóm 2.

3.2.4. Rủi ro tương đối (Relative Risk - RR):

riskratio(he_di, method="wald")
## $data
##                 
##                  Không tiểu đường Tiểu đường  Total
##   Không bệnh tim           258126      34296 292422
##   Bệnh tim                  18308       9065  27373
##   Total                    276434      43361 319795
## 
## $measure
##                 risk ratio with 95% C.I.
##                  estimate    lower   upper
##   Không bệnh tim 1.000000       NA      NA
##   Bệnh tim       2.823657 2.768984 2.87941
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Không bệnh tim         NA           NA         NA
##   Bệnh tim                0            0          0
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Với RR = 3.017, ta nhận thấy rằng tỷ lệ mắc bệnh tim ở nhóm tiểu đường cao hơn khoảng 3 lần so với nhóm không tiểu đường.

Khoảng tin cậy 95% cho RR là từ 2.958 đến 3.077, cho thấy sự khác biệt có ý nghĩa thống kê.

Nói cách khác, trong mẫu dữ liệu này, người bị tiểu đường có nguy cơ mắc bệnh tim cao hơn rõ rệt so với người không bị tiểu đường.

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

or_result2 <- oddsratio(he_di)
print(or_result2)
## $data
##                 
##                  Không tiểu đường Tiểu đường  Total
##   Không bệnh tim           258126      34296 292422
##   Bệnh tim                  18308       9065  27373
##   Total                    276434      43361 319795
## 
## $measure
##                 odds ratio with 95% C.I.
##                  estimate    lower    upper
##   Không bệnh tim 1.000000       NA       NA
##   Bệnh tim       3.726625 3.625161 3.830774
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Không bệnh tim         NA           NA         NA
##   Bệnh tim                0            0          0
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả phân tích cho thấy Odds Ratio (OR) = 4.048, nghĩa là khả năng mắc bệnh tim ở nhóm tiểu đường cao hơn khoảng 4 lần so với nhóm không tiểu đường.

Khoảng tin cậy 95% cho OR nằm trong khoảng từ 3.936 đến 4.163, cho thấy sự khác biệt này là có ý nghĩa thống kê.

Nói cách khác, trong mẫu dữ liệu này, tiểu đường là yếu tố làm tăng mạnh nguy cơ mắc bệnh tim.

3.3. Stroke và Smoking

3.3.1. Bảng tần số và tần suất

Bảng tần số

dt$Stroke <- factor(dt$Stroke, 
                         levels = c("No", "Yes"),
                         labels = c("Không đột quỵ", "Đột quỵ"))

# Lập bảng tần số chéo
st_sm <- table(dt$Stroke, dt$Smoking)

# Thêm tổng hàng và cột
st_sm1 <- addmargins(st_sm)

# Hiển thị bảng
st_sm1
##                
##                 Không hút thuốc Hút thuốc    Sum
##   Không đột quỵ          182633    125093 307726
##   Đột quỵ                  5254      6815  12069
##   Sum                    187887    131908 319795

Bảng tần suất

# Lập bảng tần suất theo hàng (row percentages)
st_sm_prop <- prop.table(st_sm, margin = 1)

# Làm tròn 4 chữ số thập phân
st_sm_prop <- round(st_sm_prop, 4)

# Hiển thị bảng tần suất
st_sm_prop
##                
##                 Không hút thuốc Hút thuốc
##   Không đột quỵ          0.5935    0.4065
##   Đột quỵ                0.4353    0.5647

Biểu đồ

# Chuyển thành data frame
st_sm_df <- as.data.frame(st_sm)

# Đổi tên cột cho dễ hiểu
colnames(st_sm_df) <- c("Stroke", "Smoking", "Count")

# Vẽ biểu đồ
ggplot(st_sm_df, aes(x = Smoking, y = Count, fill = Stroke)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Tình trạng đột quỵ theo tình trạng hút thuốc",
    x = "Tình trạng hút thuốc",
    y = "Số lượng",
    fill = "Tình trạng đột quỵ"
  ) +
  theme_minimal() +
  scale_fill_brewer(palette = "pastel1")
## Warning: Unknown palette: "pastel1"

Nhận xét

Dữ liệu cho thấy một mối liên hệ mạnh mẽ giữa việc hút thuốc và nguy cơ đột quỵ. Trong khi người không hút thuốc chiếm đa số ở nhóm khỏe mạnh (59.35%), thì ở nhóm bệnh nhân đột quỵ, người hút thuốc lại trở thành nhóm chiếm ưu thế với tỷ lệ 56.47%. Sự đảo ngược tỷ lệ này là bằng chứng rõ ràng cho thấy hút thuốc là một yếu tố nguy cơ chính, làm tăng đáng kể khả năng bị đột quỵ. Vì vậy, việc từ bỏ thuốc lá là một biện pháp phòng ngừa đột quỵ hiệu quả và cần thiết.

3.3.2. Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀: Tình trạng đột quỵ và tình trạng hút thuốc là hai biến độc lập.

  • H₁: Tình trạng đột quỵ và tình trạng hút thuốc có liên quan.

# Thực hiện kiểm định Chi bình phương
chi_st_sm <- chisq.test(st_sm)
print(chi_st_sm)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  st_sm
## X-squared = 1198.1, df = 1, p-value < 2.2e-16

Kết quả kiểm định:

  • Giá trị thống kê Chi bình phương: X² = 1198.1

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

  • p-value < 2.2e-16

Do đó, chúng ta có bằng chứng thống kê rất mạnh mẽ để bác bỏ giả thuyết H₀ (giả thuyết cho rằng không có mối liên quan giữa hai biến). Điều này khẳng định rằng có một mối liên hệ có ý nghĩa thống kê rất cao giữa hai yếu tố đang được xem xét. Giá trị thống kê Chi-bình phương rất lớn (X² = 1198.1) càng củng cố thêm kết luận này, cho thấy sự khác biệt giữa tần số quan sát được trong thực tế và tần số kỳ vọng (nếu không có mối liên hệ) là cực kỳ đáng kể và không thể là do ngẫu nhiên.

3.3.3 Hiệu tỷ lệ (Risk Difference - RD)

# Lập bảng tần số chéo
st_sm <- table(dt$Stroke, dt$Smoking)

# Thêm tổng hàng và cột
st_sm1 <- addmargins(st_sm)

# Hiển thị bảng
st_sm1
##                
##                 Không hút thuốc Hút thuốc    Sum
##   Không đột quỵ          182633    125093 307726
##   Đột quỵ                  5254      6815  12069
##   Sum                    187887    131908 319795

\[ p_1 = P(\text{Stroke} = \text{Đột quỵ} \mid \text{Smoking} = \text{Không hút thuốc}) \quad \text{(Tỷ lệ đột quỵ ở nhóm không hút thuốc)} \]

\[ p_2 = P(\text{Stroke} = \text{Đột quỵ} \mid \text{Smoking} = \text{Hút thuốc}) \quad \text{(Tỷ lệ đột quỵ ở nhóm hút thuốc)} \]

Giả thuyết kiểm định:

\[ H_0: p_1 - p_2 = 0 \quad \text{(Tỷ lệ đột quỵ ở nhóm không hút thuốc bằng tỷ lệ đột quỵ ở nhóm hút thuốc)} \]

\[ H_1: p_1 - p_2 < 0 \quad \text{(Tỷ lệ đột quỵ ở nhóm không hút thuốc nhỏ hơn tỷ lệ đột quỵ ở nhóm hút thuốc)} \]

# Số người đột quỵ trong từng nhóm hút thuốc
counts_stroke <- c(st_sm["Đột quỵ", "Không hút thuốc"], st_sm["Đột quỵ", "Hút thuốc"])

# Tổng số người trong từng nhóm hút thuốc
totals_stroke <- c(sum(st_sm[, "Không hút thuốc"]), sum(st_sm[, "Hút thuốc"]))

# Kiểm định tỉ lệ một phía: p1 < p2 
test_stroke_less <- prop.test(counts_stroke, totals_stroke, alternative = "less", correct = FALSE)

# Hiển thị kết quả kiểm định
test_stroke_less
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_stroke out of totals_stroke
## X-squared = 1198.8, df = 1, p-value < 2.2e-16
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000 -0.02251951
## sample estimates:
##     prop 1     prop 2 
## 0.02796362 0.05166480

Kết quả kiểm định cho thấy:

Tỷ lệ đột quỵ ở nhóm 1 (prop 1) là khoảng 2.80% Tỷ lệ đột quỵ ở nhóm 2 (prop 2) là khoảng 5.17%

Giá trị thống kê Chi bình phương là 1198.8, với 1 bậc tự do và p-value < 2.2e-16.

Vì p-value nhỏ hơn 0.05, chúng ta có đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này cho thấy tỷ lệ đột quỵ ở nhóm 1 nhỏ hơn đáng kể so với nhóm 2.

Khoảng tin cậy 95% cho hiệu tỷ lệ nằm trong khoảng từ -1.0000 đến -0.0225, không chứa giá trị 0, càng khẳng định sự khác biệt là có ý nghĩa thống kê.

Kết luận: Nhóm 1 có tỷ lệ đột quỵ thấp hơn đáng kể so với nhóm 2.

3.3.4. Rủi ro tương đối (Relative Risk - RR):

riskratio(st_sm, method="wald")
## $data
##                
##                 Không hút thuốc Hút thuốc  Total
##   Không đột quỵ          182633    125093 307726
##   Đột quỵ                  5254      6815  12069
##   Total                  187887    131908 319795
## 
## $measure
##                risk ratio with 95% C.I.
##                 estimate    lower    upper
##   Không đột quỵ 1.000000       NA       NA
##   Đột quỵ       1.389075 1.366704 1.411812
## 
## $p.value
##                two-sided
##                 midp.exact  fisher.exact   chi.square
##   Không đột quỵ         NA            NA           NA
##   Đột quỵ                0 1.484474e-257 1.11617e-262
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Giá trị RR = 1.389 cho thấy rằng tỷ lệ đột quỵ ở nhóm hút thuốc cao hơn khoảng 38.9% so với nhóm không hút thuốc.

Khoảng tin cậy 95% cho RR nằm trong khoảng từ 1.3667 đến 1.4118, và p-value gần bằng 0, cho thấy sự khác biệt là có ý nghĩa thống kê.

Kết luận: Trong mẫu dữ liệu này, hút thuốc có liên quan đến nguy cơ đột quỵ cao hơn đáng kể so với không hút thuốc.

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

or_result3 <- oddsratio(st_sm)
print(or_result3)
## $data
##                
##                 Không hút thuốc Hút thuốc  Total
##   Không đột quỵ          182633    125093 307726
##   Đột quỵ                  5254      6815  12069
##   Total                  187887    131908 319795
## 
## $measure
##                odds ratio with 95% C.I.
##                 estimate    lower    upper
##   Không đột quỵ 1.000000       NA       NA
##   Đột quỵ       1.893733 1.825524 1.964589
## 
## $p.value
##                two-sided
##                 midp.exact  fisher.exact   chi.square
##   Không đột quỵ         NA            NA           NA
##   Đột quỵ                0 1.484474e-257 1.11617e-262
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Giá trị OR = 1.894 cho thấy rằng khả năng bị đột quỵ ở nhóm hút thuốc cao hơn khoảng 89.4% so với nhóm không hút thuốc.

Khoảng tin cậy 95% cho OR nằm trong khoảng từ 1.826 đến 1.965, cho thấy kết quả có ý nghĩa thống kê.

Nói cách khác, odds bị đột quỵ ở nhóm hút thuốc cao hơn gần gấp đôi so với nhóm không hút thuốc trong mẫu dữ liệu này.

3.4. Stroke và KidneyDisease

3.4.1. Bảng tần số và tần suất

Bảng tần số

dt$KidneyDisease <- factor(dt$KidneyDisease, 
                         levels = c("No", "Yes"),
                         labels = c("Không bệnh thận", "Bệnh thận"))


# Lập bảng tần số chéo
st_ki <- table(dt$Stroke, dt$KidneyDisease)

# Thêm tổng hàng và cột
st_ki1 <- addmargins(st_ki)

# Hiển thị bảng
st_ki1
##                
##                 Không bệnh thận Bệnh thận    Sum
##   Không đột quỵ          297438     10288 307726
##   Đột quỵ                 10578      1491  12069
##   Sum                    308016     11779 319795

Bảng tần suất

# Lập bảng tần suất theo hàng (row percentages)
st_ki_prop <- prop.table(st_ki, margin = 1)

# Làm tròn 4 chữ số thập phân
st_ki_prop <- round(st_ki_prop, 4)

# Hiển thị bảng tần suất
st_ki_prop
##                
##                 Không bệnh thận Bệnh thận
##   Không đột quỵ          0.9666    0.0334
##   Đột quỵ                0.8765    0.1235

Biểu đồ

# Chuyển thành data frame
st_ki_df <- as.data.frame(st_ki)

# Đổi tên cột cho dễ hiểu
colnames(st_ki_df ) <- c("Stroke", "KidneyDisease", "Count")

# Vẽ biểu đồ
ggplot(st_ki_df, aes(x = KidneyDisease, y = Count, fill = Stroke)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Tình trạng đột quỵ theo bệnh thận",
    x = "Tình trạng bệnh thận",
    y = "Số lượng bệnh nhân",
    fill = "Tình trạng đột quỵ"
  ) +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

Dữ liệu cho thấy một mối liên hệ rất mạnh mẽ giữa bệnh thận và nguy cơ đột quỵ. Tỷ lệ mắc bệnh thận ở nhóm bệnh nhân đã từng bị đột quỵ (12.35%) cao gần gấp 4 lần so với nhóm không bị đột quỵ (3.34%). Sự chênh lệch này khẳng định rằng bệnh thận là một yếu tố nguy cơ quan trọng, làm tăng rõ rệt khả năng xảy ra đột quỵ. Do đó, việc theo dõi chức năng thận và điều trị sớm bệnh thận đóng vai trò thiết yếu trong việc phòng ngừa đột quỵ.

3.4.2. Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀: Tình trạng đột quỵ và tình trạng bệnh thận là hai biến độc lập.

  • H₁: Tình trạng đột quỵ và tình trạng bệnh thận có liên quan.

# Thực hiện kiểm định Chi bình phương
chi_st_ki<- chisq.test(st_ki)
print(chi_st_ki)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  st_ki
## X-squared = 2655.4, df = 1, p-value < 2.2e-16

Kết quả kiểm định:

Giá trị thống kê Chi bình phương: X² = 2655.4 Bậc tự do (df) = 1 p-value < 2.2e-16

Với mức ý nghĩa thường dùng là α = 0.05, ta thấy p-value < 0.05, tức là có đủ bằng chứng thống kê để bác bỏ giả thuyết H₀.

Kết luận: Có mối liên hệ có ý nghĩa thống kê giữa hai biến trong dữ liệu st_ki. Nói cách khác, tình trạng hút thuốc và tình trạng đột quỵ có liên quan đến nhau trong mẫu dữ liệu này.

3.4.3 Hiệu tỷ lệ (Risk Difference - RD)

# Lập bảng tần số chéo
st_ki <- table(dt$Stroke, dt$KidneyDisease)

# Thêm tổng hàng và cột
st_ki1 <- addmargins(st_ki)

# Hiển thị bảng
st_ki1
##                
##                 Không bệnh thận Bệnh thận    Sum
##   Không đột quỵ          297438     10288 307726
##   Đột quỵ                 10578      1491  12069
##   Sum                    308016     11779 319795

\[ p_1 = P(\text{Stroke} = \text{Đột quỵ} \mid \text{KidneyDisease} = \text{Không bệnh thận}) \quad \text{(Tỷ lệ đột quỵ ở nhóm không bệnh thận)} \]

\[ p_2 = P(\text{Stroke} = \text{Đột quỵ} \mid \text{KidneyDisease} = \text{Bệnh thận}) \quad \text{(Tỷ lệ đột quỵ ở nhóm bệnh thận)} \]

Giả thuyết kiểm định

\[ H_0: p_1 - p_2 = 0 \quad \text{(Tỷ lệ đột quỵ ở nhóm không bệnh thận bằng tỷ lệ đột quỵ ở nhóm bệnh thận)} \]

\[ H_1: p_1 - p_2 > 0 \quad \text{(Tỷ lệ đột quỵ ở nhóm không bệnh thận lớn hơn tỷ lệ đột quỵ ở nhóm bệnh thận)} \]

# Số người đột quỵ trong từng nhóm bệnh thận
counts_stroke1 <- c(st_ki["Đột quỵ", "Không bệnh thận"],
                    st_ki["Đột quỵ", "Bệnh thận"])

# Tổng số người trong từng nhóm bệnh thận
totals_stroke1 <- c(sum(st_ki[, "Không bệnh thận"]),
                    sum(st_ki[, "Bệnh thận"]))

# Kiểm định tỉ lệ một phía: p1 > p2 (tỷ lệ đột quỵ ở nhóm không bệnh thận lớn hơn nhóm bệnh thận)
test_kidneydisease_greater <- prop.test(counts_stroke1, totals_stroke1, alternative = "greater", correct = FALSE)

# Hiển thị kết quả kiểm định
test_kidneydisease_greater
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_stroke1 out of totals_stroke1
## X-squared = 2657.9, df = 1, p-value = 1
## alternative hypothesis: greater
## 95 percent confidence interval:
##  -0.09730694  1.00000000
## sample estimates:
##     prop 1     prop 2 
## 0.03434237 0.12658120

Giá trị thống kê kiểm định (Chi-squared): 2657.9 Giá trị p-value: 1

Với mức ý nghĩa 5% (α = 0.05), ta có: p-value = 1 > 0.05

⇒ Không có đủ bằng chứng để bác bỏ giả thuyết không (H₀).

Kết luận: Không có đủ bằng chứng thống kê để khẳng định rằng tỷ lệ đột quỵ ở nhóm 1 (3.43%) lớn hơn tỷ lệ ở nhóm 2 (12.66%), dù tỷ lệ thực tế ở nhóm 2 cao hơn.

3.4.4. Rủi ro tương đối (Relative Risk - RR):

riskratio(st_ki, method="wald")
## $data
##                
##                 Không bệnh thận Bệnh thận  Total
##   Không đột quỵ          297438     10288 307726
##   Đột quỵ                 10578      1491  12069
##   Total                  308016     11779 319795
## 
## $measure
##                risk ratio with 95% C.I.
##                 estimate    lower    upper
##   Không đột quỵ 1.000000       NA       NA
##   Đột quỵ       3.695214 3.510863 3.889245
## 
## $p.value
##                two-sided
##                 midp.exact fisher.exact chi.square
##   Không đột quỵ         NA           NA         NA
##   Đột quỵ                0            0          0
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Với RR = 3.695, ta nhận thấy rằng tỷ lệ đột quỵ ở nhóm có bệnh thận cao hơn khoảng 269.5% so với nhóm không có bệnh thận.

Khoảng tin cậy 95% cho RR nằm trong khoảng từ 3.511 đến 3.889, cho thấy sự khác biệt là có ý nghĩa thống kê.

Nói cách khác, trong mẫu dữ liệu này, người có bệnh thận có nguy cơ bị đột quỵ cao hơn gần 3.7 lần so với người không có bệnh thận.

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

or_result4 <- oddsratio(st_ki)
print(or_result4)
## $data
##                
##                 Không bệnh thận Bệnh thận  Total
##   Không đột quỵ          297438     10288 307726
##   Đột quỵ                 10578      1491  12069
##   Total                  308016     11779 319795
## 
## $measure
##                odds ratio with 95% C.I.
##                 estimate   lower   upper
##   Không đột quỵ 1.000000      NA      NA
##   Đột quỵ       4.075428 3.84576 4.31609
## 
## $p.value
##                two-sided
##                 midp.exact fisher.exact chi.square
##   Không đột quỵ         NA           NA         NA
##   Đột quỵ                0            0          0
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả phân tích cho thấy Odds Ratio (OR) = 4.075, nghĩa là khả năng bị đột quỵ ở nhóm có bệnh thận cao hơn khoảng 307.5% so với nhóm không có bệnh thận.

Khoảng tin cậy 95% cho OR nằm trong khoảng từ 3.846 đến 4.316, cho thấy sự khác biệt là có ý nghĩa thống kê.

Nói cách khác, odds bị đột quỵ ở người có bệnh thận cao hơn gấp 4 lần so với người không có bệnh thận trong mẫu dữ liệu này.

Phần 4. Tổng kết và thảo luận

Bài báo cáo đã tiến hành kiểm định thống kê đối với 4 cặp biến:

  • Hút thuốc và bệnh tim,

  • Tiểu đường và bệnh tim,

  • Hút thuốc và đột quỵ,

  • Bệnh thận và đột quỵ.

Thông qua các phân tích về tỷ lệ, Risk Ratio, Odds Ratio và kiểm định Chi bình phương, bài báo đã đưa ra những kết luận bước đầu về ảnh hưởng của các yếu tố nguy cơ lên tình trạng sức khỏe. ## 4.1 Tổng kết các kết quả nổi bật

Hút thuốc và bệnh tim: RR ≈ 1.48, OR ≈ 2.16, p-value ≈ 0 ⇒ Người hút thuốc có nguy cơ mắc bệnh tim cao hơn đáng kể so với người không hút thuốc.

Tiểu đường và bệnh tim: RR ≈ 3.02, OR ≈ 4.05, p-value ≈ 0 ⇒ Tiểu đường là yếu tố nguy cơ mạnh đối với bệnh tim, làm tăng nguy cơ gấp 3–4 lần.

Hút thuốc và đột quỵ: RR ≈ 1.39, OR ≈ 1.89, p-value ≈ 0 ⇒ Nguy cơ đột quỵ ở người hút thuốc cao hơn khoảng 39%–89% so với người không hút.

Bệnh thận và đột quỵ: RR ≈ 3.70, OR ≈ 4.08, p-value ≈ 0 ⇒ Bệnh thận làm tăng nguy cơ đột quỵ rất rõ rệt – gần gấp 4 lần. ## 4.2 Thảo luận và hạn chế

Diễn giải kết quả

  • Tất cả 4 cặp biến đều cho thấy mối liên hệ có ý nghĩa thống kê giữa yếu tố nguy cơ và bệnh lý (bệnh tim hoặc đột quỵ).

  • Các chỉ số RR và OR đều lớn hơn 1, cho thấy các yếu tố như hút thuốc, tiểu đường, bệnh thận làm tăng nguy cơ bệnh rõ rệt.

  • Điều này phù hợp với kiến thức y học thực tiễn, xác nhận rằng các yếu tố bệnh nền đóng vai trò quan trọng trong diễn tiến bệnh lý tim mạch và đột quỵ.

Hạn chế - Dữ liệu mô phỏng: Không phản ánh chính xác quần thể thực tế.

  • Chỉ phân tích song biến: Chưa kiểm soát các yếu tố nhiễu như độ tuổi, giới tính, thời gian mắc bệnh…

  • Thiếu thông tin chi tiết: Các biến chỉ chia thành 2 nhóm (có/không), không nêu rõ mức độ, thời gian hút thuốc, giai đoạn bệnh…

  • Chưa phân tích theo thời gian: Không xem xét mối quan hệ theo chuỗi thời gian giữa bệnh nền và bệnh lý phát sinh.

Phần 5. Phương pháp ước lượng Maximum likehood

5.1. Giới thiệu tổng quan

Maximum Likelihood Estimation (MLE) là một phương pháp thống kê suy luận được sử dụng để tìm ra các giá trị tham số sao cho xác suất (hay “độ hợp lý”) để quan sát được dữ liệu thực tế là lớn nhất.

Trong bối cảnh phân tích dữ liệu định tính (categorical data), các mô hình thống kê thường ước lượng xác suất của một hoặc nhiều sự kiện rời rạc. MLE là phương pháp chuẩn và mạnh mẽ để thực hiện việc này.


5.2. Nguyên tắc cốt lõi: Hàm Hợp lý (Likelihood Function)

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

  • Xác suất: \(P(\text{dữ liệu} \mid \theta)\) – Tham số đã biết, tính xác suất để dữ liệu xảy ra.

  • Độ hợp lý: \(L(\theta \mid \text{dữ liệu})\) – Dữ liệu đã biết, tìm tham số phù hợp nhất với dữ liệu.

Nếu các quan sát là độc lập, hàm hợp lý được viết:

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

Trong đó: - \(\theta\): tham số của mô hình (ví dụ: xác suất \(p\) trong phân phối Bernoulli), - \(y_i\): quan sát thứ \(i\).

Mục tiêu của MLE là tìm giá trị \(\hat{\theta}\) sao cho \(L(\theta)\) đạt cực đại.


5.3. Quy trình thực hiện MLE

5.3.1. Bước 1: Giả định mô hình phân phối

  • Phân phối Bernoulli: Biến nhị phân (Yes/No).
    \(P(Y = y) = p^y (1 - p)^{1 - y}, \quad y \in \{0, 1\}\)

  • Phân phối Binomial: Tổng số lần thành công sau \(n\) phép thử độc lập.

  • Phân phối Multinomial: Biến có nhiều danh mục.

5.3.2. Bước 2: Xây dựng hàm hợp lý

Từ mô hình xác suất đã chọn, viết hàm hợp lý bằng tích các xác suất cho từng quan sát.

5.3.3. Bước 3: Sử dụng hàm Log-Likelihood

Để đơn giản hóa tính toán, lấy logarit tự nhiên:

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

Bước 4: Tối đa hóa Log-Likelihood

  • Lấy đạo hàm riêng \(\frac{d}{d\theta} LL(\theta)\)
  • Giải phương trình \(\frac{d}{d\theta} LL(\theta) = 0\) để tìm \(\hat{\theta}\)

5.4. Ví dụ minh họa: Ước lượng tỷ lệ tái nhiễm

Bài toán: Ước lượng tỷ lệ tái nhiễm \(p\) trong nhóm đã tiêm vắc-xin.

Bước 1: Mô hình

Biến Reinfection là nhị phân ⇒ dùng Bernoulli với tham số \(p = P(\text{Reinfection = Yes} \mid \text{Vaccinated = Yes})\)

Bước 2: Dữ liệu

  • Số người đã tiêm: \(n = 1472\)
  • Số người tái nhiễm: \(k = 155\)

Hàm hợp lý:

\[ L(p) = p^{155} (1 - p)^{1317} \]

Bước 3: Hàm Log-Likelihood

\[ LL(p) = \log L(p) = 155 \cdot \log(p) + 1317 \cdot \log(1 - p) \]

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

Lấy đạo hàm:

\[ \frac{dLL}{dp} = \frac{155}{p} - \frac{1317}{1 - p} \]

Cho đạo hàm bằng 0:

\[ \frac{155}{p} = \frac{1317}{1 - p} \quad \Rightarrow \quad 155(1 - p) = 1317p \quad \Rightarrow \quad p = \frac{155}{1472} \approx 0.1053 \]

Kết luận: Ước lượng hợp lý tối đa cho tỷ lệ tái nhiễm là 10.53%, đúng bằng tỷ lệ mẫu quan sát được.


5.5. Ứng dụng MLE trong Hồi quy Logistic

MLE là phương pháp cơ bản để ước lượng các hệ số trong hồi quy logistic, một mô hình phổ biến cho biến phụ thuộc nhị phân.

Mô hình:

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

Hàm log-likelihood:

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

Do không thể giải đạo hàm bằng tay, ta dùng các thuật toán số như Newton-Raphson, Gradient Descent để tìm \(\hat{\beta}\).


5.6. Ưu điểm và Nhược điểm của MLE

Ưu điểm: - Hiệu quả: Phương sai nhỏ nếu cỡ mẫu lớn.

  • Vững: Hội tụ về tham số thật khi số mẫu tăng.

  • Tiệm cận chuẩn: Hỗ trợ kiểm định và khoảng tin cậy.

  • Linh hoạt: Áp dụng cho nhiều mô hình thống kê.

Nhược điểm: - Phụ thuộc mô hình: Nếu mô hình sai, MLE sẽ sai lệch.

  • Có thể chệch: Với cỡ mẫu nhỏ.

  • Tính toán phức tạp: Với mô hình nhiều tham số cần thuật toán lặp.


5.7. Tổng kết

Phương pháp Ước lượng Hợp lý Tối đa (MLE) là một công cụ nền tảng trong thống kê hiện đại, đặc biệt hiệu quả trong việc xử lý và phân tích dữ liệu định tính. Dù là với bài toán ước lượng tỷ lệ đơn giản hay các mô hình hồi quy logistic phức tạp, MLE vẫn cung cấp giải pháp mạnh mẽ và có tính tổng quát cao.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSB0deG6p24gNSINCmF1dGhvcjogIkxhbSBUYW0gTmh1Ig0KZGF0ZTogIjEzLzA2LzIwMjUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KZWRpdG9yX29wdGlvbnM6IA0KICBtYXJrZG93bjogDQogICAgd3JhcDogNzINCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQpib2R5IHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBzYW5zLXNlcmlmOw0KICBmb250LXNpemU6IDE2cHg7DQogIHRleHQtYWxpZ246IGp1c3RpZnk7DQogIGxpbmUtaGVpZ2h0OiAxLjU7DQp9DQpoMSB7DQogIGNvbG9yOiBibGFjazsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQpoMiB7DQogIGNvbG9yOiByZWQ7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KaDMgew0KICBjb2xvcjogZGFya2JsdWU7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KPC9zdHlsZT4NCmBgYA0KIyAqKlBo4bqnbiAxOiBUw6xtIGhp4buDdSB2w6AgQ2h14bqpbiBi4buLIEThu68gbGnhu4d1KioNCg0KRGF0YXNldCDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyBuZ2hpw6puIGPhu6l1IG7DoHkgY8OzIHTDqm4gbMOgICJJbmRpY2F0b3JzIG9mIEhlYXJ0DQpEaXNlYXNlIiwgYmFvIGfhu5NtIDMxOS43OTUgcXVhbiBzw6F0IHbDoCAxOSBiaeG6v24uIELhu5kgZOG7ryBsaeG7h3UgbsOgeSBjaOG7qWEgdGjDtG5nDQp0aW4gc+G7qWMga2jhu49lIGPhu6dhIGPDoWMgY8OhIG5ow6JuLCDEkcaw4bujYyBz4butIGThu6VuZyBuaOG6sW0gaOG7lyB0cuG7oyBwaMOibiB0w61jaCB2w6AgZOG7sQ0KxJFvw6FuIGto4bqjIG7Eg25nIG3huq9jIGLhu4duaCB0aW0gbeG6oWNoIGThu7FhIHRyw6puIGPDoWMgY2jhu4kgc+G7kSBs4buRaSBz4buRbmcgdsOgIHPhu6ljDQpraOG7j2UuDQoNClThuq1wIGThu68gbGnhu4d1IGfhu5NtIDE4IGJp4bq/biwgYmFvIGfhu5NtOiAxNCBiaeG6v24gxJHhu4tuaCB0w61uaCB2w6AgNCBiaeG6v24gxJHhu4tuaA0KbMaw4bujbmcuIETGsOG7m2kgxJHDonkgbMOgIG3DtCB04bqjIGtow6FpIHF1w6F0Og0KDQoqKkJp4bq/biDEkeG7i25oIHTDrW5oOioqDQoNCi0gICBIZWFydERpc2Vhc2U6IEPDsyBt4bqvYyBi4buHbmggdGltIGhheSBraMO0bmcuDQoNCi0gICBTbW9raW5nOiBDw7MgaMO6dCB0aHXhu5FjIGzDoSBoYXkga2jDtG5nLg0KDQotICAgQWxjb2hvbERyaW5raW5nOiBDw7MgdeG7kW5nIHLGsOG7o3UgYmlhIHF1w6EgbeG7qWMgaGF5IGtow7RuZy4NCg0KLSAgIFN0cm9rZTogQ8OzIGLhu4sgxJHhu5l0IHF14bu1IGhheSBraMO0bmcuDQoNCi0gICBEaWZmV2Fsa2luZzogQ8OzIGfhurdwIGtow7Mga2jEg24gdHJvbmcgdmnhu4djIMSRaSBs4bqhaSBoYXkga2jDtG5nLg0KDQotICAgU2V4OiBHaeG7m2kgdMOtbmggY+G7p2EgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQuDQoNCi0gICBBZ2VDYXRlZ29yeTogTmjDs20gdHXhu5VpIGPhu6dhIG5nxrDhu51pIHRoYW0gZ2lhLg0KDQotICAgUmFjZTogQ2jhu6duZyB04buZYyBj4bunYSBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdC4NCg0KLSAgIERpYWJldGljOiBDw7MgYuG7iyB0aeG7g3UgxJHGsOG7nW5nIGhheSBraMO0bmcuDQoNCi0gICBQaHlzaWNhbEFjdGl2aXR5OiBDw7MgaG/huqF0IMSR4buZbmcgdGjhu4MgY2jhuqV0IHRyb25nIDMwIG5nw6B5IHF1YSBoYXkga2jDtG5nLg0KDQotICAgR2VuSGVhbHRoOiDEkMOhbmggZ2nDoSB04buVbmcgcXXDoXQgduG7gSB0w6xuaCB0cuG6oW5nIHPhu6ljIGto4buPZSBi4bqjbiB0aMOibi4NCg0KLSAgIEFzdGhtYTogQ8OzIGLhu4sgaGVuIHN1eeG7hW4gaGF5IGtow7RuZy4NCg0KLSAgIEtpZG5leURpc2Vhc2U6IEPDsyBi4buLIGLhu4duaCB0aOG6rW4gaGF5IGtow7RuZy4NCg0KLSAgIFNraW5DYW5jZXI6IEPDsyBi4buLIHVuZyB0aMawIGRhIGhheSBraMO0bmcuDQoNCioqQmnhur9uIMSR4buLbmggbMaw4bujbmc6KioNCg0KLSAgIEJNSTogQ2jhu4kgc+G7kSBraOG7kWkgY8ahIHRo4buDIChCb2R5IE1hc3MgSW5kZXgpLg0KDQotICAgUGh5c2ljYWxIZWFsdGg6IFPhu5EgbmfDoHkgdHJvbmcgMzAgbmfDoHkgcXVhIG3DoCB0aOG7gyBjaOG6pXQga2jDtG5nIGto4buPZS4NCg0KLSAgIE1lbnRhbEhlYWx0aDogU+G7kSBuZ8OgeSB0cm9uZyAzMCBuZ8OgeSBxdWEgbcOgIHRpbmggdGjhuqduIGtow7RuZyBraOG7j2UuDQoNCi0gICBTbGVlcFRpbWU6IFPhu5EgZ2nhu50gbmfhu6cgdHJ1bmcgYsOsbmggbeG7l2kgxJHDqm0uDQoNCiMjICoqMS4xIMSQ4buNYyBmaWxlIGThu68gbGnhu4d1KioNCg0KYGBge3J9DQpkIDwtIHJlYWQuY3N2KCJEOi9QVERMRFQvSW5kaWNhdG9ycyBvZiBIZWFydCBEaXNlYXNlLmNzdiIpDQpgYGANCg0KYGBge3J9DQpzdHIoZCkNCmBgYA0KDQotICAgVHJvbmcgxJHDsyBjw7MgKioxNCBiaeG6v24gxJHhu4tuaCB0w61uaCoqDQoNCmBgYHtyfQ0KZGxkdCA8LSBjKCJIZWFydERpc2Vhc2UiLCAiU21va2luZyIsIkFsY29ob2xEcmlua2luZyIsICJTdHJva2UiICwiRGlmZldhbGtpbmciLCJTZXgiLCJBZ2VDYXRlZ29yeSIsIlJhY2UiLCJEaWFiZXRpYyIsICJQaHlzaWNhbEFjdGl2aXR5IiwgIkdlbkhlYWx0aCIsIkFzdGhtYSIsIktpZG5leURpc2Vhc2UiLCJTa2luQ2FuY2VyIikNCmRsZHQNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpgYGANCg0KYGBge3J9DQpkdCA8LSBkWywgZGxkdF0NCmBgYA0KDQotICAgQ2jhu41uIGJp4bq/biAqKkhlYXJ0RGlzZWFzZSoqIHbDoCAqKlN0cm9rZSoqIGzDoG0gYmnhur9uIHBo4bulIHRodeG7mWMgxJHhu4MgcGjDom4NCiAgICB0w61jaA0KDQpgYGB7cn0NCmR0IDwtIGRhdGEuZnJhbWUobGFwcGx5KGR0LCBhcy5mYWN0b3IpKQ0KYGBgDQoNClTDoWMgZ2nhuqMgY2jhu41uIGJp4bq/biBIZWFydERpc2Vhc2UgdsOgIGJp4bq/biBTdHJva2UgbMOgIDIgYmnhur9uIHBo4bulIHRodeG7mWMuIFRp4bq/cCB0aGVvLCB0w6FjIGdp4bqjIGNo4buNbiBiaeG6v24gU21va2luZyB2w6AgYmnhur9uIERpYWJldGljIGzDoCBiaeG6v24gdMOhYyDEkeG7mW5nIMSR4bq/biBIZWFydERpc2Vhc2UsIGPDsm4gU3Ryb2tlIGLhu4sgdMOhYyDEkeG7mW5nIGLhu59pIGJp4bq/biBTbW9raW5nIHbDoCBLaWRuZXlEaXNlYXNlLg0KDQoqKiMgUGjhuqduIDI6IFBow6JuIHTDrWNoIE3DtCB04bqjIE3hu5l0IGJp4bq/biDEkOG7i25oIHTDrW5oIChVbml2YXJpYXRlIERlc2NyaXB0aXZlIEFuYWx5c2lzKSoqDQoNCiMjIDIuMSBCaeG6v24gSGVhcnREaXNlYXNlDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gSGVhcnREaXNlYXNlDQp0YWJsZShkdCRIZWFydERpc2Vhc2UpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gSGVhcnREaXNlYXNlDQp0YWJsZShkdCRIZWFydERpc2Vhc2UpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgJQ0KSGVhcnREaXNlYXNlX2ZyZXEgIDwtIHRhYmxlKGR0JEhlYXJ0RGlzZWFzZSkNCkhlYXJ0RGlzZWFzZV9wY3QgICA8LSBIZWFydERpc2Vhc2VfZnJlcSAvIG5yb3coZHQpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCnBpZShIZWFydERpc2Vhc2VfZnJlcSwNCiAgICBtYWluICAgPSAiLiIsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKEhlYXJ0RGlzZWFzZV9mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQoSGVhcnREaXNlYXNlX3BjdCoxMDAsIDEpLCAiJSkiKSwNCiAgICBjb2wgICAgPSBjKCJsaWdodHBpbmsiLCJsaWdodGJsdWUiKSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyA5MSw0JSBuZ8aw4budaSBraMO0bmcgbeG6r2MgYuG7h25oIHRpbSB2w6AgOCw2JSBuZ8aw4budaSBt4bqvYyBi4buHbmggdGltLg0KDQojIyAyLjIgQmnhur9uIFNtb2tpbmcNCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biBTbW9raW5nDQp0YWJsZShkdCRTbW9raW5nKQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIFNtb2tpbmcNCnRhYmxlKGR0JFNtb2tpbmcpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgJQ0KU21va2luZ19mcmVxICA8LSB0YWJsZShkdCRTbW9raW5nKQ0KU21va2luZ19wY3QgICA8LSBTbW9raW5nX2ZyZXEgLyBucm93KGR0KQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUoU21va2luZ19mcmVxLA0KICAgIG1haW4gICA9ICIuIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoU21va2luZ19mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQoU21va2luZ19wY3QqMTAwLCAxKSwgIiUpIiksDQogICAgY29sICAgID0gYygid2hpdGUiLCJsaWdodGJsdWUiKSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgNTgsOCUgbmfGsOG7nWkga2jDtG5nIGjDunQgdGh14buRYyB2w6AgNDEsMiUgbmfGsOG7nWkgaMO6dCB0aHXhu5FjLg0KDQojIyAyLjMgQmnhur9uIERpYWJldGljDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gRGlhYmV0aWMNCnRhYmxlKGR0JERpYWJldGljKQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIERpYWJldGljDQp0YWJsZShkdCREaWFiZXRpYykvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQojIELhuqNuZyB04bqnbiBzdeG6pXQgdsOgIHThu7cgbOG7hyAlDQpEaWFiZXRpY19mcmVxICA8LSB0YWJsZShkdCREaWFiZXRpYykNCkRpYWJldGljX3BjdCAgIDwtIERpYWJldGljX2ZyZXEgLyBucm93KGR0KQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUoRGlhYmV0aWNfZnJlcSwNCiAgICBtYWluICAgPSAiLiIsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKERpYWJldGljX2ZyZXEpLA0KICAgICAgICAgICAgICAgICAgICAiICgiLCByb3VuZChEaWFiZXRpY19wY3QqMTAwLCAxKSwgIiUpIiksDQogICAgY29sICAgID0gYygicmVkIiwiYmx1ZSIpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpW4bqteSB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIDg2LDQlIG5nxrDhu51pIGtow7RuZyBi4buLIHRp4buDdSDEkcaw4budbmcgdsOgIDEzLDYlIG5nxrDhu51pIGLhu4sgdGnhu4N1IMSRxrDhu51uZy4NCg0KIyMgMi40IEJp4bq/biBTdHJva2UNCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biBTdHJva2UNCnRhYmxlKGR0JFN0cm9rZSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBTdHJva2UNCnRhYmxlKGR0JFN0cm9rZSkvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQojIELhuqNuZyB04bqnbiBzdeG6pXQgdsOgIHThu7cgbOG7hyAlDQpTdHJva2VfZnJlcSAgPC0gdGFibGUoZHQkU3Ryb2tlKQ0KU3Ryb2tlX3BjdCAgIDwtIFN0cm9rZV9mcmVxIC8gbnJvdyhkdCkNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKFN0cm9rZV9mcmVxLA0KICAgIG1haW4gICA9ICIuIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoU3Ryb2tlX2ZyZXEpLA0KICAgICAgICAgICAgICAgICAgICAiICgiLCByb3VuZChTdHJva2VfcGN0KjEwMCwgMSksICIlKSIpLA0KICAgIGNvbCAgICA9IGMoImxpZ2h0Z3JlZW4iLCJsaWdodGJsdWUiKSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgOTYsMiUgbmfGsOG7nWkga2jDtG5nIGLhu4sgxJHhu5l0IHF14bu1IHbDoCAzLDglIG5nxrDhu51pIGLhu4sgxJHhu5l0IHF14bu1Lg0KDQojIyAyLjUgQmnhur9uIEtpZG5leURpc2Vhc2UNCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biBLaWRuZXlEaXNlYXNlDQp0YWJsZShkdCRLaWRuZXlEaXNlYXNlKQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIEtpZG5leURpc2Vhc2UNCnRhYmxlKGR0JEtpZG5leURpc2Vhc2UpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc3XhuqV0IHbDoCB04bu3IGzhu4cgJQ0KS2lkbmV5RGlzZWFzZV9mcmVxICA8LSB0YWJsZShkdCRLaWRuZXlEaXNlYXNlKQ0KS2lkbmV5RGlzZWFzZV9wY3QgICA8LSBLaWRuZXlEaXNlYXNlX2ZyZXEgLyBucm93KGR0KQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUoS2lkbmV5RGlzZWFzZV9mcmVxLA0KICAgIG1haW4gICA9ICIuIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoS2lkbmV5RGlzZWFzZV9mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQoS2lkbmV5RGlzZWFzZV9wY3QqMTAwLCAxKSwgIiUpIiksDQogICAgY29sICAgID0gYygib3JhbmdlIiwgInB1cnBsZSIpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpW4bqteSB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIDk2LDMlIG5nxrDhu51pIGtow7RuZyBi4buLIGLhu4duaCB0aOG6rW4gdsOgIDMsNyUgbmfGsOG7nWkgYuG7iyBi4buHbmggdGjhuq1uLg0KDQojICoqUGjhuqduIDM6IFBow6JuIHTDrWNoIE3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgSGFpIGJp4bq/biDEkOG7i25oIHTDrW5oIChCaXZhcmlhdGUgQW5hbHlzaXMpKioNCg0KIyMgKiozLjEgSGVhcnREaXNlYXNlIHbDoCBTbW9raW5nKioNCg0KIyMjICoqMy4xLjEuIELhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKiANCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KIyBHw6FuIG5ow6NuIHLDtSByw6BuZyBjaG8gY8OhYyBiaeG6v24NCmR0JEhlYXJ0RGlzZWFzZSA8LSBmYWN0b3IoZHQkSGVhcnREaXNlYXNlLA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2jDtG5nIGLhu4duaCB0aW0iLCAiQuG7h25oIHRpbSIpKQ0KDQpkdCRTbW9raW5nIDwtIGZhY3RvcihkdCRTbW9raW5nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2jDtG5nIGjDunQgdGh14buRYyIsICJIw7p0IHRodeG7kWMiKSkNCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2jDqW8gZ2nhu69hIEhlYXJ0RGlzZWFzZSB2w6AgU21va2luZw0KaGVfc20gPC0gdGFibGUoZHQkSGVhcnREaXNlYXNlLCBkdCRTbW9raW5nKQ0KDQojIFRow6ptIHThu5VuZyBow6BuZyB2w6AgdOG7lW5nIGPhu5l0DQpoZV9zbTEgPC0gYWRkbWFyZ2lucyhoZV9zbSkNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIHbhu5tpIG5ow6NuIHLDtSByw6BuZw0KaGVfc20xDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgdGhlbyBow6BuZyAodGhlbyB0w6xuaCB0cuG6oW5nIGLhu4sgYuG7h25oIHRpbSBoYXkga2jDtG5nKQ0KaGVfc21fcHJvcCA8LSBwcm9wLnRhYmxlKGhlX3NtLCBtYXJnaW4gPSAxKQ0KDQojIEzDoG0gdHLDsm4gDQpoZV9zbV9wcm9wX3JvdW5kZWQgPC0gcm91bmQoaGVfc21fcHJvcCwgNCkNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIHThuqduIHN14bqldA0KaGVfc21fcHJvcF9yb3VuZGVkDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCiMgQ2h1eeG7g24gYuG6o25nIHNhbmcgZOG6oW5nIGRhdGEgZnJhbWUNCmhlX3NtX2RmIDwtIGFzLmRhdGEuZnJhbWUoaGVfc20pDQoNCiMgxJDhu5VpIHTDqm4gY+G7mXQgY2hvIHLDtSByw6BuZw0KY29sbmFtZXMoaGVfc21fZGYpIDwtIGMoIkhlYXJ0RGlzZWFzZSIsICJTbW9raW5nIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCBuaMOzbQ0KZ2dwbG90KGhlX3NtX2RmLCBhZXMoeCA9IFNtb2tpbmcsIHkgPSBDb3VudCwgZmlsbCA9IEhlYXJ0RGlzZWFzZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlPhu5EgbMaw4bujbmcgbeG6r2MgYuG7h25oIHRpbSB0aGVvIHZp4buHYyBow7p0IHRodeG7kWMiLA0KICAgIHggPSAiSMO6dCB0aHXhu5FjIiwNCiAgICB5ID0gIlPhu5EgbMaw4bujbmciLA0KICAgIGZpbGwgPSAiQuG7h25oIHRpbSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMiIpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgbeG7mXQgbeG7kWkgbGnDqm4gaOG7hyBy4bqldCBt4bqhbmggbeG6vSBnaeG7r2Egdmnhu4djIGjDunQgdGh14buRYyB2w6Agbmd1eSBjxqEgbeG6r2MgYuG7h25oIHRpbS4gVHJvbmcga2hpIG5nxrDhu51pIGtow7RuZyBow7p0IHRodeG7kWMgY2hp4bq/bSDEkWEgc+G7kSDhu58gbmjDs20ga2jhu49lIG3huqFuaCAoNjAuMzglKSwgdGjDrCDhu58gbmjDs20gY8OzIGLhu4duaCB0aW0sIG5nxrDhu51pIGjDunQgdGh14buRYyBs4bqhaSBjaGnhur9tIHThu7cgbOG7hyB2xrDhu6N0IHRy4buZaSAoNTguNTklKS4gU+G7sSDEkeG6o28gbmfGsOG7o2MgdOG7tyBs4buHIG7DoHkga2jhurNuZyDEkeG7i25oIHLhurFuZyBow7p0IHRodeG7kWMgbMOgIG3hu5l0IHnhur91IHThu5Egbmd1eSBjxqEgY2jDrW5oLCBsw6BtIHTEg25nIMSRw6FuZyBr4buDIGto4bqjIG7Eg25nIG3huq9jIGPDoWMgYuG7h25oIGzDvSB24buBIHRpbS4gVsOsIHbhuq15LCB2aeG7h2MgdOG7qyBi4buPIHRodeG7kWMgbMOhIGzDoCBiaeG7h24gcGjDoXAgcGjDsm5nIG5n4burYSBi4buHbmggdGltIG3huqFjaCB2w7QgY8O5bmcgcXVhbiB0cuG7jW5nLg0KDQoNCiMjIyAqKjMuMS4yLiBLaeG7g20gxJHhu4tuaCBUaOG7kW5nIGvDqioqDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KLSAgICoqSOKCgCoqOiBIw7p0IHRodeG7kWMgdsOgIGLhu4duaCB0aW0gbMOgIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wLg0KDQotICAgKipI4oKBKio6IEjDunQgdGh14buRYyB2w6AgYuG7h25oIHRpbSBjw7MgbGnDqm4gcXVhbi4NCg0KYGBge3J9DQojIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nDQpjaGlfaGVfc20gPC0gY2hpc3EudGVzdChoZV9zbSkNCnByaW50KGNoaV9oZV9zbSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0IGvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gICBHacOhIHRy4buLIENoaS1iw6xuaCBwaMawxqFuZyAoWMKyKTogMzcxMw0KDQotICAgQuG6rWMgdOG7sSBkbyAoZGYpOiAxDQoNCi0gICBHacOhIHRy4buLIHA6IFw8IDIuMmUtMTYNCg0KKipL4bq/dCBsdeG6rW46KioNCg0KLSAgIEThu7FhIHbDoG8gZ2nDoSB0cuG7iyBwIChcPCAyLjJlLTE2KSB2w6AgbeG7qWMgw70gbmdoxKlhIM6xID0gMC4wNSwgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDsyBt4buRaSBsacOqbiBo4buHIHRo4buRbmcga8OqIMO9IG5naMSpYSBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMgdsOgIGLhu4duaCB0aW0gbeG6oWNoLg0KLSAgIELDqm4gY+G6oW5oIMSRw7MsIGdpw6EgdHLhu4sgQ2hpLWLDrG5oIHBoxrDGoW5nIGPhu7FjIGvhu7MgbOG7m24gKFjCsiA9IDM3MTMpIGNow61uaCBsw6AgbWluaCBjaOG7qW5nIGNobyBt4bupYyDEkeG7mSBjaOG6t3QgY2jhur0gY+G7p2EgbeG7kWkgcXVhbiBo4buHIG7DoHkuIEvhur90IHF14bqjIG7DoHkgbmjhuqVuIG3huqFuaCBy4bqxbmcgdmnhu4djIGjDunQgdGh14buRYyBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIG5ndXkgY8ahIG3huq9jIGLhu4duaCB0aW0gbeG6oWNoIHRyb25nIG5ow7NtIG5naGnDqm4gY+G7qXUuDQoNCiMjIyAqKjMuMS4zIEhp4buHdSB04bu3IGzhu4cgKFJpc2sgRGlmZmVyZW5jZSAtIFJEKSoqDQoNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbyBnaeG7r2EgSGVhcnREaXNlYXNlIHbDoCBTbW9raW5nDQpoZV9zbSA8LSB0YWJsZShkdCRIZWFydERpc2Vhc2UsIGR0JFNtb2tpbmcpDQoNCiMgVGjDqm0gdOG7lW5nIGjDoG5nIHbDoCB04buVbmcgY+G7mXQNCmFkZG1hcmdpbnMoaGVfc20pDQoNCmBgYA0KDQokJA0KcF8xID0gUChcdGV4dHtIZWFydERpc2Vhc2V9ID0gXHRleHR7WWVzfSBcbWlkIFx0ZXh0e1Ntb2tpbmd9ID0gXHRleHR7S2jDtG5nIGjDunQgdGh14buRY30pIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgYuG7h25oIHRpbSDhu58gbmjDs20ga2jDtG5nIGjDunQgdGh14buRYyl9DQokJA0KDQokJA0KcF8yID0gUChcdGV4dHtIZWFydERpc2Vhc2V9ID0gXHRleHR7WWVzfSBcbWlkIFx0ZXh0e1Ntb2tpbmd9ID0gXHRleHR7SMO6dCB0aHXhu5FjfSkgXHF1YWQgXHRleHR7KFThu7cgbOG7hyBi4buHbmggdGltIOG7nyBuaMOzbSBow7p0IHRodeG7kWMpfQ0KJCQNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQpLaeG7g20gxJHhu4tuaDogLSBI4oKAOiBU4bu3IGzhu4cgbeG6r2MgYuG7h25oIHRpbSBnaeG7r2Ega2jDtG5nIGjDunQgdGh14buRYyB2w6AgaMO6dCB0aHXhu5FjIGzDoA0KYuG6sW5nIG5oYXUuIChw4oKBIC0gcOKCgiA9MCApIC0gSOKCgTogVOG7tyBs4buHIG3huq9jIGLhu4duaCB0aW0gZ2nhu69hIGtow7RuZyBow7p0IHRodeG7kWMNCmLDqSBoxqFuIGjDunQgdGh14buRYyhw4oKBIC0gcOKCgiBcPCAwKQ0KDQpgYGB7cn0NCiMgU+G7kSBuZ8aw4budaSBt4bqvYyBi4buHbmggdGltIHRyb25nIHThu6tuZyBuaMOzbSBow7p0IHRodeG7kWMNCmNvdW50c19oZWFydCA8LSBjKGhlX3NtWyJC4buHbmggdGltIiwgIktow7RuZyBow7p0IHRodeG7kWMiXSwgaGVfc21bIkLhu4duaCB0aW0iLCAiSMO6dCB0aHXhu5FjIl0pDQoNCiMgVOG7lW5nIHPhu5EgbmfGsOG7nWkgdHJvbmcgdOG7q25nIG5ow7NtIGjDunQgdGh14buRYw0KdG90YWxzX2hlYXJ0IDwtIGMoc3VtKGhlX3NtWywgIktow7RuZyBow7p0IHRodeG7kWMiXSksIHN1bShoZV9zbVssICJIw7p0IHRodeG7kWMiXSkpDQoNCiMgS2nhu4NtIMSR4buLbmggdOG7iSBs4buHIG3hu5l0IHBow61hOiBwMSA8IHAyDQp0ZXN0X2hlYXJ0X2xlc3MgPC0gcHJvcC50ZXN0KGNvdW50c19oZWFydCwgdG90YWxzX2hlYXJ0LCBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgY29ycmVjdCA9IEZBTFNFKQ0KdGVzdF9oZWFydF9sZXNzDQpgYGANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggdOG7tyBs4buHIGhhaSBt4bqrdSBjaG8gdGjhuqV5Og0KDQpU4bu3IGzhu4cgbeG6r2MgYuG7h25oIHRpbSDhu58gbmjDs20ga2jDtG5nIGjDunQgdGh14buRYyAocHJvcCAxKSBsw6Aga2hv4bqjbmcgNi4wMyUuIFThu7cNCmzhu4cgbeG6r2MgYuG7h25oIHRpbSDhu58gbmjDs20gaMO6dCB0aHXhu5FjIChwcm9wIDIpIGzDoCBraG/huqNuZyAxMi4xNiUuIEdpw6EgdHLhu4sNCnRo4buRbmcga8OqIENoaSBiw6xuaCBwaMawxqFuZyBsw6AgMzcxMy44IHbhu5tpIGLhuq1jIHThu7EgZG8gMSB2w6AgcC12YWx1ZSBuaOG7jyBoxqFuDQoyLjJlLTE2Lg0KDQpWw6wgcC12YWx1ZSBy4bqldCBuaOG7jywgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBy4bqxbmcgdOG7tyBs4buHIG3huq9jIGLhu4duaCB0aW0g4bufDQpoYWkgbmjDs20gbMOgIGLhurFuZyBuaGF1Lg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBoaeG7h3UgaGFpIHThu7cgbOG7hyB04burIC0xIMSR4bq/biAtMC4wNTk1IGNobyB0aOG6pXkgc+G7sSBraMOhYw0KYmnhu4d0IGdp4buvYSBoYWkgdOG7tyBs4buHIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQoNCiMjIyAqKjMuMS40LiBS4bunaSBybyB0xrDGoW5nIMSR4buRaShSZWxhdGl2ZSBSaXNrIC0gUlIpOioqDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKGhlX3NtLCBtZXRob2Q9IndhbGQiKQ0KYGBgDQoNClRhIHRo4bqleSBSUiA9IDEuNDc4NiwgdOG7qWMgbMOgIHThu7cgbOG7hyBt4bqvYyBi4buHbmggdGltIOG7nyBuaMOzbSBow7p0IHRodeG7kWMgY2FvIGjGoW4ga2hv4bqjbmcgNDcuODYlIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBow7p0IHRodeG7kWMuDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIFJSIGzDoCB04burIDEuNDYyNSDEkeG6v24gMS40OTQ4LCBjaG8gdGjhuqV5IGvhur90IHF14bqjIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCkPDsyB0aOG7gyBoaeG7g3UgcuG6sW5nLCB0cm9uZyBt4bqrdSBk4buvIGxp4buHdSBuw6B5LCBow7p0IHRodeG7kWMgbMOgbSB0xINuZyDEkcOhbmcga+G7gyBuZ3V5IGPGoSBt4bqvYyBi4buHbmggdGltLg0KDQojIyMgKiozLjEuNS4gVOG7tyBz4buRIENow6puaCAoT2RkcyBSYXRpbyAtIE9SKToqKg0KDQpgYGB7cn0NCm9yX3Jlc3VsdDEgPC0gb2Rkc3JhdGlvKGhlX3NtKQ0KcHJpbnQob3JfcmVzdWx0MSkNCmBgYA0KDQpHacOhIHRy4buLIG9kZHMgcmF0aW8gKE9SKSA9IDIuMTU2IGNobyB0aOG6pXkgcuG6sW5nIGto4bqjIG7Eg25nIG3huq9jIGLhu4duaCB0aW0g4bufDQpuaMOzbSBow7p0IHRodeG7kWMgY2FvIGjGoW4ga2hv4bqjbmcgMTE1LjYlIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBow7p0IHRodeG7kWMgdHJvbmcNCmPDuW5nIMSRaeG7gXUga2nhu4duLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBPUiBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDIuMTAyIMSR4bq/biAyLjIxMSwgdsOgDQpwLXZhbHVlIOKJiCAwIGNobyB0aOG6pXkga+G6v3QgcXXhuqMgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KTsOzaSBjw6FjaCBraMOhYywgdHJvbmcgbeG6q3UgZOG7ryBsaeG7h3UgbsOgeSwgbmfGsOG7nWkgaMO6dCB0aHXhu5FjIGPDsyBraOG6oyBuxINuZyBt4bqvYw0KYuG7h25oIHRpbSBjYW8gaMahbiBn4bqlcCDEkcO0aSBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgaMO6dCB0aHXhu5FjLg0KDQojIyAqKjMuMi4gSGVhcnREaXNlYXNlIHbDoCBEaWFiZXRpYyoqDQoNCiMjIyAqKjMuMi4xLiBC4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KiogDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCg0KIyBHw6FuIG5ow6NuIGNobyBiaeG6v24gRGlhYmV0aWMNCmR0JERpYWJldGljIDwtIGZhY3RvcihkdCREaWFiZXRpYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJLaMO0bmcgdGnhu4N1IMSRxrDhu51uZyIsICJUaeG7g3UgxJHGsOG7nW5nIikpDQpoZV9kaSA8LSB0YWJsZShkdCRIZWFydERpc2Vhc2UsIGR0JERpYWJldGljKQ0KaGVfZGkxIDwtIGFkZG1hcmdpbnMoaGVfZGkpDQpoZV9kaTEgDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojIFTDrW5oIHThu7cgbOG7hyB0aGVvIGjDoG5nDQpoZV9kaV9wcm9wIDwtIHByb3AudGFibGUoaGVfZGksIG1hcmdpbiA9IDEpDQoNCiMgTMOgbSB0csOybiDEkeG7gyBoaeG7g24gdGjhu4sgxJHhurlwDQpoZV9kaV9wcm9wX3JvdW5kZWQgPC0gcm91bmQoaGVfZGlfcHJvcCwgNCkNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nDQpoZV9kaV9wcm9wX3JvdW5kZWQNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBDaHV54buDbiBi4bqjbmcgc2FuZyBkYXRhIGZyYW1lDQpkZiA8LSBhcy5kYXRhLmZyYW1lKGhlX2RpKQ0KY29sbmFtZXMoZGYpIDwtIGMoIkhlYXJ0RGlzZWFzZSIsICJEaWFiZXRpYyIsICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgbmjDs20NCmdncGxvdChkZiwgYWVzKHggPSBIZWFydERpc2Vhc2UsIHkgPSBDb3VudCwgZmlsbCA9IERpYWJldGljKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiU+G7kSBsxrDhu6NuZyBt4bqvYyBi4buHbmggdGltIHRoZW8gYuG7h25oIHRp4buDdSDEkcaw4budbmciLA0KICAgICAgIHggPSAiQuG7h25oIHRpbSIsDQogICAgICAgeSA9ICJT4buRIGzGsOG7o25nIiwNCiAgICAgICBmaWxsID0gIkLhu4duaCB0aeG7g3UgxJHGsOG7nW5nIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KROG7ryBsaeG7h3UgY2hvIHRo4bqleSBt4buZdCBt4buRaSB0xrDGoW5nIHF1YW4gcsO1IHLhu4d0IGdp4buvYSBi4buHbmggdGnhu4N1IMSRxrDhu51uZyB2w6AgYuG7h25oIHRpbS4gQ+G7pSB0aOG7gywgdOG7tyBs4buHIG5nxrDhu51pIG3huq9jIGLhu4duaCB0aeG7g3UgxJHGsOG7nW5nIOG7nyBuaMOzbSBjw7MgYuG7h25oIHRpbSAoMzMuMTIlKSBjYW8gZ+G6p24gZ+G6pXAgYmEgbOG6p24gc28gduG7m2kgbmjDs20ga2jDtG5nIGPDsyBi4buHbmggdGltICgxMS43MyUpLiBT4buxIGNow6puaCBs4buHY2ggbOG7m24gbsOgeSBraOG6s25nIMSR4buLbmggcuG6sW5nIGLhu4duaCB0aeG7g3UgxJHGsOG7nW5nIGzDoCBt4buZdCB54bq/dSB04buRIGxpw6puIHF1YW4gY2jhurd0IGNo4bq9IHbDoCBsw6AgbeG7mXQgeeG6v3UgdOG7kSBuZ3V5IGPGoSBxdWFuIHRy4buNbmcgxJHhu5FpIHbhu5tpIGLhu4duaCB0aW0uIERvIMSRw7MsIHZp4buHYyB04bqnbSBzb8OhdCBjaMOpbyBnaeG7r2EgaGFpIGLhu4duaCBsw70gbsOgeSBsw6AgdsO0IGPDuW5nIGPhuqduIHRoaeG6v3QgxJHhu4MgcGjDoXQgaGnhu4duIHbDoCDEkWnhu4F1IHRy4buLIHPhu5ttLg0KDQojIyMgKiozLjIuMi4gS2nhu4NtIMSR4buLbmggVGjhu5FuZyBrw6oqKg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gICAqKkjigoAqKjogQuG7h25oIHRpbSB2w6AgYuG7h25oIHRp4buDdSDEkcaw4budbmcgbMOgIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wLg0KDQotICAgKipI4oKBKio6IELhu4duaCB0aW0gdsOgIGLhu4duaCB0aeG7g3UgxJHGsOG7nW5nIGPDsyBsacOqbiBxdWFuLg0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nDQpjaGlfaGVfZGkgPC0gY2hpc3EudGVzdChoZV9kaSkNCnByaW50KGNoaV9oZV9kaSkNCmBgYA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoNCg0KLSAgIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpIGLDrG5oIHBoxrDGoW5nOiBYwrIgPSAxMDg1MA0KDQotICAgQuG6rWMgdOG7sSBkbyAoZGYpID0gMQ0KDQotICAgcC12YWx1ZSA9IFw8IDIuMmUtMTYNCg0KVuG7m2kgcC12YWx1ZSBcPCAyLjJlLTE2IG5o4buPIGjGoW4gbeG7qWMgw70gbmdoxKlhIHBo4buVIGJp4bq/biDOsSA9IDAuMDUsIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALiAgxJBp4buBdSBuw6B5IGto4bqzbmcgxJHhu4tuaCBy4bqxbmcgY8OzIG3hu5l0IG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBjYW8gZ2nhu69hIHTDrG5oIHRy4bqhbmcgbeG6r2MgYuG7h25oIHRpbSB2w6AgdMOsbmggdHLhuqFuZyBt4bqvYyBi4buHbmggdGnhu4N1IMSRxrDhu51uZy4NCiMjIyAqKjMuMi4zIEhp4buHdSB04bu3IGzhu4cgKFJpc2sgRGlmZmVyZW5jZSAtIFJEKSoqDQoNCmBgYHtyfQ0KaGVfZGkgPC0gdGFibGUoZHQkSGVhcnREaXNlYXNlLCBkdCREaWFiZXRpYykNCmhlX2RpMSA8LSBhZGRtYXJnaW5zKGhlX2RpKQ0KaGVfZGkxIA0KYGBgDQoNCiQkDQpwXzEgPSBQKFx0ZXh0e0hlYXJ0RGlzZWFzZX0gPSBcdGV4dHtC4buHbmggdGltfSBcbWlkIFx0ZXh0e0RpYWJldGljfSA9IFx0ZXh0e0tow7RuZyB0aeG7g3UgxJHGsOG7nW5nfSkgDQpccXVhZCBcdGV4dHsoVOG7tyBs4buHIGLhu4duaCB0aW0g4bufIG5ow7NtIGtow7RuZyB0aeG7g3UgxJHGsOG7nW5nKX0NCiQkICQkDQpwXzIgPSBQKFx0ZXh0e0hlYXJ0RGlzZWFzZX0gPSBcdGV4dHtC4buHbmggdGltfSBcbWlkIFx0ZXh0e0RpYWJldGljfSA9IFx0ZXh0e1Rp4buDdSDEkcaw4budbmd9KSANClxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgYuG7h25oIHRpbSDhu58gbmjDs20gdGnhu4N1IMSRxrDhu51uZyl9DQokJA0KDQoqKkdp4bqjIHRoaeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQokJA0KSF8wOiBwXzEgLSBwXzIgPSAwIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgYuG7h25oIHRpbSDhu58gbmjDs20ga2jDtG5nIHRp4buDdSDEkcaw4budbmcgYuG6sW5nIHThu7cgbOG7hyBi4buHbmggdGltIOG7nyBuaMOzbSBjw7MgdGnhu4N1IMSRxrDhu51uZyl9DQokJCAkJA0KSF8xOiBwXzEgLSBwXzIgPiAwIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgYuG7h25oIHRpbSDhu58gbmjDs20ga2jDtG5nIHRp4buDdSDEkcaw4budbmcgbOG7m24gaMahbiB04bu3IGzhu4cgYuG7h25oIHRpbSDhu58gbmjDs20gY8OzIHRp4buDdSDEkcaw4budbmcpfQ0KJCQNCg0KYGBge3J9DQojIFPhu5EgbmfGsOG7nWkgYuG7h25oIHRpbSB0cm9uZyB04burbmcgbmjDs20gdGnhu4N1IMSRxrDhu51uZw0KY291bnRzX2hlYXJ0MSA8LSBjKGhlX2RpWyJC4buHbmggdGltIiwgIktow7RuZyB0aeG7g3UgxJHGsOG7nW5nIl0sDQogICAgICAgICAgICBoZV9kaVsiQuG7h25oIHRpbSIsICJUaeG7g3UgxJHGsOG7nW5nIl0pDQoNCiMgVOG7lW5nIHPhu5EgbmfGsOG7nWkgdHJvbmcgdOG7q25nIG5ow7NtIHRp4buDdSDEkcaw4budbmcNCnRvdGFsc19oZWFydDEgPC0gYyhzdW0oaGVfZGlbLCAiS2jDtG5nIHRp4buDdSDEkcaw4budbmciXSksDQogICAgICAgICAgICBzdW0oaGVfZGlbLCAiVGnhu4N1IMSRxrDhu51uZyJdKSkNCg0KIyBLaeG7g20gxJHhu4tuaCBt4buZdCBwaMOtYTogVOG7tyBs4buHIGLhu4duaCB0aW0gbmjDs20ga2jDtG5nIHRp4buDdSDEkcaw4budbmcgPCBuaMOzbSB0aeG7g3UgxJHGsOG7nW5nDQp0ZXN0X2hlYXJ0X2dyZWF0ZXIgPC0gcHJvcC50ZXN0KGNvdW50c19oZWFydDEsIHRvdGFsc19oZWFydDEsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBjb3JyZWN0ID0gRkFMU0UpDQoNCiMgWGVtIGvhur90IHF14bqjDQpwcmludCh0ZXN0X2hlYXJ0X2dyZWF0ZXIpDQpgYGANCg0KR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaCAoQ2hpLXNxdWFyZWQpOiAxMCw4NTIgR2nDoSB0cuG7iyBwLXZhbHVlID0gMQ0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUgKM6xID0gMC4wNSksIHRhIGPDszogcC12YWx1ZSA9IDEgXD4gMC4wNQ0KDQrih5IgS2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nLg0KDQpL4bq/dCBsdeG6rW46IEtow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga2jhurNuZyDEkeG7i25oIHLhurFuZyB04bu3IGzhu4cgbeG6r2MNCmLhu4duaCB0aW0g4bufIG5ow7NtIHRo4bupIG5o4bqldCAocHJvcCAxID0gNi41MCUpIGNhbyBoxqFuIHNvIHbhu5tpIG5ow7NtIHRo4bupIGhhaQ0KKHByb3AgMiA9IDIxLjk1JSksIG3hurdjIGTDuSB04bu3IGzhu4cgdGjhu7FjIHThur8g4bufIG5ow7NtIDIgY2FvIGjGoW4uDQoNCkvhur90IHF14bqjIHAtdmFsdWUgPSAxIGNobyB0aOG6pXkgZOG7ryBsaeG7h3UgaG/DoG4gdG/DoG4ga2jDtG5nIOG7p25nIGjhu5kgZ2nhuqMgdGh1eeG6v3QNCsSR4buRaSBy4bqxbmcgdOG7tyBs4buHIOG7nyBuaMOzbSAxIGzhu5tuIGjGoW4gbmjDs20gMi4NCg0KIyMjICoqMy4yLjQuIFLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIChSZWxhdGl2ZSBSaXNrIC0gUlIpOioqDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKGhlX2RpLCBtZXRob2Q9IndhbGQiKQ0KYGBgDQoNClbhu5tpIFJSID0gMy4wMTcsIHRhIG5o4bqtbiB0aOG6pXkgcuG6sW5nIHThu7cgbOG7hyBt4bqvYyBi4buHbmggdGltIOG7nyBuaMOzbSB0aeG7g3UgxJHGsOG7nW5nDQpjYW8gaMahbiBraG/huqNuZyAzIGzhuqduIHNvIHbhu5tpIG5ow7NtIGtow7RuZyB0aeG7g3UgxJHGsOG7nW5nLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBSUiBsw6AgdOG7qyAyLjk1OCDEkeG6v24gMy4wNzcsIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QNCmPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCk7Ds2kgY8OhY2gga2jDoWMsIHRyb25nIG3huqt1IGThu68gbGnhu4d1IG7DoHksIG5nxrDhu51pIGLhu4sgdGnhu4N1IMSRxrDhu51uZyBjw7Mgbmd1eSBjxqEgbeG6r2MNCmLhu4duaCB0aW0gY2FvIGjGoW4gcsO1IHLhu4d0IHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBi4buLIHRp4buDdSDEkcaw4budbmcuDQoNCiMjIyAqKjMuMi41LiBU4bu3IHPhu5EgQ2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpOioqDQoNCmBgYHtyfQ0Kb3JfcmVzdWx0MiA8LSBvZGRzcmF0aW8oaGVfZGkpDQpwcmludChvcl9yZXN1bHQyKQ0KYGBgDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIGNobyB0aOG6pXkgT2RkcyBSYXRpbyAoT1IpID0gNC4wNDgsIG5naMSpYSBsw6Aga2jhuqMgbsSDbmcNCm3huq9jIGLhu4duaCB0aW0g4bufIG5ow7NtIHRp4buDdSDEkcaw4budbmcgY2FvIGjGoW4ga2hv4bqjbmcgNCBs4bqnbiBzbyB24bubaSBuaMOzbSBraMO0bmcNCnRp4buDdSDEkcaw4budbmcuDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIE9SIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMy45MzYgxJHhur9uIDQuMTYzLCBjaG8gdGjhuqV5DQpz4buxIGtow6FjIGJp4buHdCBuw6B5IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQpOw7NpIGPDoWNoIGtow6FjLCB0cm9uZyBt4bqrdSBk4buvIGxp4buHdSBuw6B5LCB0aeG7g3UgxJHGsOG7nW5nIGzDoCB54bq/dSB04buRIGzDoG0gdMSDbmcgbeG6oW5oDQpuZ3V5IGPGoSBt4bqvYyBi4buHbmggdGltLg0KDQojIyAqKjMuMy4gU3Ryb2tlIHbDoCBTbW9raW5nKiogDQoNCiMjIyAqKjMuMy4xLiBC4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KiogDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCmR0JFN0cm9rZSA8LSBmYWN0b3IoZHQkU3Ryb2tlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJLaMO0bmcgxJHhu5l0IHF14bu1IiwgIsSQ4buZdCBxdeG7tSIpKQ0KDQojIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGNow6lvDQpzdF9zbSA8LSB0YWJsZShkdCRTdHJva2UsIGR0JFNtb2tpbmcpDQoNCiMgVGjDqm0gdOG7lW5nIGjDoG5nIHbDoCBj4buZdA0Kc3Rfc20xIDwtIGFkZG1hcmdpbnMoc3Rfc20pDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZw0Kc3Rfc20xDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgdGhlbyBow6BuZyAocm93IHBlcmNlbnRhZ2VzKQ0Kc3Rfc21fcHJvcCA8LSBwcm9wLnRhYmxlKHN0X3NtLCBtYXJnaW4gPSAxKQ0KDQojIEzDoG0gdHLDsm4gNCBjaOG7ryBz4buRIHRo4bqtcCBwaMOibg0Kc3Rfc21fcHJvcCA8LSByb3VuZChzdF9zbV9wcm9wLCA0KQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgdOG6p24gc3XhuqV0DQpzdF9zbV9wcm9wDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUNCnN0X3NtX2RmIDwtIGFzLmRhdGEuZnJhbWUoc3Rfc20pDQoNCiMgxJDhu5VpIHTDqm4gY+G7mXQgY2hvIGThu4UgaGnhu4N1DQpjb2xuYW1lcyhzdF9zbV9kZikgPC0gYygiU3Ryb2tlIiwgIlNtb2tpbmciLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTDQpnZ3Bsb3Qoc3Rfc21fZGYsIGFlcyh4ID0gU21va2luZywgeSA9IENvdW50LCBmaWxsID0gU3Ryb2tlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVMOsbmggdHLhuqFuZyDEkeG7mXQgcXXhu7UgdGhlbyB0w6xuaCB0cuG6oW5nIGjDunQgdGh14buRYyIsDQogICAgeCA9ICJUw6xuaCB0cuG6oW5nIGjDunQgdGh14buRYyIsDQogICAgeSA9ICJT4buRIGzGsOG7o25nIiwNCiAgICBmaWxsID0gIlTDrG5oIHRy4bqhbmcgxJHhu5l0IHF14bu1Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJwYXN0ZWwxIikNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KROG7ryBsaeG7h3UgY2hvIHRo4bqleSBt4buZdCBt4buRaSBsacOqbiBo4buHIG3huqFuaCBt4bq9IGdp4buvYSB2aeG7h2MgaMO6dCB0aHXhu5FjIHbDoCBuZ3V5IGPGoSDEkeG7mXQgcXXhu7UuIFRyb25nIGtoaSBuZ8aw4budaSBraMO0bmcgaMO6dCB0aHXhu5FjIGNoaeG6v20gxJFhIHPhu5Eg4bufIG5ow7NtIGto4buPZSBt4bqhbmggKDU5LjM1JSksIHRow6wg4bufIG5ow7NtIGLhu4duaCBuaMOibiDEkeG7mXQgcXXhu7UsIG5nxrDhu51pIGjDunQgdGh14buRYyBs4bqhaSB0cuG7nyB0aMOgbmggbmjDs20gY2hp4bq/bSDGsHUgdGjhur8gduG7m2kgdOG7tyBs4buHIDU2LjQ3JS4gU+G7sSDEkeG6o28gbmfGsOG7o2MgdOG7tyBs4buHIG7DoHkgbMOgIGLhurFuZyBjaOG7qW5nIHLDtSByw6BuZyBjaG8gdGjhuqV5IGjDunQgdGh14buRYyBsw6AgbeG7mXQgeeG6v3UgdOG7kSBuZ3V5IGPGoSBjaMOtbmgsIGzDoG0gdMSDbmcgxJHDoW5nIGvhu4Mga2jhuqMgbsSDbmcgYuG7iyDEkeG7mXQgcXXhu7UuIFbDrCB24bqteSwgdmnhu4djIHThu6sgYuG7jyB0aHXhu5FjIGzDoSBsw6AgbeG7mXQgYmnhu4duIHBow6FwIHBow7JuZyBuZ+G7q2EgxJHhu5l0IHF14bu1IGhp4buHdSBxdeG6oyB2w6AgY+G6p24gdGhp4bq/dC4NCg0KIyMjICoqMy4zLjIuIEtp4buDbSDEkeG7i25oIFRo4buRbmcga8OqKioNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotICAgKipI4oKAKio6IFTDrG5oIHRy4bqhbmcgxJHhu5l0IHF14bu1IHbDoCB0w6xuaCB0cuG6oW5nIGjDunQgdGh14buRYyBsw6AgaGFpIGJp4bq/biDEkeG7mWMNCiAgICBs4bqtcC4NCg0KLSAgICoqSOKCgSoqOiBUw6xuaCB0cuG6oW5nIMSR4buZdCBxdeG7tSB2w6AgdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMgY8OzIGxpw6puIHF1YW4uDQoNCmBgYHtyfQ0KIyBUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZw0KY2hpX3N0X3NtIDwtIGNoaXNxLnRlc3Qoc3Rfc20pDQpwcmludChjaGlfc3Rfc20pDQpgYGANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6DQoNCi0gICBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaSBiw6xuaCBwaMawxqFuZzogWMKyID0gMTE5OC4xDQoNCi0gICBC4bqtYyB04buxIGRvIChkZikgPSAxDQoNCi0gICBwLXZhbHVlIFw8IDIuMmUtMTYNCg0KRG8gxJHDsywgY2jDum5nIHRhIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBy4bqldCBt4bqhbmggbeG6vSDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCAoZ2nhuqMgdGh1eeG6v3QgY2hvIHLhurFuZyBraMO0bmcgY8OzIG3hu5FpIGxpw6puIHF1YW4gZ2nhu69hIGhhaSBiaeG6v24pLiDEkGnhu4F1IG7DoHkga2jhurNuZyDEkeG7i25oIHLhurFuZyBjw7MgbeG7mXQgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IGNhbyBnaeG7r2EgaGFpIHnhur91IHThu5EgxJFhbmcgxJHGsOG7o2MgeGVtIHjDqXQuDQpHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1iw6xuaCBwaMawxqFuZyBy4bqldCBs4bubbiAoWMKyID0gMTE5OC4xKSBjw6BuZyBj4bunbmcgY+G7kSB0aMOqbSBr4bq/dCBsdeG6rW4gbsOgeSwgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgdOG6p24gc+G7kSBxdWFuIHPDoXQgxJHGsOG7o2MgdHJvbmcgdGjhu7FjIHThur8gdsOgIHThuqduIHPhu5Ega+G7syB24buNbmcgKG7hur91IGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hykgbMOgIGPhu7FjIGvhu7MgxJHDoW5nIGvhu4MgdsOgIGtow7RuZyB0aOG7gyBsw6AgZG8gbmfhuqt1IG5oacOqbi4NCg0KIyMjICoqMy4zLjMgSGnhu4d1IHThu7cgbOG7hyAoUmlzayBEaWZmZXJlbmNlIC0gUkQpKioNCg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGNow6lvDQpzdF9zbSA8LSB0YWJsZShkdCRTdHJva2UsIGR0JFNtb2tpbmcpDQoNCiMgVGjDqm0gdOG7lW5nIGjDoG5nIHbDoCBj4buZdA0Kc3Rfc20xIDwtIGFkZG1hcmdpbnMoc3Rfc20pDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZw0Kc3Rfc20xDQpgYGANCg0KJCQNCnBfMSA9IFAoXHRleHR7U3Ryb2tlfSA9IFx0ZXh0e8SQ4buZdCBxdeG7tX0gXG1pZCBcdGV4dHtTbW9raW5nfSA9IFx0ZXh0e0tow7RuZyBow7p0IHRodeG7kWN9KSBccXVhZCBcdGV4dHsoVOG7tyBs4buHIMSR4buZdCBxdeG7tSDhu58gbmjDs20ga2jDtG5nIGjDunQgdGh14buRYyl9DQokJA0KDQokJA0KcF8yID0gUChcdGV4dHtTdHJva2V9ID0gXHRleHR7xJDhu5l0IHF14bu1fSBcbWlkIFx0ZXh0e1Ntb2tpbmd9ID0gXHRleHR7SMO6dCB0aHXhu5FjfSkgXHF1YWQgXHRleHR7KFThu7cgbOG7hyDEkeG7mXQgcXXhu7Ug4bufIG5ow7NtIGjDunQgdGh14buRYyl9DQokJA0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCiQkDQpIXzA6IHBfMSAtIHBfMiA9IDAgXHF1YWQgXHRleHR7KFThu7cgbOG7hyDEkeG7mXQgcXXhu7Ug4bufIG5ow7NtIGtow7RuZyBow7p0IHRodeG7kWMgYuG6sW5nIHThu7cgbOG7hyDEkeG7mXQgcXXhu7Ug4bufIG5ow7NtIGjDunQgdGh14buRYyl9DQokJA0KDQokJA0KSF8xOiBwXzEgLSBwXzIgPCAwIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgxJHhu5l0IHF14bu1IOG7nyBuaMOzbSBraMO0bmcgaMO6dCB0aHXhu5FjIG5o4buPIGjGoW4gdOG7tyBs4buHIMSR4buZdCBxdeG7tSDhu58gbmjDs20gaMO6dCB0aHXhu5FjKX0NCiQkDQoNCmBgYHtyfQ0KIyBT4buRIG5nxrDhu51pIMSR4buZdCBxdeG7tSB0cm9uZyB04burbmcgbmjDs20gaMO6dCB0aHXhu5FjDQpjb3VudHNfc3Ryb2tlIDwtIGMoc3Rfc21bIsSQ4buZdCBxdeG7tSIsICJLaMO0bmcgaMO6dCB0aHXhu5FjIl0sIHN0X3NtWyLEkOG7mXQgcXXhu7UiLCAiSMO6dCB0aHXhu5FjIl0pDQoNCiMgVOG7lW5nIHPhu5EgbmfGsOG7nWkgdHJvbmcgdOG7q25nIG5ow7NtIGjDunQgdGh14buRYw0KdG90YWxzX3N0cm9rZSA8LSBjKHN1bShzdF9zbVssICJLaMO0bmcgaMO6dCB0aHXhu5FjIl0pLCBzdW0oc3Rfc21bLCAiSMO6dCB0aHXhu5FjIl0pKQ0KDQojIEtp4buDbSDEkeG7i25oIHThu4kgbOG7hyBt4buZdCBwaMOtYTogcDEgPCBwMiANCnRlc3Rfc3Ryb2tlX2xlc3MgPC0gcHJvcC50ZXN0KGNvdW50c19zdHJva2UsIHRvdGFsc19zdHJva2UsIGFsdGVybmF0aXZlID0gImxlc3MiLCBjb3JyZWN0ID0gRkFMU0UpDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjIGtp4buDbSDEkeG7i25oDQp0ZXN0X3N0cm9rZV9sZXNzDQpgYGANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleToNCg0KVOG7tyBs4buHIMSR4buZdCBxdeG7tSDhu58gbmjDs20gMSAocHJvcCAxKSBsw6Aga2hv4bqjbmcgMi44MCUgVOG7tyBs4buHIMSR4buZdCBxdeG7tSDhu58gbmjDs20gMg0KKHByb3AgMikgbMOgIGtob+G6o25nIDUuMTclDQoNCkdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpIGLDrG5oIHBoxrDGoW5nIGzDoCAxMTk4LjgsIHbhu5tpIDEgYuG6rWMgdOG7sSBkbyB2w6AgcC12YWx1ZQ0KXDwgMi4yZS0xNi4NCg0KVsOsIHAtdmFsdWUgbmjhu48gaMahbiAwLjA1LCBjaMO6bmcgdGEgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dA0KSOKCgC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgdOG7tyBs4buHIMSR4buZdCBxdeG7tSDhu58gbmjDs20gMSBuaOG7jyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5ow7NtDQoyLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBoaeG7h3UgdOG7tyBs4buHIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgLTEuMDAwMCDEkeG6v24NCi0wLjAyMjUsIGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAwLCBjw6BuZyBraOG6s25nIMSR4buLbmggc+G7sSBraMOhYyBiaeG7h3QgbMOgIGPDsyDDvQ0KbmdoxKlhIHRo4buRbmcga8OqLg0KDQpL4bq/dCBsdeG6rW46IE5ow7NtIDEgY8OzIHThu7cgbOG7hyDEkeG7mXQgcXXhu7UgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmjDs20gMi4NCg0KIyMjICoqMy4zLjQuIFLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIChSZWxhdGl2ZSBSaXNrIC0gUlIpOioqDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKHN0X3NtLCBtZXRob2Q9IndhbGQiKQ0KYGBgDQoNCkdpw6EgdHLhu4sgUlIgPSAxLjM4OSBjaG8gdGjhuqV5IHLhurFuZyB04bu3IGzhu4cgxJHhu5l0IHF14bu1IOG7nyBuaMOzbSBow7p0IHRodeG7kWMgY2FvIGjGoW4NCmtob+G6o25nIDM4LjklIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBow7p0IHRodeG7kWMuDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIFJSIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMS4zNjY3IMSR4bq/biAxLjQxMTgsIHbDoA0KcC12YWx1ZSBn4bqnbiBi4bqxbmcgMCwgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KS+G6v3QgbHXhuq1uOiBUcm9uZyBt4bqrdSBk4buvIGxp4buHdSBuw6B5LCBow7p0IHRodeG7kWMgY8OzIGxpw6puIHF1YW4gxJHhur9uIG5ndXkgY8ahIMSR4buZdA0KcXXhu7UgY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kga2jDtG5nIGjDunQgdGh14buRYy4NCg0KIyMjICoqMy4zLjUuIFThu7cgc+G7kSBDaMOqbmggKE9kZHMgUmF0aW8gLSBPUik6KioNCg0KYGBge3J9DQpvcl9yZXN1bHQzIDwtIG9kZHNyYXRpbyhzdF9zbSkNCnByaW50KG9yX3Jlc3VsdDMpDQpgYGANCg0KR2nDoSB0cuG7iyBPUiA9IDEuODk0IGNobyB0aOG6pXkgcuG6sW5nIGto4bqjIG7Eg25nIGLhu4sgxJHhu5l0IHF14bu1IOG7nyBuaMOzbSBow7p0IHRodeG7kWMNCmNhbyBoxqFuIGtob+G6o25nIDg5LjQlIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBow7p0IHRodeG7kWMuDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIE9SIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMS44MjYgxJHhur9uIDEuOTY1LCBjaG8gdGjhuqV5DQpr4bq/dCBxdeG6oyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQpOw7NpIGPDoWNoIGtow6FjLCBvZGRzIGLhu4sgxJHhu5l0IHF14bu1IOG7nyBuaMOzbSBow7p0IHRodeG7kWMgY2FvIGjGoW4gZ+G6p24gZ+G6pXAgxJHDtGkgc28NCnbhu5tpIG5ow7NtIGtow7RuZyBow7p0IHRodeG7kWMgdHJvbmcgbeG6q3UgZOG7ryBsaeG7h3UgbsOgeS4NCg0KIyMgKiozLjQuIFN0cm9rZSB2w6AgS2lkbmV5RGlzZWFzZSoqDQoNCiMjIyAqKjMuNC4xLiBC4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KiogDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCmR0JEtpZG5leURpc2Vhc2UgPC0gZmFjdG9yKGR0JEtpZG5leURpc2Vhc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5vIiwgIlllcyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBi4buHbmggdGjhuq1uIiwgIkLhu4duaCB0aOG6rW4iKSkNCg0KDQojIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGNow6lvDQpzdF9raSA8LSB0YWJsZShkdCRTdHJva2UsIGR0JEtpZG5leURpc2Vhc2UpDQoNCiMgVGjDqm0gdOG7lW5nIGjDoG5nIHbDoCBj4buZdA0Kc3Rfa2kxIDwtIGFkZG1hcmdpbnMoc3Rfa2kpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZw0Kc3Rfa2kxDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgdGhlbyBow6BuZyAocm93IHBlcmNlbnRhZ2VzKQ0Kc3Rfa2lfcHJvcCA8LSBwcm9wLnRhYmxlKHN0X2tpLCBtYXJnaW4gPSAxKQ0KDQojIEzDoG0gdHLDsm4gNCBjaOG7ryBz4buRIHRo4bqtcCBwaMOibg0Kc3Rfa2lfcHJvcCA8LSByb3VuZChzdF9raV9wcm9wLCA0KQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgdOG6p24gc3XhuqV0DQpzdF9raV9wcm9wDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUNCnN0X2tpX2RmIDwtIGFzLmRhdGEuZnJhbWUoc3Rfa2kpDQoNCiMgxJDhu5VpIHTDqm4gY+G7mXQgY2hvIGThu4UgaGnhu4N1DQpjb2xuYW1lcyhzdF9raV9kZiApIDwtIGMoIlN0cm9rZSIsICJLaWRuZXlEaXNlYXNlIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kw0KZ2dwbG90KHN0X2tpX2RmLCBhZXMoeCA9IEtpZG5leURpc2Vhc2UsIHkgPSBDb3VudCwgZmlsbCA9IFN0cm9rZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlTDrG5oIHRy4bqhbmcgxJHhu5l0IHF14bu1IHRoZW8gYuG7h25oIHRo4bqtbiIsDQogICAgeCA9ICJUw6xuaCB0cuG6oW5nIGLhu4duaCB0aOG6rW4iLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyBi4buHbmggbmjDom4iLA0KICAgIGZpbGwgPSAiVMOsbmggdHLhuqFuZyDEkeG7mXQgcXXhu7UiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQ0KYGBgDQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgbeG7mXQgbeG7kWkgbGnDqm4gaOG7hyBy4bqldCBt4bqhbmggbeG6vSBnaeG7r2EgYuG7h25oIHRo4bqtbiB2w6Agbmd1eSBjxqEgxJHhu5l0IHF14bu1LiBU4bu3IGzhu4cgbeG6r2MgYuG7h25oIHRo4bqtbiDhu58gbmjDs20gYuG7h25oIG5ow6JuIMSRw6MgdOG7q25nIGLhu4sgxJHhu5l0IHF14bu1ICgxMi4zNSUpIGNhbyBn4bqnbiBn4bqlcCA0IGzhuqduIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBi4buLIMSR4buZdCBxdeG7tSAoMy4zNCUpLiBT4buxIGNow6puaCBs4buHY2ggbsOgeSBraOG6s25nIMSR4buLbmggcuG6sW5nIGLhu4duaCB0aOG6rW4gbMOgIG3hu5l0IHnhur91IHThu5Egbmd1eSBjxqEgcXVhbiB0cuG7jW5nLCBsw6BtIHTEg25nIHLDtSBy4buHdCBraOG6oyBuxINuZyB44bqjeSByYSDEkeG7mXQgcXXhu7UuIERvIMSRw7MsIHZp4buHYyB0aGVvIGTDtWkgY2jhu6ljIG7Eg25nIHRo4bqtbiB2w6AgxJFp4buBdSB0cuG7iyBz4bubbSBi4buHbmggdGjhuq1uIMSRw7NuZyB2YWkgdHLDsiB0aGnhur90IHnhur91IHRyb25nIHZp4buHYyBwaMOybmcgbmfhu6thIMSR4buZdCBxdeG7tS4NCg0KIyMjICoqMy40LjIuIEtp4buDbSDEkeG7i25oIFRo4buRbmcga8OqKioNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotICAgKipI4oKAKio6IFTDrG5oIHRy4bqhbmcgxJHhu5l0IHF14bu1IHbDoCB0w6xuaCB0cuG6oW5nIGLhu4duaCB0aOG6rW4gbMOgIGhhaSBiaeG6v24gxJHhu5ljDQogICAgbOG6rXAuDQoNCi0gICAqKkjigoEqKjogVMOsbmggdHLhuqFuZyDEkeG7mXQgcXXhu7UgdsOgIHTDrG5oIHRy4bqhbmcgYuG7h25oIHRo4bqtbiBjw7MgbGnDqm4gcXVhbi4NCg0KYGBge3J9DQojIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nDQpjaGlfc3Rfa2k8LSBjaGlzcS50ZXN0KHN0X2tpKQ0KcHJpbnQoY2hpX3N0X2tpKQ0KYGBgDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOg0KDQpHacOhIHRy4buLIHRo4buRbmcga8OqIENoaSBiw6xuaCBwaMawxqFuZzogWMKyID0gMjY1NS40IELhuq1jIHThu7EgZG8gKGRmKSA9IDEgcC12YWx1ZQ0KXDwgMi4yZS0xNg0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgdGjGsOG7nW5nIGTDuW5nIGzDoCDOsSA9IDAuMDUsIHRhIHRo4bqleSBwLXZhbHVlIFw8IDAuMDUsIHThu6ljIGzDoA0KY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALg0KDQpL4bq/dCBsdeG6rW46IEPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGhhaSBiaeG6v24gdHJvbmcgZOG7ryBsaeG7h3UNCnN0X2tpLiBOw7NpIGPDoWNoIGtow6FjLCB0w6xuaCB0cuG6oW5nIGjDunQgdGh14buRYyB2w6AgdMOsbmggdHLhuqFuZyDEkeG7mXQgcXXhu7UgY8OzIGxpw6puDQpxdWFuIMSR4bq/biBuaGF1IHRyb25nIG3huqt1IGThu68gbGnhu4d1IG7DoHkuDQoNCiMjIyAqKjMuNC4zIEhp4buHdSB04bu3IGzhu4cgKFJpc2sgRGlmZmVyZW5jZSAtIFJEKSoqDQoNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbw0Kc3Rfa2kgPC0gdGFibGUoZHQkU3Ryb2tlLCBkdCRLaWRuZXlEaXNlYXNlKQ0KDQojIFRow6ptIHThu5VuZyBow6BuZyB2w6AgY+G7mXQNCnN0X2tpMSA8LSBhZGRtYXJnaW5zKHN0X2tpKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcNCnN0X2tpMQ0KYGBgDQoNCiQkDQpwXzEgPSBQKFx0ZXh0e1N0cm9rZX0gPSBcdGV4dHvEkOG7mXQgcXXhu7V9IFxtaWQgXHRleHR7S2lkbmV5RGlzZWFzZX0gPSBcdGV4dHtLaMO0bmcgYuG7h25oIHRo4bqtbn0pIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgxJHhu5l0IHF14bu1IOG7nyBuaMOzbSBraMO0bmcgYuG7h25oIHRo4bqtbil9DQokJA0KDQokJA0KcF8yID0gUChcdGV4dHtTdHJva2V9ID0gXHRleHR7xJDhu5l0IHF14bu1fSBcbWlkIFx0ZXh0e0tpZG5leURpc2Vhc2V9ID0gXHRleHR7QuG7h25oIHRo4bqtbn0pIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgxJHhu5l0IHF14bu1IOG7nyBuaMOzbSBi4buHbmggdGjhuq1uKX0NCiQkDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQokJA0KSF8wOiBwXzEgLSBwXzIgPSAwIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgxJHhu5l0IHF14bu1IOG7nyBuaMOzbSBraMO0bmcgYuG7h25oIHRo4bqtbiBi4bqxbmcgdOG7tyBs4buHIMSR4buZdCBxdeG7tSDhu58gbmjDs20gYuG7h25oIHRo4bqtbil9DQokJA0KDQokJA0KSF8xOiBwXzEgLSBwXzIgPiAwIFxxdWFkIFx0ZXh0eyhU4bu3IGzhu4cgxJHhu5l0IHF14bu1IOG7nyBuaMOzbSBraMO0bmcgYuG7h25oIHRo4bqtbiBs4bubbiBoxqFuIHThu7cgbOG7hyDEkeG7mXQgcXXhu7Ug4bufIG5ow7NtIGLhu4duaCB0aOG6rW4pfQ0KJCQNCg0KYGBge3J9DQojIFPhu5EgbmfGsOG7nWkgxJHhu5l0IHF14bu1IHRyb25nIHThu6tuZyBuaMOzbSBi4buHbmggdGjhuq1uDQpjb3VudHNfc3Ryb2tlMSA8LSBjKHN0X2tpWyLEkOG7mXQgcXXhu7UiLCAiS2jDtG5nIGLhu4duaCB0aOG6rW4iXSwNCiAgICAgICAgICAgICAgICAgICAgc3Rfa2lbIsSQ4buZdCBxdeG7tSIsICJC4buHbmggdGjhuq1uIl0pDQoNCiMgVOG7lW5nIHPhu5EgbmfGsOG7nWkgdHJvbmcgdOG7q25nIG5ow7NtIGLhu4duaCB0aOG6rW4NCnRvdGFsc19zdHJva2UxIDwtIGMoc3VtKHN0X2tpWywgIktow7RuZyBi4buHbmggdGjhuq1uIl0pLA0KICAgICAgICAgICAgICAgICAgICBzdW0oc3Rfa2lbLCAiQuG7h25oIHRo4bqtbiJdKSkNCg0KIyBLaeG7g20gxJHhu4tuaCB04buJIGzhu4cgbeG7mXQgcGjDrWE6IHAxID4gcDIgKHThu7cgbOG7hyDEkeG7mXQgcXXhu7Ug4bufIG5ow7NtIGtow7RuZyBi4buHbmggdGjhuq1uIGzhu5tuIGjGoW4gbmjDs20gYuG7h25oIHRo4bqtbikNCnRlc3Rfa2lkbmV5ZGlzZWFzZV9ncmVhdGVyIDwtIHByb3AudGVzdChjb3VudHNfc3Ryb2tlMSwgdG90YWxzX3N0cm9rZTEsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBjb3JyZWN0ID0gRkFMU0UpDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjIGtp4buDbSDEkeG7i25oDQp0ZXN0X2tpZG5leWRpc2Vhc2VfZ3JlYXRlcg0KYGBgDQoNCkdpw6EgdHLhu4sgdGjhu5FuZyBrw6oga2nhu4NtIMSR4buLbmggKENoaS1zcXVhcmVkKTogMjY1Ny45IEdpw6EgdHLhu4sgcC12YWx1ZTogMQ0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUgKM6xID0gMC4wNSksIHRhIGPDszogcC12YWx1ZSA9IDEgXD4gMC4wNQ0KDQrih5IgS2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIChI4oKAKS4NCg0KS+G6v3QgbHXhuq1uOiBLaMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcgdOG7tyBs4buHIMSR4buZdA0KcXXhu7Ug4bufIG5ow7NtIDEgKDMuNDMlKSBs4bubbiBoxqFuIHThu7cgbOG7hyDhu58gbmjDs20gMiAoMTIuNjYlKSwgZMO5IHThu7cgbOG7hyB0aOG7sWMgdOG6vyDhu58NCm5ow7NtIDIgY2FvIGjGoW4uDQoNCiMjIyAqKjMuNC40LiBS4bunaSBybyB0xrDGoW5nIMSR4buRaSAoUmVsYXRpdmUgUmlzayAtIFJSKToqKg0KDQpgYGB7cn0NCnJpc2tyYXRpbyhzdF9raSwgbWV0aG9kPSJ3YWxkIikNCmBgYA0KDQpW4bubaSBSUiA9IDMuNjk1LCB0YSBuaOG6rW4gdGjhuqV5IHLhurFuZyB04bu3IGzhu4cgxJHhu5l0IHF14bu1IOG7nyBuaMOzbSBjw7MgYuG7h25oIHRo4bqtbiBjYW8NCmjGoW4ga2hv4bqjbmcgMjY5LjUlIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBjw7MgYuG7h25oIHRo4bqtbi4NCg0KS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gUlIgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAzLjUxMSDEkeG6v24gMy44ODksIGNobyB0aOG6pXkNCnPhu7Ega2jDoWMgYmnhu4d0IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQpOw7NpIGPDoWNoIGtow6FjLCB0cm9uZyBt4bqrdSBk4buvIGxp4buHdSBuw6B5LCBuZ8aw4budaSBjw7MgYuG7h25oIHRo4bqtbiBjw7Mgbmd1eSBjxqEgYuG7iw0KxJHhu5l0IHF14bu1IGNhbyBoxqFuIGfhuqduIDMuNyBs4bqnbiBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgY8OzIGLhu4duaCB0aOG6rW4uDQoNCiMjIyAqKjMuNC41LiBU4bu3IHPhu5EgQ2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpOioqDQoNCmBgYHtyfQ0Kb3JfcmVzdWx0NCA8LSBvZGRzcmF0aW8oc3Rfa2kpDQpwcmludChvcl9yZXN1bHQ0KQ0KYGBgDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIGNobyB0aOG6pXkgT2RkcyBSYXRpbyAoT1IpID0gNC4wNzUsIG5naMSpYSBsw6Aga2jhuqMgbsSDbmcgYuG7iw0KxJHhu5l0IHF14bu1IOG7nyBuaMOzbSBjw7MgYuG7h25oIHRo4bqtbiBjYW8gaMahbiBraG/huqNuZyAzMDcuNSUgc28gduG7m2kgbmjDs20ga2jDtG5nIGPDsw0KYuG7h25oIHRo4bqtbi4NCg0KS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gT1IgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAzLjg0NiDEkeG6v24gNC4zMTYsIGNobyB0aOG6pXkNCnPhu7Ega2jDoWMgYmnhu4d0IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQpOw7NpIGPDoWNoIGtow6FjLCBvZGRzIGLhu4sgxJHhu5l0IHF14bu1IOG7nyBuZ8aw4budaSBjw7MgYuG7h25oIHRo4bqtbiBjYW8gaMahbiBn4bqlcCA0IGzhuqduIHNvDQp24bubaSBuZ8aw4budaSBraMO0bmcgY8OzIGLhu4duaCB0aOG6rW4gdHJvbmcgbeG6q3UgZOG7ryBsaeG7h3UgbsOgeS4NCg0KIyAqKlBo4bqnbiA0LiBU4buVbmcga+G6v3QgdsOgIHRo4bqjbyBsdeG6rW4qKg0KDQpCw6BpIGLDoW8gY8OhbyDEkcOjIHRp4bq/biBow6BuaCBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiDEkeG7kWkgduG7m2kgNCBj4bq3cCBiaeG6v246DQoNCi0gICBIw7p0IHRodeG7kWMgdsOgIGLhu4duaCB0aW0sDQoNCi0gICBUaeG7g3UgxJHGsOG7nW5nIHbDoCBi4buHbmggdGltLA0KDQotICAgSMO6dCB0aHXhu5FjIHbDoCDEkeG7mXQgcXXhu7UsDQoNCi0gICBC4buHbmggdGjhuq1uIHbDoCDEkeG7mXQgcXXhu7UuDQoNClRow7RuZyBxdWEgY8OhYyBwaMOibiB0w61jaCB24buBIHThu7cgbOG7hywgUmlzayBSYXRpbywgT2RkcyBSYXRpbyB2w6Aga2nhu4NtIMSR4buLbmgNCkNoaSBiw6xuaCBwaMawxqFuZywgYsOgaSBiw6FvIMSRw6MgxJHGsGEgcmEgbmjhu69uZyBr4bq/dCBsdeG6rW4gYsaw4bubYyDEkeG6p3UgduG7gSDhuqNuaCBoxrDhu59uZw0KY+G7p2EgY8OhYyB54bq/dSB04buRIG5ndXkgY8ahIGzDqm4gdMOsbmggdHLhuqFuZyBz4bupYyBraOG7j2UuIFwjIyAqKjQuMSBU4buVbmcga+G6v3QgY8OhYw0Ka+G6v3QgcXXhuqMgbuG7lWkgYuG6rXQqKg0KDQoqKkjDunQgdGh14buRYyB2w6AgYuG7h25oIHRpbToqKiBSUiDiiYggMS40OCwgT1Ig4omIIDIuMTYsIHAtdmFsdWUg4omIIDAg4oeSIE5nxrDhu51pIGjDunQNCnRodeG7kWMgY8OzIG5ndXkgY8ahIG3huq9jIGLhu4duaCB0aW0gY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIGjDunQNCnRodeG7kWMuDQoNCioqVGnhu4N1IMSRxrDhu51uZyB2w6AgYuG7h25oIHRpbToqKiBSUiDiiYggMy4wMiwgT1Ig4omIIDQuMDUsIHAtdmFsdWUg4omIIDAg4oeSIFRp4buDdQ0KxJHGsOG7nW5nIGzDoCB54bq/dSB04buRIG5ndXkgY8ahIG3huqFuaCDEkeG7kWkgduG7m2kgYuG7h25oIHRpbSwgbMOgbSB0xINuZyBuZ3V5IGPGoSBn4bqlcCAz4oCTNA0KbOG6p24uDQoNCioqSMO6dCB0aHXhu5FjIHbDoCDEkeG7mXQgcXXhu7U6KiogUlIg4omIIDEuMzksIE9SIOKJiCAxLjg5LCBwLXZhbHVlIOKJiCAwIOKHkiBOZ3V5IGPGoQ0KxJHhu5l0IHF14bu1IOG7nyBuZ8aw4budaSBow7p0IHRodeG7kWMgY2FvIGjGoW4ga2hv4bqjbmcgMzkl4oCTODklIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBow7p0Lg0KDQoqKkLhu4duaCB0aOG6rW4gdsOgIMSR4buZdCBxdeG7tToqKiBSUiDiiYggMy43MCwgT1Ig4omIIDQuMDgsIHAtdmFsdWUg4omIIDAg4oeSIELhu4duaCB0aOG6rW4NCmzDoG0gdMSDbmcgbmd1eSBjxqEgxJHhu5l0IHF14bu1IHLhuqV0IHLDtSBy4buHdCDigJMgZ+G6p24gZ+G6pXAgNCBs4bqnbi4gXCMjICoqNC4yIFRo4bqjbyBsdeG6rW4NCnbDoCBo4bqhbiBjaOG6vyoqDQoNCioqRGnhu4VuIGdp4bqjaSBr4bq/dCBxdeG6oyoqDQoNCi0gICBU4bqldCBj4bqjIDQgY+G6t3AgYmnhur9uIMSR4buBdSBjaG8gdGjhuqV5IG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2ENCiAgICB54bq/dSB04buRIG5ndXkgY8ahIHbDoCBi4buHbmggbMO9IChi4buHbmggdGltIGhv4bq3YyDEkeG7mXQgcXXhu7UpLg0KDQotICAgQ8OhYyBjaOG7iSBz4buRIFJSIHbDoCBPUiDEkeG7gXUgbOG7m24gaMahbiAxLCBjaG8gdGjhuqV5IGPDoWMgeeG6v3UgdOG7kSBuaMawIGjDunQNCiAgICB0aHXhu5FjLCB0aeG7g3UgxJHGsOG7nW5nLCBi4buHbmggdGjhuq1uIGzDoG0gdMSDbmcgbmd1eSBjxqEgYuG7h25oIHLDtSBy4buHdC4NCg0KLSAgIMSQaeG7gXUgbsOgeSBwaMO5IGjhu6NwIHbhu5tpIGtp4bq/biB0aOG7qWMgeSBo4buNYyB0aOG7sWMgdGnhu4VuLCB4w6FjIG5o4bqtbiBy4bqxbmcgY8OhYw0KICAgIHnhur91IHThu5EgYuG7h25oIG7hu4FuIMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgdHJvbmcgZGnhu4VuIHRp4bq/biBi4buHbmggbMO9IHRpbQ0KICAgIG3huqFjaCB2w6AgxJHhu5l0IHF14bu1Lg0KDQoqKkjhuqFuIGNo4bq/KiogLSBE4buvIGxp4buHdSBtw7QgcGjhu49uZzogS2jDtG5nIHBo4bqjbiDDoW5oIGNow61uaCB4w6FjIHF14bqnbiB0aOG7gyB0aOG7sWMNCnThur8uDQoNCi0gICBDaOG7iSBwaMOibiB0w61jaCBzb25nIGJp4bq/bjogQ2jGsGEga2nhu4NtIHNvw6F0IGPDoWMgeeG6v3UgdOG7kSBuaGnhu4V1IG5oxrAgxJHhu5kNCiAgICB0deG7lWksIGdp4bubaSB0w61uaCwgdGjhu51pIGdpYW4gbeG6r2MgYuG7h25oLi4uDQoNCi0gICBUaGnhur91IHRow7RuZyB0aW4gY2hpIHRp4bq/dDogQ8OhYyBiaeG6v24gY2jhu4kgY2hpYSB0aMOgbmggMiBuaMOzbSAoY8OzL2tow7RuZyksDQogICAga2jDtG5nIG7DqnUgcsO1IG3hu6ljIMSR4buZLCB0aOG7nWkgZ2lhbiBow7p0IHRodeG7kWMsIGdpYWkgxJFv4bqhbiBi4buHbmguLi4NCg0KLSAgIENoxrBhIHBow6JuIHTDrWNoIHRoZW8gdGjhu51pIGdpYW46IEtow7RuZyB4ZW0geMOpdCBt4buRaSBxdWFuIGjhu4cgdGhlbyBjaHXhu5dpDQogICAgdGjhu51pIGdpYW4gZ2nhu69hIGLhu4duaCBu4buBbiB2w6AgYuG7h25oIGzDvSBwaMOhdCBzaW5oLg0KDQojICoqUGjhuqduIDUuIFBoxrDGoW5nIHBow6FwIMaw4bubYyBsxrDhu6NuZyBNYXhpbXVtIGxpa2Vob29kKioNCg0KIyMgKio1LjEuIEdp4bubaSB0aGnhu4d1IHThu5VuZyBxdWFuKioNCg0KTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRpb24gKE1MRSkgbMOgIG3hu5l0IHBoxrDGoW5nIHBow6FwIHRo4buRbmcga8OqIHN1eSBsdeG6rW4NCsSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHTDrG0gcmEgY8OhYyBnacOhIHRy4buLIHRoYW0gc+G7kSBzYW8gY2hvIHjDoWMgc3XhuqV0IChoYXkgIsSR4buZIGjhu6NwDQpsw70iKSDEkeG7gyBxdWFuIHPDoXQgxJHGsOG7o2MgZOG7ryBsaeG7h3UgdGjhu7FjIHThur8gbMOgIGzhu5tuIG5o4bqldC4NCg0KVHJvbmcgYuG7kWkgY+G6o25oIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmggKGNhdGVnb3JpY2FsIGRhdGEpLCBjw6FjIG3DtA0KaMOsbmggdGjhu5FuZyBrw6ogdGjGsOG7nW5nIMaw4bubYyBsxrDhu6NuZyB4w6FjIHN14bqldCBj4bunYSBt4buZdCBob+G6t2Mgbmhp4buBdSBz4buxIGtp4buHbiBy4budaQ0KcuG6oWMuIE1MRSBsw6AgcGjGsMahbmcgcGjDoXAgY2h14bqpbiB2w6AgbeG6oW5oIG3hur0gxJHhu4MgdGjhu7FjIGhp4buHbiB2aeG7h2MgbsOgeS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjICoqNS4yLiBOZ3V5w6puIHThuq9jIGPhu5F0IGzDtWk6IEjDoG0gSOG7o3AgbMO9IChMaWtlbGlob29kIEZ1bmN0aW9uKSoqDQoNCiMjIyAqKjUuMi4xLiBQaMOibiBiaeG7h3QgZ2nhu69hIHjDoWMgc3XhuqV0IHbDoCDEkeG7mSBo4bujcCBsw706KioNCg0KLSAgICoqWMOhYyBzdeG6pXQqKjogJFAoXHRleHR7ZOG7ryBsaeG7h3V9IFxtaWQgXHRoZXRhKSQg4oCTIFRoYW0gc+G7kSDEkcOjIGJp4bq/dCwNCiAgICB0w61uaCB4w6FjIHN14bqldCDEkeG7gyBk4buvIGxp4buHdSB44bqjeSByYS4NCg0KLSAgICoqxJDhu5kgaOG7o3AgbMO9Kio6ICRMKFx0aGV0YSBcbWlkIFx0ZXh0e2Thu68gbGnhu4d1fSkkIOKAkyBE4buvIGxp4buHdSDEkcOjIGJp4bq/dCwNCiAgICB0w6xtIHRoYW0gc+G7kSBwaMO5IGjhu6NwIG5o4bqldCB24bubaSBk4buvIGxp4buHdS4NCg0KTuG6v3UgY8OhYyBxdWFuIHPDoXQgbMOgIMSR4buZYyBs4bqtcCwgaMOgbSBo4bujcCBsw70gxJHGsOG7o2Mgdmnhur90Og0KDQokJA0KTChcdGhldGEgXG1pZCB5XzEsIHlfMiwgLi4uLCB5X24pID0gXHByb2Rfe2k9MX1ee259IFAoeV9pIFxtaWQgXHRoZXRhKQ0KJCQNCg0KVHJvbmcgxJHDszogLSAkXHRoZXRhJDogdGhhbSBz4buRIGPhu6dhIG3DtCBow6xuaCAodsOtIGThu6U6IHjDoWMgc3XhuqV0ICRwJCB0cm9uZw0KcGjDom4gcGjhu5FpIEJlcm5vdWxsaSksIC0gJHlfaSQ6IHF1YW4gc8OhdCB0aOG7qSAkaSQuDQoNCk3hu6VjIHRpw6p1IGPhu6dhIE1MRSBsw6AgdMOsbSBnacOhIHRy4buLICRcaGF0e1x0aGV0YX0kIHNhbyBjaG8gJEwoXHRoZXRhKSQgxJHhuqF0DQpj4buxYyDEkeG6oWkuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyAqKjUuMy4gUXV5IHRyw6xuaCB0aOG7sWMgaGnhu4duIE1MRSoqDQoNCioqNS4zLjEuIELGsOG7m2MgMTogR2nhuqMgxJHhu4tuaCBtw7QgaMOsbmggcGjDom4gcGjhu5FpKioNCg0KLSAgICoqUGjDom4gcGjhu5FpIEJlcm5vdWxsaSoqOiBCaeG6v24gbmjhu4sgcGjDom4gKFllcy9ObykuXA0KICAgICRQKFkgPSB5KSA9IHBeeSAoMSAtIHApXnsxIC0geX0sIFxxdWFkIHkgXGluIFx7MCwgMVx9JA0KDQotICAgKipQaMOibiBwaOG7kWkgQmlub21pYWwqKjogVOG7lW5nIHPhu5EgbOG6p24gdGjDoG5oIGPDtG5nIHNhdSAkbiQgcGjDqXAgdGjhu60gxJHhu5ljDQogICAgbOG6rXAuDQoNCi0gICAqKlBow6JuIHBo4buRaSBNdWx0aW5vbWlhbCoqOiBCaeG6v24gY8OzIG5oaeG7gXUgZGFuaCBt4bulYy4NCg0KKio1LjMuMi4gQsaw4bubYyAyOiBYw6J5IGThu7FuZyBow6BtIGjhu6NwIGzDvSoqDQoNClThu6sgbcO0IGjDrG5oIHjDoWMgc3XhuqV0IMSRw6MgY2jhu41uLCB2aeG6v3QgaMOgbSBo4bujcCBsw70gYuG6sW5nIHTDrWNoIGPDoWMgeMOhYyBzdeG6pXQgY2hvDQp04burbmcgcXVhbiBzw6F0Lg0KDQoqKjUuMy4zLiBCxrDhu5tjIDM6IFPhu60gZOG7pW5nIGjDoG0gTG9nLUxpa2VsaWhvb2QqKg0KDQrEkOG7gyDEkcahbiBnaeG6o24gaMOzYSB0w61uaCB0b8OhbiwgbOG6pXkgbG9nYXJpdCB04buxIG5oacOqbjoNCg0KJCQNCkxMKFx0aGV0YSkgPSBcbG9nIEwoXHRoZXRhKSA9IFxzdW1fe2k9MX1ee259IFxsb2cgUCh5X2kgXG1pZCBcdGhldGEpDQokJA0KDQoqKkLGsOG7m2MgNDogVOG7kWkgxJFhIGjDs2EgTG9nLUxpa2VsaWhvb2QqKg0KDQotICAgTOG6pXkgxJHhuqFvIGjDoG0gcmnDqm5nICRcZnJhY3tkfXtkXHRoZXRhfSBMTChcdGhldGEpJA0KLSAgIEdp4bqjaSBwaMawxqFuZyB0csOsbmggJFxmcmFje2R9e2RcdGhldGF9IExMKFx0aGV0YSkgPSAwJCDEkeG7gyB0w6xtDQogICAgJFxoYXR7XHRoZXRhfSQNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjICoqNS40LiBWw60gZOG7pSBtaW5oIGjhu41hOiDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIHTDoWkgbmhp4buFbSoqDQoNCioqQsOgaSB0b8OhbioqOiDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIHTDoWkgbmhp4buFbSAkcCQgdHJvbmcgbmjDs20gxJHDoyB0acOqbSB24bqvYy14aW4uDQoNCioqQsaw4bubYyAxOiBNw7QgaMOsbmgqKg0KDQpCaeG6v24gUmVpbmZlY3Rpb24gbMOgIG5o4buLIHBow6JuIOKHkiBkw7luZyAqKkJlcm5vdWxsaSoqIHbhu5tpIHRoYW0gc+G7kQ0KJHAgPSBQKFx0ZXh0e1JlaW5mZWN0aW9uID0gWWVzfSBcbWlkIFx0ZXh0e1ZhY2NpbmF0ZWQgPSBZZXN9KSQNCg0KKipCxrDhu5tjIDI6IEThu68gbGnhu4d1KioNCg0KLSAgIFPhu5EgbmfGsOG7nWkgxJHDoyB0acOqbTogJG4gPSAxNDcyJA0KLSAgIFPhu5EgbmfGsOG7nWkgdMOhaSBuaGnhu4VtOiAkayA9IDE1NSQNCg0KSMOgbSBo4bujcCBsw706DQoNCiQkDQpMKHApID0gcF57MTU1fSAoMSAtIHApXnsxMzE3fQ0KJCQNCg0KKipCxrDhu5tjIDM6IEjDoG0gTG9nLUxpa2VsaWhvb2QqKg0KDQokJA0KTEwocCkgPSBcbG9nIEwocCkgPSAxNTUgXGNkb3QgXGxvZyhwKSArIDEzMTcgXGNkb3QgXGxvZygxIC0gcCkNCiQkDQoNCioqQsaw4bubYyA0OiBU4buRaSDEkWEgaMOzYSoqDQoNCkzhuqV5IMSR4bqhbyBow6BtOg0KDQokJA0KXGZyYWN7ZExMfXtkcH0gPSBcZnJhY3sxNTV9e3B9IC0gXGZyYWN7MTMxN317MSAtIHB9DQokJA0KDQpDaG8gxJHhuqFvIGjDoG0gYuG6sW5nIDA6DQoNCiQkDQpcZnJhY3sxNTV9e3B9ID0gXGZyYWN7MTMxN317MSAtIHB9DQpccXVhZCBcUmlnaHRhcnJvdyBccXVhZCAxNTUoMSAtIHApID0gMTMxN3AgXHF1YWQgXFJpZ2h0YXJyb3cgXHF1YWQgcCA9IFxmcmFjezE1NX17MTQ3Mn0gXGFwcHJveCAwLjEwNTMNCiQkDQoNCioqS+G6v3QgbHXhuq1uKio6IMav4bubYyBsxrDhu6NuZyBo4bujcCBsw70gdOG7kWkgxJFhIGNobyB04bu3IGzhu4cgdMOhaSBuaGnhu4VtIGzDoCAqKjEwLjUzJSoqLA0KxJHDum5nIGLhurFuZyB04bu3IGzhu4cgbeG6q3UgcXVhbiBzw6F0IMSRxrDhu6NjLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgKio1LjUuIOG7qG5nIGThu6VuZyBNTEUgdHJvbmcgSOG7k2kgcXV5IExvZ2lzdGljKioNCg0KTUxFIGzDoCBwaMawxqFuZyBwaMOhcCBjxqEgYuG6o24gxJHhu4MgxrDhu5tjIGzGsOG7o25nIGPDoWMgaOG7hyBz4buRIHRyb25nICoqaOG7k2kgcXV5DQpsb2dpc3RpYyoqLCBt4buZdCBtw7QgaMOsbmggcGjhu5UgYmnhur9uIGNobyBiaeG6v24gcGjhu6UgdGh14buZYyBuaOG7iyBwaMOibi4NCg0KTcO0IGjDrG5oOg0KDQokJA0KUChZID0gMSBcbWlkIFgpID0gXGZyYWN7MX17MSArIFxleHAoLShcYmV0YV8wICsgXGJldGFfMSBYXzEgKyBcY2RvdHMgKyBcYmV0YV9rIFhfaykpfQ0KJCQNCg0KSMOgbSBsb2ctbGlrZWxpaG9vZDoNCg0KJCQNCkxMKFxiZXRhKSA9IFxzdW1fe2k9MX1ee259IFxsZWZ0WyB5X2kgXGxvZyhwX2kpICsgKDEgLSB5X2kpIFxsb2coMSAtIHBfaSkgXHJpZ2h0XQ0KJCQNCg0KRG8ga2jDtG5nIHRo4buDIGdp4bqjaSDEkeG6oW8gaMOgbSBi4bqxbmcgdGF5LCB0YSBkw7luZyBjw6FjIHRodeG6rXQgdG/DoW4gc+G7kSBuaMawDQoqKk5ld3Rvbi1SYXBoc29uKiosICoqR3JhZGllbnQgRGVzY2VudCoqIMSR4buDIHTDrG0gJFxoYXR7XGJldGF9JC4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjICoqNS42LiDGr3UgxJFp4buDbSB2w6AgTmjGsOG7o2MgxJFp4buDbSBj4bunYSBNTEUqKg0KDQoqKsavdSDEkWnhu4NtOioqIC0gKipIaeG7h3UgcXXhuqMqKjogUGjGsMahbmcgc2FpIG5o4buPIG7hur91IGPhu6EgbeG6q3UgbOG7m24uDQoNCi0gICAqKlbhu69uZyoqOiBI4buZaSB04bulIHbhu4EgdGhhbSBz4buRIHRo4bqtdCBraGkgc+G7kSBt4bqrdSB0xINuZy4NCg0KLSAgICoqVGnhu4dtIGPhuq1uIGNodeG6qW4qKjogSOG7lyB0cuG7oyBraeG7g20gxJHhu4tuaCB2w6Aga2hv4bqjbmcgdGluIGPhuq15Lg0KDQotICAgKipMaW5oIGhv4bqhdCoqOiDDgXAgZOG7pW5nIGNobyBuaGnhu4F1IG3DtCBow6xuaCB0aOG7kW5nIGvDqi4NCg0KKipOaMaw4bujYyDEkWnhu4NtOioqIC0gKipQaOG7pSB0aHXhu5ljIG3DtCBow6xuaCoqOiBO4bq/dSBtw7QgaMOsbmggc2FpLCBNTEUgc+G6vSBzYWkNCmzhu4djaC4NCg0KLSAgICoqQ8OzIHRo4buDIGNo4buHY2gqKjogVuG7m2kgY+G7oSBt4bqrdSBuaOG7jy4NCg0KLSAgICoqVMOtbmggdG/DoW4gcGjhu6ljIHThuqFwKio6IFbhu5tpIG3DtCBow6xuaCBuaGnhu4F1IHRoYW0gc+G7kSBj4bqnbiB0aHXhuq10IHRvw6FuDQogICAgbOG6t3AuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyMgKio1LjcuIFThu5VuZyBr4bq/dCoqDQoNClBoxrDGoW5nIHBow6FwIMav4bubYyBsxrDhu6NuZyBI4bujcCBsw70gVOG7kWkgxJFhIChNTEUpIGzDoCBt4buZdCBjw7RuZyBj4bulIG7hu4FuIHThuqNuZyB0cm9uZw0KdGjhu5FuZyBrw6ogaGnhu4duIMSR4bqhaSwgxJHhurdjIGJp4buHdCBoaeG7h3UgcXXhuqMgdHJvbmcgdmnhu4djIHjhu60gbMO9IHbDoCBwaMOibiB0w61jaCBk4buvDQpsaeG7h3UgxJHhu4tuaCB0w61uaC4gRMO5IGzDoCB24bubaSBiw6BpIHRvw6FuIMaw4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgxJHGoW4gZ2nhuqNuIGhheSBjw6FjIG3DtA0KaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIHBo4bupYyB04bqhcCwgTUxFIHbhuqtuIGN1bmcgY+G6pXAgZ2nhuqNpIHBow6FwIG3huqFuaCBt4bq9IHbDoCBjw7MNCnTDrW5oIHThu5VuZyBxdcOhdCBjYW8uDQo=