1 CHƯƠNG 1. GIỚI THIỆU VỀ BỘ DỮ LIỆU

td <- read.csv("C:/Users/Admin/Downloads/titanic.csv", header = T)
str(td)
## 'data.frame':    418 obs. of  8 variables:
##  $ Pclass  : int  3 3 2 3 3 3 3 2 3 3 ...
##  $ Sex     : chr  "male" "female" "male" "male" ...
##  $ Age     : num  34.5 47 62 27 22 14 30 26 18 21 ...
##  $ SibSp   : int  0 1 0 0 1 0 0 1 0 2 ...
##  $ Parch   : int  0 0 0 0 1 0 0 1 0 0 ...
##  $ Ticket  : chr  "330911" "363272" "240276" "315154" ...
##  $ Fare    : num  7.83 7 9.69 8.66 12.29 ...
##  $ Embarked: chr  "Q" "S" "Q" "S" ...
head(td)
##   Pclass    Sex  Age SibSp Parch  Ticket    Fare Embarked
## 1      3   male 34.5     0     0  330911  7.8292        Q
## 2      3 female 47.0     1     0  363272  7.0000        S
## 3      2   male 62.0     0     0  240276  9.6875        Q
## 4      3   male 27.0     0     0  315154  8.6625        S
## 5      3 female 22.0     1     1 3101298 12.2875        S
## 6      3   male 14.0     0     0    7538  9.2250        S

Mô tả dữ liệu: Bộ dữ liệu gồm 418 quan sát (hành khách) và 8 biến bao gồm: Pclass, Sex, Age, SibSp, Parch, Ticket, Fare, Embarked. Cụ thể trong bộ dữ liệu trên ta có:

Biến định tính:

  • Pclass: Hạng vé: 1, 2 hoặc 3

  • Sex: Giới tính (Female/Male)

  • Ticket: Mã vé tàu

  • Embarked: Cảng lên tàu (C, Q, S)

    Biến định lượng:

  • Age: Tuổi

  • SibSp: Số anh/chị/em hoặc vợ/chồng đi cùng

  • Parch: Số cha/mẹ hoặc con cái đi cùng

  • Fare: Giá vé

Nội dung dữ liệu ở 5 quan sát đầu và 5 quan sát cuối bảng:

head(td,5)
##   Pclass    Sex  Age SibSp Parch  Ticket    Fare Embarked
## 1      3   male 34.5     0     0  330911  7.8292        Q
## 2      3 female 47.0     1     0  363272  7.0000        S
## 3      2   male 62.0     0     0  240276  9.6875        Q
## 4      3   male 27.0     0     0  315154  8.6625        S
## 5      3 female 22.0     1     1 3101298 12.2875        S
tail(td, 5)
##     Pclass    Sex  Age SibSp Parch             Ticket     Fare Embarked
## 414      3   male 57.0     0     0          A.5. 3236   8.0500        S
## 415      1 female 39.0     0     0           PC 17758 108.9000        C
## 416      3   male 38.5     0     0 SOTON/O.Q. 3101262   7.2500        S
## 417      3   male 25.0     0     0             359309   8.0500        S
## 418      3   male 55.0     1     1               2668  22.3583        C

Tiếp theo đó, chúng ta sẽ kiểm tra thêm các giá trị thiếu trong bộ dữ liệu

colSums(is.na(td))
##   Pclass      Sex      Age    SibSp    Parch   Ticket     Fare Embarked 
##        0        0        0        0        0        0        0        0

Kết quả cho thấy không có giá trị thiếu (N/A) nào trong bộ dữ liệu trên.

Kiểm tra biến định tính có phải dạng factor

dinhtinh <- c('Pclass', 'Sex', 'Ticket', 'Embarked')
data_dinhtinh <- td[,dinhtinh]
#kiểm tra các biến định tính có phải là factor hay chưa
for (i in 1:ncol(data_dinhtinh)) {
  a <- is.factor(data_dinhtinh[,i])
  cat(colnames(data_dinhtinh)[i],":",a,"\n")
}
## Pclass : FALSE 
## Sex : FALSE 
## Ticket : FALSE 
## Embarked : FALSE

Chuyển đổi các biến trên sang kiểu factor

# Chuyển về dạng factor 

for (i in 1:ncol(data_dinhtinh)) {
  data_dinhtinh[,i] <- as.factor(data_dinhtinh[,i])
}

# Kiểm tra lại 
for (i in 1:ncol(data_dinhtinh)) {
  a <- is.factor(data_dinhtinh[,i])
  cat(colnames(data_dinhtinh)[i],":",a,"\n")
}
## Pclass : TRUE 
## Sex : TRUE 
## Ticket : TRUE 
## Embarked : TRUE

Sau khi kiểm tra kiểu dữ liệu ban đầu, các biến phân loại như Pclass, Sex, Ticket, Embarked đã được chuyển từ kiểu character sang factor. Tổng cộng có 4 biến đã được chuyển đổi thành công.

2 CHƯƠNG 2. PHÂN TÍCH DỮ LIỆU

2.1 Pclass

table(td$Pclass)
## 
##   1   2   3 
## 107  93 218

Pclass – Hạng vé:

  • Hạng 1: 107 hành khách

  • Hạng 2: 93 hành khách

  • Hạng 3: 218 hành khách

→ Đa số hành khách đi hạng 3

Biểu đồ cho Pclass

install.packages("ggplot2", repos = "https://cran.r-project.org")
## 
##   There is a binary version available but the source version is later:
##         binary source needs_compilation
## ggplot2  3.5.1  3.5.2             FALSE
## installing the source package 'ggplot2'
library(ggplot2)
# Biểu đồ Pclass
ggplot(td, aes(x = Pclass)) +
  geom_bar(fill = "steelblue") +
  labs(title = "Phân bố hạng vé (Pclass)", x = "Hạng vé", y = "Số lượng") +
  theme_minimal()

Kết quả thống kê cho thấy phần lớn hành khách thuộc hạng vé thứ 3 với 218 người, chiếm hơn một nửa tổng số hành khách. Hạng 1 và hạng 2 lần lượt có 107 và 93 người. Điều này cho thấy tầng lớp phổ thông (hạng 3) là nhóm khách chính trên chuyến tàu Titanic.

2.2 Sex

table(td$Sex)
## 
## female   male 
##    152    266

Sex – Giới tính:

  • Nam (male): 266 người

  • Nữ (female): 152 người

→ Nam giới chiếm ưu thế (≈ 64%)

# Biểu đồ Sex
ggplot(td, aes(x = Sex)) +
  geom_bar(fill = "tomato") +
  labs(title = "Phân bố giới tính", x = "Giới tính", y = "Số lượng") +
  theme_minimal()

Giới tính nam chiếm đa số với 266 người (khoảng 64%), trong khi nữ giới có 152 người. Sự chênh lệch này phản ánh rằng hành khách nam nhiều hơn nữ trong tập dữ liệu này.

2.3 Embarked

table(td$Embarked)
## 
##   C   Q   S 
## 102  46 270

Embarked – Cảng lên tàu:

  • Cảng S (Southampton): 270 người

  • Cảng C (Cherbourg): 102 người

  • Cảng Q (Queenstown): 46 người

→ Phần lớn hành khách lên tàu tại Southampton

# Biểu đồ Embarked
ggplot(td, aes(x = Embarked)) +
  geom_bar(fill = "darkgreen") +
  labs(title = "Cảng lên tàu", x = "Cảng", y = "Số lượng") +
  theme_minimal()

Cảng Southampton (S) là nơi có số lượng hành khách lên tàu nhiều nhất với 270 người, tiếp theo là Cherbourg (C) với 102 người và Queenstown (Q) với 46 người. Như vậy, cảng S là điểm xuất phát chính của hành khách trên tàu Titanic trong bộ dữ liệu này.

2.4 Ticket

table(td$Ticket)
## 
##             110469             110489             110813             111163 
##                  1                  1                  1                  1 
##             112051             112058             112377             112378 
##                  1                  1                  1                  2 
##             112901             113038             113044             113054 
##                  1                  1                  1                  1 
##             113059             113503             113509             113773 
##                  1                  4                  1                  1 
##             113778             113780             113781             113790 
##                  1                  1                  2                  1 
##             113791             113795             113796             113801 
##                  1                  1                  1                  1 
##              11753              11765              11767              11769 
##                  1                  1                  1                  1 
##              11770              11778              11813               1222 
##                  1                  2                  1                  1 
##              12749              13050              13236              13508 
##                  2                  2                  2                  2 
##              13567              13695              13905               1601 
##                  1                  2                  1                  1 
##              16966              17463              17464              17475 
##                  3                  1                  1                  1 
##              17765              17770              19877              19924 
##                  1                  1                  1                  1 
##              19928              19950               2003             211535 
##                  1                  2                  1                  1 
##              21228              21332             220844             220845 
##                  2                  1                  1                  3 
##             226875             228414             230136             233478 
##                  1                  1                  2                  1 
##             233734             235509             236853             236854 
##                  1                  1                  1                  1 
##             237216             237249             237393             237670 
##                  1                  1                  1                  1 
##             237734             237735             237789             239059 
##                  1                  1                  1                  1 
##             240261             240276              24065              24160 
##                  1                  1                  2                  1 
##             242963             244346             244358             244360 
##                  1                  1                  1                  1 
##             244368             248659             248726             248734 
##                  1                  1                  1                  1 
##             248738             248744             248746             250650 
##                  1                  1                  1                  1 
##             250651               2543               2621               2622 
##                  1                  1                  1                  1 
##               2625              26360               2650               2652 
##                  1                  1                  2                  1 
##               2653               2654               2655               2656 
##                  1                  1                  1                  1 
##               2657               2658               2660               2661 
##                  1                  1                  2                  1 
##               2662               2668               2670              26707 
##                  2                  1                  1                  1 
##               2673               2675               2676               2678 
##                  1                  1                  1                  1 
##               2679               2680               2681               2682 
##                  1                  1                  1                  1 
##               2684               2688               2689               2692 
##                  1                  1                  1                  1 
##               2696               2698              28004              28034 
##                  1                  1                  1                  1 
##              28133              28220              28221              28404 
##                  1                  2                  1                  1 
##              28664              28666              29103              29105 
##                  1                  1                  2                  1 
##              29107               2926              29750            3101266 
##                  1                  1                  1                  1 
##            3101295            3101297            3101298             315083 
##                  1                  1                  1                  1 
##             315085             315087             315091             315092 
##                  1                  1                  1                  1 
##             315095             315152             315153             315154 
##                  1                  1                  2                  1 
##              32302             329944             330844             330910 
##                  1                  1                  1                  1 
##             330911             330920             330924             330963 
##                  1                  1                  1                  1 
##             330968             330971             330972             334914 
##                  1                  1                  1                  1 
##             334915             335432              33638               3410 
##                  1                  1                  2                  1 
##             342441             342684             342712             343271 
##                  1                  1                  1                  1 
##             345498             345501             345572             345763 
##                  1                  1                  1                  1 
##             345768             345771             345775               3470 
##                  1                  1                  1                  1 
##             347065             347066             347070             347072 
##                  1                  1                  1                  2 
##             347075             347077             347079             347080 
##                  1                  3                  1                  1 
##             347086             347090             347091             347465 
##                  1                  1                  1                  1 
##             347467             347469             347471             348122 
##                  1                  1                  1                  1 
##             348125             349202             349211             349220 
##                  1                  1                  1                  1 
##             349226             349229             349230             349232 
##                  1                  1                  1                  1 
##             349235             349238             349250             349255 
##                  1                  1                  1                  1 
##             349256             349909             349910             349911 
##                  1                  1                  1                  1 
##             350026             350033             350045             350053 
##                  1                  1                  1                  1 
##             350054             350403             350405             350408 
##                  1                  1                  2                  1 
##             350409             350410             350416             359306 
##                  1                  1                  1                  1 
##             359309             363272             363611             364498 
##                  1                  1                  1                  1 
##             364856             364858             364859             365235 
##                  1                  1                  1                  1 
##             365237              36568             366713             367226 
##                  1                  1                  1                  1 
##             367227             368364             368402             368573 
##                  1                  1                  1                  1 
##             368702             368783              36928               3701 
##                  1                  1                  2                  1 
##             370129             370368             370371             370374 
##                  1                  1                  1                  1 
##             371109             371362             376563             376566 
##                  1                  1                  1                  1 
##             382650             382652             382653             383123 
##                  1                  1                  1                  1 
##             383162             386525             392091             392095 
##                  1                  1                  1                  1 
##               4133              65305                680                694 
##                  1                  1                  1                  1 
##               7266               7538               7548               7935 
##                  1                  1                  1                  1 
##               9232        A. 2. 39186         A./5. 3338          A.5. 3236 
##                  1                  1                  1                  1 
##          A/4 31416          A/4 48871          A/4 48873           A/5 1478 
##                  1                  1                  1                  1 
##          A/5 21175          A/5. 3337           A/5. 851        AQ/3. 30631 
##                  1                  1                  2                  1 
##          AQ/4 3130            C 17368             C 4001         C.A. 15185 
##                  1                  1                  2                  1 
##          C.A. 2315          C.A. 2673         C.A. 30769         C.A. 31029 
##                  2                  1                  1                  3 
##         C.A. 31030         C.A. 33112         C.A. 33595         C.A. 34050 
##                  1                  2                  1                  1 
##         C.A. 34644         C.A. 34651         C.A. 37671         C.A. 42795 
##                  1                  1                  1                  1 
##         C.A. 49867          C.A. 6212            CA 2144           CA 31352 
##                  1                  1                  2                  2 
##           CA. 2343         F.C. 12750         F.C. 12998       F.C.C. 13528 
##                  4                  1                  1                  1 
##       F.C.C. 13534       F.C.C. 13540            LP 1588           PC 17483 
##                  2                  1                  1                  3 
##           PC 17531           PC 17558           PC 17562           PC 17569 
##                  1                  1                  1                  1 
##           PC 17580           PC 17585           PC 17591           PC 17592 
##                  1                  1                  1                  1 
##           PC 17594           PC 17597           PC 17598           PC 17599 
##                  1                  1                  1                  1 
##           PC 17603           PC 17606           PC 17607           PC 17608 
##                  1                  1                  1                  5 
##           PC 17613           PC 17755           PC 17756           PC 17757 
##                  1                  1                  2                  1 
##           PC 17758           PC 17759           PC 17760           PC 17761 
##                  1                  1                  1                  1 
##            PP 9549    S.C./PARIS 2079        S.O./P.P. 2      S.O./P.P. 251 
##                  1                  1                  2                  1 
##      S.O./P.P. 752       S.O.C. 14879           SC 14888        SC/A.3 2861 
##                  1                  2                  1                  1 
##        SC/A4 23568        SC/AH 29037         SC/AH 3085      SC/Paris 2123 
##                  1                  1                  1                  1 
##      SC/PARIS 2147      SC/PARIS 2148      SC/PARIS 2159      SC/PARIS 2166 
##                  1                  1                  1                  1 
##      SC/PARIS 2167      SC/PARIS 2168 SOTON/O.Q. 3101262 SOTON/O.Q. 3101263 
##                  1                  1                  1                  1 
## SOTON/O.Q. 3101308 SOTON/O.Q. 3101309 SOTON/O.Q. 3101314 SOTON/O.Q. 3101315 
##                  1                  1                  1                  3 
##   SOTON/O2 3101284    SOTON/OQ 392083  STON/O 2. 3101268  STON/O 2. 3101291 
##                  1                  1                  1                  1 
##   STON/O2. 3101270    STON/OQ. 369943        W./C. 14260        W./C. 14266 
##                  1                  1                  1                  1 
##         W./C. 6607         W./C. 6608        W.E.P. 5734 
##                  2                  1                  1

Biến Ticket có tính chất định danh, mỗi giá trị đại diện cho một mã vé cụ thể được cấp cho hành khách hoặc nhóm hành khách. Trong bộ dữ liệu gồm 418 quan sát, có đến 363 mã vé khác nhau, trong đó phần lớn chỉ xuất hiện đúng 1 lần.

Điều này cho thấy rằng hầu hết hành khách có mã vé riêng biệt. Một số mã vé lặp lại nhiều hơn 1 lần, cho thấy có thể là những hành khách đi cùng nhóm, sử dụng chung vé. Tuy nhiên, do số lượng giá trị duy nhất quá nhiều, biến Ticket không phù hợp để mô tả bằng biểu đồ tần suất hoặc biểu đồ cột.

2.5 Ước lượng khoảng - kiểm định giả thiết

Câu hỏi giả định: Liệu tuổi trung bình của hành khách có bằng 30 không?

1. Ước lượng khoảng tin cậy 95% cho kỳ vọng tuổi

# Loại bỏ giá trị NA trước khi phân tích
age_data <- na.omit(td$Age)

# Tính khoảng tin cậy 95% cho trung bình
t.test(age_data, conf.level = 0.95)
## 
##  One Sample t-test
## 
## data:  age_data
## t = 44.132, df = 417, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  29.95184 32.74434
## sample estimates:
## mean of x 
##  31.34809

Dựa trên kết quả kiểm định trên, khoảng tin cậy 95% cho tuổi trung bình của hành khách nằm trong khoảng: [29.9518;32.7443]

→ Nghĩa là với độ tin cậy 95%, tuổi trung bình của hành khách trên tàu Titanic nằm giữa khoảng gần 30 đến gần 33 tuổi.

2. Kiểm định giả thiết

Giả thiết:

  • H0: μ = 30 (Tuổi trung bình bằng 30)

  • H1: μ ≠ 30 (Tuổi trung bình khác 30)

t.test(age_data, mu = 30)
## 
##  One Sample t-test
## 
## data:  age_data
## t = 1.8979, df = 417, p-value = 0.0584
## alternative hypothesis: true mean is not equal to 30
## 95 percent confidence interval:
##  29.95184 32.74434
## sample estimates:
## mean of x 
##  31.34809
  • Giả thiết gốc (H₀): Tuổi trung bình = 30

  • Giả thiết đối (H₁): Tuổi trung bình ≠ 30

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

  • t = 1.8979

  • df = 417

  • p-value = 0.0584

→ Vì p-value = 0.0584 > 0.05, ta không bác bỏ giả thiết H₀ ở mức ý nghĩa 5%.

3 CHƯƠNG 3. PHÂN TÍCH TÁC ĐỘNG CỦA CÁC BIẾN ĐỊNH TÍNH LÊN BIẾN SEX

3.1 Biến Pclass và Sex

3.1.1 Tần số chéo

install.packages("DT", repos = "https://cran.r-project.org")
## package 'DT' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Admin\AppData\Local\Temp\RtmpWAvFlW\downloaded_packages
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(DT)

# Tạo bảng tần suất chéo
tbl <- table(td$Pclass, td$Sex)

# In bảng tần suất
print(tbl)
##    
##     female male
##   1     50   57
##   2     30   63
##   3     72  146
# Chuyển bảng tần suất thành data frame
df_tbl <- as.data.frame(tbl)
colnames(df_tbl) <- c("Pclass", "Sex", "Frequency")

# Tính tổng số quan sát
total <- sum(df_tbl$Frequency)

# Thêm cột phần trăm trên tổng số
df_tbl <- df_tbl %>%
  mutate(Percentage = paste0(round(Frequency / total * 100, 2), "%"))


print(df_tbl)
##   Pclass    Sex Frequency Percentage
## 1      1 female        50     11.96%
## 2      2 female        30      7.18%
## 3      3 female        72     17.22%
## 4      1   male        57     13.64%
## 5      2   male        63     15.07%
## 6      3   male       146     34.93%
datatable(df_tbl)

3.1.2 Trực quan hóa

barplot(tbl,
        beside = TRUE,
        col = c("skyblue", "orange", "green"),
        legend = rownames(tbl),
        main = "Barplot: Phân bố giới tính theo hạng vé",
        xlab = "Giới tính", ylab = "Số lượng")

Nhận xét:

Kết quả phân tích cho thấy sự phân bố khác biệt rõ rệt giữa các nhóm hành khách theo hạng vé (Pclass) và giới tính (Sex).

  • Trong số hành khách nữ, nhóm nhiều nhất thuộc hạng vé 3 với 72 người, chiếm 17.22% tổng số, tiếp theo là hạng vé 1 với 50 người (11.96%) và hạng vé 2 với 30 người (7.18%).

  • Đối với hành khách nam, nhóm đông nhất cũng là hạng vé 3 với 146 người, chiếm tỷ lệ cao nhất 34.93%, sau đó là hạng vé 2 với 63 người (15.07%) và hạng vé 1 với 57 người (13.64%).

-> Như vậy, cả nam và nữ đều có xu hướng tập trung đông nhất ở hạng vé phổ thông (pclass 3). Tuy nhiên, tỷ lệ nam giới ở hạng vé 3 chiếm phần lớn hơn đáng kể so với nữ giới, cho thấy sự chênh lệch về phân bố giới tính theo hạng vé.

3.1.3 Kiểm định Chi-bình phương:

prod <- table(td$Pclass, td$Sex)
chisq.test(prod)
## 
##  Pearson's Chi-squared test
## 
## data:  prod
## X-squared = 6.6939, df = 2, p-value = 0.03519
## 

Với mức ý nghĩa thông thường α = 0.05:

  • Do p-value = 0.03519 < 0.05, ta bác bỏ giả thuyết H0.

  • Nghĩa là: có mối liên hệ có ý nghĩa thống kê giữa giới tính (sex) và hạng vé (pclass).

  • Nói cách khác, phân bố giới tính không đồng đều giữa các hạng vé.

    Kết luận:

    Kết quả kiểm định Chi-bình phương cho thấy rằng giới tính và hạng vé có mối quan hệ phụ thuộc. Phân bố nam và nữ thay đổi theo từng hạng vé, phản ánh sự khác biệt về giới tính trong các tầng lớp hành khách.

3.1.4 Tính Relative Risk và Odds Ratio

# Tạo bảng 2x2
tbl_2x2 <- matrix(c(50, 57, 72, 146), nrow = 2, byrow = TRUE)
colnames(tbl_2x2) <- c("female", "male")
rownames(tbl_2x2) <- c("pclass1", "pclass3")

print(tbl_2x2)
##         female male
## pclass1     50   57
## pclass3     72  146
# Tính Relative Risk (RR)
a <- tbl_2x2[1, 1]  # pclass1 - female
b <- tbl_2x2[1, 2]  # pclass1 - male
c <- tbl_2x2[2, 1]  # pclass3 - female
d <- tbl_2x2[2, 2]  # pclass3 - male

# Tỷ lệ nữ ở mỗi nhóm
risk1 <- a / (a + b)
risk3 <- c / (c + d)

rr <- risk1 / risk3
cat("Relative Risk (RR):", rr, "\n")
## Relative Risk (RR): 1.414849
# Tính Odds Ratio (OR)
or <- (a * d) / (b * c)
cat("Odds Ratio (OR):", or, "\n")
## Odds Ratio (OR): 1.778752

Kết luận:

Dựa trên bảng 2x2 giữa pclass và sex, kết quả cho thấy:

  • Relative Risk (RR) = 1.41: Tức là nguy cơ (xác suất) là nữ trong nhóm hành khách hạng vé 1 cao hơn 1.41 lần so với nhóm hạng vé 3.

-> Điều này cho thấy hành khách nữ có xu hướng chọn hạng vé cao (pclass 1) nhiều hơn so với hành khách nữ ở hạng vé phổ thông (pclass 3).

  • Odds Ratio (OR) = 1.78: Tỷ lệ nữ so với nam ở hạng vé 1 cao hơn 1.78 lần so với tỷ lệ đó ở hạng vé 3.

-> Nói cách khác, giới tính nữ phổ biến hơn tương đối ở hạng vé cao hơn.

3.2 Biến Embarked và biến Sex

*BẢng tần số chéchéo

tbl_sex_emb <- table(td$Sex, td$Embarked)
tbl_sex_emb
##         
##            C   Q   S
##   female  40  24  88
##   male    62  22 182
prop.table(tbl_sex_emb, margin = 2) * 100
##         
##                 C        Q        S
##   female 39.21569 52.17391 32.59259
##   male   60.78431 47.82609 67.40741

Tỷ lệ nữ theo từng bến:

C: 39.2%

Q: 52.2%

S: 32.6%

⟶ Có sự khác biệt rõ ràng trong tỷ lệ giới tính giữa các cảng lên tàu.

*Trực quan hóa

library(ggplot2)
# Sex vs Embarked
ggplot(td, aes(x = Embarked, fill = Sex)) +
  geom_bar(position = "fill") +
  ylab("Tỷ lệ") +
  scale_y_continuous(labels = scales::percent) +
  ggtitle("Tỷ lệ giới tính theo nơi lên tàu") +
  theme_minimal()

*Kiếm định Chi-bình phương

chisq.test(tbl_sex_emb)
## 
##  Pearson's Chi-squared test
## 
## data:  tbl_sex_emb
## X-squared = 6.9867, df = 2, p-value = 0.0304

Kiểm định Chi-bình phương: X² = 6.9867

df = 2

p-value = 0.0304

Kết luận: Có mối quan hệ có ý nghĩa thống kê giữa giới tính và nơi lên tàu (vì p < 0.05). Điều này cho thấy tỷ lệ nam và nữ không phân bố đồng đều giữa các điểm lên tàu.

*Relative Risk (RR) & Odds Ratio (OR)

if (!require(epitools)) install.packages("epitools")
## Loading required package: epitools
library(epitools)
td_bin <- subset(td, Embarked %in% c("S", "C"))
tbl <- table(td_bin$Sex, td_bin$Embarked)
riskratio(tbl)
## $data
##         
##            C   S Total
##   female  40  88   128
##   male    62 182   244
##   Total  102 270   372
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate    lower    upper
##   female 1.000000       NA       NA
##   male   1.084948 0.945231 1.245317
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   female         NA           NA         NA
##   male    0.2345738    0.2708785  0.2303184
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
oddsratio(tbl)
## $data
##         
##            C   S Total
##   female  40  88   128
##   male    62 182   244
##   Total  102 270   372
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate     lower    upper
##   female 1.000000        NA       NA
##   male   1.334262 0.8278558 2.137469
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   female         NA           NA         NA
##   male    0.2345738    0.2708785  0.2303184
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

*Relative Risk (RR) – với Embarked = C và S:

RR (nam so với nữ) = 1.08

Khoảng tin cậy 95%: (0.95 – 1.25)

p = 0.2346 ⟶ không có ý nghĩa thống kê

⟶ Nam có nguy cơ cao hơn một chút đi từ Southampton so với nữ, nhưng không đủ bằng chứng thống kê để khẳng định sự khác biệt.

*Odds Ratio (OR):

OR (nam so với nữ) = 1.33

Khoảng tin cậy 95%: (0.83 – 2.14)

p = 0.2346

⟶ Mặc dù tỷ lệ odds đi từ Southampton cao hơn ở nam, khác biệt không có ý nghĩa thống kê.

Kết luận: Kết quả phân tích cho thấy giới tính có mối liên hệ thống kê với bến lên tàu, nhưng khi so sánh xác suất cụ thể (RR và OR), sự khác biệt giữa nam và nữ khi lên từ cảng C và S không đủ mạnh để khẳng định có khác biệt thật sự về mặt thống kê.

4 Chương 4. Phân tích sự tác động của các biến còn lại lên biến Pclass

4.1 Biến Pclass và Sex

4.1.1 Bảng tần số chéo:

tbl_pclass_sex <- table(td$Pclass, td$Sex)
print(tbl_pclass_sex)
##    
##     female male
##   1     50   57
##   2     30   63
##   3     72  146
prop.table(tbl_pclass_sex, margin = 2) * 100  # phần trăm theo giới tính
##    
##       female     male
##   1 32.89474 21.42857
##   2 19.73684 23.68421
##   3 47.36842 54.88722

Tỷ lệ nữ ở mỗi hạng vé:

Pclass 1: 46.7%

Pclass 2: 32.3%

Pclass 3: 33.0%

4.1.2 Trực quan hóa:

library(ggplot2)

ggplot(td, aes(x = Sex, fill = Pclass)) +
  geom_bar(position = "fill") +
  ylab("Tỷ lệ") +
  ggtitle("Tỷ lệ hạng vé theo giới tính") +
  scale_y_continuous(labels = scales::percent_format())
## Warning: The following aesthetics were dropped during statistical transformation: fill.
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

4.1.3 Kiếm định Chi bình phương:

chisq.test(tbl_pclass_sex)
## 
##  Pearson's Chi-squared test
## 
## data:  tbl_pclass_sex
## X-squared = 6.6939, df = 2, p-value = 0.03519

Giá trị thống kê: χ² = 6.6939

Bậc tự do: df = 2

p-value = 0.0352

Kết luận: Có mối liên hệ có ý nghĩa thống kê giữa giới tính và hạng vé. Giới tính ảnh hưởng đến sự phân bố hành khách theo từng hạng vé.

4.1.4 Tính RR và OR

library(epitools)

td_sub1 <- subset(td, Pclass %in% c("1", "3"))
tbl_rr_or1 <- table(td_sub1$Pclass, td_sub1$Sex)
print(tbl_rr_or1)
##    
##     female male
##   1     50   57
##   3     72  146
riskratio(tbl_rr_or1)
## $data
##        
##         female male Total
##   1         50   57   107
##   3         72  146   218
##   Total    122  203   325
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate    lower    upper
##   1 1.000000       NA       NA
##   3 1.257203 1.028841 1.536251
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   1         NA           NA         NA
##   3 0.01784201   0.02045651 0.01652187
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
oddsratio(tbl_rr_or1)
## $data
##        
##         female male Total
##   1         50   57   107
##   3         72  146   218
##   Total    122  203   325
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate   lower   upper
##   1 1.000000      NA      NA
##   3 1.775235 1.10439 2.85704
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   1         NA           NA         NA
##   3 0.01784201   0.02045651 0.01652187
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

RR (female, 1 vs 3) = 1.41 → Nữ có khả năng đi Pclass 1 cao hơn 1.41 lần so với Pclass 3.

OR (female, 1 vs 3) = 1.78 → Tỷ lệ odds để là nữ trong Pclass 1 cao hơn 1.78 lần so với Pclass 3.

Kết luận: Nữ giới có xu hướng đi hạng vé cao hơn nam giới. Kết quả thống kê hỗ trợ giả thuyết rằng giới tính có ảnh hưởng đến phân tầng hành khách theo vé.’

4.2 Biến Pclass và Embarked

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

tbl_pclass_emb <- table(td$Pclass, td$Embarked)
print(tbl_pclass_emb)
##    
##       C   Q   S
##   1  56   1  50
##   2  11   4  78
##   3  35  41 142
prop.table(tbl_pclass_emb, margin = 2) * 100  # phần trăm theo nơi lên tàu
##    
##             C         Q         S
##   1 54.901961  2.173913 18.518519
##   2 10.784314  8.695652 28.888889
##   3 34.313725 89.130435 52.592593

Phân bố hạng vé có sự khác biệt rõ ràng giữa các cảng lên tàu.

4.2.2 Trực quan hóa

ggplot(td, aes(x = Embarked, fill = Pclass)) +
  geom_bar(position = "fill") +
  ylab("Tỷ lệ") +
  ggtitle("Tỷ lệ hạng vé theo nơi lên tàu") +
  scale_y_continuous(labels = scales::percent_format())
## Warning: The following aesthetics were dropped during statistical transformation: fill.
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

Biểu đồ cột tỷ lệ theo từng bến cho thấy:

Cherbourg (C): phần lớn hành khách đi Pclass 1

Queenstown (Q): gần như toàn bộ là Pclass 3

Southampton (S): chủ yếu là Pclass 3, một phần là Pclass 2

⟶ Biểu đồ củng cố sự khác biệt mạnh giữa các nhóm hành khách theo điểm khởi hành.

4.2.3 Kiếm định Chi bình phương

chisq.test(tbl_pclass_emb)
## 
##  Pearson's Chi-squared test
## 
## data:  tbl_pclass_emb
## X-squared = 82.832, df = 4, p-value < 2.2e-16

Giá trị thống kê: χ² = 82.832

df = 4

p-value < 2.2e-16

Kết luận: Có mối quan hệ rất có ý nghĩa thống kê giữa hạng vé và nơi lên tàu. Phân bố hạng vé không đồng đều giữa các cảng, và sự khác biệt là cực kỳ rõ rệt.

4.2.4 Tính RR và OR

td_sub2 <- subset(td, Pclass %in% c("1", "3") & Embarked %in% c("S", "C"))
tbl_rr_or2 <- table(td_sub2$Pclass, td_sub2$Embarked)
print(tbl_rr_or2)
##    
##       C   S
##   1  56  50
##   3  35 142
riskratio(tbl_rr_or2)
## $data
##        
##          C   S Total
##   1     56  50   106
##   3     35 142   177
##   Total 91 192   283
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate    lower    upper
##   1 1.000000       NA       NA
##   3 1.700791 1.372675 2.107339
## 
## $p.value
##    two-sided
##       midp.exact fisher.exact   chi.square
##   1           NA           NA           NA
##   3 1.305133e-08 1.888476e-08 8.285642e-09
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
oddsratio(tbl_rr_or2)
## $data
##        
##          C   S Total
##   1     56  50   106
##   3     35 142   177
##   Total 91 192   283
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate    lower    upper
##   1 1.000000       NA       NA
##   3 4.508035 2.663002 7.747982
## 
## $p.value
##    two-sided
##       midp.exact fisher.exact   chi.square
##   1           NA           NA           NA
##   3 1.305133e-08 1.888476e-08 8.285642e-09
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Relative Risk (RR)

RR (Pclass 3 so với Pclass 1) = 1.70

95% CI: (1.37 – 2.11)

p-value = 1.3 × 10⁻⁸

Diễn giải: Hành khách lên từ Southampton có nguy cơ đi Pclass 3 cao hơn 1.7 lần so với hành khách đi từ Cherbourg. Kết quả có ý nghĩa thống kê mạnh.

Odds Ratio (OR):

OR (Pclass 3 vs Pclass 1) = 4.51

95% CI: (2.66 – 7.75)

p-value ≈ 1.3 × 10⁻⁸

Diễn giải: Tỷ số odds để đi Pclass 3 ở người lên từ Southampton cao hơn 4.5 lần so với người lên từ Cherbourg. Mối quan hệ này có độ tin cậy rất cao.

-> Phân tích cho thấy nơi lên tàu (Embarked) có tác động rõ rệt và có ý nghĩa thống kê mạnh đến hạng vé (Pclass) của hành khách. Hành khách từ Cherbourg có xu hướng đi hạng cao (Pclass 1), trong khi hành khách từ Queenstown hoặc Southampton chủ yếu đi hạng phổ thông (Pclass 3).

Kết quả kiểm định Chi-bình phương, cùng với các chỉ số RR và OR, đều khẳng định mối liên hệ mạnh và đáng tin cậy giữa nơi lên tàu và điều kiện kinh tế – xã hội phản ánh qua loại vé.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA0IHbDoCA1Ig0KYXV0aG9yOiAixJDhurduZyBUaMO5eSBEdW5nIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojICoqQ0jGr8agTkcgMS4gR0nhu5pJIFRISeG7hlUgVuG7gCBC4buYIEThu64gTEnhu4ZVKioNCg0KYGBge3J9DQp0ZCA8LSByZWFkLmNzdigiQzovVXNlcnMvQWRtaW4vRG93bmxvYWRzL3RpdGFuaWMuY3N2IiwgaGVhZGVyID0gVCkNCnN0cih0ZCkNCmhlYWQodGQpDQpgYGANCg0KICBNw7QgdOG6oyBk4buvIGxp4buHdTogQuG7mSBk4buvIGxp4buHdSBn4buTbSA0MTggcXVhbiBzw6F0IChow6BuaCBraMOhY2gpIHbDoCA4IGJp4bq/biBiYW8gZ+G7k206IFBjbGFzcywgU2V4LCBBZ2UsIFNpYlNwLCAJUGFyY2gsIFRpY2tldCwgRmFyZSwgCUVtYmFya2VkLiBD4bulIHRo4buDIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgdHLDqm4gdGEgY8OzOg0KICANCiAgKipCaeG6v24gxJHhu4tuaCB0w61uaDoqKg0KICANCiAqIFBjbGFzczogSOG6oW5nIHbDqTogMSwgMiBob+G6t2MgMw0KIA0KICogU2V4OiBHaeG7m2kgdMOtbmggKEZlbWFsZS9NYWxlKQ0KIA0KICogVGlja2V0OiBNw6MgdsOpIHTDoHUNCiANCiAqIEVtYmFya2VkOiBD4bqjbmcgbMOqbiB0w6B1IChDLCBRLCBTKQ0KIA0KICAgKipCaeG6v24gxJHhu4tuaCBsxrDhu6NuZzoqKg0KICAgDQogICogQWdlOiBUdeG7lWkgDQogIA0KICAqIFNpYlNwOiBT4buRIGFuaC9jaOG7iy9lbSBob+G6t2MgduG7oy9jaOG7k25nIMSRaSBjw7luZw0KICANCiAgKiBQYXJjaDogU+G7kSBjaGEvbeG6uSBob+G6t2MgY29uIGPDoWkgxJFpIGPDuW5nDQogIA0KICAqIEZhcmU6IEdpw6EgdsOpDQogIA0KICBO4buZaSBkdW5nIGThu68gbGnhu4d1IOG7nyA1IHF1YW4gc8OhdCDEkeG6p3UgdsOgIDUgcXVhbiBzw6F0IGN14buRaSBi4bqjbmc6DQogIA0KYGBge3J9DQpoZWFkKHRkLDUpDQpgYGANCg0KYGBge3J9DQp0YWlsKHRkLCA1KQ0KYGBgDQogVGnhur9wIHRoZW8gxJHDsywgY2jDum5nIHRhIHPhur0ga2nhu4NtIHRyYSB0aMOqbSBjw6FjIGdpw6EgdHLhu4sgdGhp4bq/dSB0cm9uZyBi4buZIGThu68gbGnhu4d1DQogDQpgYGB7cn0NCmNvbFN1bXMoaXMubmEodGQpKQ0KYGBgDQogS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBraMO0bmcgY8OzIGdpw6EgdHLhu4sgdGhp4bq/dSAoTi9BKSBuw6BvIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgdHLDqm4uDQogDQogKipLaeG7g20gdHJhIGJp4bq/biDEkeG7i25oIHTDrW5oIGPDsyBwaOG6o2kgZOG6oW5nIGZhY3RvcioqDQogDQpgYGB7cn0NCmRpbmh0aW5oIDwtIGMoJ1BjbGFzcycsICdTZXgnLCAnVGlja2V0JywgJ0VtYmFya2VkJykNCmRhdGFfZGluaHRpbmggPC0gdGRbLGRpbmh0aW5oXQ0KI2tp4buDbSB0cmEgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7MgcGjhuqNpIGzDoCBmYWN0b3IgaGF5IGNoxrBhDQpmb3IgKGkgaW4gMTpuY29sKGRhdGFfZGluaHRpbmgpKSB7DQogIGEgPC0gaXMuZmFjdG9yKGRhdGFfZGluaHRpbmhbLGldKQ0KICBjYXQoY29sbmFtZXMoZGF0YV9kaW5odGluaClbaV0sIjoiLGEsIlxuIikNCn0NCmBgYA0KIENodXnhu4NuIMSR4buVaSBjw6FjIGJp4bq/biB0csOqbiBzYW5nIGtp4buDdSBmYWN0b3INCiANCmBgYHtyfQ0KIyBDaHV54buDbiB24buBIGThuqFuZyBmYWN0b3IgDQoNCmZvciAoaSBpbiAxOm5jb2woZGF0YV9kaW5odGluaCkpIHsNCiAgZGF0YV9kaW5odGluaFssaV0gPC0gYXMuZmFjdG9yKGRhdGFfZGluaHRpbmhbLGldKQ0KfQ0KDQojIEtp4buDbSB0cmEgbOG6oWkgDQpmb3IgKGkgaW4gMTpuY29sKGRhdGFfZGluaHRpbmgpKSB7DQogIGEgPC0gaXMuZmFjdG9yKGRhdGFfZGluaHRpbmhbLGldKQ0KICBjYXQoY29sbmFtZXMoZGF0YV9kaW5odGluaClbaV0sIjoiLGEsIlxuIikNCn0NCmBgYA0KIFNhdSBraGkga2nhu4NtIHRyYSBraeG7g3UgZOG7ryBsaeG7h3UgYmFuIMSR4bqndSwgY8OhYyBiaeG6v24gcGjDom4gbG/huqFpIG5oxrAgUGNsYXNzLCBTZXgsIFRpY2tldCwgRW1iYXJrZWQgxJHDoyDEkcaw4bujYyBjaHV54buDbiB04burIGtp4buDdSBjaGFyYWN0ZXIgc2FuZyBmYWN0b3IuIFThu5VuZyBj4buZbmcgY8OzIDQgYmnhur9uIMSRw6MgxJHGsOG7o2MgY2h1eeG7g24gxJHhu5VpIHRow6BuaCBjw7RuZy4NCiANCiMgKipDSMavxqBORyAyLiBQSMOCTiBUw41DSCBE4buuIExJ4buGVSoqDQoNCiMjICoqUGNsYXNzKioNCg0KYGBge3J9DQp0YWJsZSh0ZCRQY2xhc3MpDQpgYGANCioqUGNsYXNzIOKAkyBI4bqhbmcgdsOpOioqDQoNCiogSOG6oW5nIDE6IDEwNyBow6BuaCBraMOhY2gNCg0KKiBI4bqhbmcgMjogOTMgaMOgbmgga2jDoWNoDQoNCiogSOG6oW5nIDM6IDIxOCBow6BuaCBraMOhY2gNCiAgDQrihpIgxJBhIHPhu5EgaMOgbmgga2jDoWNoIMSRaSBo4bqhbmcgMw0KDQoqKkJp4buDdSDEkeG7kyBjaG8gUGNsYXNzKioNCg0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIiwgcmVwb3MgPSAiaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KICANCmxpYnJhcnkoZ2dwbG90MikNCiMgQmnhu4N1IMSR4buTIFBjbGFzcw0KZ2dwbG90KHRkLCBhZXMoeCA9IFBjbGFzcykpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSBo4bqhbmcgdsOpIChQY2xhc3MpIiwgeCA9ICJI4bqhbmcgdsOpIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQogIEvhur90IHF14bqjIHRo4buRbmcga8OqIGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIGjDoG5oIGtow6FjaCB0aHXhu5ljIGjhuqFuZyB2w6kgdGjhu6kgMyB24bubaSAyMTggbmfGsOG7nWksIGNoaeG6v20gaMahbiBt4buZdCBu4butYSB04buVbmcgc+G7kSBow6BuaCBraMOhY2guIEjhuqFuZyAxIHbDoCBo4bqhbmcgMiBs4bqnbiBsxrDhu6N0IGPDsyAxMDcgdsOgIDkzIG5nxrDhu51pLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB04bqnbmcgbOG7m3AgcGjhu5UgdGjDtG5nICho4bqhbmcgMykgbMOgIG5ow7NtIGtow6FjaCBjaMOtbmggdHLDqm4gY2h1eeG6v24gdMOgdSBUaXRhbmljLg0KDQoNCiMjICoqU2V4KioNCg0KYGBge3J9DQp0YWJsZSh0ZCRTZXgpDQpgYGANCioqU2V4IOKAkyBHaeG7m2kgdMOtbmg6KioNCg0KKiBOYW0gKG1hbGUpOiAyNjYgbmfGsOG7nWkNCg0KKiBO4buvIChmZW1hbGUpOiAxNTIgbmfGsOG7nWkNCg0K4oaSIE5hbSBnaeG7m2kgY2hp4bq/bSDGsHUgdGjhur8gKOKJiCA2NCUpDQoNCmBgYHtyfQ0KIyBCaeG7g3UgxJHhu5MgU2V4DQpnZ3Bsb3QodGQsIGFlcyh4ID0gU2V4KSkgKw0KICBnZW9tX2JhcihmaWxsID0gInRvbWF0byIpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGdp4bubaSB0w61uaCIsIHggPSAiR2nhu5tpIHTDrW5oIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQogIEdp4bubaSB0w61uaCBuYW0gY2hp4bq/bSDEkWEgc+G7kSB24bubaSAyNjYgbmfGsOG7nWkgKGtob+G6o25nIDY0JSksIHRyb25nIGtoaSBu4buvIGdp4bubaSBjw7MgMTUyIG5nxrDhu51pLiBT4buxIGNow6puaCBs4buHY2ggbsOgeSBwaOG6o24gw6FuaCBy4bqxbmcgaMOgbmgga2jDoWNoIG5hbSBuaGnhu4F1IGjGoW4gbuG7ryB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBuw6B5Lg0KICANCiMjICoqRW1iYXJrZWQqKg0KDQpgYGB7cn0NCnRhYmxlKHRkJEVtYmFya2VkKQ0KYGBgDQoqKkVtYmFya2VkIOKAkyBD4bqjbmcgbMOqbiB0w6B1OioqDQoNCiogQ+G6o25nIFMgKFNvdXRoYW1wdG9uKTogMjcwIG5nxrDhu51pDQoNCiogQ+G6o25nIEMgKENoZXJib3VyZyk6IDEwMiBuZ8aw4budaQ0KDQoqIEPhuqNuZyBRIChRdWVlbnN0b3duKTogNDYgbmfGsOG7nWkNCg0K4oaSIFBo4bqnbiBs4bubbiBow6BuaCBraMOhY2ggbMOqbiB0w6B1IHThuqFpIFNvdXRoYW1wdG9uDQoNCmBgYHtyfQ0KIyBCaeG7g3UgxJHhu5MgRW1iYXJrZWQNCmdncGxvdCh0ZCwgYWVzKHggPSBFbWJhcmtlZCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJkYXJrZ3JlZW4iKSArDQogIGxhYnModGl0bGUgPSAiQ+G6o25nIGzDqm4gdMOgdSIsIHggPSAiQ+G6o25nIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KICANCiAgQ+G6o25nIFNvdXRoYW1wdG9uIChTKSBsw6AgbsahaSBjw7Mgc+G7kSBsxrDhu6NuZyBow6BuaCBraMOhY2ggbMOqbiB0w6B1IG5oaeG7gXUgbmjhuqV0IHbhu5tpIDI3MCBuZ8aw4budaSwgdGnhur9wIHRoZW8gbMOgIENoZXJib3VyZyAoQykgduG7m2kgMTAyIG5nxrDhu51pIHbDoCBRdWVlbnN0b3duIChRKSB24bubaSA0NiBuZ8aw4budaS4gTmjGsCB24bqteSwgY+G6o25nIFMgbMOgIMSRaeG7g20geHXhuqV0IHBow6F0IGNow61uaCBj4bunYSBow6BuaCBraMOhY2ggdHLDqm4gdMOgdSBUaXRhbmljIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeS4NCg0KIyMgKipUaWNrZXQqKg0KDQpgYGB7cn0NCnRhYmxlKHRkJFRpY2tldCkNCmBgYA0KDQogIEJp4bq/biBUaWNrZXQgY8OzIHTDrW5oIGNo4bqldCDEkeG7i25oIGRhbmgsIG3hu5dpIGdpw6EgdHLhu4sgxJHhuqFpIGRp4buHbiBjaG8gbeG7mXQgbcOjIHbDqSBj4bulIHRo4buDIMSRxrDhu6NjIGPhuqVwIGNobyBow6BuaCBraMOhY2ggaG/hurdjIG5ow7NtIGjDoG5oIGtow6FjaC4gVHJvbmcgYuG7mSBk4buvIGxp4buHdSBn4buTbSA0MTggcXVhbiBzw6F0LCBjw7MgxJHhur9uIDM2MyBtw6MgdsOpIGtow6FjIG5oYXUsIHRyb25nIMSRw7MgcGjhuqduIGzhu5tuIGNo4buJIHh14bqldCBoaeG7h24gxJHDum5nIDEgbOG6p24uDQoNCiAgxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIGjhuqd1IGjhur90IGjDoG5oIGtow6FjaCBjw7MgbcOjIHbDqSByacOqbmcgYmnhu4d0LiBN4buZdCBz4buRIG3DoyB2w6kgbOG6t3AgbOG6oWkgbmhp4buBdSBoxqFuIDEgbOG6p24sIGNobyB0aOG6pXkgY8OzIHRo4buDIGzDoCBuaOG7r25nIGjDoG5oIGtow6FjaCDEkWkgY8O5bmcgbmjDs20sIHPhu60gZOG7pW5nIGNodW5nIHbDqS4gVHV5IG5oacOqbiwgZG8gc+G7kSBsxrDhu6NuZyBnacOhIHRy4buLIGR1eSBuaOG6pXQgcXXDoSBuaGnhu4F1LCBiaeG6v24gVGlja2V0IGtow7RuZyBwaMO5IGjhu6NwIMSR4buDIG3DtCB04bqjIGLhurFuZyBiaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IGhv4bq3YyBiaeG7g3UgxJHhu5MgY+G7mXQuIA0KICANCiMjICoqxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIC0ga2nhu4NtIMSR4buLbmggZ2nhuqMgdGhp4bq/dCoqDQoNCiAgKipDw6J1IGjhu49pIGdp4bqjIMSR4buLbmg6IExp4buHdSB0deG7lWkgdHJ1bmcgYsOsbmggY+G7p2EgaMOgbmgga2jDoWNoIGPDsyBi4bqxbmcgMzAga2jDtG5nPyoqDQoNCiAgICoqMS4gxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIGvhu7MgduG7jW5nIHR14buVaSoqDQogICANCmBgYHtyfQ0KIyBMb+G6oWkgYuG7jyBnacOhIHRy4buLIE5BIHRyxrDhu5tjIGtoaSBwaMOibiB0w61jaA0KYWdlX2RhdGEgPC0gbmEub21pdCh0ZCRBZ2UpDQoNCiMgVMOtbmgga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdHJ1bmcgYsOsbmgNCnQudGVzdChhZ2VfZGF0YSwgY29uZi5sZXZlbCA9IDAuOTUpDQoNCmBgYA0KICBE4buxYSB0csOqbiBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB0csOqbiwga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdHXhu5VpIHRydW5nIGLDrG5oIGPhu6dhIGjDoG5oIGtow6FjaCBu4bqxbSB0cm9uZyBraG/huqNuZzogWzI5Ljk1MTg7MzIuNzQ0M10NCg0K4oaSIE5naMSpYSBsw6AgduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSwgdHXhu5VpIHRydW5nIGLDrG5oIGPhu6dhIGjDoG5oIGtow6FjaCB0csOqbiB0w6B1IFRpdGFuaWMgbuG6sW0gZ2nhu69hIGtob+G6o25nIGfhuqduIDMwIMSR4bq/biBn4bqnbiAzMyB0deG7lWkuDQogDQogICoqMi4gS2nhu4NtIMSR4buLbmggZ2nhuqMgdGhp4bq/dCoqDQoNCiAgR2nhuqMgdGhp4bq/dDoNCg0KKiBIMDogzrwgPSAzMCAoVHXhu5VpIHRydW5nIGLDrG5oIGLhurFuZyAzMCkNCg0KKiBIMTogzrwg4omgIDMwIChUdeG7lWkgdHJ1bmcgYsOsbmgga2jDoWMgMzApDQoNCmBgYHtyfQ0KdC50ZXN0KGFnZV9kYXRhLCBtdSA9IDMwKQ0KYGBgDQoqIEdp4bqjIHRoaeG6v3QgZ+G7kWMgKEjigoApOiBUdeG7lWkgdHJ1bmcgYsOsbmggPSAzMA0KDQoqIEdp4bqjIHRoaeG6v3QgxJHhu5FpIChI4oKBKTogVHXhu5VpIHRydW5nIGLDrG5oIOKJoCAzMA0KDQogIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIHQ6DQoNCiogdCA9IDEuODk3OQ0KDQoqIGRmID0gNDE3DQoNCiogcC12YWx1ZSA9IDAuMDU4NA0KDQrihpIgVsOsIHAtdmFsdWUgPSAwLjA1ODQgPiAwLjA1LCB0YSBraMO0bmcgYsOhYyBi4buPIGdp4bqjIHRoaeG6v3QgSOKCgCDhu58gbeG7qWMgw70gbmdoxKlhIDUlLg0KDQojICoqQ0jGr8agTkcgMy4gUEjDgk4gVMONQ0ggVMOBQyDEkOG7mE5HIEPhu6ZBIEPDgUMgQknhur5OIMSQ4buKTkggVMONTkggTMOKTiBCSeG6vk4gU0VYKioNCg0KDQojIyAqKkJp4bq/biBQY2xhc3MgdsOgIFNleCoqDQoNCiMjIyAqKlThuqduIHPhu5EgY2jDqW8qKg0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoIkRUIiwgcmVwb3MgPSAiaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShEVCkNCg0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvDQp0YmwgPC0gdGFibGUodGQkUGNsYXNzLCB0ZCRTZXgpDQoNCiMgSW4gYuG6o25nIHThuqduIHN14bqldA0KcHJpbnQodGJsKQ0KDQojIENodXnhu4NuIGLhuqNuZyB04bqnbiBzdeG6pXQgdGjDoG5oIGRhdGEgZnJhbWUNCmRmX3RibCA8LSBhcy5kYXRhLmZyYW1lKHRibCkNCmNvbG5hbWVzKGRmX3RibCkgPC0gYygiUGNsYXNzIiwgIlNleCIsICJGcmVxdWVuY3kiKQ0KDQojIFTDrW5oIHThu5VuZyBz4buRIHF1YW4gc8OhdA0KdG90YWwgPC0gc3VtKGRmX3RibCRGcmVxdWVuY3kpDQoNCiMgVGjDqm0gY+G7mXQgcGjhuqduIHRyxINtIHRyw6puIHThu5VuZyBz4buRDQpkZl90YmwgPC0gZGZfdGJsICU+JQ0KICBtdXRhdGUoUGVyY2VudGFnZSA9IHBhc3RlMChyb3VuZChGcmVxdWVuY3kgLyB0b3RhbCAqIDEwMCwgMiksICIlIikpDQoNCg0KcHJpbnQoZGZfdGJsKQ0KZGF0YXRhYmxlKGRmX3RibCkNCg0KYGBgDQojIyMgKipUcuG7sWMgcXVhbiBow7NhKioNCiAgDQpgYGB7cn0NCmJhcnBsb3QodGJsLA0KICAgICAgICBiZXNpZGUgPSBUUlVFLA0KICAgICAgICBjb2wgPSBjKCJza3libHVlIiwgIm9yYW5nZSIsICJncmVlbiIpLA0KICAgICAgICBsZWdlbmQgPSByb3duYW1lcyh0YmwpLA0KICAgICAgICBtYWluID0gIkJhcnBsb3Q6IFBow6JuIGLhu5EgZ2nhu5tpIHTDrW5oIHRoZW8gaOG6oW5nIHbDqSIsDQogICAgICAgIHhsYWIgPSAiR2nhu5tpIHTDrW5oIiwgeWxhYiA9ICJT4buRIGzGsOG7o25nIikNCg0KYGBgDQoNCiAgKipOaOG6rW4geMOpdDoqKg0KICANCiAgS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2EgY8OhYyBuaMOzbSBow6BuaCBraMOhY2ggdGhlbyBo4bqhbmcgdsOpIChQY2xhc3MpIHbDoCBnaeG7m2kgdMOtbmggKFNleCkuDQogIA0KKiBUcm9uZyBz4buRIGjDoG5oIGtow6FjaCBu4buvLCBuaMOzbSBuaGnhu4F1IG5o4bqldCB0aHXhu5ljIGjhuqFuZyB2w6kgMyB24bubaSA3MiBuZ8aw4budaSwgY2hp4bq/bSAxNy4yMiUgdOG7lW5nIHPhu5EsIHRp4bq/cCB0aGVvIGzDoCBo4bqhbmcgdsOpIDEgduG7m2kgNTAgbmfGsOG7nWkgKDExLjk2JSkgdsOgIGjhuqFuZyB2w6kgMiB24bubaSAzMCBuZ8aw4budaSAoNy4xOCUpLg0KDQoqIMSQ4buRaSB24bubaSBow6BuaCBraMOhY2ggbmFtLCBuaMOzbSDEkcO0bmcgbmjhuqV0IGPFqW5nIGzDoCBo4bqhbmcgdsOpIDMgduG7m2kgMTQ2IG5nxrDhu51pLCBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IDM0LjkzJSwgc2F1IMSRw7MgbMOgIGjhuqFuZyB2w6kgMiB24bubaSA2MyBuZ8aw4budaSAoMTUuMDclKSB2w6AgaOG6oW5nIHbDqSAxIHbhu5tpIDU3IG5nxrDhu51pICgxMy42NCUpLg0KDQotPiBOaMawIHbhuq15LCBj4bqjIG5hbSB2w6AgbuG7ryDEkeG7gXUgY8OzIHh1IGjGsOG7m25nIHThuq1wIHRydW5nIMSRw7RuZyBuaOG6pXQg4bufIGjhuqFuZyB2w6kgcGjhu5UgdGjDtG5nIChwY2xhc3MgMykuIFR1eSBuaGnDqm4sIHThu7cgbOG7hyBuYW0gZ2nhu5tpIOG7nyBo4bqhbmcgdsOpIDMgY2hp4bq/bSBwaOG6p24gbOG7m24gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBu4buvIGdp4bubaSwgY2hvIHRo4bqleSBz4buxIGNow6puaCBs4buHY2ggduG7gSBwaMOibiBi4buRIGdp4bubaSB0w61uaCB0aGVvIGjhuqFuZyB2w6kuDQoNCiMjIyAgKipLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmc6KioNCiAgDQpgYGB7cn0NCnByb2QgPC0gdGFibGUodGQkUGNsYXNzLCB0ZCRTZXgpDQpjaGlzcS50ZXN0KHByb2QpDQojIyANCmBgYA0KICBW4bubaSBt4bupYyDDvSBuZ2jEqWEgdGjDtG5nIHRoxrDhu51uZyDOsSA9IDAuMDU6DQoNCiogRG8gcC12YWx1ZSA9IDAuMDM1MTkgPCAwLjA1LCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSDAuDQoNCiogTmdoxKlhIGzDoDogY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgZ2nhu5tpIHTDrW5oIChzZXgpIHbDoCBo4bqhbmcgdsOpIChwY2xhc3MpLg0KDQoqIE7Ds2kgY8OhY2gga2jDoWMsIHBow6JuIGLhu5EgZ2nhu5tpIHTDrW5oIGtow7RuZyDEkeG7k25nIMSR4buBdSBnaeG7r2EgY8OhYyBo4bqhbmcgdsOpLg0KDQogICoqS+G6v3QgbHXhuq1uOioqDQogIA0KICBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgY2hvIHRo4bqleSBy4bqxbmcgZ2nhu5tpIHTDrW5oIHbDoCBo4bqhbmcgdsOpIGPDsyBt4buRaSBxdWFuIGjhu4cgcGjhu6UgdGh14buZYy4gUGjDom4gYuG7kSBuYW0gdsOgIG7hu68gdGhheSDEkeG7lWkgdGhlbyB04burbmcgaOG6oW5nIHbDqSwgcGjhuqNuIMOhbmggc+G7sSBraMOhYyBiaeG7h3QgduG7gSBnaeG7m2kgdMOtbmggdHJvbmcgY8OhYyB04bqnbmcgbOG7m3AgaMOgbmgga2jDoWNoLg0KICANCiMjIyAqKlTDrW5oIFJlbGF0aXZlIFJpc2sgdsOgIE9kZHMgUmF0aW8qKg0KICANCiAgDQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIDJ4Mg0KdGJsXzJ4MiA8LSBtYXRyaXgoYyg1MCwgNTcsIDcyLCAxNDYpLCBucm93ID0gMiwgYnlyb3cgPSBUUlVFKQ0KY29sbmFtZXModGJsXzJ4MikgPC0gYygiZmVtYWxlIiwgIm1hbGUiKQ0Kcm93bmFtZXModGJsXzJ4MikgPC0gYygicGNsYXNzMSIsICJwY2xhc3MzIikNCg0KcHJpbnQodGJsXzJ4MikNCg0KIyBUw61uaCBSZWxhdGl2ZSBSaXNrIChSUikNCmEgPC0gdGJsXzJ4MlsxLCAxXSAgIyBwY2xhc3MxIC0gZmVtYWxlDQpiIDwtIHRibF8yeDJbMSwgMl0gICMgcGNsYXNzMSAtIG1hbGUNCmMgPC0gdGJsXzJ4MlsyLCAxXSAgIyBwY2xhc3MzIC0gZmVtYWxlDQpkIDwtIHRibF8yeDJbMiwgMl0gICMgcGNsYXNzMyAtIG1hbGUNCg0KIyBU4bu3IGzhu4cgbuG7ryDhu58gbeG7l2kgbmjDs20NCnJpc2sxIDwtIGEgLyAoYSArIGIpDQpyaXNrMyA8LSBjIC8gKGMgKyBkKQ0KDQpyciA8LSByaXNrMSAvIHJpc2szDQpjYXQoIlJlbGF0aXZlIFJpc2sgKFJSKToiLCByciwgIlxuIikNCg0KIyBUw61uaCBPZGRzIFJhdGlvIChPUikNCm9yIDwtIChhICogZCkgLyAoYiAqIGMpDQpjYXQoIk9kZHMgUmF0aW8gKE9SKToiLCBvciwgIlxuIikNCg0KYGBgDQogICoqS+G6v3QgbHXhuq1uOioqDQogIA0KICBE4buxYSB0csOqbiBi4bqjbmcgMngyIGdp4buvYSBwY2xhc3MgdsOgIHNleCwga+G6v3QgcXXhuqMgY2hvIHRo4bqleToNCg0KKiBSZWxhdGl2ZSBSaXNrIChSUikgPSAxLjQxOiBU4bupYyBsw6Agbmd1eSBjxqEgKHjDoWMgc3XhuqV0KSBsw6AgbuG7ryB0cm9uZyBuaMOzbSBow6BuaCBraMOhY2ggaOG6oW5nIHbDqSAxIGNhbyBoxqFuIDEuNDEgbOG6p24gc28gduG7m2kgbmjDs20gaOG6oW5nIHbDqSAzLg0KDQotPiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBow6BuaCBraMOhY2ggbuG7ryBjw7MgeHUgaMaw4bubbmcgY2jhu41uIGjhuqFuZyB2w6kgY2FvIChwY2xhc3MgMSkgbmhp4buBdSBoxqFuIHNvIHbhu5tpIGjDoG5oIGtow6FjaCBu4buvIOG7nyBo4bqhbmcgdsOpIHBo4buVIHRow7RuZyAocGNsYXNzIDMpLg0KDQoqIE9kZHMgUmF0aW8gKE9SKSA9IDEuNzg6IFThu7cgbOG7hyBu4buvIHNvIHbhu5tpIG5hbSDhu58gaOG6oW5nIHbDqSAxIGNhbyBoxqFuIDEuNzggbOG6p24gc28gduG7m2kgdOG7tyBs4buHIMSRw7Mg4bufIGjhuqFuZyB2w6kgMy4NCiAgDQotPiBOw7NpIGPDoWNoIGtow6FjLCBnaeG7m2kgdMOtbmggbuG7ryBwaOG7lSBiaeG6v24gaMahbiB0xrDGoW5nIMSR4buRaSDhu58gaOG6oW5nIHbDqSBjYW8gaMahbi4NCg0KIyMgKipCaeG6v24gRW1iYXJrZWQgdsOgIGJp4bq/biBTZXgqKg0KDQoqQuG6om5nIHThuqduIHPhu5EgY2jDqWNow6lvDQpgYGB7cn0NCnRibF9zZXhfZW1iIDwtIHRhYmxlKHRkJFNleCwgdGQkRW1iYXJrZWQpDQp0Ymxfc2V4X2VtYg0KcHJvcC50YWJsZSh0Ymxfc2V4X2VtYiwgbWFyZ2luID0gMikgKiAxMDANCmBgYA0KDQpU4bu3IGzhu4cgbuG7ryB0aGVvIHThu6tuZyBi4bq/bjoNCg0KQzogMzkuMiUNCg0KUTogNTIuMiUNCg0KUzogMzIuNiUNCg0K4p+2IEPDsyBz4buxIGtow6FjIGJp4buHdCByw7UgcsOgbmcgdHJvbmcgdOG7tyBs4buHIGdp4bubaSB0w61uaCBnaeG7r2EgY8OhYyBj4bqjbmcgbMOqbiB0w6B1Lg0KDQoqVHLhu7FjIHF1YW4gaMOzYQ0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCiMgU2V4IHZzIEVtYmFya2VkDQpnZ3Bsb3QodGQsIGFlcyh4ID0gRW1iYXJrZWQsIGZpbGwgPSBTZXgpKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArDQogIHlsYWIoIlThu7cgbOG7hyIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBnZ3RpdGxlKCJU4bu3IGzhu4cgZ2nhu5tpIHTDrW5oIHRoZW8gbsahaSBsw6puIHTDoHUiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCipLaeG6v20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcNCmBgYHtyfQ0KY2hpc3EudGVzdCh0Ymxfc2V4X2VtYikNCmBgYA0KIEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZzoNCljCsiA9IDYuOTg2Nw0KDQpkZiA9IDINCg0KcC12YWx1ZSA9IDAuMDMwNA0KDQogS+G6v3QgbHXhuq1uOiBDw7MgbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgbsahaSBsw6puIHTDoHUgKHbDrCBwIDwgMC4wNSkuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHThu7cgbOG7hyBuYW0gdsOgIG7hu68ga2jDtG5nIHBow6JuIGLhu5EgxJHhu5NuZyDEkeG7gXUgZ2nhu69hIGPDoWMgxJFp4buDbSBsw6puIHTDoHUuDQoNCipSZWxhdGl2ZSBSaXNrIChSUikgJiBPZGRzIFJhdGlvIChPUikNCg0KYGBge3J9DQppZiAoIXJlcXVpcmUoZXBpdG9vbHMpKSBpbnN0YWxsLnBhY2thZ2VzKCJlcGl0b29scyIpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KdGRfYmluIDwtIHN1YnNldCh0ZCwgRW1iYXJrZWQgJWluJSBjKCJTIiwgIkMiKSkNCnRibCA8LSB0YWJsZSh0ZF9iaW4kU2V4LCB0ZF9iaW4kRW1iYXJrZWQpDQpyaXNrcmF0aW8odGJsKQ0Kb2Rkc3JhdGlvKHRibCkNCg0KYGBgDQogICAgICAgICAgICAgICAgDQogICpSZWxhdGl2ZSBSaXNrIChSUikg4oCTIHbhu5tpIEVtYmFya2VkID0gQyB2w6AgUzoNCiAgDQpSUiAobmFtIHNvIHbhu5tpIG7hu68pID0gMS4wOA0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlOiAoMC45NSDigJMgMS4yNSkNCg0KcCA9IDAuMjM0NiDin7Yga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oNCg0K4p+2IE5hbSBjw7Mgbmd1eSBjxqEgY2FvIGjGoW4gbeG7mXQgY2jDunQgxJFpIHThu6sgU291dGhhbXB0b24gc28gduG7m2kgbuG7rywgbmjGsG5nIGtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBraOG6s25nIMSR4buLbmggc+G7sSBraMOhYyBiaeG7h3QuDQoNCiAgKk9kZHMgUmF0aW8gKE9SKToNCiAgDQpPUiAobmFtIHNvIHbhu5tpIG7hu68pID0gMS4zMw0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlOiAoMC44MyDigJMgMi4xNCkNCg0KcCA9IDAuMjM0Ng0KDQrin7YgTeG6t2MgZMO5IHThu7cgbOG7hyBvZGRzIMSRaSB04burIFNvdXRoYW1wdG9uIGNhbyBoxqFuIOG7nyBuYW0sIGtow6FjIGJp4buHdCBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KICAqKkvhur90IGx14bqtbjoqKiBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IGdp4bubaSB0w61uaCBjw7MgbeG7kWkgbGnDqm4gaOG7hyB0aOG7kW5nIGvDqiB24bubaSBi4bq/biBsw6puIHTDoHUsIG5oxrBuZyBraGkgc28gc8OhbmggeMOhYyBzdeG6pXQgY+G7pSB0aOG7gyAoUlIgdsOgIE9SKSwgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIG5hbSB2w6AgbuG7ryBraGkgbMOqbiB04burIGPhuqNuZyBDIHbDoCBTIGtow7RuZyDEkeG7pyBt4bqhbmggxJHhu4Mga2jhurNuZyDEkeG7i25oIGPDsyBraMOhYyBiaeG7h3QgdGjhuq10IHPhu7EgduG7gSBt4bq3dCB0aOG7kW5nIGvDqi4NCiAgDQojICoqQ2jGsMahbmcgNC4gUGjDom4gdMOtY2ggc+G7sSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyBiaeG6v24gY8OybiBs4bqhaSBsw6puIGJp4bq/biBQY2xhc3MqKg0KDQojIyAqKkJp4bq/biBQY2xhc3MgdsOgIFNleCoqDQoNCiMjIyAqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvOioqDQogIA0KYGBge3J9DQp0YmxfcGNsYXNzX3NleCA8LSB0YWJsZSh0ZCRQY2xhc3MsIHRkJFNleCkNCnByaW50KHRibF9wY2xhc3Nfc2V4KQ0KcHJvcC50YWJsZSh0YmxfcGNsYXNzX3NleCwgbWFyZ2luID0gMikgKiAxMDAgICMgcGjhuqduIHRyxINtIHRoZW8gZ2nhu5tpIHTDrW5oDQoNCmBgYA0KVOG7tyBs4buHIG7hu68g4bufIG3hu5dpIGjhuqFuZyB2w6k6DQoNClBjbGFzcyAxOiA0Ni43JQ0KDQpQY2xhc3MgMjogMzIuMyUNCg0KUGNsYXNzIDM6IDMzLjAlDQoNCiMjIyAqKlRy4buxYyBxdWFuIGjDs2E6KioNCiAgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KZ2dwbG90KHRkLCBhZXMoeCA9IFNleCwgZmlsbCA9IFBjbGFzcykpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsNCiAgeWxhYigiVOG7tyBs4buHIikgKw0KICBnZ3RpdGxlKCJU4bu3IGzhu4cgaOG6oW5nIHbDqSB0aGVvIGdp4bubaSB0w61uaCIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSkNCg0KYGBgDQoNCg0KIyMjICoqS2nhur9tIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nOioqDQogIA0KYGBge3J9DQpjaGlzcS50ZXN0KHRibF9wY2xhc3Nfc2V4KQ0KDQpgYGANCkdpw6EgdHLhu4sgdGjhu5FuZyBrw6o6IM+HwrIgPSA2LjY5MzkNCg0KQuG6rWMgdOG7sSBkbzogZGYgPSAyDQoNCnAtdmFsdWUgPSAwLjAzNTINCg0KIEvhur90IGx14bqtbjogQ8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBo4bqhbmcgdsOpLiBHaeG7m2kgdMOtbmgg4bqjbmggaMaw4bufbmcgxJHhur9uIHPhu7EgcGjDom4gYuG7kSBow6BuaCBraMOhY2ggdGhlbyB04burbmcgaOG6oW5nIHbDqS4NCg0KIyMjICoqVMOtbmggUlIgdsOgIE9SKioNCiAgDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQoNCnRkX3N1YjEgPC0gc3Vic2V0KHRkLCBQY2xhc3MgJWluJSBjKCIxIiwgIjMiKSkNCnRibF9ycl9vcjEgPC0gdGFibGUodGRfc3ViMSRQY2xhc3MsIHRkX3N1YjEkU2V4KQ0KcHJpbnQodGJsX3JyX29yMSkNCg0Kcmlza3JhdGlvKHRibF9ycl9vcjEpDQpvZGRzcmF0aW8odGJsX3JyX29yMSkNCg0KYGBgDQoNClJSIChmZW1hbGUsIDEgdnMgMykgPSAxLjQxDQrihpIgTuG7ryBjw7Mga2jhuqMgbsSDbmcgxJFpIFBjbGFzcyAxIGNhbyBoxqFuIDEuNDEgbOG6p24gc28gduG7m2kgUGNsYXNzIDMuDQoNCk9SIChmZW1hbGUsIDEgdnMgMykgPSAxLjc4DQrihpIgVOG7tyBs4buHIG9kZHMgxJHhu4MgbMOgIG7hu68gdHJvbmcgUGNsYXNzIDEgY2FvIGjGoW4gMS43OCBs4bqnbiBzbyB24bubaSBQY2xhc3MgMy4NCg0KIEvhur90IGx14bqtbjogTuG7ryBnaeG7m2kgY8OzIHh1IGjGsOG7m25nIMSRaSBo4bqhbmcgdsOpIGNhbyBoxqFuIG5hbSBnaeG7m2kuIEvhur90IHF14bqjIHRo4buRbmcga8OqIGjhu5cgdHLhu6MgZ2nhuqMgdGh1eeG6v3QgcuG6sW5nIGdp4bubaSB0w61uaCBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHBow6JuIHThuqduZyBow6BuaCBraMOhY2ggdGhlbyB2w6kuJw0KDQojIyAqKkJp4bq/biBQY2xhc3MgdsOgIEVtYmFya2VkKioNCg0KIyMjICoqQuG6o25nIHThuqduIHPhu5EgY2jDqW8qKg0KICANCmBgYHtyfQ0KdGJsX3BjbGFzc19lbWIgPC0gdGFibGUodGQkUGNsYXNzLCB0ZCRFbWJhcmtlZCkNCnByaW50KHRibF9wY2xhc3NfZW1iKQ0KcHJvcC50YWJsZSh0YmxfcGNsYXNzX2VtYiwgbWFyZ2luID0gMikgKiAxMDAgICMgcGjhuqduIHRyxINtIHRoZW8gbsahaSBsw6puIHTDoHUNCg0KYGBgDQogIFBow6JuIGLhu5EgaOG6oW5nIHbDqSBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLDoG5nIGdp4buvYSBjw6FjIGPhuqNuZyBsw6puIHTDoHUuDQogIA0KIyMjICoqVHLhu7FjIHF1YW4gaMOzYSoqDQogIA0KYGBge3J9DQpnZ3Bsb3QodGQsIGFlcyh4ID0gRW1iYXJrZWQsIGZpbGwgPSBQY2xhc3MpKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArDQogIHlsYWIoIlThu7cgbOG7hyIpICsNCiAgZ2d0aXRsZSgiVOG7tyBs4buHIGjhuqFuZyB2w6kgdGhlbyBuxqFpIGzDqm4gdMOgdSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSkNCg0KYGBgDQpCaeG7g3UgxJHhu5MgY+G7mXQgdOG7tyBs4buHIHRoZW8gdOG7q25nIGLhur9uIGNobyB0aOG6pXk6DQoNCkNoZXJib3VyZyAoQyk6IHBo4bqnbiBs4bubbiBow6BuaCBraMOhY2ggxJFpIFBjbGFzcyAxDQoNClF1ZWVuc3Rvd24gKFEpOiBn4bqnbiBuaMawIHRvw6BuIGLhu5kgbMOgIFBjbGFzcyAzDQoNClNvdXRoYW1wdG9uIChTKTogY2jhu6cgeeG6v3UgbMOgIFBjbGFzcyAzLCBt4buZdCBwaOG6p24gbMOgIFBjbGFzcyAyDQoNCuKftiBCaeG7g3UgxJHhu5MgY+G7p25nIGPhu5Egc+G7sSBraMOhYyBiaeG7h3QgbeG6oW5oIGdp4buvYSBjw6FjIG5ow7NtIGjDoG5oIGtow6FjaCB0aGVvIMSRaeG7g20ga2jhu59pIGjDoG5oLg0KDQojIyMgKipLaeG6v20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcqKg0KICANCmBgYHtyfQ0KY2hpc3EudGVzdCh0YmxfcGNsYXNzX2VtYikNCg0KYGBgDQpHacOhIHRy4buLIHRo4buRbmcga8OqOiDPh8KyID0gODIuODMyDQoNCmRmID0gNA0KDQpwLXZhbHVlIDwgMi4yZS0xNg0KDQogS+G6v3QgbHXhuq1uOiBDw7MgbeG7kWkgcXVhbiBo4buHIHLhuqV0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGjhuqFuZyB2w6kgdsOgIG7GoWkgbMOqbiB0w6B1LiBQaMOibiBi4buRIGjhuqFuZyB2w6kga2jDtG5nIMSR4buTbmcgxJHhu4F1IGdp4buvYSBjw6FjIGPhuqNuZywgdsOgIHPhu7Ega2jDoWMgYmnhu4d0IGzDoCBj4buxYyBr4buzIHLDtSBy4buHdC4NCg0KDQojIyMgKipUw61uaCBSUiB2w6AgT1IqKg0KICANCmBgYHtyfQ0KdGRfc3ViMiA8LSBzdWJzZXQodGQsIFBjbGFzcyAlaW4lIGMoIjEiLCAiMyIpICYgRW1iYXJrZWQgJWluJSBjKCJTIiwgIkMiKSkNCnRibF9ycl9vcjIgPC0gdGFibGUodGRfc3ViMiRQY2xhc3MsIHRkX3N1YjIkRW1iYXJrZWQpDQpwcmludCh0YmxfcnJfb3IyKQ0KDQpyaXNrcmF0aW8odGJsX3JyX29yMikNCm9kZHNyYXRpbyh0YmxfcnJfb3IyKQ0KDQpgYGANCg0KICAqKlJlbGF0aXZlIFJpc2sgKFJSKSoqDQoNClJSIChQY2xhc3MgMyBzbyB24bubaSBQY2xhc3MgMSkgPSAxLjcwDQoNCjk1JSBDSTogKDEuMzcg4oCTIDIuMTEpDQoNCnAtdmFsdWUgPSAxLjMgw5cgMTDigbvigbgNCg0KIERp4buFbiBnaeG6o2k6IEjDoG5oIGtow6FjaCBsw6puIHThu6sgU291dGhhbXB0b24gY8OzIG5ndXkgY8ahIMSRaSBQY2xhc3MgMyBjYW8gaMahbiAxLjcgbOG6p24gc28gduG7m2kgaMOgbmgga2jDoWNoIMSRaSB04burIENoZXJib3VyZy4gS+G6v3QgcXXhuqMgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBt4bqhbmguDQoNCiAgKipPZGRzIFJhdGlvIChPUik6KioNCiAgDQpPUiAoUGNsYXNzIDMgdnMgUGNsYXNzIDEpID0gNC41MQ0KDQo5NSUgQ0k6ICgyLjY2IOKAkyA3Ljc1KQ0KDQpwLXZhbHVlIOKJiCAxLjMgw5cgMTDigbvigbgNCg0KIERp4buFbiBnaeG6o2k6IFThu7cgc+G7kSBvZGRzIMSR4buDIMSRaSBQY2xhc3MgMyDhu58gbmfGsOG7nWkgbMOqbiB04burIFNvdXRoYW1wdG9uIGNhbyBoxqFuIDQuNSBs4bqnbiBzbyB24bubaSBuZ8aw4budaSBsw6puIHThu6sgQ2hlcmJvdXJnLiBN4buRaSBxdWFuIGjhu4cgbsOgeSBjw7MgxJHhu5kgdGluIGPhuq15IHLhuqV0IGNhby4NCiANCi0+IFBow6JuIHTDrWNoIGNobyB0aOG6pXkgbsahaSBsw6puIHTDoHUgKEVtYmFya2VkKSBjw7MgdMOhYyDEkeG7mW5nIHLDtSBy4buHdCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBt4bqhbmggxJHhur9uIGjhuqFuZyB2w6kgKFBjbGFzcykgY+G7p2EgaMOgbmgga2jDoWNoLiBIw6BuaCBraMOhY2ggdOG7qyBDaGVyYm91cmcgY8OzIHh1IGjGsOG7m25nIMSRaSBo4bqhbmcgY2FvIChQY2xhc3MgMSksIHRyb25nIGtoaSBow6BuaCBraMOhY2ggdOG7qyBRdWVlbnN0b3duIGhv4bq3YyBTb3V0aGFtcHRvbiBjaOG7pyB54bq/dSDEkWkgaOG6oW5nIHBo4buVIHRow7RuZyAoUGNsYXNzIDMpLg0KDQogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nLCBjw7luZyB24bubaSBjw6FjIGNo4buJIHPhu5EgUlIgdsOgIE9SLCDEkeG7gXUga2jhurNuZyDEkeG7i25oIG3hu5FpIGxpw6puIGjhu4cgbeG6oW5oIHbDoCDEkcOhbmcgdGluIGPhuq15IGdp4buvYSBuxqFpIGzDqm4gdMOgdSB2w6AgxJFp4buBdSBraeG7h24ga2luaCB04bq/IOKAkyB4w6MgaOG7mWkgcGjhuqNuIMOhbmggcXVhIGxv4bqhaSB2w6ku