1 LỜI CẢM ƠN

2 CHƯƠNG 1: PHẦN MỞ ĐẦU

2.1 Lý do chọn đề tài

Trong các năm gần đây, việc nghiên cứu về các yếu tố ảnh hưởng đến kết quả học tập của sinh viên đã trở thành một chủ đề quan trọng và đa dạng trong nghiên cứu giáo dục. Trong bối cảnh xã hội và kinh tế ngày càng biến động, việc hiểu rõ các yếu tố này có thể giúp các nhà quản lý giáo dục và chính sách xác định những biện pháp hỗ trợ hiệu quả để nâng cao chất lượng giáo dục và sự thành công học tập của sinh viên.

Sinh viên gần ra trường đang đối mặt với nhiều thách thức và áp lực, bao gồm sự chuyển đổi từ môi trường học tập sang môi trường làm việc, sự phải đối mặt với các quyết định liên quan đến sự nghiệp và cuộc sống, cũng như áp lực từ gia đình và xã hội. Vì vậy chúng tôi chọn nghiên cứu đề tài này nhằm cung cấp cái nhìn sâu sắc về
những thách thức mà họ đối mặt và những yếu tố quan trọng có thể ảnh hưởng đến hiệu suất học tập và thành công nghề nghiệp của họ sau này.

2.2 Mục tiêu nghiên cứu

Mục đích của nghiên cứu này là tìm hiểu và phân tích các yếu tố ảnh hưởng đến kết quả học tập của sinh viên gần ra trường. Thông qua việc xác định các yếu tố này, chúng ta có thể:

  • Đánh giá mức độ ảnh hưởng của các yếu tố khác nhau như giới tính, việc đi làm bán thời gian, mức độ căng thẳng,… và các yếu tố khác đối với hiệu suất học tập của sinh viên.

  • Cung cấp thông tin quan trọng cho nhà quản lý giáo dục và chính sách để phát triển các chương trình hỗ trợ và chính sách giáo dục phù hợp với nhu cầu của sinh viên gần ra trường.

  • Tạo ra cơ sở cho các nghiên cứu và thảo luận tiếp theo về việc cải thiện chất lượng giáo dục và chuẩn bị cho sự thành công sau tốt nghiệp.

2.3 Đối tượng và phạm vi nghiên cứu

Đối tượng nghiên cứu là sinh viên Đại học hoặc Cao đẳng ở khu vực

2.4 Kết cấu đề tài

Bài nghiên cứu bao gồm 4 chương:

Chương 1: Phần mở đầu

Chương 2: Tổng quan lý thuyết nghiên cứu

Chương 3: Kết quả nghiên cứu

Chương 4: Kết luận

3 CHƯƠNG 2: TỔNG QUAN LÝ THUYẾT NGHIÊN CỨU

3.1 Phân phối Poisson - Poisson Distribution

3.2 Phân phối nhị thức - Binomial Distribution

3.3 Mô hình hồi quy Logistic

3.4 Mô hình hồi quy Probit

3.5 Rủi ro tương đối (Relative Risk/ Risk Ratio)

3.6 Tỷ lệ chênh (Odd Ratio)

4 CHƯƠNG 3: KẾT QUẢ NGHIÊN CỨU

4.1 Dữ liệu nghiên cứu

Dữ liệu được chọn để nghiên cứu được lấy từ trang web Kaggle.com. Bộ dữ liệu này chứa thông tin được thu thập từ sinh viên đại học thông qua cuộc khảo sát bằng biểu mẫu Google với 19 biến và 235 quan sát. Cụ thể các biến như sau:

  • Gender: Giới tính của sinh viên là nam/ nữ

  • Department: Lĩnh vực học tập mà sinh viên đang theo học gồm: BCA là ngành Quản trị thương mại, Commerce là ngành Kinh doanh thương mại, Accounting and Finance là ngành Tài chính kế toán, ISM là ngành Quản lý công nghệ thông tin

  • 12th Mark: điểm mà sinh viên đạt được khi tốt nghiệp cấp 3

  • College Mark: Điểm ở trường Đại học hoặc Cao đẳng của sinh viên

  • Daily Studying Time: Lượng thời gian mà sinh viên dành ra cho việc học hàng ngày

  • Willingness to pursue a career based on their degree: Mức độ sẵn lòng theo đuổi nghề nghiệp liên quan đến bằng cấp của họ

  • Stress Level: Mức độ căng thẳng của sinh viên gồm: Awful là rất tệ, Bad là tệ, Fabulous là thoải mái và Good là tốt

  • Part-time Job: Sinh viên có làm việc bán thời gian hay không?

r = getOption("repos")
r["CRAN"] = "http://cran.us.r-project.org"
options(repos = r)
library(readxl)
d <- read_excel("C:/Users/Hoan Nguyen/Downloads/Data_PTDLDT.xlsx")
library(flextable)
install.packages("data.table")
## Installing package into 'C:/Users/Hoan Nguyen/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'data.table' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Hoan Nguyen\AppData\Local\Temp\Rtmp085mUO\downloaded_packages
library(data.table)
install.packages("dplyr")
## Installing package into 'C:/Users/Hoan Nguyen/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'dplyr' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Hoan Nguyen\AppData\Local\Temp\Rtmp085mUO\downloaded_packages
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:data.table':
## 
##     between, first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
install.packages("ggplot2")
## Installing package into 'C:/Users/Hoan Nguyen/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'ggplot2' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Hoan Nguyen\AppData\Local\Temp\Rtmp085mUO\downloaded_packages
library(ggplot2)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ✔ readr     2.1.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::between()     masks data.table::between()
## ✖ purrr::compose()     masks flextable::compose()
## ✖ dplyr::filter()      masks stats::filter()
## ✖ dplyr::first()       masks data.table::first()
## ✖ lubridate::hour()    masks data.table::hour()
## ✖ lubridate::isoweek() masks data.table::isoweek()
## ✖ dplyr::lag()         masks stats::lag()
## ✖ dplyr::last()        masks data.table::last()
## ✖ lubridate::mday()    masks data.table::mday()
## ✖ lubridate::minute()  masks data.table::minute()
## ✖ lubridate::month()   masks data.table::month()
## ✖ lubridate::quarter() masks data.table::quarter()
## ✖ lubridate::second()  masks data.table::second()
## ✖ purrr::transpose()   masks data.table::transpose()
## ✖ lubridate::wday()    masks data.table::wday()
## ✖ lubridate::week()    masks data.table::week()
## ✖ lubridate::yday()    masks data.table::yday()
## ✖ lubridate::year()    masks data.table::year()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
install.packages("DescTools")
## Installing package into 'C:/Users/Hoan Nguyen/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'DescTools' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Hoan Nguyen\AppData\Local\Temp\Rtmp085mUO\downloaded_packages
library(DescTools)
## 
## Attaching package: 'DescTools'
## 
## The following object is masked from 'package:data.table':
## 
##     %like%
install.packages("epitool")
## Installing package into 'C:/Users/Hoan Nguyen/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
library(AER)
## Loading required package: car
## Loading required package: carData
## 
## Attaching package: 'car'
## 
## The following object is masked from 'package:DescTools':
## 
##     Recode
## 
## The following object is masked from 'package:purrr':
## 
##     some
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## Loading required package: lmtest
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Loading required package: sandwich
## Loading required package: survival
library(DT)
  • Đặt lại tên biến để dễ dàng phân tích
d <- d %>%
  rename(
    gend = Gender,
    dep = Department,
    m12 = `12th Mark`,
    col = `college mark`,
    stu = `daily studing time`,
    wil = `willingness to pursue a career based on their degree`,
    stre = `Stress Level`,
    pat = `part-time job`
  )
d$col <- cut(d$col, breaks = c(0, 60, 80, 100), labels = c("Low", "Medium", "High"))
data.table(d)
##        gend      dep m12    col            stu  wil     stre pat
##   1:   Male      BCA  64 Medium  0 - 30 minute 0.50      Bad  No
##   2: Female      BCA  80 Medium 30 - 60 minute 0.75      Bad  No
##   3:   Male      BCA  61    Low     1 - 2 Hour 0.50    Awful  No
##   4: Female      BCA  59    Low     1 - 2 Hour 0.50      Bad  No
##   5:   Male      BCA  65    Low 30 - 60 minute 0.25     Good  No
##  ---                                                            
## 231:   Male      ISM  67 Medium 30 - 60 minute 0.50      Bad  No
## 232:   Male      ISM  70 Medium     2 - 3 hour 0.75     Good  No
## 233: Female      BCA  75 Medium 30 - 60 minute 0.50      Bad  No
## 234: Female Commerce  74 Medium  0 - 30 minute 0.75    Awful  No
## 235: Female      ISM  45    Low     3 - 4 hour 0.75 fabulous  No

4.1.1 Xác định biến phụ thuộc

4.1.1.1 Biến Định lượng

Biến định lượng bao gồm: m12 và wil

4.1.1.2 Biến định tính

Biến định tính bao gồm: gend, dep, stu, stre, pat, và biến col (đã được mã hóa thành biến định tính)

4.2 Thống kê mô tả

4.2.1 Thống kê mô tả cho một biến

4.2.1.1 Biến Gender

Bảng tần số

table(d$gend)
## 
## Female   Male 
##     79    156
a <- prop.table(table(d$gend)) * 100

Đồ thị

pie(a, labels = paste(names(a), round(a, 2), "%"),
    main = "Đồ thị tròn về tỷ lệ nam nữ")

Qua bảng tần số và đồ thị trên cho thấy trong bộ dữ liệu nghiên cứu số quan sát mang giới tính Nữ (Female) là 79 quan sát chiếm 33.62% và 156 quan sát còn lại là giới tính Nam (Male) chiếm 66.38%.

4.2.1.2 Biến Department

Bảng tần số

table(d$dep) %>% addmargins ()
## 
## Accounting and Finance                    BCA               Commerce 
##                     15                    132                     60 
##                    ISM                    Sum 
##                     28                    235
prop.table(table(d$dep)) * 100
## 
## Accounting and Finance                    BCA               Commerce 
##               6.382979              56.170213              25.531915 
##                    ISM 
##              11.914894

Đồ thị

b <- as.data.frame(table(d$dep)) 
colnames(b) <- c("Ngành", "Count")
ggplot(b, aes(x = Ngành, y = Count, fill = Ngành)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ thể hiện số lượng sinh viên theo các ngành học", x = "Các ngành học của sinh viên", y = "Số lượng") +
  theme_minimal()

Trong tổng 235 sinh viên được khảo sát: Sinh viên theo ngành BCA (Quản trị thương mại) chiếm hơn một nửa với 56,17% (132 sinh viên) và sinh viên theo ngành Accounting and Finance (Kế toán và Tài chính) là ít nhất với 6,383% (15 sinh viên). Sinh viên theo ngành Commerce (Kinh doanh thương mại) chiếm 25,532% (60 sinh viên), còn lại 28 sinh viên theo ngành học ISM (Quản lý hệ thống thông tin) chiếm 11,915%.

4.2.1.3 Biến 12th Mark

Bảng tần số, thống kê mô tả

table(d$m12) 
## 
##    45    47    48  49.5    50    51    52    53    54    55    57    58    59 
##     2     1     2     1    11     1     1     2     3     8     4     2     1 
##    60    61  61.3 61.33  61.6 61.67    62  62.6    63  63.3 63.66    64  64.8 
##    24     3     1     1     1     1     3     1     4     1     1     6     1 
##    65  65.3  65.5    66    67  67.5    68  68.1  68.3    69  69.7    70    71 
##    12     1     1     2     3     1     3     1     1     6     1    24     2 
##    72  72.8    73  73.3  73.8    74    75    76 76.77    77    78    79  79.5 
##     3     1     4     1     1     3    16     3     1     2     4     4     1 
##    80    81    82    83  83.5    84    85    86    87    88    89    90    91 
##    13     2     1     1     2     1     8     4     1     4     1     5     1 
##    92    94 
##     1     1
summary (d$m12)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   45.00   60.00   69.00   68.78   76.00   94.00

Đồ thị

hist(d$m12)

Kết quả của thống kê mô tả cho ta biết được số điểm lớp 12 mà sinh viên trong bộ dữ liệu đạt được trung bình là 68.8 điểm, số điểm cao nhất và thấp nhất mà sinh viên có thể đạt được lần lượt là 94 điểm và 45 điểm. Chủ yếu sinh viên có điểm lớp 12 trong khoảng từ 55 điểm tới 80 điểm là nhiều nhất. Từ 45 điểm tới dưới 55 điểm có số sinh viên đạt được thứ 2 và khoảng điểm ít sinh viên đạt được nhất là trên 80 điểm.

4.2.1.4 Biến college mark

Thay đổi biến định lượng thành định tính

c <- as.data.frame(table(d$col)) 
c
##     Var1 Freq
## 1    Low   60
## 2 Medium  126
## 3   High   49

Bảng tần số

prop.table(table(d$col)) * 100
## 
##      Low   Medium     High 
## 25.53191 53.61702 20.85106

Đồ thị

d1 <- (prop.table(table(d$col)) * 100) 
pie(d1, labels = paste(names(d1), round(d1, 2), "%"),
    main = "Đồ thị tròn về tỷ lệ điểm theo levels")

Với bộ dữ liệu nghiên cứu, tỷ lệ sinh viên đạt điểm đại học ở mức trung bình (60-80) chiếm đa số với 53,62%. Tỷ lệ sinh viên đạt điểm đại học ở mức thấp (0-60) chiếm 25,53% nhiều hơn tỷ lệ sinh viên đạt điểm đại học ở mức cao (80-100) chiếm 20.85%.

4.2.1.5 Biến Daily Studying Time

Bảng tần số

table(d$stu)
## 
##    0 - 30 minute       1 - 2 Hour       2 - 3 hour       3 - 4 hour 
##               46               61               24               15 
##   30 - 60 minute More Than 4 hour 
##               81                8

Dựa vào bảng tần số trên ta có thể biết được lượng thời gian hằng ngày mà sinh viên dành ra để học từ 0-30 phút có 46 sinh viên, từ 1-2 tiếng có 61 tiếng, 2-3 tiếng có 24 sinh viên, 3-4 tiếng có 15 sinh viên, 30-60 phút có 81 sinh viên, và sinh viên dành ra hơn 4 tiếng để học có 8 sinh viên

Bảng tần suất

table(d$stu)/sum(table(d$stu))
## 
##    0 - 30 minute       1 - 2 Hour       2 - 3 hour       3 - 4 hour 
##       0.19574468       0.25957447       0.10212766       0.06382979 
##   30 - 60 minute More Than 4 hour 
##       0.34468085       0.03404255

Dựa vào bảng tần suất trên ta có thể biết được lượng thời gian hằng ngày mà sinh viên dành ra để học từ 0-30 phút khoảng 19.57% sinh viên, từ 1-2 tiếng khoảng 25.96% tiếng, 2-3 tiếng khoảng 10.21% sinh viên, 3-4 tiếng khoảng 6.4% sinh viên, 30-60 phút khoảng 34.47% sinh viên, và sinh viên dành ra hơn 4 tiếng để học khoảng 3.4% sinh viên

Đồ thị

d |> ggplot( aes( x = stu, y= after_stat(count))) + geom_bar(fill='lightblue') + geom_text(aes(label= scales :: percent(after_stat(count/sum(count)),accuracy=.01)), stat = 'count', color= 'black', vjust= -.5) + theme_classic() + xlab('Số giờ học') + ylab('Tỷ lệ')

Nhìn chung, tỷ lệ sinh viên dành từ 30-60 phút mỗi ngày để học chiếm tỉ lệ cao nhất, với 34.47%, cho thấy rằng nhiều sinh viên có xu hướng học tập trong khoảng thời gian này. Đứng thứ hai là nhóm sinh viên dành từ 1-2 tiếng mỗi ngày để học, chiếm 25.96%, cho thấy một phần lớn sinh viên cũng dành thời gian đáng kể cho việc học tập của mình. Tuy nhiên tỷ lệ sinh viên dành hơn 4 tiếng mỗi ngày để học chỉ chiếm 3.4%, một con số khá ít, điều này cho thấy rất ít sinh viên sẵn sàng dành quá nhiều thời gian cho việc học mỗi ngày. Tương tự, chỉ có 6.4% sinh viên dành từ 3-4 tiếng học tập, và 10.21% dành 2-3 tiếng mỗi ngày. Đáng chú ý là có đến 19.57% sinh viên chỉ dành từ 0-30 phút mỗi ngày để học, điều này có thể cho thấy một phần sinh viên có thể gặp khó khăn trong việc dành thời gian cho học tập

4.2.1.6 Biến Willingness to pursue a career based on their degree

Bảng tần số

table(d$wil)
## 
##    0 0.25  0.5 0.75    1 
##    2   14   61  114   44

Dựa vào bảng tần số trên, ta có thể thấy được mức độ sinh viên không sẵn sàng theo đuổi nghề nghiệp dựa trên ngành học có 2 sinh viên, sinh viên sẵn sàng theo đuổi nghề nghiệp của họ ở mức 25% dựa trên ngành học có 14 sinh viên, sinh viên sẵn sàng theo đuổi nghề nghiệp của họ ở mức 50% dựa trên ngành học có 61 sinh viên, sinh viên sẵn sàng theo đuổi nghề nghiệp của họ ở mức 75% dựa trên ngành học có 114 sinh viên và sinh viên sẵn sàng theo đuổi nghề nghiệp của họ ở mức 100% dựa trên ngành học có 44 sinh viên

Bảng tần suất

table(d$wil)/sum(table(d$wil))
## 
##           0        0.25         0.5        0.75           1 
## 0.008510638 0.059574468 0.259574468 0.485106383 0.187234043

Dựa vào bảng tần suất trên, ta có thể thấy được mức độ sinh viên không sẵn sàng theo đuổi nghề nghiệp dựa trên ngành học có 0.8% sinh viên, sinh viên sẵn sàng theo đuổi nghề nghiệp của họ ở mức 25% dựa trên ngành học chiếm 5.9% sinh viên, sinh viên sẵn sàng theo đuổi nghề nghiệp của họ ở mức 50% dựa trên ngành học chiếm 25.96% sinh viên, sinh viên sẵn sàng theo đuổi nghề nghiệp của họ ở mức 75% dựa trên ngành học chiếm 48.51% sinh viên và sinh viên sẵn sàng theo đuổi nghề nghiệp của họ ở mức 100% dựa trên ngành học chiếm 18.72% sinh viên

Đồ thị

d |> ggplot( aes( x = wil, y= after_stat(count))) + geom_bar(fill='lightblue') + geom_text(aes(label= scales :: percent(after_stat(count/sum(count)),accuracy=.01)), stat = 'count', color= 'black', vjust= -.5) + theme_classic() + xlab('Mức độ căng thẳng') + ylab('Tỷ lệ')

Nhóm sinh viên không sẵn sàng theo đuổi nghề nghiệp dựa trên ngành học chỉ chiếm 0.85%, cho thấy rằng phần lớn sinh viên đều có một mức độ sẵn sàng nhất định để theo đuổi nghề nghiệp tương ứng với ngành học.

Nhóm sinh viên sẵn sàng theo đuổi nghề nghiệp dựa trên ngành học của mình ở mức độ 25% chiếm 5.9%, cho thấy một số sinh viên có quan tâm nhưng không hoàn toàn chắc chắn về việc sẽ gắn bó với nghề theo đúng ngành học của họ trong tương lai. Ngoài ra có đến 25.96% sinh viên sẵn sàng theo đuổi nghề nghiệp dựa trên ngành học của mình ở mức độ 50%, điều này có thể là do họ còn đang phân vân hoặc đang trong quá trình cân nhắc giữa các lựa chọn nghề nghiệp.

Một tỷ lệ lớn sinh viên, 48.51%, sẵn sàng theo đuổi nghề nghiệp của họ ở mức độ 75%, cho thấy sự định hướng rõ ràng và quyết tâm cao trong việc theo đuổi con đường nghề nghiệp theo đúng với ngành học của mình. Cuối cùng, có 18.72% sinh viên hoàn toàn sẵn sàng (100%) để theo đuổi nghề nghiệp dựa trên ngành học, thể hiện sự xác định và chắc chắn trong lựa chọn nghề nghiệp của họ.

4.2.1.7 Biến Stress Level

Bảng tần số

table(d$stre)
## 
##    Awful      Bad fabulous     Good 
##       19       68       11      137

Dựa vào kết quả trên ta có thể thấy, có 19 sinh viên cảm thấy mức độ căng thẳng của mình ở mức rất tệ. Đây cũng là mức thấp nhất trong các mức độ căng thẳng được khảo sát. Có 68 sinh viên cho rằng mức độ căng thẳng của họ là tệ. Có 11 sinh viên cho biết họ cảm thấy rất thoải mái và không căng thẳng. Có 137 sinh viên đánh giá mức độ căng thẳng của họ là tốt và đây là mức có số lượng sinh viên cao nhất, cho thấy phần lớn sinh viên cảm thấy thoải mái hoặc ít căng thẳng.

Bảng tần suất

table(d$stre)/sum(table(d$stre))
## 
##      Awful        Bad   fabulous       Good 
## 0.08085106 0.28936170 0.04680851 0.58297872

Để đánh giá mức độ căng thẳng theo % ta dựa vào bẳng tần suất trên. Số lượng sinh viên cảm thấy mức độ căng thẳng của mình ở mức rất tệ chiểm 8.09%. Số lượng sinh viên cảm thấy mức độ căng thẳng của mình ở mức tệ chiểm 28.94%. Số lượng sinh viên cảm thấy mức độ căng thẳng của mình ở mức thoải mái chiểm 4.68% và số lượng sinh viên cảm thấy mức độ căng thẳng của mình ở mức tốt chiểm 58.3%

Đồ thị

d |> ggplot( aes( x = stre, y= after_stat(count))) + geom_bar(fill='lightblue') + geom_text(aes(label= scales :: percent(after_stat(count/sum(count)),accuracy=.01)), stat = 'count', color= 'black', vjust= -.5) + theme_classic() + xlab('Mức độ căng thẳng') + ylab('Tỷ lệ')

4.2.1.8 Biến Part-time Job

Bảng tần số

table(d$pat)
## 
##  No Yes 
## 194  41

Dựa vào bảng tần số ta thấy, có 194 sinh viên không đi làm thêm bán thời gian, và có 41 sinh viên đi làm thêm bán thời gian.

Bảng tần suất

table(d$pat)/sum(table(d$pat))
## 
##        No       Yes 
## 0.8255319 0.1744681

Dựa vào bảng tần suất trên ta thấy, sinh viên không đi làm thêm bán thời gian chiếm 82.55% và sinh viên đi làm thêm bán thời gian chiếm 17.45%.

Đồ thị

m <- d
m <- table(d$pat)
m <- d |> group_by(pat) |> summarise(freq = n()) |> mutate(m, per = freq/sum(freq))
m |> ggplot(aes(x = '', y = per, fill = pat)) +
  geom_bar(stat = 'identity') + 
  coord_polar('y')

Nhìn vào độ thị trên ta có thể rõ ràng thấy được tỷ lệ sinh viên đi làm thêm bán thời gian không nhiều

4.2.2 Thống kê mô tả cho hai biến

Để hiểu rõ mối quan hệ và sự tương tác giữa các yếu tố ảnh hưởng đến kết quả học tập của sinh viên cũng như xác định những yếu tố ảnh hưởng lớn đến kết quả học tập của sinh viên, ta tiến hành thống kê mô tả với từng biến độc lập với biến phụ thuộc col (điểm đại học).

4.2.2.1 Biến col với biến stu

Bảng tần số

table(d$col, d$stu)
##         
##          0 - 30 minute 1 - 2 Hour 2 - 3 hour 3 - 4 hour 30 - 60 minute
##   Low               12         16          4          3             23
##   Medium            29         27         15          6             45
##   High               5         18          5          6             13
##         
##          More Than 4 hour
##   Low                   2
##   Medium                4
##   High                  2
addmargins(table(d$col, d$stu))
##         
##          0 - 30 minute 1 - 2 Hour 2 - 3 hour 3 - 4 hour 30 - 60 minute
##   Low               12         16          4          3             23
##   Medium            29         27         15          6             45
##   High               5         18          5          6             13
##   Sum               46         61         24         15             81
##         
##          More Than 4 hour Sum
##   Low                   2  60
##   Medium                4 126
##   High                  2  49
##   Sum                   8 235

Bảng tần số trên cho ta thấy: - Có 12 sinh viên dành từ 0-30 phút cho việc học mỗi ngày thì có số điểm thấp - Có 16 sinh viên dành từ 1-2 tiếng cho việc học mỗi ngày thì có số điểm thấp - Có 4 sinh viên dành từ 2-3 tiếng cho việc học mỗi ngày thì có số điểm thấp

Bảng tần suất

prop.table(table(d$col, d$stu))
##         
##          0 - 30 minute  1 - 2 Hour  2 - 3 hour  3 - 4 hour 30 - 60 minute
##   Low      0.051063830 0.068085106 0.017021277 0.012765957    0.097872340
##   Medium   0.123404255 0.114893617 0.063829787 0.025531915    0.191489362
##   High     0.021276596 0.076595745 0.021276596 0.025531915    0.055319149
##         
##          More Than 4 hour
##   Low         0.008510638
##   Medium      0.017021277
##   High        0.008510638
addmargins(prop.table(table(d$col, d$stu)))
##         
##          0 - 30 minute  1 - 2 Hour  2 - 3 hour  3 - 4 hour 30 - 60 minute
##   Low      0.051063830 0.068085106 0.017021277 0.012765957    0.097872340
##   Medium   0.123404255 0.114893617 0.063829787 0.025531915    0.191489362
##   High     0.021276596 0.076595745 0.021276596 0.025531915    0.055319149
##   Sum      0.195744681 0.259574468 0.102127660 0.063829787    0.344680851
##         
##          More Than 4 hour         Sum
##   Low         0.008510638 0.255319149
##   Medium      0.017021277 0.536170213
##   High        0.008510638 0.208510638
##   Sum         0.034042553 1.000000000

Đồ thị

ggplot(d, aes(stu, fill = col)) + geom_bar(position = 'dodge') +  labs(x = "Thời gian dành ra học", y = "Điểm")

4.2.2.2 Biến col với biến wil

Bảng tần số

table(d$col, d$wil)
##         
##           0 0.25 0.5 0.75  1
##   Low     1    6  19   29  5
##   Medium  1    6  34   64 21
##   High    0    2   8   21 18
addmargins(table(d$col, d$wil))
##         
##            0 0.25 0.5 0.75   1 Sum
##   Low      1    6  19   29   5  60
##   Medium   1    6  34   64  21 126
##   High     0    2   8   21  18  49
##   Sum      2   14  61  114  44 235

Bảng tần suất

prop.table(table(d$col, d$wil))
##         
##                    0        0.25         0.5        0.75           1
##   Low    0.004255319 0.025531915 0.080851064 0.123404255 0.021276596
##   Medium 0.004255319 0.025531915 0.144680851 0.272340426 0.089361702
##   High   0.000000000 0.008510638 0.034042553 0.089361702 0.076595745
addmargins(prop.table(table(d$col, d$wil)))
##         
##                    0        0.25         0.5        0.75           1
##   Low    0.004255319 0.025531915 0.080851064 0.123404255 0.021276596
##   Medium 0.004255319 0.025531915 0.144680851 0.272340426 0.089361702
##   High   0.000000000 0.008510638 0.034042553 0.089361702 0.076595745
##   Sum    0.008510638 0.059574468 0.259574468 0.485106383 0.187234043
##         
##                  Sum
##   Low    0.255319149
##   Medium 0.536170213
##   High   0.208510638
##   Sum    1.000000000

Đồ thị

ggplot(d, aes(x = col, y = wil, fill = col)) +
  geom_boxplot() +
  labs(x = "Điểm", y = "Mức độ sẵn sàng") +
  theme_minimal()

4.2.2.3 Biến col với biến stre

Bảng tần số

table(d$col, d$stre)
##         
##          Awful Bad fabulous Good
##   Low        4  24        4   28
##   Medium    13  36        4   73
##   High       2   8        3   36
addmargins(table(d$col, d$stre))
##         
##          Awful Bad fabulous Good Sum
##   Low        4  24        4   28  60
##   Medium    13  36        4   73 126
##   High       2   8        3   36  49
##   Sum       19  68       11  137 235

Bảng tần suất

prop.table(table(d$col, d$stre))
##         
##                Awful         Bad    fabulous        Good
##   Low    0.017021277 0.102127660 0.017021277 0.119148936
##   Medium 0.055319149 0.153191489 0.017021277 0.310638298
##   High   0.008510638 0.034042553 0.012765957 0.153191489
addmargins(prop.table(table(d$col, d$stre)))
##         
##                Awful         Bad    fabulous        Good         Sum
##   Low    0.017021277 0.102127660 0.017021277 0.119148936 0.255319149
##   Medium 0.055319149 0.153191489 0.017021277 0.310638298 0.536170213
##   High   0.008510638 0.034042553 0.012765957 0.153191489 0.208510638
##   Sum    0.080851064 0.289361702 0.046808511 0.582978723 1.000000000

Đồ thị

ggplot(d, aes(stre, fill = col)) + geom_bar(position = 'dodge') +  labs(x = "Mức độ căng thẳng", y = "Điểm")

4.2.2.4 Biến col với biến pat

Bảng tần số

table(d$col, d$pat)
##         
##           No Yes
##   Low     51   9
##   Medium 100  26
##   High    43   6
addmargins(table(d$col, d$pat))
##         
##           No Yes Sum
##   Low     51   9  60
##   Medium 100  26 126
##   High    43   6  49
##   Sum    194  41 235

Bảng tần suất

prop.table(table(d$col, d$pat))
##         
##                  No        Yes
##   Low    0.21702128 0.03829787
##   Medium 0.42553191 0.11063830
##   High   0.18297872 0.02553191
addmargins(prop.table(table(d$col, d$pat)))
##         
##                  No        Yes        Sum
##   Low    0.21702128 0.03829787 0.25531915
##   Medium 0.42553191 0.11063830 0.53617021
##   High   0.18297872 0.02553191 0.20851064
##   Sum    0.82553191 0.17446809 1.00000000

Đồ thị

ggplot(d, aes(pat, fill = col)) + geom_bar(position = 'dodge') +  labs(x = "Làm bán thời gian", y = "Điểm")

4.2.3 Tỷ lệ chênh

4.3 Thống kê suy diễn

4.3.1 Kiểm định tính độc lập cho hai biến

4.3.2 Khoảng ước lượng tỷ lệ

4.4 Mô hình hồi quy

4.5 Mô hình hồi quy logit

4.6 Mô hình hồi quy probit

4.7 Mô hình hồi quy cloglog

4.8 Lựa chọn mô hình phù hợp

5 CHƯƠNG 4: KẾT LUẬN

LS0tDQp0aXRsZTogIlBow6JuIHTDrWNoIG5o4buvbmcgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24ga+G6v3QgcXXhuqMgaOG7jWMgdOG6rXAgY+G7p2Egc2luaCB2acOqbiINCmF1dGhvcjogIk5ndXnhu4VuIFRo4buLIFRoYW5oIFRyw7pjIg0KZGF0ZTogIjIwMjQtMDYtMTIiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgaGlnaGxpZ2h0OiBrYXRlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KPHN0eWxlPg0KYm9keSB7DQp0ZXh0LWFsaWduOiBqdXN0aWZ5fQ0KPC9zdHlsZT4NCg0KIyBM4bucSSBD4bqiTSDGoE4NCg0KIyBDSMavxqBORyAxOiBQSOG6pk4gTeG7niDEkOG6plUNCg0KIyMgTMO9IGRvIGNo4buNbiDEkeG7gSB0w6BpDQoNClRyb25nIGPDoWMgbsSDbSBn4bqnbiDEkcOieSwgdmnhu4djIG5naGnDqm4gY+G7qXUgduG7gSBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGvhur90IHF14bqjIGjhu41jIHThuq1wIGPhu6dhIHNpbmggdmnDqm4gxJHDoyB0cuG7nyB0aMOgbmggbeG7mXQgY2jhu6cgxJHhu4EgcXVhbiB0cuG7jW5nIHbDoCDEkWEgZOG6oW5nIHRyb25nIG5naGnDqm4gY+G7qXUgZ2nDoW8gZOG7pWMuIFRyb25nIGLhu5FpIGPhuqNuaCB4w6MgaOG7mWkgdsOgIGtpbmggdOG6vyBuZ8OgeSBjw6BuZyBiaeG6v24gxJHhu5luZywgdmnhu4djIGhp4buDdSByw7UgY8OhYyB54bq/dSB04buRIG7DoHkgY8OzIHRo4buDIGdpw7pwIGPDoWMgbmjDoCBxdeG6o24gbMO9IGdpw6FvIGThu6VjIHbDoCBjaMOtbmggc8OhY2ggeMOhYyDEkeG7i25oIG5o4buvbmcgYmnhu4duIHBow6FwIGjhu5cgdHLhu6MgaGnhu4d1IHF14bqjIMSR4buDIG7Dom5nIGNhbyBjaOG6pXQgbMaw4bujbmcgZ2nDoW8gZOG7pWMgdsOgIHPhu7EgdGjDoG5oIGPDtG5nIGjhu41jIHThuq1wIGPhu6dhIHNpbmggdmnDqm4uDQoNClNpbmggdmnDqm4gZ+G6p24gcmEgdHLGsOG7nW5nIMSRYW5nIMSR4buRaSBt4bq3dCB24bubaSBuaGnhu4F1IHRow6FjaCB0aOG7qWMgdsOgIMOhcCBs4buxYywgYmFvIGfhu5NtIHPhu7EgY2h1eeG7g24gxJHhu5VpIHThu6sgbcO0aSB0csaw4budbmcgaOG7jWMgDQp04bqtcCBzYW5nIG3DtGkgdHLGsOG7nW5nIGzDoG0gdmnhu4djLCBz4buxIHBo4bqjaSDEkeG7kWkgbeG6t3QgduG7m2kgY8OhYyBxdXnhur90IMSR4buLbmggbGnDqm4gcXVhbiDEkeG6v24gc+G7sSBuZ2hp4buHcCB2w6AgY3Xhu5ljIHPhu5FuZywgY8WpbmcgbmjGsCDDoXAgbOG7sWMgdOG7qyBnaWEgxJHDrG5oIHbDoCB4w6MgaOG7mWkuIFbDrCB24bqteSBjaMO6bmcgdMO0aSBjaOG7jW4gbmdoacOqbiBj4bupdSDEkeG7gSB0w6BpIG7DoHkgbmjhurFtIGN1bmcgY+G6pXAgY8OhaSBuaMOsbiBzw6J1IHPhuq9jIHbhu4EgIA0Kbmjhu69uZyB0aMOhY2ggdGjhu6ljIG3DoCBo4buNIMSR4buRaSBt4bq3dCB2w6Agbmjhu69uZyB54bq/dSB04buRIHF1YW4gdHLhu41uZyBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGhp4buHdSBzdeG6pXQgaOG7jWMgdOG6rXAgdsOgIHRow6BuaCBjw7RuZyANCm5naOG7gSBuZ2hp4buHcCBj4bunYSBo4buNIHNhdSBuw6B5Lg0KDQojIyBN4bulYyB0acOqdSBuZ2hpw6puIGPhu6l1DQoNCk3hu6VjIMSRw61jaCBj4bunYSBuZ2hpw6puIGPhu6l1IG7DoHkgbMOgIHTDrG0gaGnhu4N1IHbDoCBwaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGvhur90IHF14bqjIGjhu41jIHThuq1wIGPhu6dhIHNpbmggdmnDqm4gZ+G6p24gcmEgdHLGsOG7nW5nLiBUaMO0bmcgcXVhIHZp4buHYyB4w6FjIMSR4buLbmggY8OhYyB54bq/dSB04buRIG7DoHksIGNow7puZyB0YSBjw7MgdGjhu4M6DQoNCiAgKiDEkMOhbmggZ2nDoSBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSBjw6FjIHnhur91IHThu5Ega2jDoWMgbmhhdSBuaMawIGdp4bubaSB0w61uaCwgdmnhu4djIMSRaSBsw6BtIGLDoW4gdGjhu51pIGdpYW4sIG3hu6ljIMSR4buZIGPEg25nIHRo4bqzbmcsLi4uIHbDoCBjw6FjIHnhur91IHThu5Ega2jDoWMgxJHhu5FpIHbhu5tpIGhp4buHdSBzdeG6pXQgaOG7jWMgdOG6rXAgY+G7p2Egc2luaCB2acOqbi4NCiAgDQogICogQ3VuZyBj4bqlcCB0aMO0bmcgdGluIHF1YW4gdHLhu41uZyBjaG8gbmjDoCBxdeG6o24gbMO9IGdpw6FvIGThu6VjIHbDoCBjaMOtbmggc8OhY2ggxJHhu4MgcGjDoXQgdHJp4buDbiBjw6FjIGNoxrDGoW5nIHRyw6xuaCBo4buXIHRy4bujIA0KdsOgIGNow61uaCBzw6FjaCBnacOhbyBk4bulYyBwaMO5IGjhu6NwIHbhu5tpIG5odSBj4bqndSBj4bunYSBzaW5oIHZpw6puIGfhuqduIHJhIHRyxrDhu51uZy4NCg0KICAqIFThuqFvIHJhIGPGoSBz4bufIGNobyBjw6FjIG5naGnDqm4gY+G7qXUgdsOgIHRo4bqjbyBsdeG6rW4gdGnhur9wIHRoZW8gduG7gSB2aeG7h2MgY+G6o2kgdGhp4buHbiBjaOG6pXQgbMaw4bujbmcgZ2nDoW8gZOG7pWMgdsOgIGNodeG6qW4gYuG7iyBjaG8gc+G7sSB0aMOgbmggY8O0bmcgc2F1IHThu5F0IG5naGnhu4dwLg0KDQojIyDEkOG7kWkgdMaw4bujbmcgdsOgIHBo4bqhbSB2aSBuZ2hpw6puIGPhu6l1DQoNCiAgxJDhu5FpIHTGsOG7o25nIG5naGnDqm4gY+G7qXUgbMOgIHNpbmggdmnDqm4gxJDhuqFpIGjhu41jIGhv4bq3YyBDYW8gxJHhurNuZyDhu58ga2h1IHbhu7FjDQoNCiMjIEvhur90IGPhuqV1IMSR4buBIHTDoGkNCg0KICBCw6BpIG5naGnDqm4gY+G7qXUgYmFvIGfhu5NtIDQgY2jGsMahbmc6DQogIA0KICAqQ2jGsMahbmcgMToqIFBo4bqnbiBt4bufIMSR4bqndQ0KICANCiAgKkNoxrDGoW5nIDI6KiBU4buVbmcgcXVhbiBsw70gdGh1eeG6v3QgbmdoacOqbiBj4bupdQ0KICANCiAgKkNoxrDGoW5nIDM6KiBL4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1DQogIA0KICAqQ2jGsMahbmcgNDoqIEvhur90IGx14bqtbg0KDQojIENIxq/GoE5HIDI6IFThu5RORyBRVUFOIEzDnSBUSFVZ4bq+VCBOR0hJw4pOIEPhu6hVDQoNCiMjIFBow6JuIHBo4buRaSBQb2lzc29uIC0gUG9pc3NvbiBEaXN0cmlidXRpb24NCg0KIyMgUGjDom4gcGjhu5FpIG5o4buLIHRo4bupYyAtIEJpbm9taWFsIERpc3RyaWJ1dGlvbg0KDQojIyBNw7QgaMOsbmggaOG7k2kgcXV5IExvZ2lzdGljDQoNCiMjIE3DtCBow6xuaCBo4buTaSBxdXkgUHJvYml0DQoNCiMjIFLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIChSZWxhdGl2ZSBSaXNrLyBSaXNrIFJhdGlvKQ0KDQojIyBU4bu3IGzhu4cgY2jDqm5oIChPZGQgUmF0aW8pDQoNCiMgQ0jGr8agTkcgMzogS+G6vlQgUVXhuqIgTkdIScOKTiBD4buoVQ0KDQojIyBE4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1DQoNCkThu68gbGnhu4d1IMSRxrDhu6NjIGNo4buNbiDEkeG7gyBuZ2hpw6puIGPhu6l1IMSRxrDhu6NjIGzhuqV5IHThu6sgdHJhbmcgd2ViIEthZ2dsZS5jb20uIELhu5kgZOG7ryBsaeG7h3UgbsOgeSBjaOG7qWEgdGjDtG5nIHRpbiDEkcaw4bujYyB0aHUgdGjhuq1wIHThu6sgc2luaCB2acOqbiDEkeG6oWkgaOG7jWMgdGjDtG5nIHF1YSBjdeG7mWMga2jhuqNvIHPDoXQgYuG6sW5nIGJp4buDdSBt4bqrdSBHb29nbGUgduG7m2kgMTkgYmnhur9uIHbDoCAyMzUgcXVhbiBzw6F0LiBD4bulIHRo4buDIGPDoWMgYmnhur9uIG5oxrAgc2F1Og0KDQogICogR2VuZGVyOiBHaeG7m2kgdMOtbmggY+G7p2Egc2luaCB2acOqbiBsw6AgbmFtLyBu4buvDQogIA0KICAqIERlcGFydG1lbnQ6IEzEqW5oIHbhu7FjIGjhu41jIHThuq1wIG3DoCBzaW5oIHZpw6puIMSRYW5nIHRoZW8gaOG7jWMgZ+G7k206IEJDQSBsw6AgbmfDoG5oIFF14bqjbiB0cuG7iyB0aMawxqFuZyBt4bqhaSwgQ29tbWVyY2UgbMOgIG5nw6BuaCBLaW5oIGRvYW5oIHRoxrDGoW5nIG3huqFpLCBBY2NvdW50aW5nIGFuZCBGaW5hbmNlIGzDoCBuZ8OgbmggVMOgaSBjaMOtbmgga+G6vyB0b8OhbiwgSVNNIGzDoCBuZ8OgbmggUXXhuqNuIGzDvSBjw7RuZyBuZ2jhu4cgdGjDtG5nIHRpbg0KICANCiAgKiAxMnRoIE1hcms6IMSRaeG7g20gbcOgIHNpbmggdmnDqm4gxJHhuqF0IMSRxrDhu6NjIGtoaSB04buRdCBuZ2hp4buHcCBj4bqlcCAzDQogIA0KICAqIENvbGxlZ2UgTWFyazogxJBp4buDbSDhu58gdHLGsOG7nW5nIMSQ4bqhaSBo4buNYyBob+G6t2MgQ2FvIMSR4bqzbmcgY+G7p2Egc2luaCB2acOqbiANCiAgDQogICogRGFpbHkgU3R1ZHlpbmcgVGltZTogTMaw4bujbmcgdGjhu51pIGdpYW4gbcOgIHNpbmggdmnDqm4gZMOgbmggcmEgY2hvIHZp4buHYyBo4buNYyBow6BuZyBuZ8OgeQ0KICANCiAgKiBXaWxsaW5nbmVzcyB0byBwdXJzdWUgYSBjYXJlZXIgYmFzZWQgb24gdGhlaXIgZGVncmVlOiBN4bupYyDEkeG7mSBz4bq1biBsw7JuZyB0aGVvIMSRdeG7lWkgbmdo4buBIG5naGnhu4dwIGxpw6puIHF1YW4gxJHhur9uIGLhurFuZyBj4bqlcCBj4bunYSBo4buNDQogIA0KICAqIFN0cmVzcyBMZXZlbDogTeG7qWMgxJHhu5kgY8SDbmcgdGjhurNuZyBj4bunYSBzaW5oIHZpw6puIGfhu5NtOiBBd2Z1bCBsw6AgcuG6pXQgdOG7hywgQmFkIGzDoCB04buHLCBGYWJ1bG91cyBsw6AgdGhv4bqjaSBtw6FpIHbDoCBHb29kIGzDoCB04buRdA0KICANCiAgKiBQYXJ0LXRpbWUgSm9iOiBTaW5oIHZpw6puIGPDsyBsw6BtIHZp4buHYyBiw6FuIHRo4budaSBnaWFuIGhheSBraMO0bmc/DQogIA0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpyID0gZ2V0T3B0aW9uKCJyZXBvcyIpDQpyWyJDUkFOIl0gPSAiaHR0cDovL2NyYW4udXMuci1wcm9qZWN0Lm9yZyINCm9wdGlvbnMocmVwb3MgPSByKQ0KbGlicmFyeShyZWFkeGwpDQpkIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL0hvYW4gTmd1eWVuL0Rvd25sb2Fkcy9EYXRhX1BURExEVC54bHN4IikNCmxpYnJhcnkoZmxleHRhYmxlKQ0KaW5zdGFsbC5wYWNrYWdlcygiZGF0YS50YWJsZSIpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQpsaWJyYXJ5KGRwbHlyKQ0KaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmluc3RhbGwucGFja2FnZXMoIkRlc2NUb29scyIpDQpsaWJyYXJ5KERlc2NUb29scykNCmluc3RhbGwucGFja2FnZXMoImVwaXRvb2wiKQ0KbGlicmFyeShBRVIpDQpsaWJyYXJ5KERUKQ0KDQpgYGAgIA0KIA0KICAqIMSQ4bq3dCBs4bqhaSB0w6puIGJp4bq/biDEkeG7gyBk4buFIGTDoG5nIHBow6JuIHTDrWNoDQogDQpgYGB7cn0NCmQgPC0gZCAlPiUNCiAgcmVuYW1lKA0KICAgIGdlbmQgPSBHZW5kZXIsDQogICAgZGVwID0gRGVwYXJ0bWVudCwNCiAgICBtMTIgPSBgMTJ0aCBNYXJrYCwNCiAgICBjb2wgPSBgY29sbGVnZSBtYXJrYCwNCiAgICBzdHUgPSBgZGFpbHkgc3R1ZGluZyB0aW1lYCwNCiAgICB3aWwgPSBgd2lsbGluZ25lc3MgdG8gcHVyc3VlIGEgY2FyZWVyIGJhc2VkIG9uIHRoZWlyIGRlZ3JlZWAsDQogICAgc3RyZSA9IGBTdHJlc3MgTGV2ZWxgLA0KICAgIHBhdCA9IGBwYXJ0LXRpbWUgam9iYA0KICApDQpgYGANCg0KDQpgYGB7cn0NCmQkY29sIDwtIGN1dChkJGNvbCwgYnJlYWtzID0gYygwLCA2MCwgODAsIDEwMCksIGxhYmVscyA9IGMoIkxvdyIsICJNZWRpdW0iLCAiSGlnaCIpKQ0KZGF0YS50YWJsZShkKQ0KYGBgDQoNCiMjIyBYw6FjIMSR4buLbmggYmnhur9uIHBo4bulIHRodeG7mWMNCg0KIyMjIyBCaeG6v24gxJDhu4tuaCBsxrDhu6NuZw0KDQogIEJp4bq/biDEkeG7i25oIGzGsOG7o25nIGJhbyBn4buTbTogbTEyIHbDoCB3aWwNCg0KIyMjIyBCaeG6v24gxJHhu4tuaCB0w61uaA0KDQogIEJp4bq/biDEkeG7i25oIHTDrW5oIGJhbyBn4buTbTogZ2VuZCwgZGVwLCBzdHUsIHN0cmUsIHBhdCwgdsOgIGJp4bq/biBjb2wgKMSRw6MgxJHGsOG7o2MgbcOjIGjDs2EgdGjDoG5oIGJp4bq/biDEkeG7i25oIHTDrW5oKQ0KDQojIyBUaOG7kW5nIGvDqiBtw7QgdOG6ow0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIG3hu5l0IGJp4bq/bg0KDQojIyMjIEJp4bq/biBHZW5kZXIgDQoNCiAgKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCnRhYmxlKGQkZ2VuZCkNCmEgPC0gcHJvcC50YWJsZSh0YWJsZShkJGdlbmQpKSAqIDEwMA0KYGBgDQoNCiAgKirEkOG7kyB0aOG7iyoqDQpgYGB7cn0NCnBpZShhLCBsYWJlbHMgPSBwYXN0ZShuYW1lcyhhKSwgcm91bmQoYSwgMiksICIlIiksDQogICAgbWFpbiA9ICLEkOG7kyB0aOG7iyB0csOybiB24buBIHThu7cgbOG7hyBuYW0gbuG7ryIpDQpgYGANCg0KICBRdWEgYuG6o25nIHThuqduIHPhu5EgdsOgIMSR4buTIHRo4buLIHRyw6puIGNobyB0aOG6pXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1IHPhu5EgcXVhbiBzw6F0IG1hbmcgZ2nhu5tpIHTDrW5oIE7hu68gKEZlbWFsZSkgbMOgIDc5IHF1YW4gc8OhdCBjaGnhur9tIDMzLjYyJSB2w6AgMTU2IHF1YW4gc8OhdCBjw7JuIGzhuqFpIGzDoCBnaeG7m2kgdMOtbmggTmFtIChNYWxlKSBjaGnhur9tIDY2LjM4JS4gDQogIA0KIyMjIyBCaeG6v24gRGVwYXJ0bWVudCANCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCnRhYmxlKGQkZGVwKSAlPiUgYWRkbWFyZ2lucyAoKQ0KcHJvcC50YWJsZSh0YWJsZShkJGRlcCkpICogMTAwDQpgYGANCg0KKirEkOG7kyB0aOG7iyoqDQpgYGB7cn0NCmIgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkJGRlcCkpIA0KY29sbmFtZXMoYikgPC0gYygiTmfDoG5oIiwgIkNvdW50IikNCmdncGxvdChiLCBhZXMoeCA9IE5nw6BuaCwgeSA9IENvdW50LCBmaWxsID0gTmfDoG5oKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBzaW5oIHZpw6puIHRoZW8gY8OhYyBuZ8OgbmggaOG7jWMiLCB4ID0gIkPDoWMgbmfDoG5oIGjhu41jIGPhu6dhIHNpbmggdmnDqm4iLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiAgVHJvbmcgdOG7lW5nIDIzNSBzaW5oIHZpw6puIMSRxrDhu6NjIGto4bqjbyBzw6F0OiBTaW5oIHZpw6puIHRoZW8gbmfDoG5oIEJDQSAoUXXhuqNuIHRy4buLIHRoxrDGoW5nIG3huqFpKSBjaGnhur9tIGjGoW4gbeG7mXQgbuG7rWEgduG7m2kgNTYsMTclICgxMzIgc2luaCB2acOqbikgdsOgIHNpbmggdmnDqm4gdGhlbyBuZ8OgbmggQWNjb3VudGluZyBhbmQgRmluYW5jZSAoS+G6vyB0b8OhbiB2w6AgVMOgaSBjaMOtbmgpIGzDoCDDrXQgbmjhuqV0IHbhu5tpIDYsMzgzJSAoMTUgc2luaCB2acOqbikuIFNpbmggdmnDqm4gdGhlbyBuZ8OgbmggQ29tbWVyY2UgKEtpbmggZG9hbmggdGjGsMahbmcgbeG6oWkpIGNoaeG6v20gMjUsNTMyJSAoNjAgc2luaCB2acOqbiksIGPDsm4gbOG6oWkgMjggc2luaCB2acOqbiB0aGVvIG5nw6BuaCBo4buNYyBJU00gKFF14bqjbiBsw70gaOG7hyB0aOG7kW5nIHRow7RuZyB0aW4pIGNoaeG6v20gMTEsOTE1JS4NCiAgDQojIyMjIEJp4bq/biAxMnRoIE1hcmsgDQoNCioqQuG6o25nIHThuqduIHPhu5EsIHRo4buRbmcga8OqIG3DtCB04bqjKioNCg0KYGBge3J9DQp0YWJsZShkJG0xMikgDQpzdW1tYXJ5IChkJG0xMikNCmBgYA0KDQoqKsSQ4buTIHRo4buLKioNCmBgYHtyfQ0KaGlzdChkJG0xMikNCmBgYA0KDQoNCiAgS+G6v3QgcXXhuqMgY+G7p2EgdGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIHRhIGJp4bq/dCDEkcaw4bujYyBz4buRIMSRaeG7g20gbOG7m3AgMTIgbcOgIHNpbmggdmnDqm4gdHJvbmcgYuG7mSBk4buvIGxp4buHdSDEkeG6oXQgxJHGsOG7o2MgdHJ1bmcgYsOsbmggbMOgIDY4LjggxJFp4buDbSwgc+G7kSDEkWnhu4NtIGNhbyBuaOG6pXQgdsOgIHRo4bqlcCBuaOG6pXQgbcOgIHNpbmggdmnDqm4gY8OzIHRo4buDIMSR4bqhdCDEkcaw4bujYyBs4bqnbiBsxrDhu6N0IGzDoCA5NCDEkWnhu4NtIHbDoCA0NSDEkWnhu4NtLiBDaOG7pyB54bq/dSBzaW5oIHZpw6puIGPDsyDEkWnhu4NtIGzhu5twIDEyIHRyb25nIGtob+G6o25nIHThu6sgNTUgxJFp4buDbSB04bubaSA4MCDEkWnhu4NtIGzDoCBuaGnhu4F1IG5o4bqldC4gVOG7qyA0NSDEkWnhu4NtIHThu5tpIGTGsOG7m2kgNTUgxJFp4buDbSBjw7Mgc+G7kSBzaW5oIHZpw6puIMSR4bqhdCDEkcaw4bujYyB0aOG7qSAyIHbDoCBraG/huqNuZyDEkWnhu4NtIMOtdCBzaW5oIHZpw6puIMSR4bqhdCDEkcaw4bujYyBuaOG6pXQgbMOgIHRyw6puIDgwIMSRaeG7g20uIA0KICANCiMjIyMgQmnhur9uIGNvbGxlZ2UgbWFyayANCg0KKipUaGF5IMSR4buVaSBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB0aMOgbmggxJHhu4tuaCB0w61uaCoqDQoNCmBgYHtyfQ0KYyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGQkY29sKSkgDQpjDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCnByb3AudGFibGUodGFibGUoZCRjb2wpKSAqIDEwMA0KYGBgDQoNCioqxJDhu5MgdGjhu4sqKg0KDQpgYGB7cn0NCmQxIDwtIChwcm9wLnRhYmxlKHRhYmxlKGQkY29sKSkgKiAxMDApIA0KcGllKGQxLCBsYWJlbHMgPSBwYXN0ZShuYW1lcyhkMSksIHJvdW5kKGQxLCAyKSwgIiUiKSwNCiAgICBtYWluID0gIsSQ4buTIHRo4buLIHRyw7JuIHbhu4EgdOG7tyBs4buHIMSRaeG7g20gdGhlbyBsZXZlbHMiKQ0KYGBgDQoNCiAgVuG7m2kgYuG7mSBk4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1LCB04bu3IGzhu4cgc2luaCB2acOqbiDEkeG6oXQgxJFp4buDbSDEkeG6oWkgaOG7jWMg4bufIG3hu6ljIHRydW5nIGLDrG5oICg2MC04MCkgY2hp4bq/bSDEkWEgc+G7kSB24bubaSA1Myw2MiUuIFThu7cgbOG7hyBzaW5oIHZpw6puIMSR4bqhdCDEkWnhu4NtIMSR4bqhaSBo4buNYyDhu58gbeG7qWMgdGjhuqVwICgwLTYwKSBjaGnhur9tIDI1LDUzJSBuaGnhu4F1IGjGoW4gdOG7tyBs4buHIHNpbmggdmnDqm4gxJHhuqF0IMSRaeG7g20gxJHhuqFpIGjhu41jIOG7nyBt4bupYyBjYW8gKDgwLTEwMCkgY2hp4bq/bSAyMC44NSUuDQoNCg0KIyMjIyBCaeG6v24gRGFpbHkgU3R1ZHlpbmcgVGltZQ0KDQogICoqQuG6o25nIHThuqduIHPhu5EqKg0KICANCmBgYHtyfQ0KdGFibGUoZCRzdHUpDQpgYGANCg0KICBE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRIHRyw6puIHRhIGPDsyB0aOG7gyBiaeG6v3QgxJHGsOG7o2MgbMaw4bujbmcgdGjhu51pIGdpYW4gaOG6sW5nIG5nw6B5IG3DoCBzaW5oIHZpw6puIGTDoG5oIHJhIMSR4buDIGjhu41jIHThu6sgMC0zMCBwaMO6dCBjw7MgNDYgIHNpbmggdmnDqm4sIHThu6sgMS0yIHRp4bq/bmcgY8OzIDYxIHRp4bq/bmcsIDItMyB0aeG6v25nIGPDsyAyNCBzaW5oIHZpw6puLCAzLTQgdGnhur9uZyBjw7MgMTUgc2luaCB2acOqbiwgMzAtNjAgcGjDunQgY8OzIDgxIHNpbmggdmnDqm4sIHbDoCBzaW5oIHZpw6puIGTDoG5oIHJhIGjGoW4gNCB0aeG6v25nIMSR4buDIGjhu41jIGPDsyA4IHNpbmggdmnDqm4gIA0KDQogICoqQuG6o25nIHThuqduIHN14bqldCoqDQogIA0KYGBge3J9DQp0YWJsZShkJHN0dSkvc3VtKHRhYmxlKGQkc3R1KSkNCmBgYA0KDQogIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHN14bqldCB0csOqbiB0YSBjw7MgdGjhu4MgYmnhur90IMSRxrDhu6NjIGzGsOG7o25nIHRo4budaSBnaWFuIGjhurFuZyBuZ8OgeSBtw6Agc2luaCB2acOqbiBkw6BuaCByYSDEkeG7gyBo4buNYyB04burIDAtMzAgcGjDunQga2hv4bqjbmcgMTkuNTclIHNpbmggdmnDqm4sIHThu6sgMS0yIHRp4bq/bmcga2hv4bqjbmcgMjUuOTYlIHRp4bq/bmcsIDItMyB0aeG6v25nIGtob+G6o25nIDEwLjIxJSBzaW5oIHZpw6puLCAzLTQgdGnhur9uZyBraG/huqNuZyA2LjQlIHNpbmggdmnDqm4sIDMwLTYwIHBow7p0IGtob+G6o25nIDM0LjQ3JSBzaW5oIHZpw6puLCB2w6Agc2luaCB2acOqbiBkw6BuaCByYSBoxqFuIDQgdGnhur9uZyDEkeG7gyBo4buNYyBraG/huqNuZyAzLjQlIHNpbmggdmnDqm4gDQoNCiAgKirEkOG7kyB0aOG7iyoqDQogIA0KYGBge3J9DQpkIHw+IGdncGxvdCggYWVzKCB4ID0gc3R1LCB5PSBhZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbD0nbGlnaHRibHVlJykgKyBnZW9tX3RleHQoYWVzKGxhYmVsPSBzY2FsZXMgOjogcGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpLGFjY3VyYWN5PS4wMSkpLCBzdGF0ID0gJ2NvdW50JywgY29sb3I9ICdibGFjaycsIHZqdXN0PSAtLjUpICsgdGhlbWVfY2xhc3NpYygpICsgeGxhYignU+G7kSBnaeG7nSBo4buNYycpICsgeWxhYignVOG7tyBs4buHJykNCmBgYA0KDQogIE5ow6xuIGNodW5nLCB04bu3IGzhu4cgc2luaCB2acOqbiBkw6BuaCB04burIDMwLTYwIHBow7p0IG3hu5dpIG5nw6B5IMSR4buDIGjhu41jIGNoaeG6v20gdOG7iSBs4buHIGNhbyBuaOG6pXQsIHbhu5tpIDM0LjQ3JSwgY2hvIHRo4bqleSBy4bqxbmcgbmhp4buBdSBzaW5oIHZpw6puIGPDsyB4dSBoxrDhu5tuZyBo4buNYyB04bqtcCB0cm9uZyBraG/huqNuZyB0aOG7nWkgZ2lhbiBuw6B5LiDEkOG7qW5nIHRo4bupIGhhaSBsw6AgbmjDs20gc2luaCB2acOqbiBkw6BuaCB04burIDEtMiB0aeG6v25nIG3hu5dpIG5nw6B5IMSR4buDIGjhu41jLCBjaGnhur9tIDI1Ljk2JSwgY2hvIHRo4bqleSBt4buZdCBwaOG6p24gbOG7m24gc2luaCB2acOqbiBjxaluZyBkw6BuaCB0aOG7nWkgZ2lhbiDEkcOhbmcga+G7gyBjaG8gdmnhu4djIGjhu41jIHThuq1wIGPhu6dhIG3DrG5oLiBUdXkgbmhpw6puIHThu7cgbOG7hyBzaW5oIHZpw6puIGTDoG5oIGjGoW4gNCB0aeG6v25nIG3hu5dpIG5nw6B5IMSR4buDIGjhu41jIGNo4buJIGNoaeG6v20gMy40JSwgbeG7mXQgY29uIHPhu5Ega2jDoSDDrXQsIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhuqV0IMOtdCBzaW5oIHZpw6puIHPhurVuIHPDoG5nIGTDoG5oIHF1w6Egbmhp4buBdSB0aOG7nWkgZ2lhbiBjaG8gdmnhu4djIGjhu41jIG3hu5dpIG5nw6B5LiBUxrDGoW5nIHThu7EsIGNo4buJIGPDsyA2LjQlIHNpbmggdmnDqm4gZMOgbmggdOG7qyAzLTQgdGnhur9uZyBo4buNYyB04bqtcCwgdsOgIDEwLjIxJSBkw6BuaCAyLTMgdGnhur9uZyBt4buXaSBuZ8OgeS4gxJDDoW5nIGNow7ogw70gbMOgIGPDsyDEkeG6v24gMTkuNTclIHNpbmggdmnDqm4gY2jhu4kgZMOgbmggdOG7qyAwLTMwIHBow7p0IG3hu5dpIG5nw6B5IMSR4buDIGjhu41jLCDEkWnhu4F1IG7DoHkgY8OzIHRo4buDIGNobyB0aOG6pXkgbeG7mXQgcGjhuqduIHNpbmggdmnDqm4gY8OzIHRo4buDIGfhurdwIGtow7Mga2jEg24gdHJvbmcgdmnhu4djIGTDoG5oIHRo4budaSBnaWFuIGNobyBo4buNYyB04bqtcA0KDQojIyMjIEJp4bq/biBXaWxsaW5nbmVzcyB0byBwdXJzdWUgYSBjYXJlZXIgYmFzZWQgb24gdGhlaXIgZGVncmVlDQoNCiAgKipC4bqjbmcgdOG6p24gc+G7kSoqDQogIA0KYGBge3J9DQp0YWJsZShkJHdpbCkNCmBgYA0KDQogIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EgdHLDqm4sIHRhIGPDsyB0aOG7gyB0aOG6pXkgxJHGsOG7o2MgbeG7qWMgxJHhu5kgc2luaCB2acOqbiBraMO0bmcgc+G6tW4gc8OgbmcgdGhlbyDEkXXhu5VpIG5naOG7gSBuZ2hp4buHcCBk4buxYSB0csOqbiBuZ8OgbmggaOG7jWMgY8OzIDIgc2luaCB2acOqbiwgc2luaCB2acOqbiBz4bq1biBzw6BuZyB0aGVvIMSRdeG7lWkgbmdo4buBIG5naGnhu4dwIGPhu6dhIGjhu40g4bufIG3hu6ljIDI1JSBk4buxYSB0csOqbiBuZ8OgbmggaOG7jWMgY8OzIDE0IHNpbmggdmnDqm4sIHNpbmggdmnDqm4gc+G6tW4gc8OgbmcgdGhlbyDEkXXhu5VpIG5naOG7gSBuZ2hp4buHcCBj4bunYSBo4buNIOG7nyBt4bupYyA1MCUgZOG7sWEgdHLDqm4gbmfDoG5oIGjhu41jIGPDsyA2MSBzaW5oIHZpw6puLCBzaW5oIHZpw6puIHPhurVuIHPDoG5nIHRoZW8gxJF14buVaSBuZ2jhu4EgbmdoaeG7h3AgY+G7p2EgaOG7jSDhu58gbeG7qWMgNzUlIGThu7FhIHRyw6puIG5nw6BuaCBo4buNYyBjw7MgMTE0IHNpbmggdmnDqm4gdsOgIHNpbmggdmnDqm4gc+G6tW4gc8OgbmcgdGhlbyDEkXXhu5VpIG5naOG7gSBuZ2hp4buHcCBj4bunYSBo4buNIOG7nyBt4bupYyAxMDAlIGThu7FhIHRyw6puIG5nw6BuaCBo4buNYyBjw7MgNDQgc2luaCB2acOqbg0KDQogKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCiAgDQpgYGB7cn0NCnRhYmxlKGQkd2lsKS9zdW0odGFibGUoZCR3aWwpKQ0KYGBgDQoNCiAgROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc3XhuqV0IHRyw6puLCB0YSBjw7MgdGjhu4MgdGjhuqV5IMSRxrDhu6NjIG3hu6ljIMSR4buZIHNpbmggdmnDqm4ga2jDtG5nIHPhurVuIHPDoG5nIHRoZW8gxJF14buVaSBuZ2jhu4EgbmdoaeG7h3AgZOG7sWEgdHLDqm4gbmfDoG5oIGjhu41jIGPDsyAwLjglIHNpbmggdmnDqm4sIHNpbmggdmnDqm4gc+G6tW4gc8OgbmcgdGhlbyDEkXXhu5VpIG5naOG7gSBuZ2hp4buHcCBj4bunYSBo4buNIOG7nyBt4bupYyAyNSUgZOG7sWEgdHLDqm4gbmfDoG5oIGjhu41jIGNoaeG6v20gNS45JSBzaW5oIHZpw6puLCBzaW5oIHZpw6puIHPhurVuIHPDoG5nIHRoZW8gxJF14buVaSBuZ2jhu4EgbmdoaeG7h3AgY+G7p2EgaOG7jSDhu58gbeG7qWMgNTAlIGThu7FhIHRyw6puIG5nw6BuaCBo4buNYyBjaGnhur9tIDI1Ljk2JSBzaW5oIHZpw6puLCBzaW5oIHZpw6puIHPhurVuIHPDoG5nIHRoZW8gxJF14buVaSBuZ2jhu4EgbmdoaeG7h3AgY+G7p2EgaOG7jSDhu58gbeG7qWMgNzUlIGThu7FhIHRyw6puIG5nw6BuaCBo4buNYyBjaGnhur9tIDQ4LjUxJSBzaW5oIHZpw6puIHbDoCBzaW5oIHZpw6puIHPhurVuIHPDoG5nIHRoZW8gxJF14buVaSBuZ2jhu4EgbmdoaeG7h3AgY+G7p2EgaOG7jSDhu58gbeG7qWMgMTAwJSBk4buxYSB0csOqbiBuZ8OgbmggaOG7jWMgY2hp4bq/bSAxOC43MiUgc2luaCB2acOqbg0KDQogICoqxJDhu5MgdGjhu4sqKg0KICANCmBgYHtyfQ0KZCB8PiBnZ3Bsb3QoIGFlcyggeCA9IHdpbCwgeT0gYWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGw9J2xpZ2h0Ymx1ZScpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSxhY2N1cmFjeT0uMDEpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yPSAnYmxhY2snLCB2anVzdD0gLS41KSArIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ03hu6ljIMSR4buZIGPEg25nIHRo4bqzbmcnKSArIHlsYWIoJ1Thu7cgbOG7hycpDQpgYGANCg0KICBOaMOzbSBzaW5oIHZpw6puIGtow7RuZyBz4bq1biBzw6BuZyB0aGVvIMSRdeG7lWkgbmdo4buBIG5naGnhu4dwIGThu7FhIHRyw6puIG5nw6BuaCBo4buNYyBjaOG7iSBjaGnhur9tIDAuODUlLCBjaG8gdGjhuqV5IHLhurFuZyBwaOG6p24gbOG7m24gc2luaCB2acOqbiDEkeG7gXUgY8OzIG3hu5l0IG3hu6ljIMSR4buZIHPhurVuIHPDoG5nIG5o4bqldCDEkeG7i25oIMSR4buDIHRoZW8gxJF14buVaSBuZ2jhu4EgbmdoaeG7h3AgdMawxqFuZyDhu6luZyB24bubaSBuZ8OgbmggaOG7jWMuIA0KDQogIE5ow7NtIHNpbmggdmnDqm4gc+G6tW4gc8OgbmcgdGhlbyDEkXXhu5VpIG5naOG7gSBuZ2hp4buHcCBk4buxYSB0csOqbiBuZ8OgbmggaOG7jWMgY+G7p2EgbcOsbmgg4bufIG3hu6ljIMSR4buZIDI1JSBjaGnhur9tIDUuOSUsIGNobyB0aOG6pXkgbeG7mXQgc+G7kSBzaW5oIHZpw6puIGPDsyBxdWFuIHTDom0gbmjGsG5nIGtow7RuZyBob8OgbiB0b8OgbiBjaOG6r2MgY2jhuq9uIHbhu4Egdmnhu4djIHPhur0gZ+G6r24gYsOzIHbhu5tpIG5naOG7gSB0aGVvIMSRw7puZyBuZ8OgbmggaOG7jWMgY+G7p2EgaOG7jSB0cm9uZyB0xrDGoW5nIGxhaS4gTmdvw6BpIHJhIGPDsyDEkeG6v24gMjUuOTYlIHNpbmggdmnDqm4gc+G6tW4gc8OgbmcgdGhlbyDEkXXhu5VpIG5naOG7gSBuZ2hp4buHcCBk4buxYSB0csOqbiBuZ8OgbmggaOG7jWMgY+G7p2EgbcOsbmgg4bufIG3hu6ljIMSR4buZIDUwJSwgxJFp4buBdSBuw6B5IGPDsyB0aOG7gyBsw6AgZG8gaOG7jSBjw7JuIMSRYW5nIHBow6JuIHbDom4gaG/hurdjIMSRYW5nIHRyb25nIHF1w6EgdHLDrG5oIGPDom4gbmjhuq9jIGdp4buvYSBjw6FjIGzhu7FhIGNo4buNbiBuZ2jhu4EgbmdoaeG7h3AuDQoNCiAgTeG7mXQgdOG7tyBs4buHIGzhu5tuIHNpbmggdmnDqm4sIDQ4LjUxJSwgc+G6tW4gc8OgbmcgdGhlbyDEkXXhu5VpIG5naOG7gSBuZ2hp4buHcCBj4bunYSBo4buNIOG7nyBt4bupYyDEkeG7mSA3NSUsIGNobyB0aOG6pXkgc+G7sSDEkeG7i25oIGjGsOG7m25nIHLDtSByw6BuZyB2w6AgcXV54bq/dCB0w6JtIGNhbyB0cm9uZyB2aeG7h2MgdGhlbyDEkXXhu5VpIGNvbiDEkcaw4budbmcgbmdo4buBIG5naGnhu4dwIHRoZW8gxJHDum5nIHbhu5tpIG5nw6BuaCBo4buNYyBj4bunYSBtw6xuaC4gQ3Xhu5FpIGPDuW5nLCBjw7MgMTguNzIlIHNpbmggdmnDqm4gaG/DoG4gdG/DoG4gc+G6tW4gc8OgbmcgKDEwMCUpIMSR4buDIHRoZW8gxJF14buVaSBuZ2jhu4EgbmdoaeG7h3AgZOG7sWEgdHLDqm4gbmfDoG5oIGjhu41jLCB0aOG7gyBoaeG7h24gc+G7sSB4w6FjIMSR4buLbmggdsOgIGNo4bqvYyBjaOG6r24gdHJvbmcgbOG7sWEgY2jhu41uIG5naOG7gSBuZ2hp4buHcCBj4bunYSBo4buNLg0KDQojIyMjIEJp4bq/biBTdHJlc3MgTGV2ZWwNCg0KICAqKkLhuqNuZyB04bqnbiBz4buRKioNCiAgDQpgYGB7cn0NCnRhYmxlKGQkc3RyZSkNCmBgYA0KIA0KICBE4buxYSB2w6BvIGvhur90IHF14bqjIHRyw6puIHRhIGPDsyB0aOG7gyB0aOG6pXksIGPDsyAxOSBzaW5oIHZpw6puIGPhuqNtIHRo4bqleSBt4bupYyDEkeG7mSBjxINuZyB0aOG6s25nIGPhu6dhIG3DrG5oIOG7nyBt4bupYyBy4bqldCB04buHLiDEkMOieSBjxaluZyBsw6AgbeG7qWMgdGjhuqVwIG5o4bqldCB0cm9uZyBjw6FjIG3hu6ljIMSR4buZIGPEg25nIHRo4bqzbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQuIEPDsyA2OCBzaW5oIHZpw6puIGNobyBy4bqxbmcgbeG7qWMgxJHhu5kgY8SDbmcgdGjhurNuZyBj4bunYSBo4buNIGzDoCB04buHLiBDw7MgIDExIHNpbmggdmnDqm4gY2hvIGJp4bq/dCBo4buNIGPhuqNtIHRo4bqleSBy4bqldCB0aG/huqNpIG3DoWkgdsOgIGtow7RuZyBjxINuZyB0aOG6s25nLiBDw7MgMTM3IHNpbmggdmnDqm4gxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgY8SDbmcgdGjhurNuZyBj4bunYSBo4buNIGzDoCB04buRdCB2w6AgxJHDonkgbMOgIG3hu6ljIGPDsyBz4buRIGzGsOG7o25nIHNpbmggdmnDqm4gY2FvIG5o4bqldCwgY2hvIHRo4bqleSBwaOG6p24gbOG7m24gc2luaCB2acOqbiBj4bqjbSB0aOG6pXkgdGhv4bqjaSBtw6FpIGhv4bq3YyDDrXQgY8SDbmcgdGjhurNuZy4gDQoNCg0KICoqQuG6o25nIHThuqduIHN14bqldCoqDQogIA0KYGBge3J9DQp0YWJsZShkJHN0cmUpL3N1bSh0YWJsZShkJHN0cmUpKQ0KYGBgDQoNCiAgxJDhu4MgxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgY8SDbmcgdGjhurNuZyB0aGVvICUgdGEgZOG7sWEgdsOgbyBi4bqzbmcgdOG6p24gc3XhuqV0IHRyw6puLiBT4buRIGzGsOG7o25nIHNpbmggdmnDqm4gY+G6o20gdGjhuqV5IG3hu6ljIMSR4buZIGPEg25nIHRo4bqzbmcgY+G7p2EgbcOsbmgg4bufIG3hu6ljIHLhuqV0IHThu4cgY2hp4buDbSA4LjA5JS4gU+G7kSBsxrDhu6NuZyBzaW5oIHZpw6puIGPhuqNtIHRo4bqleSBt4bupYyDEkeG7mSBjxINuZyB0aOG6s25nIGPhu6dhIG3DrG5oIOG7nyBt4bupYyB04buHIGNoaeG7g20gMjguOTQlLiBT4buRIGzGsOG7o25nIHNpbmggdmnDqm4gY+G6o20gdGjhuqV5IG3hu6ljIMSR4buZIGPEg25nIHRo4bqzbmcgY+G7p2EgbcOsbmgg4bufIG3hu6ljIHRob+G6o2kgbcOhaSBjaGnhu4NtIDQuNjglIHbDoCBz4buRIGzGsOG7o25nIHNpbmggdmnDqm4gY+G6o20gdGjhuqV5IG3hu6ljIMSR4buZIGPEg25nIHRo4bqzbmcgY+G7p2EgbcOsbmgg4bufIG3hu6ljIHThu5F0IGNoaeG7g20gNTguMyUNCg0KICAqKsSQ4buTIHRo4buLKioNCiAgDQpgYGB7cn0NCmQgfD4gZ2dwbG90KCBhZXMoIHggPSBzdHJlLCB5PSBhZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbD0nbGlnaHRibHVlJykgKyBnZW9tX3RleHQoYWVzKGxhYmVsPSBzY2FsZXMgOjogcGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpLGFjY3VyYWN5PS4wMSkpLCBzdGF0ID0gJ2NvdW50JywgY29sb3I9ICdibGFjaycsIHZqdXN0PSAtLjUpICsgdGhlbWVfY2xhc3NpYygpICsgeGxhYignTeG7qWMgxJHhu5kgY8SDbmcgdGjhurNuZycpICsgeWxhYignVOG7tyBs4buHJykNCmBgYA0KDQojIyMjIEJp4bq/biBQYXJ0LXRpbWUgSm9iDQoNCiAgKipC4bqjbmcgdOG6p24gc+G7kSoqDQogIA0KYGBge3J9DQp0YWJsZShkJHBhdCkNCmBgYA0KDQogIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EgdGEgdGjhuqV5LCBjw7MgMTk0IHNpbmggdmnDqm4ga2jDtG5nIMSRaSBsw6BtIHRow6ptIGLDoW4gdGjhu51pIGdpYW4sIHbDoCBjw7MgNDEgc2luaCB2acOqbiDEkWkgbMOgbSB0aMOqbSBiw6FuIHRo4budaSBnaWFuLg0KDQogKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCiAgDQpgYGB7cn0NCnRhYmxlKGQkcGF0KS9zdW0odGFibGUoZCRwYXQpKQ0KYGBgDQoNCiAgROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc3XhuqV0IHRyw6puIHRhIHRo4bqleSwgc2luaCB2acOqbiBraMO0bmcgxJFpIGzDoG0gdGjDqm0gYsOhbiB0aOG7nWkgZ2lhbiBjaGnhur9tIDgyLjU1JSB2w6Agc2luaCB2acOqbiDEkWkgbMOgbSB0aMOqbSBiw6FuIHRo4budaSBnaWFuIGNoaeG6v20gMTcuNDUlLg0KDQogICoqxJDhu5MgdGjhu4sqKg0KICANCmBgYHtyfQ0KbSA8LSBkDQptIDwtIHRhYmxlKGQkcGF0KQ0KbSA8LSBkIHw+IGdyb3VwX2J5KHBhdCkgfD4gc3VtbWFyaXNlKGZyZXEgPSBuKCkpIHw+IG11dGF0ZShtLCBwZXIgPSBmcmVxL3N1bShmcmVxKSkNCm0gfD4gZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBwZXIsIGZpbGwgPSBwYXQpKSArDQogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIA0KICBjb29yZF9wb2xhcigneScpDQpgYGANCiAgDQogIE5ow6xuIHbDoG8gxJHhu5kgdGjhu4sgdHLDqm4gdGEgY8OzIHRo4buDIHLDtSByw6BuZyB0aOG6pXkgxJHGsOG7o2MgdOG7tyBs4buHIHNpbmggdmnDqm4gxJFpIGzDoG0gdGjDqm0gYsOhbiB0aOG7nWkgZ2lhbiBraMO0bmcgbmhp4buBdQ0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGhhaSBiaeG6v24NCg0KICDEkOG7gyBoaeG7g3UgcsO1IG3hu5FpIHF1YW4gaOG7hyB2w6Agc+G7sSB0xrDGoW5nIHTDoWMgZ2nhu69hIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24ga+G6v3QgcXXhuqMgaOG7jWMgdOG6rXAgY+G7p2Egc2luaCB2acOqbiBjxaluZyBuaMawIHjDoWMgxJHhu4tuaCBuaOG7r25nIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgbOG7m24gxJHhur9uIGvhur90IHF14bqjIGjhu41jIHThuq1wIGPhu6dhIHNpbmggdmnDqm4sIHRhIHRp4bq/biBow6BuaCB0aOG7kW5nIGvDqiBtw7QgdOG6oyB24bubaSB04burbmcgYmnhur9uIMSR4buZYyBs4bqtcCB24bubaSBiaeG6v24gcGjhu6UgdGh14buZYyBjb2wgKMSRaeG7g20gxJHhuqFpIGjhu41jKS4NCiAgDQojIyMjIEJp4bq/biBjb2wgduG7m2kgYmnhur9uIHN0dQ0KDQogICoqQuG6o25nIHThuqduIHPhu5EqKg0KYGBge3J9DQp0YWJsZShkJGNvbCwgZCRzdHUpDQphZGRtYXJnaW5zKHRhYmxlKGQkY29sLCBkJHN0dSkpDQpgYGANCiAgDQogIELhuqNuZyB04bqnbiBz4buRIHRyw6puIGNobyB0YSB0aOG6pXk6DQogIC0gQ8OzIDEyIHNpbmggdmnDqm4gZMOgbmggdOG7qyAwLTMwIHBow7p0IGNobyB2aeG7h2MgaOG7jWMgbeG7l2kgbmfDoHkgdGjDrCBjw7Mgc+G7kSDEkWnhu4NtIHRo4bqlcA0KICAtIEPDsyAxNiBzaW5oIHZpw6puIGTDoG5oIHThu6sgMS0yIHRp4bq/bmcgY2hvIHZp4buHYyBo4buNYyBt4buXaSBuZ8OgeSB0aMOsIGPDsyBz4buRIMSRaeG7g20gdGjhuqVwDQogIC0gQ8OzIDQgc2luaCB2acOqbiBkw6BuaCB04burIDItMyB0aeG6v25nIGNobyB2aeG7h2MgaOG7jWMgbeG7l2kgbmfDoHkgdGjDrCBjw7Mgc+G7kSDEkWnhu4NtIHRo4bqlcA0KICANCiAgKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCiAgDQpgYGB7cn0NCnByb3AudGFibGUodGFibGUoZCRjb2wsIGQkc3R1KSkNCmFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShkJGNvbCwgZCRzdHUpKSkNCmBgYA0KDQoNCiAgKirEkOG7kyB0aOG7iyoqDQogIA0KYGBge3J9DQpnZ3Bsb3QoZCwgYWVzKHN0dSwgZmlsbCA9IGNvbCkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKSArICBsYWJzKHggPSAiVGjhu51pIGdpYW4gZMOgbmggcmEgaOG7jWMiLCB5ID0gIsSQaeG7g20iKQ0KIA0KYGBgDQogIA0KDQoNCiMjIyMgQmnhur9uIGNvbCB24bubaSBiaeG6v24gd2lsDQoNCiAgKipC4bqjbmcgdOG6p24gc+G7kSoqDQogIA0KYGBge3J9DQp0YWJsZShkJGNvbCwgZCR3aWwpDQphZGRtYXJnaW5zKHRhYmxlKGQkY29sLCBkJHdpbCkpDQpgYGANCiAgDQogIA0KICAqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KICANCmBgYHtyfQ0KcHJvcC50YWJsZSh0YWJsZShkJGNvbCwgZCR3aWwpKQ0KYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKGQkY29sLCBkJHdpbCkpKQ0KYGBgDQogIA0KICANCiAgKirEkOG7kyB0aOG7iyoqDQoNCmBgYHtyfQ0KZ2dwbG90KGQsIGFlcyh4ID0gY29sLCB5ID0gd2lsLCBmaWxsID0gY29sKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnMoeCA9ICLEkGnhu4NtIiwgeSA9ICJN4bupYyDEkeG7mSBz4bq1biBzw6BuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCiAgDQoNCiMjIyMgQmnhur9uIGNvbCB24bubaSBiaeG6v24gc3RyZQ0KDQogICoqQuG6o25nIHThuqduIHPhu5EqKg0KDQpgYGB7cn0NCnRhYmxlKGQkY29sLCBkJHN0cmUpDQphZGRtYXJnaW5zKHRhYmxlKGQkY29sLCBkJHN0cmUpKQ0KYGBgDQogIA0KICANCiAgKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlKGQkY29sLCBkJHN0cmUpKQ0KYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKGQkY29sLCBkJHN0cmUpKSkNCmBgYA0KDQogIA0KICAqKsSQ4buTIHRo4buLKioNCiAgDQpgYGB7cn0NCmdncGxvdChkLCBhZXMoc3RyZSwgZmlsbCA9IGNvbCkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKSArICBsYWJzKHggPSAiTeG7qWMgxJHhu5kgY8SDbmcgdGjhurNuZyIsIHkgPSAixJBp4buDbSIpDQpgYGANCiAgDQoNCiMjIyMgQmnhur9uIGNvbCB24bubaSBiaeG6v24gcGF0DQoNCiAgKipC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KdGFibGUoZCRjb2wsIGQkcGF0KQ0KYWRkbWFyZ2lucyh0YWJsZShkJGNvbCwgZCRwYXQpKQ0KYGBgDQogIA0KICANCiAgKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlKGQkY29sLCBkJHBhdCkpDQphZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUoZCRjb2wsIGQkcGF0KSkpDQpgYGANCg0KICANCiAgKirEkOG7kyB0aOG7iyoqDQoNCmBgYHtyfQ0KZ2dwbG90KGQsIGFlcyhwYXQsIGZpbGwgPSBjb2wpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2RvZGdlJykgKyAgbGFicyh4ID0gIkzDoG0gYsOhbiB0aOG7nWkgZ2lhbiIsIHkgPSAixJBp4buDbSIpDQpgYGANCiAgDQoNCiMjIyBU4bu3IGzhu4cgY2jDqm5oDQoNCiMjIFRo4buRbmcga8OqIHN1eSBkaeG7hW4NCg0KIyMjIEtp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCBjaG8gaGFpIGJp4bq/bg0KDQojIyMgS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hw0KDQojIyBNw7QgaMOsbmggaOG7k2kgcXV5DQoNCiMjIE3DtCBow6xuaCBo4buTaSBxdXkgbG9naXQNCg0KIyMgTcO0IGjDrG5oIGjhu5NpIHF1eSBwcm9iaXQNCg0KIyMgTcO0IGjDrG5oIGjhu5NpIHF1eSBjbG9nbG9nDQoNCiMjIEzhu7FhIGNo4buNbiBtw7QgaMOsbmggcGjDuSBo4bujcA0KDQojIENIxq/GoE5HIDQ6IEvhur5UIExV4bqsTg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==