library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'purrr' was built under R version 4.3.1
## Warning: package 'dplyr' was built under R version 4.3.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library (readxl)
## Warning: package 'readxl' was built under R version 4.3.3
library (ggplot2)
library (DescTools)
## Warning: package 'DescTools' was built under R version 4.3.3
library(epitools)
## Warning: package 'epitools' was built under R version 4.3.1
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
## Warning: package 'lattice' was built under R version 4.3.1
## 
## Attaching package: 'caret'
## 
## The following objects are masked from 'package:DescTools':
## 
##     MAE, RMSE
## 
## The following object is masked from 'package:purrr':
## 
##     lift
library(DT)
## Warning: package 'DT' was built under R version 4.3.3

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

Dữ liệu sử dụng trong bài nghiên cứu được lấy từ tác giả Kane Rudolph trên trang web kaggle.com.

Dữ liệu được thu thập bằng cách khảo sát sinh viên Hoa Kỳ đang theo học ở các cấp học khác nhau như trung học, đại học và thạc sĩ. Tổng cộng có 352 sinh viên được đưa vào nghiên cứu. Dữ liệu được thu thập từ các sinh viên bằng phương pháp câu hỏi với sự đồng ý có hiểu biết.

Data <- read_excel("C:/Users/Dell/Downloads/Data (2).xlsx")
str (Data)
## tibble [352 × 14] (S3: tbl_df/tbl/data.frame)
##  $ Gender            : chr [1:352] "Male" "Male" "Female" "Female" ...
##  $ Age               : num [1:352] 22 22 17 18 19 26 23 21 21 22 ...
##  $ Education         : chr [1:352] "College - Bachelor's" "College - Bachelor's" "High School" "High School" ...
##  $ Pleasureinthings  : num [1:352] 3 2 2 3 1 1 2 3 3 3 ...
##  $ Feelingdown       : num [1:352] 2 1 2 1 2 2 2 3 1 4 ...
##  $ Littleenergy      : num [1:352] 4 1 2 3 3 4 3 3 3 2 ...
##  $ Feelingbadyourself: num [1:352] 3 1 1 1 1 1 1 3 2 3 ...
##  $ Hurtingyourself   : num [1:352] 2 1 1 2 1 1 1 3 1 2 ...
##  $ Job               : chr [1:352] "Yes" "Yes" "No" "No" ...
##  $ Accommodation     : chr [1:352] "Home (with parents)" "Private rented accommodation" "Home (with parents)" "Home (with parents)" ...
##  $ Selfstudy         : chr [1:352] "2 - 4 hours" "1 - 2 hours" "1 - 2 hours" "1 - 2 hours" ...
##  $ Media             : chr [1:352] "More than 4 Hours" "1 - 2 Hours" "More than 4 Hours" "2 - 4 Hours" ...
##  $ GPA               : num [1:352] 2.3 2.7 2.97 2.74 3.37 3.33 2.75 3.25 3.97 2.75 ...
##  $ Depression        : chr [1:352] "Yes" "Yes" "No" "No" ...

Bộ dữ liệu gồm có 14 biến. Trong đó có 7 biến định tính và 7 biến định lượng:

  • Biến Gender - Giới tính của sinh viên, gồm 2 giá trị Male (Nam) hoặc Female (Nữ).

  • Biến Age - Tuổi của sinh viên.

  • Accommodation - Nơi ở hiện tại của sinh viên, gồm 2 giá trị: Home with parents (Tại nhà với gia đình) và Private rented accommodation (Phòng trọ tư nhân).

  • Biến EducationL Trình độ học vấn hiện tại, gồm 3 giá trị - High School (Trung học phổ thông), College - Bachelor’s (Đại học) và Master (Thạc sĩ).

  • Biến Selfstudy - Số giờ tự học mỗi ngày, gồm 3 giá trị: 1 - 2 hours (từ 1 đến 2 tiếng), 2 - 4 hours (từ 2 đến 4 tiếng) và More than 4 hours (hơn 4 tiếng).

  • Biến Job - hiện tại có đi làm hay không, gồm 2 giá trị: Yes hoặc No

  • Biến Media - số giờ dành cho phương tiện truyền thông mỗi ngày, gồm 3 giá trị: 1 - 2 hours (từ 1 đến 2 tiếng), 2 - 4 hours (từ 2 đến 4 tiếng) và More than 4 hours (hơn 4 tiếng).

  • Biến Pleasureinthings - Ít hứng thú hoặc niềm vui trong công việc, gồm 4 mức độ: 1 (Chưa bao giờ), 2(Thi thoảng), 3 (Thường xuyên), 4 (Luôn luôn).

  • Biến Littleenergy - Cảm thấy mệt mỏi hoặc có ít năng lượng, gồm 4 mức độ tương tự như biến Pleasureinthings.

  • Biến Feelingbadyourself - Cảm thấy tồi tệ về bản thân hoặc rằng bạn là một kẻ thất bại hoặc đã không làm bản thân hoặc gia đình thất vọng, gồm 4 mức độ tương tự như biến Pleasureinthings.

  • Biến Feelingdown - Cảm thấy thất vọng, chán nản, hoặc vô vọng, gồm 4 mức độ tương tự như biến Pleasureinthings.

  • Biến Hurtingyourself - Suy nghĩ rằng bạn nên chết đi hoặc làm tổn thương chính mình theo một cách nào đó, gồm 4 mức độ tương tự như biến Pleasureinthings.

  • Biến GPA - Điểm số tích luỹ hiện tại tính theo thang điểm 4.

  • Biến Depression - Sinh viên có biểu hiện trầm cảm hay không, gồm 2 giá trị: Yes hoặc No.

2 Thống kê mô tả

2.1 Thống kê mô tả cho 1 biến

2.1.1 Thống kê mô tả cho biến định tính

dnt <- Data[,c("Gender","Accommodation","Education","Selfstudy","Job","Media","Depression")]

Gender - Giới tính

table(Data$Gender)
## 
## Female   Male 
##    313     39
prop.table(table(Data$Gender))
## 
##    Female      Male 
## 0.8892045 0.1107955

Trong tổng số 352 học sinh sinh viên tham gia khảo sát thì có đến 313 sinh viên nữ (chiếm gần 89%) và 39 sinh viên nam (chiếm 11%).

ggplot(Data,aes(Gender))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Gender")

Education - Trình độ học vấn

table(Data$Education)
## 
## College - Bachelor's          High School               Master 
##                  204                  124                   24
prop.table(table(Data$Education))
## 
## College - Bachelor's          High School               Master 
##           0.57954545           0.35227273           0.06818182

Kết quả khảo sát 352 học sinh sinh viên cho thấy :

  • Có 204 sinh viên đang theo học đại học (college - Bachelor’s) chiếm tỉ lệ 58%

  • Có 124 học sinh đang học trung học phổ thông (High School) chiếm tỉ lệ 35%

  • Có 24 sinh viên đang theo học thạc sĩ (Master) chiếm tỉ lệ 7%

ggplot(Data,aes(Education))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Education")

Job - Công việc hiện tại

table(Data$Job)
## 
##  No Yes 
## 119 233
prop.table(table(Data$Job))
## 
##        No       Yes 
## 0.3380682 0.6619318

Trong tổng số những người được khảo sát (352 người) thì có đến 66% người có việc làm bao gồm cả công việc full-tim và part-time (tương đương với 233 học sinh sinh viên) và có khoảng 34% (tương đương với 119 học sinh sinh viên) không đi làm.

ggplot(Data,aes(Job))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Job")

Accommodation - Nơi ở hiện tại

table(Data$Accommodation)
## 
##          Home (with parents) Private rented accommodation 
##                          155                          197
prop.table(table(Data$Accommodation))
## 
##          Home (with parents) Private rented accommodation 
##                    0.4403409                    0.5596591

Theo kết quả của bảng khảo sát 352 học sinh sinh viên thì có :

  • 155 học sinh sinh viên sống chung với gia đình chiếm 44%

  • 197 học sinh sinh viên ở tại các phòng trọ tư nhân chiếm 56%

Đa số học sinh sinh viên có xu hướng ở các phòng trọ tư nhân hơn là sống chung với gia đình

ggplot(Data,aes(Accommodation))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Accommodation")

Selfstudy - Thời gian tự học mỗi ngày

table(Data$Selfstudy)
## 
##       1 - 2 hours       2 - 4 hours More than 4 hours 
##               201                99                52
prop.table(table(Data$Selfstudy))
## 
##       1 - 2 hours       2 - 4 hours More than 4 hours 
##         0.5710227         0.2812500         0.1477273

Theo kết quả khảo sát cho thấy đa số học sinh sinh viên (khoảng 57%) dành thời gian từ 1-2 tiếng để học mỗi ngày ( tương đương với 200 học sinh sinh viên), có khoảng 28% (tương đương với 99 học sinh sinh viên) dành thời gian từ 2-4 tiếng để học mỗi ngày và có khoảng 15% (tương đương với 53 học sinh sinh viên) dành nhiều hơn 4 tiếng để học trong một ngày.

ggplot(Data,aes(Selfstudy))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Selfstudy")

Media - Thời gian dành cho phương tiện truyền thông

table(Data$Media)
## 
##       1 - 2 Hours       2 - 4 Hours More than 4 Hours    Not Applicable 
##                38               112               197                 5
prop.table(table(Data$Media))
## 
##       1 - 2 Hours       2 - 4 Hours More than 4 Hours    Not Applicable 
##        0.10795455        0.31818182        0.55965909        0.01420455
ggplot(Data, aes(x = "", fill = Media)) +
  geom_bar(color = "blue", width = 1, stat = "count") +
  coord_polar("y", start = 0) +
  ylab("Number of Students") +
  xlab("Media")

Depression - Trầm cảm

table(Data$Depression)
## 
##  No Yes 
## 206 146
prop.table(table(Data$Depression))
## 
##        No       Yes 
## 0.5852273 0.4147727
ggplot(Data,aes(Depression))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Depression")

2.2 Thống kê mô tả cho biến định lượng

mac <-data.frame(Data$Age, Data$Pleasureinthings, Data$Feelingdown, Data$Littleenergy, Data$Feelingbadyourself, Data$Hurtingyourself, Data$GPA)

summary(mac)
##     Data.Age     Data.Pleasureinthings Data.Feelingdown Data.Littleenergy
##  Min.   :17.00   Min.   :1.000         Min.   :1.000    Min.   :1.000    
##  1st Qu.:19.00   1st Qu.:2.000         1st Qu.:1.000    1st Qu.:2.000    
##  Median :22.00   Median :2.000         Median :2.000    Median :3.000    
##  Mean   :21.97   Mean   :2.389         Mean   :2.236    Mean   :2.852    
##  3rd Qu.:24.00   3rd Qu.:3.000         3rd Qu.:3.000    3rd Qu.:4.000    
##  Max.   :28.00   Max.   :4.000         Max.   :4.000    Max.   :4.000    
##  Data.Feelingbadyourself Data.Hurtingyourself    Data.GPA    
##  Min.   :1.000           Min.   :1.000        Min.   :1.000  
##  1st Qu.:1.000           1st Qu.:1.000        1st Qu.:2.300  
##  Median :2.000           Median :1.000        Median :3.350  
##  Mean   :2.432           Mean   :1.577        Mean   :3.009  
##  3rd Qu.:3.000           3rd Qu.:2.000        3rd Qu.:3.350  
##  Max.   :4.000           Max.   :4.000        Max.   :4.000
dnl <- Data[,c("Age","Pleasureinthings","Littleenergy","Feelingbadyourself","Feelingdown","Hurtingyourself","GPA")]

Age - Tuổi

summary(Data$Age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   17.00   19.00   22.00   21.97   24.00   28.00
sd(Data$Age)
## [1] 3.21924
table(Data$Age)
## 
## 17 18 19 20 21 22 23 24 25 26 27 28 
## 32 23 46 31 26 44 34 40 14 18 26 18
prop.table(table(Data$Age))
## 
##         17         18         19         20         21         22         23 
## 0.09090909 0.06534091 0.13068182 0.08806818 0.07386364 0.12500000 0.09659091 
##         24         25         26         27         28 
## 0.11363636 0.03977273 0.05113636 0.07386364 0.05113636
ggplot(Data,aes(Age))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Age")

Pleasureinthings - Mức độ cảm thấy ít hứng thú với việc mình làm

summary(Data$Pleasureinthings)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   2.000   2.389   3.000   4.000
table(Data$Pleasureinthings)
## 
##   1   2   3   4 
##  55 147 108  42
prop.table(table(Data$Pleasureinthings))
## 
##         1         2         3         4 
## 0.1562500 0.4176136 0.3068182 0.1193182
ggplot(Data,aes(Pleasureinthings))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Pleasureinthings")

Feelingdown - Mức độ cảm thấy chán nản, thất vọng

summary(Data$Feelingdown)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   2.000   2.236   3.000   4.000
table(Data$Feelingdown)
## 
##   1   2   3   4 
## 100 120  81  51
prop.table(table(Data$Feelingdown))
## 
##         1         2         3         4 
## 0.2840909 0.3409091 0.2301136 0.1448864
ggplot(Data,aes(Feelingdown))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Feelingdown")

Littleenergy - Mức độ cảm thấy mệt mỏi hoặc có ít năng lượng

summary(Data$Littleenergy)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   3.000   2.852   4.000   4.000
table(Data$Littleenergy)
## 
##   1   2   3   4 
##  36  99  98 119
prop.table(table(Data$Littleenergy))
## 
##         1         2         3         4 
## 0.1022727 0.2812500 0.2784091 0.3380682
ggplot(Data,aes(Littleenergy))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Littleenergy")

Feelingbadyourself - Mức độ cảm thấy tồi tệ về bản thân

summary(Data$Feelingbadyourself)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   2.000   2.432   3.000   4.000
table(Data$Feelingbadyourself)
## 
##  1  2  3  4 
## 93 92 89 78
prop.table(table(Data$Feelingbadyourself))
## 
##         1         2         3         4 
## 0.2642045 0.2613636 0.2528409 0.2215909
ggplot(Data,aes(Feelingbadyourself))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Feelingbadyourself")

Hurtingyourself - Mức độ suy nghĩ đến cái chết hoặc tự làm tổn thương mình

summary(Data$Hurtingyourself)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   1.000   1.577   2.000   4.000
prop.table(table(Data$Hurtingyourself))
## 
##          1          2          3          4 
## 0.65625000 0.18465909 0.08522727 0.07386364
ggplot(Data,aes(Hurtingyourself))+
  geom_bar(color = "blue", fill = "skyblue")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Students")+ xlab("Hurtingyourself")

GPA - Điểm số tích luỹ hiện tại tính theo thang điểm 4

summary(Data$GPA)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.300   3.350   3.009   3.350   4.000
sd(Data$GPA)
## [1] 0.760909
table(Data$GPA)
## 
##    1  1.3    2  2.2 2.25  2.3 2.32  2.4 2.47  2.5  2.7 2.73 2.74 2.75 2.78 2.83 
##    2   21    1    1    2   91    1    1    1    1    1    1    1   10    1    1 
## 2.85 2.87 2.97 2.98 3.05  3.1 3.15  3.2 3.23 3.24 3.25 3.27 3.33 3.35 3.37 3.41 
##    1    1    5    1    1    1    1    1    1    1    6    2    1  112    2    1 
## 3.42  3.5 3.54  3.7 3.73 3.75 3.76 3.84 3.89 3.93 3.97 3.98    4 
##    1    1    1    2    1    4    2    1    1    1    1    1   60
prop.table(table(Data$GPA))
## 
##           1         1.3           2         2.2        2.25         2.3 
## 0.005681818 0.059659091 0.002840909 0.002840909 0.005681818 0.258522727 
##        2.32         2.4        2.47         2.5         2.7        2.73 
## 0.002840909 0.002840909 0.002840909 0.002840909 0.002840909 0.002840909 
##        2.74        2.75        2.78        2.83        2.85        2.87 
## 0.002840909 0.028409091 0.002840909 0.002840909 0.002840909 0.002840909 
##        2.97        2.98        3.05         3.1        3.15         3.2 
## 0.014204545 0.002840909 0.002840909 0.002840909 0.002840909 0.002840909 
##        3.23        3.24        3.25        3.27        3.33        3.35 
## 0.002840909 0.002840909 0.017045455 0.005681818 0.002840909 0.318181818 
##        3.37        3.41        3.42         3.5        3.54         3.7 
## 0.005681818 0.002840909 0.002840909 0.002840909 0.002840909 0.005681818 
##        3.73        3.75        3.76        3.84        3.89        3.93 
## 0.002840909 0.011363636 0.005681818 0.002840909 0.002840909 0.002840909 
##        3.97        3.98           4 
## 0.002840909 0.002840909 0.170454545
hist(Data$GPA)

2.3 Thống kê mô tả cho các cặp biến

2.3.1 Biến Depression (Sinh viên có biểu hiện trầm cảm) và biến Gender (Giới tính)

2.3.2 Biến Depression (Sinh viên có biểu hiện trầm cảm) và biến Age (Độ tuổi)

2.3.3 Biến Depression (Sinh viên có biểu hiện trầm cảm) và biến Accommodation (Nơi ở hiện tại)

2.3.4 Biến Depression (Sinh viên có biểu hiện trầm cảm) và biến Job (Công việc hiện tại)

2.3.5 Biến Depression (Sinh viên có biểu hiện trầm cảm) và biến Pleasureinthings (Mức độ cảm thấy ít hứng thú với việc mình làm)

2.3.6 Biến Depression (Sinh viên có biểu hiện trầm cảm) và biến Selfstudy (Thời gian tự học mỗi ngày)

2.3.7 Biến Depression (Sinh viên có biểu hiện trầm cảm) và biến GPA (Điểm số tích luỹ hiện tại tính theo thang điểm 4)

LS0tDQp0aXRsZTogIlBIw4JOIFTDjUNIIEPDgUMgWeG6vlUgVOG7kCDhuqJOSCBIxq/hu55ORyDEkOG6vk4gVknhu4ZDIELhu4ogVFLhuqZNIEPhuqJNIOG7niBTSU5IIFZJw4pOIg0KYXV0aG9yOiAiTkdVWeG7hE4gQ+G6qE0gTkdVWcOKTiAtIMSQ4bq2TkcgVEhBTkggVFLDmkMgLSBQSOG6oE0gVEhVIFBIxq/GoE5HIg0KZGF0ZTogIjIwMjQtMDYtMDkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgdG9jX2RlcGh0OiAzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkgKHJlYWR4bCkNCmxpYnJhcnkgKGdncGxvdDIpDQpsaWJyYXJ5IChEZXNjVG9vbHMpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkoRFQpDQpgYGANCg0KDQoNCiMgROG7ryBsaeG7h3UgbmdoacOqbiBj4bupdQ0KDQpE4buvIGxp4buHdSBz4butIGThu6VuZyB0cm9uZyBiw6BpIG5naGnDqm4gY+G7qXUgxJHGsOG7o2MgbOG6pXkgdOG7qyB0w6FjIGdp4bqjIEthbmUgUnVkb2xwaCB0csOqbiB0cmFuZyB3ZWIga2FnZ2xlLmNvbS4gDQoNCkThu68gbGnhu4d1IMSRxrDhu6NjIHRodSB0aOG6rXAgYuG6sW5nIGPDoWNoIGto4bqjbyBzw6F0IHNpbmggdmnDqm4gSG9hIEvhu7MgxJFhbmcgdGhlbyBo4buNYyDhu58gY8OhYyBj4bqlcCBo4buNYyBraMOhYyBuaGF1IG5oxrAgdHJ1bmcgaOG7jWMsIMSR4bqhaSBo4buNYyB2w6AgdGjhuqFjIHPEqS4gVOG7lW5nIGPhu5luZyBjw7MgMzUyIHNpbmggdmnDqm4gxJHGsOG7o2MgxJHGsGEgdsOgbyBuZ2hpw6puIGPhu6l1LiBE4buvIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIHThu6sgY8OhYyBzaW5oIHZpw6puIGLhurFuZyBwaMawxqFuZyBwaMOhcCBjw6J1IGjhu49pIHbhu5tpIHPhu7EgxJHhu5NuZyDDvSBjw7MgaGnhu4N1IGJp4bq/dC4NCg0KYGBge3J9DQpEYXRhIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL0RlbGwvRG93bmxvYWRzL0RhdGEgKDIpLnhsc3giKQ0Kc3RyIChEYXRhKQ0KYGBgDQpC4buZIGThu68gbGnhu4d1IGfhu5NtIGPDsyAxNCBiaeG6v24uIFRyb25nIMSRw7MgY8OzIDcgYmnhur9uIMSR4buLbmggdMOtbmggdsOgIDcgYmnhur9uIMSR4buLbmggbMaw4bujbmc6DQoNCi0gQmnhur9uIEdlbmRlciAtIEdp4bubaSB0w61uaCBj4bunYSBzaW5oIHZpw6puLCBn4buTbSAyIGdpw6EgdHLhu4sgTWFsZSAoTmFtKSBob+G6t2MgRmVtYWxlIChO4buvKS4NCg0KLSBCaeG6v24gQWdlIC0gVHXhu5VpIGPhu6dhIHNpbmggdmnDqm4uDQoNCi0gQWNjb21tb2RhdGlvbiAtIE7GoWkg4bufIGhp4buHbiB04bqhaSBj4bunYSBzaW5oIHZpw6puLCBn4buTbSAyIGdpw6EgdHLhu4s6IEhvbWUgd2l0aCBwYXJlbnRzIChU4bqhaSBuaMOgIHbhu5tpIGdpYSDEkcOsbmgpIHbDoCBQcml2YXRlIHJlbnRlZCBhY2NvbW1vZGF0aW9uIChQaMOybmcgdHLhu40gdMawIG5ow6JuKS4NCg0KLSBCaeG6v24gRWR1Y2F0aW9uTCBUcsOsbmggxJHhu5kgaOG7jWMgduG6pW4gaGnhu4duIHThuqFpLCBn4buTbSAzIGdpw6EgdHLhu4sgLSBIaWdoIFNjaG9vbCAoVHJ1bmcgaOG7jWMgcGjhu5UgdGjDtG5nKSwgQ29sbGVnZSAtIEJhY2hlbG9yJ3MgKMSQ4bqhaSBo4buNYykgdsOgIE1hc3RlciAoVGjhuqFjIHPEqSkuDQoNCi0gQmnhur9uIFNlbGZzdHVkeSAtIFPhu5EgZ2nhu50gdOG7sSBo4buNYyBt4buXaSBuZ8OgeSwgZ+G7k20gMyBnacOhIHRy4buLOiAxIC0gMiBob3VycyAodOG7qyAxIMSR4bq/biAyIHRp4bq/bmcpLCAyIC0gNCBob3VycyAodOG7qyAyIMSR4bq/biA0IHRp4bq/bmcpIHbDoCBNb3JlIHRoYW4gNCBob3VycyAoaMahbiA0IHRp4bq/bmcpLg0KDQotIEJp4bq/biBKb2IgLSBoaeG7h24gdOG6oWkgY8OzIMSRaSBsw6BtIGhheSBraMO0bmcsIGfhu5NtIDIgZ2nDoSB0cuG7izogWWVzIGhv4bq3YyBObw0KDQotIEJp4bq/biBNZWRpYSAtIHPhu5EgZ2nhu50gZMOgbmggY2hvIHBoxrDGoW5nIHRp4buHbiB0cnV54buBbiB0aMO0bmcgbeG7l2kgbmfDoHksIGfhu5NtIDMgZ2nDoSB0cuG7izogMSAtIDIgaG91cnMgKHThu6sgMSDEkeG6v24gMiB0aeG6v25nKSwgMiAtIDQgaG91cnMgKHThu6sgMiDEkeG6v24gNCB0aeG6v25nKSB2w6AgTW9yZSB0aGFuIDQgaG91cnMgKGjGoW4gNCB0aeG6v25nKS4NCg0KLSBCaeG6v24gUGxlYXN1cmVpbnRoaW5ncyAtIMONdCBo4bupbmcgdGjDuiBob+G6t2Mgbmnhu4FtIHZ1aSB0cm9uZyBjw7RuZyB2aeG7h2MsIGfhu5NtIDQgbeG7qWMgxJHhu5k6IDEgKENoxrBhIGJhbyBnaeG7nSksIDIoVGhpIHRob+G6o25nKSwgMyAoVGjGsOG7nW5nIHh1ecOqbiksIDQgKEx1w7RuIGx1w7RuKS4NCg0KLSBCaeG6v24gTGl0dGxlZW5lcmd5IC0gQ+G6o20gdGjhuqV5IG3hu4d0IG3hu49pIGhv4bq3YyBjw7Mgw610IG7Eg25nIGzGsOG7o25nLCBn4buTbSA0IG3hu6ljIMSR4buZIHTGsMahbmcgdOG7sSBuaMawIGJp4bq/biBQbGVhc3VyZWludGhpbmdzLg0KDQotIEJp4bq/biBGZWVsaW5nYmFkeW91cnNlbGYgLSBD4bqjbSB0aOG6pXkgdOG7k2kgdOG7hyB24buBIGLhuqNuIHRow6JuIGhv4bq3YyBy4bqxbmcgYuG6oW4gbMOgIG3hu5l0IGvhursgdGjhuqV0IGLhuqFpIGhv4bq3YyDEkcOjIGtow7RuZyBsw6BtIGLhuqNuIHRow6JuIGhv4bq3YyBnaWEgxJHDrG5oIHRo4bqldCB24buNbmcsIGfhu5NtIDQgbeG7qWMgxJHhu5kgdMawxqFuZyB04buxIG5oxrAgYmnhur9uIFBsZWFzdXJlaW50aGluZ3MuDQoNCi0gQmnhur9uIEZlZWxpbmdkb3duIC0gQ+G6o20gdGjhuqV5IHRo4bqldCB24buNbmcsIGNow6FuIG7huqNuLCBob+G6t2MgdsO0IHbhu41uZywgZ+G7k20gNCBt4bupYyDEkeG7mSB0xrDGoW5nIHThu7EgbmjGsCBiaeG6v24gUGxlYXN1cmVpbnRoaW5ncy4NCg0KLSBCaeG6v24gSHVydGluZ3lvdXJzZWxmIC0gU3V5IG5naMSpIHLhurFuZyBi4bqhbiBuw6puIGNo4bq/dCDEkWkgaG/hurdjIGzDoG0gdOG7lW4gdGjGsMahbmcgY2jDrW5oIG3DrG5oIHRoZW8gbeG7mXQgY8OhY2ggbsOgbyDEkcOzLCBn4buTbSA0IG3hu6ljIMSR4buZIHTGsMahbmcgdOG7sSBuaMawIGJp4bq/biBQbGVhc3VyZWludGhpbmdzLg0KDQotIEJp4bq/biBHUEEgLSDEkGnhu4NtIHPhu5EgdMOtY2ggbHXhu7kgaGnhu4duIHThuqFpIHTDrW5oIHRoZW8gdGhhbmcgxJFp4buDbSA0Lg0KDQotIEJp4bq/biBEZXByZXNzaW9uIC0gU2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20gaGF5IGtow7RuZywgZ+G7k20gMiBnacOhIHRy4buLOiBZZXMgaG/hurdjIE5vLg0KDQojIFRo4buRbmcga8OqIG3DtCB04bqjDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIGNobyAxIGJp4bq/bg0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGJp4bq/biDEkeG7i25oIHTDrW5oDQoNCmBgYHtyfQ0KZG50IDwtIERhdGFbLGMoIkdlbmRlciIsIkFjY29tbW9kYXRpb24iLCJFZHVjYXRpb24iLCJTZWxmc3R1ZHkiLCJKb2IiLCJNZWRpYSIsIkRlcHJlc3Npb24iKV0NCmBgYA0KKioqR2VuZGVyIC0gR2nhu5tpIHTDrW5oKioqDQoNCmBgYHtyfQ0KdGFibGUoRGF0YSRHZW5kZXIpDQpwcm9wLnRhYmxlKHRhYmxlKERhdGEkR2VuZGVyKSkNCmBgYA0KVHJvbmcgdOG7lW5nIHPhu5EgMzUyIGjhu41jIHNpbmggc2luaCB2acOqbiB0aGFtIGdpYSBraOG6o28gc8OhdCB0aMOsIGPDsyDEkeG6v24gMzEzIHNpbmggdmnDqm4gbuG7ryAoY2hp4bq/bSBn4bqnbiA4OSUpIHbDoCAzOSBzaW5oIHZpw6puIG5hbSAoY2hp4bq/bSAxMSUpLg0KDQoNCg0KYGBge3J9DQpnZ3Bsb3QoRGF0YSxhZXMoR2VuZGVyKSkrDQogIGdlb21fYmFyKGNvbG9yID0gImJsdWUiLCBmaWxsID0gInNreWJsdWUiKSsNCiAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXMgOjogcGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQ9ICAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLS41KSsNCiAgeWxhYigiTnVtYmVyIG9mIFN0dWRlbnRzIikrIHhsYWIoIkdlbmRlciIpDQpgYGANCg0KKioqRWR1Y2F0aW9uIC0gVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuKioqDQoNCmBgYHtyfQ0KdGFibGUoRGF0YSRFZHVjYXRpb24pDQpwcm9wLnRhYmxlKHRhYmxlKERhdGEkRWR1Y2F0aW9uKSkNCmBgYA0KS+G6v3QgcXXhuqMga2jhuqNvIHPDoXQgMzUyIGjhu41jIHNpbmggc2luaCB2acOqbiBjaG8gdGjhuqV5IDogDQoNCi0gQ8OzIDIwNCBzaW5oIHZpw6puIMSRYW5nIHRoZW8gaOG7jWMgxJHhuqFpIGjhu41jIChjb2xsZWdlIC0gQmFjaGVsb3IncykgY2hp4bq/bSB04buJIGzhu4cgNTglIA0KDQotIEPDsyAxMjQgaOG7jWMgc2luaCDEkWFuZyBo4buNYyB0cnVuZyBo4buNYyBwaOG7lSB0aMO0bmcgKEhpZ2ggU2Nob29sKSBjaGnhur9tIHThu4kgbOG7hyAzNSUNCg0KLSBDw7MgMjQgc2luaCB2acOqbiDEkWFuZyB0aGVvIGjhu41jIHRo4bqhYyBzxKkgKE1hc3RlcikgY2hp4bq/bSB04buJIGzhu4cgNyUNCg0KDQpgYGB7cn0NCmdncGxvdChEYXRhLGFlcyhFZHVjYXRpb24pKSsNCiAgZ2VvbV9iYXIoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAic2t5Ymx1ZSIpKw0KICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKw0KICB5bGFiKCJOdW1iZXIgb2YgU3R1ZGVudHMiKSsgeGxhYigiRWR1Y2F0aW9uIikNCmBgYA0KDQoqKipKb2IgLSBDw7RuZyB2aeG7h2MgaGnhu4duIHThuqFpKioqDQoNCmBgYHtyfQ0KdGFibGUoRGF0YSRKb2IpDQpwcm9wLnRhYmxlKHRhYmxlKERhdGEkSm9iKSkNCmBgYA0KVHJvbmcgdOG7lW5nIHPhu5Egbmjhu69uZyBuZ8aw4budaSDEkcaw4bujYyBraOG6o28gc8OhdCAoMzUyIG5nxrDhu51pKSB0aMOsIGPDsyDEkeG6v24gNjYlIG5nxrDhu51pIGPDsyB2aeG7h2MgbMOgbSBiYW8gZ+G7k20gY+G6oyBjw7RuZyB2aeG7h2MgZnVsbC10aW0gdsOgIHBhcnQtdGltZSAodMawxqFuZyDEkcawxqFuZyB24bubaSAyMzMgaOG7jWMgc2luaCBzaW5oIHZpw6puKSB2w6AgY8OzIGtob+G6o25nIDM0JSAodMawxqFuZyDEkcawxqFuZyB24bubaSAxMTkgaOG7jWMgc2luaCBzaW5oIHZpw6puKSBraMO0bmcgxJFpIGzDoG0uDQoNCg0KYGBge3J9DQpnZ3Bsb3QoRGF0YSxhZXMoSm9iKSkrDQogIGdlb21fYmFyKGNvbG9yID0gImJsdWUiLCBmaWxsID0gInNreWJsdWUiKSsNCiAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXMgOjogcGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQ9ICAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLS41KSsNCiAgeWxhYigiTnVtYmVyIG9mIFN0dWRlbnRzIikrIHhsYWIoIkpvYiIpDQpgYGANCg0KKioqQWNjb21tb2RhdGlvbiAtIE7GoWkg4bufIGhp4buHbiB04bqhaSoqKg0KDQpgYGB7cn0NCnRhYmxlKERhdGEkQWNjb21tb2RhdGlvbikNCnByb3AudGFibGUodGFibGUoRGF0YSRBY2NvbW1vZGF0aW9uKSkNCmBgYA0KVGhlbyBr4bq/dCBxdeG6oyBj4bunYSBi4bqjbmcga2jhuqNvIHPDoXQgMzUyIGjhu41jIHNpbmggc2luaCB2acOqbiB0aMOsIGPDsyA6IA0KDQotIDE1NSBo4buNYyBzaW5oIHNpbmggdmnDqm4gc+G7kW5nIGNodW5nIHbhu5tpIGdpYSDEkcOsbmggY2hp4bq/bSA0NCUNCg0KLSAxOTcgaOG7jWMgc2luaCBzaW5oIHZpw6puIOG7nyB04bqhaSBjw6FjIHBow7JuZyB0cuG7jSB0xrAgbmjDom4gY2hp4bq/bSA1NiUNCg0KxJBhIHPhu5EgaOG7jWMgc2luaCBzaW5oIHZpw6puIGPDsyB4dSBoxrDhu5tuZyDhu58gY8OhYyBwaMOybmcgdHLhu40gdMawIG5ow6JuIGjGoW4gbMOgIHPhu5FuZyBjaHVuZyB24bubaSBnaWEgxJHDrG5oDQoNCmBgYHtyfQ0KZ2dwbG90KERhdGEsYWVzKEFjY29tbW9kYXRpb24pKSsNCiAgZ2VvbV9iYXIoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAic2t5Ymx1ZSIpKw0KICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKw0KICB5bGFiKCJOdW1iZXIgb2YgU3R1ZGVudHMiKSsgeGxhYigiQWNjb21tb2RhdGlvbiIpDQpgYGANCg0KKioqU2VsZnN0dWR5IC0gVGjhu51pIGdpYW4gdOG7sSBo4buNYyBt4buXaSBuZ8OgeSoqKg0KDQpgYGB7cn0NCnRhYmxlKERhdGEkU2VsZnN0dWR5KQ0KcHJvcC50YWJsZSh0YWJsZShEYXRhJFNlbGZzdHVkeSkpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyBraOG6o28gc8OhdCBjaG8gdGjhuqV5IMSRYSBz4buRIGjhu41jIHNpbmggc2luaCB2acOqbiAoa2hv4bqjbmcgNTclKSBkw6BuaCB0aOG7nWkgZ2lhbiB04burIDEtMiB0aeG6v25nIMSR4buDIGjhu41jIG3hu5dpIG5nw6B5ICggdMawxqFuZyDEkcawxqFuZyB24bubaSAyMDAgaOG7jWMgc2luaCBzaW5oIHZpw6puKSwgY8OzIGtob+G6o25nIDI4JSAodMawxqFuZyDEkcawxqFuZyB24bubaSA5OSBo4buNYyBzaW5oIHNpbmggdmnDqm4pIGTDoG5oIHRo4budaSBnaWFuIHThu6sgMi00IHRp4bq/bmcgxJHhu4MgaOG7jWMgbeG7l2kgbmfDoHkgdsOgIGPDsyBraG/huqNuZyAxNSUgKHTGsMahbmcgxJHGsMahbmcgduG7m2kgNTMgaOG7jWMgc2luaCBzaW5oIHZpw6puKSBkw6BuaCBuaGnhu4F1IGjGoW4gNCB0aeG6v25nIMSR4buDIGjhu41jIHRyb25nIG3hu5l0IG5nw6B5LiANCg0KDQpgYGB7cn0NCmdncGxvdChEYXRhLGFlcyhTZWxmc3R1ZHkpKSsNCiAgZ2VvbV9iYXIoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAic2t5Ymx1ZSIpKw0KICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKw0KICB5bGFiKCJOdW1iZXIgb2YgU3R1ZGVudHMiKSsgeGxhYigiU2VsZnN0dWR5IikNCmBgYA0KDQoqKipNZWRpYSAtIFRo4budaSBnaWFuIGTDoG5oIGNobyBwaMawxqFuZyB0aeG7h24gdHJ1eeG7gW4gdGjDtG5nKioqDQoNCmBgYHtyfQ0KdGFibGUoRGF0YSRNZWRpYSkNCnByb3AudGFibGUodGFibGUoRGF0YSRNZWRpYSkpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoRGF0YSwgYWVzKHggPSAiIiwgZmlsbCA9IE1lZGlhKSkgKw0KICBnZW9tX2Jhcihjb2xvciA9ICJibHVlIiwgd2lkdGggPSAxLCBzdGF0ID0gImNvdW50IikgKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCkgKw0KICB5bGFiKCJOdW1iZXIgb2YgU3R1ZGVudHMiKSArDQogIHhsYWIoIk1lZGlhIikNCmBgYA0KDQoqKipEZXByZXNzaW9uIC0gVHLhuqdtIGPhuqNtKioqDQoNCmBgYHtyfQ0KdGFibGUoRGF0YSREZXByZXNzaW9uKQ0KcHJvcC50YWJsZSh0YWJsZShEYXRhJERlcHJlc3Npb24pKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KERhdGEsYWVzKERlcHJlc3Npb24pKSsNCiAgZ2VvbV9iYXIoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAic2t5Ymx1ZSIpKw0KICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKw0KICB5bGFiKCJOdW1iZXIgb2YgU3R1ZGVudHMiKSsgeGxhYigiRGVwcmVzc2lvbiIpDQpgYGANCg0KIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGJp4bq/biDEkeG7i25oIGzGsOG7o25nDQoNCmBgYHtyfQ0KbWFjIDwtZGF0YS5mcmFtZShEYXRhJEFnZSwgRGF0YSRQbGVhc3VyZWludGhpbmdzLCBEYXRhJEZlZWxpbmdkb3duLCBEYXRhJExpdHRsZWVuZXJneSwgRGF0YSRGZWVsaW5nYmFkeW91cnNlbGYsIERhdGEkSHVydGluZ3lvdXJzZWxmLCBEYXRhJEdQQSkNCg0Kc3VtbWFyeShtYWMpDQpgYGANCg0KYGBge3J9DQpkbmwgPC0gRGF0YVssYygiQWdlIiwiUGxlYXN1cmVpbnRoaW5ncyIsIkxpdHRsZWVuZXJneSIsIkZlZWxpbmdiYWR5b3Vyc2VsZiIsIkZlZWxpbmdkb3duIiwiSHVydGluZ3lvdXJzZWxmIiwiR1BBIildDQpgYGANCg0KKioqQWdlIC0gVHXhu5VpKioqDQoNCmBgYHtyfQ0Kc3VtbWFyeShEYXRhJEFnZSkNCmBgYA0KDQpgYGB7cn0NCnNkKERhdGEkQWdlKQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGUoRGF0YSRBZ2UpDQpwcm9wLnRhYmxlKHRhYmxlKERhdGEkQWdlKSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChEYXRhLGFlcyhBZ2UpKSsNCiAgZ2VvbV9iYXIoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAic2t5Ymx1ZSIpKw0KICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKw0KICB5bGFiKCJOdW1iZXIgb2YgU3R1ZGVudHMiKSsgeGxhYigiQWdlIikNCmBgYA0KDQoqKipQbGVhc3VyZWludGhpbmdzIC0gTeG7qWMgxJHhu5kgY+G6o20gdGjhuqV5IMOtdCBo4bupbmcgdGjDuiB24bubaSB2aeG7h2MgbcOsbmggbMOgbSoqKg0KDQpgYGB7cn0NCnN1bW1hcnkoRGF0YSRQbGVhc3VyZWludGhpbmdzKQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGUoRGF0YSRQbGVhc3VyZWludGhpbmdzKQ0KcHJvcC50YWJsZSh0YWJsZShEYXRhJFBsZWFzdXJlaW50aGluZ3MpKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KERhdGEsYWVzKFBsZWFzdXJlaW50aGluZ3MpKSsNCiAgZ2VvbV9iYXIoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAic2t5Ymx1ZSIpKw0KICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKw0KICB5bGFiKCJOdW1iZXIgb2YgU3R1ZGVudHMiKSsgeGxhYigiUGxlYXN1cmVpbnRoaW5ncyIpDQpgYGANCg0KKioqRmVlbGluZ2Rvd24gLSBN4bupYyDEkeG7mSBj4bqjbSB0aOG6pXkgY2jDoW4gbuG6o24sIHRo4bqldCB24buNbmcqKioNCg0KYGBge3J9DQpzdW1tYXJ5KERhdGEkRmVlbGluZ2Rvd24pDQpgYGANCg0KYGBge3J9DQp0YWJsZShEYXRhJEZlZWxpbmdkb3duKQ0KcHJvcC50YWJsZSh0YWJsZShEYXRhJEZlZWxpbmdkb3duKSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChEYXRhLGFlcyhGZWVsaW5nZG93bikpKw0KICBnZW9tX2Jhcihjb2xvciA9ICJibHVlIiwgZmlsbCA9ICJza3libHVlIikrDQogICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0PSAgJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLCB2anVzdCA9IC0uNSkrDQogIHlsYWIoIk51bWJlciBvZiBTdHVkZW50cyIpKyB4bGFiKCJGZWVsaW5nZG93biIpDQpgYGANCg0KKioqTGl0dGxlZW5lcmd5IC0gTeG7qWMgxJHhu5kgY+G6o20gdGjhuqV5IG3hu4d0IG3hu49pIGhv4bq3YyBjw7Mgw610IG7Eg25nIGzGsOG7o25nKioqDQoNCmBgYHtyfQ0Kc3VtbWFyeShEYXRhJExpdHRsZWVuZXJneSkNCmBgYA0KDQpgYGB7cn0NCnRhYmxlKERhdGEkTGl0dGxlZW5lcmd5KQ0KcHJvcC50YWJsZSh0YWJsZShEYXRhJExpdHRsZWVuZXJneSkpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoRGF0YSxhZXMoTGl0dGxlZW5lcmd5KSkrDQogIGdlb21fYmFyKGNvbG9yID0gImJsdWUiLCBmaWxsID0gInNreWJsdWUiKSsNCiAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXMgOjogcGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQ9ICAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLS41KSsNCiAgeWxhYigiTnVtYmVyIG9mIFN0dWRlbnRzIikrIHhsYWIoIkxpdHRsZWVuZXJneSIpDQpgYGANCg0KKioqRmVlbGluZ2JhZHlvdXJzZWxmIC0gTeG7qWMgxJHhu5kgY+G6o20gdGjhuqV5IHThu5NpIHThu4cgduG7gSBi4bqjbiB0aMOibioqKg0KDQpgYGB7cn0NCnN1bW1hcnkoRGF0YSRGZWVsaW5nYmFkeW91cnNlbGYpDQpgYGANCg0KYGBge3J9DQp0YWJsZShEYXRhJEZlZWxpbmdiYWR5b3Vyc2VsZikNCnByb3AudGFibGUodGFibGUoRGF0YSRGZWVsaW5nYmFkeW91cnNlbGYpKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KERhdGEsYWVzKEZlZWxpbmdiYWR5b3Vyc2VsZikpKw0KICBnZW9tX2Jhcihjb2xvciA9ICJibHVlIiwgZmlsbCA9ICJza3libHVlIikrDQogICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0PSAgJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLCB2anVzdCA9IC0uNSkrDQogIHlsYWIoIk51bWJlciBvZiBTdHVkZW50cyIpKyB4bGFiKCJGZWVsaW5nYmFkeW91cnNlbGYiKQ0KYGBgDQoNCioqKkh1cnRpbmd5b3Vyc2VsZiAtIE3hu6ljIMSR4buZIHN1eSBuZ2jEqSDEkeG6v24gY8OhaSBjaOG6v3QgaG/hurdjIHThu7EgbMOgbSB04buVbiB0aMawxqFuZyBtw6xuaCoqKg0KDQpgYGB7cn0NCnN1bW1hcnkoRGF0YSRIdXJ0aW5neW91cnNlbGYpDQpgYGANCg0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlKERhdGEkSHVydGluZ3lvdXJzZWxmKSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChEYXRhLGFlcyhIdXJ0aW5neW91cnNlbGYpKSsNCiAgZ2VvbV9iYXIoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAic2t5Ymx1ZSIpKw0KICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKw0KICB5bGFiKCJOdW1iZXIgb2YgU3R1ZGVudHMiKSsgeGxhYigiSHVydGluZ3lvdXJzZWxmIikNCmBgYA0KDQoqKipHUEEgLSDEkGnhu4NtIHPhu5EgdMOtY2ggbHXhu7kgaGnhu4duIHThuqFpIHTDrW5oIHRoZW8gdGhhbmcgxJFp4buDbSA0KioqDQoNCmBgYHtyfQ0Kc3VtbWFyeShEYXRhJEdQQSkNCmBgYA0KDQpgYGB7cn0NCnNkKERhdGEkR1BBKQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGUoRGF0YSRHUEEpDQpwcm9wLnRhYmxlKHRhYmxlKERhdGEkR1BBKSkNCmBgYA0KDQpgYGB7cn0NCmhpc3QoRGF0YSRHUEEpDQpgYGANCg0KIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGPDoWMgY+G6t3AgYmnhur9uDQoNCiMjIyBCaeG6v24gRGVwcmVzc2lvbiAoU2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20pIHbDoCBiaeG6v24gR2VuZGVyIChHaeG7m2kgdMOtbmgpDQoNCiMjIyBCaeG6v24gRGVwcmVzc2lvbiAoU2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20pIHbDoCBiaeG6v24gQWdlICjEkOG7mSB0deG7lWkpDQoNCiMjIyBCaeG6v24gRGVwcmVzc2lvbiAoU2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20pIHbDoCBiaeG6v24gIEFjY29tbW9kYXRpb24gKE7GoWkg4bufIGhp4buHbiB04bqhaSkNCg0KIyMjIEJp4bq/biBEZXByZXNzaW9uIChTaW5oIHZpw6puIGPDsyBiaeG7g3UgaGnhu4duIHRy4bqnbSBj4bqjbSkgdsOgIGJp4bq/biBKb2IgKEPDtG5nIHZp4buHYyBoaeG7h24gdOG6oWkpDQoNCiMjIyBCaeG6v24gRGVwcmVzc2lvbiAoU2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20pIHbDoCBiaeG6v24gUGxlYXN1cmVpbnRoaW5ncyAoTeG7qWMgxJHhu5kgY+G6o20gdGjhuqV5IMOtdCBo4bupbmcgdGjDuiB24bubaSB2aeG7h2MgbcOsbmggbMOgbSkNCg0KIyMjIEJp4bq/biBEZXByZXNzaW9uIChTaW5oIHZpw6puIGPDsyBiaeG7g3UgaGnhu4duIHRy4bqnbSBj4bqjbSkgdsOgIGJp4bq/biBTZWxmc3R1ZHkgKFRo4budaSBnaWFuIHThu7EgaOG7jWMgbeG7l2kgbmfDoHkpDQoNCiMjIyBCaeG6v24gRGVwcmVzc2lvbiAoU2luaCB2acOqbiBjw7MgYmnhu4N1IGhp4buHbiB0cuG6p20gY+G6o20pIHbDoCBiaeG6v24gR1BBICAoxJBp4buDbSBz4buRIHTDrWNoIGx14bu5IGhp4buHbiB04bqhaSB0w61uaCB0aGVvIHRoYW5nIMSRaeG7g20gNCkNCg0KDQoNCg==