Giới thiệu về dataset socsupport

SocSupport là một gói dữ liệu trong phần mềm R dùng để nghiên cứu các yếu tố hỗ trợ xã hội. Dữ liệu này được thu thập từ một cuộc khảo sát về hỗ trợ xã hội và các loại hỗ trợ khác.

gender: Giới tính (nữ, nam)

age: Độ tuổi (được phân loại theo nhóm)

country: Quốc gia (Úc hoặc các nước khác)

marital: Tình trạng hôn nhân (đã kết hôn, khác, độc thân)

livewith: Cùng sống với ai (một mình, bạn bè, gia đình khác, bố mẹ, người yêu, ký túc xá)

employment: Tình trạng việc làm (hưởng lương toàn thời gian, hưởng lương bán thời gian, trợ cấp chính phủ, khác, trợ cấp nuôi con)

firstyr: Năm học đầu tiên (năm nhất hoặc khác)

enrolment: Loại hình nhập học (full-time - toàn thời gian,part-tiem - bán thời gian)

Các biến bắt đầu bằng emotional (cảm xúc):

emotional: Mức độ sẵn có của hỗ trợ về mặt tình cảm

emotionalsat: Mức độ hài lòng với hỗ trợ về mặt tình cảm

Các biến bắt đầu bằng tangible (vật chất):

tangible: Mức độ sẵn có của hỗ trợ về mặt vật chất

tangiblesat: Mức độ hài lòng với hỗ trợ về mặt vật chất

Các biến bắt đầu bằng affect (tình cảm):

affect: Mức độ sẵn có của nguồn hỗ trợ tình cảm

affectsat: Mức độ hài lòng với nguồn hỗ trợ tình cảm

Các biến bắt đầu bằng psi (tương tác xã hội tích cực):

psi: Mức độ sẵn có của tương tác xã hội tích cực

psisat: Mức độ hài lòng với tương tác xã hội tích cực

esupport: Mức độ hỗ trợ về mặt tình cảm

psupport: Mức độ hỗ trợ thiết thực

supsources: Tổng mức độ hỗ trợ xã hội

BDI: Điểm đánh giá mức độ trầm cảm theo Beck Depression Inventory

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ 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(epitools)
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.3
library(DT)
## Warning: package 'DT' was built under R version 4.3.3
library(ggplot2)
library(ggcorrplot)
library(GLMsData)
library(readxl)
socsupport <- read_excel("C:/Users/chaua/Downloads/socsupport.xlsx")
View(socsupport)
t <- socsupport

Lập bảng tần số

m <- table(t$enrolment,t$country)
prop.table(m)
##            
##             australia  other
##   full-time    0.7263 0.1053
##   part-time    0.1684 0.0000

Nhận xét: Có 72.63% người làm việc full time là người Úc, 10.53% người làm việc full time là không phải người Úc, 16.84% là người Úc làm việc part time

addmargins(table(t$enrolment,t$country))
##            
##             australia other Sum
##   full-time        69    10  79
##   part-time        16     0  16
##   Sum              85    10  95
h <- addmargins(table(t$enrolment,t$country))
prop.table(h)
##            
##             australia   other     Sum
##   full-time   0.18158 0.02632 0.20789
##   part-time   0.04211 0.00000 0.04211
##   Sum         0.22368 0.02632 0.25000

Nhận xét:

Từ bảng phân phối biên, thì người có quốc tịch Úc là 22.368% còn người có quốc tịch khác chiếm 2.632%

Đối với công việc làm full-time chiếm 20.789%, còn với công việc làm part-time chiếm 4.211% # Vẽ đồ thị

t |> ggplot(aes(x = t$country, y = after_stat(count))) + geom_bar(fill = 'skyblue') + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'red', vjust = - .5) + theme_classic() + labs(x = 'Quốc tịch Úc', y = 'Số người')
## Warning: Use of `t$country` is discouraged.
## ℹ Use `country` instead.
## Use of `t$country` is discouraged.
## ℹ Use `country` instead.

t |> ggplot(aes(x = t$enrolment, y = after_stat(count))) + geom_bar(fill = 'darkblue') + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'red', vjust = - .5) + theme_classic() + labs(x = 'Công việc', y = 'Số người')
## Warning: Use of `t$enrolment` is discouraged.
## ℹ Use `enrolment` instead.
## Warning: Use of `t$enrolment` is discouraged.
## ℹ Use `enrolment` instead.

ggplot(t, aes(country, fill = enrolment)) + geom_bar(position = 'dodge')

# Ước lượng tỉ lệ ## enrolment

ttf <- t[t$enrolment == 'full-time',]
ttp <- t[t$enrolment == 'part-time',]
prop.test(length(ttf$enrolment), length(t$enrolment), p = 0.5)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(ttf$enrolment) out of length(t$enrolment), null probability 0.5
## X-squared = 40, df = 1, p-value = 2e-10
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7379 0.8978
## sample estimates:
##      p 
## 0.8316
prop.test(length(ttp$enrolment), length(t$enrolment), p = 0.5)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(ttp$enrolment) out of length(t$enrolment), null probability 0.5
## X-squared = 40, df = 1, p-value = 2e-10
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.1022 0.2621
## sample estimates:
##      p 
## 0.1684

Giả thuyết null (H0): Tỷ lệ thực tế (p) của một loại ghi danh nhất định trong dân số bằng 0,5 (50%).

Giả thuyết thay thế (H1): Tỷ lệ thực tế (p) không bằng 0,5.

+++ Đối với dữ liệu full-time

Giá trị p rất nhỏ (2e-10) cho thấy chúng ta có thể bác bỏ giả thuyết null. Điều này có nghĩa là có bằng chứng mạnh mẽ cho thấy tỷ lệ thực tế của một loại ghi danh nhất định trong dân số không phải là 50%.

Khoảng tin cậy (0,7379 - 0,8978) cho biết rằng chúng ta có 95% tin tưởng rằng tỷ lệ thực tế nằm trong khoảng từ 73,79% đến 89,78%.

Ước tính mẫu (p = 0,8316) cho thấy tỷ lệ quan sát cao hơn (trên 83%) rơi vào một loại ghi danh cụ thể so với 50% dự kiến dưới giả thuyết null.

+++ Đối với dữ liệu part-time

Giá trị p rất nhỏ (2e-10) cho thấy chúng ta có thể bác bỏ giả thuyết null. Điều này có nghĩa là có bằng chứng mạnh mẽ cho thấy tỷ lệ thực tế của một loại ghi danh nhất định trong dân số không phải là 50%.

Khoảng tin cậy (0.1022 - 0.2621) cho biết rằng chúng ta có 95% tin tưởng rằng tỷ lệ thực tế nằm trong khoảng từ 10,22% đến 26,21%.

Ước tính mẫu (p = 0.1684) cho thấy tỷ lệ quan sát (16,84%) rơi vào một loại ghi danh cụ thể, thấp hơn so với 50% dự kiến dưới giả thuyết null. ## country

tta <- t[t$country == 'australia',]
tto <- t[t$country == 'other',]
prop.test(length(tta$country ), length(t$country ), p = 0.5)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(tta$country) out of length(t$country), null probability 0.5
## X-squared = 58, df = 1, p-value = 3e-14
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.8107 0.9456
## sample estimates:
##      p 
## 0.8947
prop.test(length(tto$country ), length(t$country ), p = 0.5)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(tto$country) out of length(t$country), null probability 0.5
## X-squared = 58, df = 1, p-value = 3e-14
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.05439 0.18930
## sample estimates:
##      p 
## 0.1053

Giả thuyết null (H0): Tỷ lệ thực tế (p) của một loại ghi danh nhất định trong dân số bằng 0,5 (50%).

Giả thuyết thay thế (H1): Tỷ lệ thực tế (p) không bằng 0,5. +++ Đối với dữ liệu australia

Giá trị p rất nhỏ (3e-14) cung cấp bằng chứng mạnh mẽ để bác bỏ giả thuyết null (tỷ lệ sinh viên từ nhóm quốc gia này bằng 50% trong dân số).

Khoảng tin cậy cho thấy chúng ta có thể tin tưởng với độ tin cậy 95% rằng tỷ lệ thực tế của sinh viên từ nhóm quốc gia này nằm trong khoảng 81,07% đến 94,56%.

Ước tính mẫu (89.47%) cho thấy tỷ lệ sinh viên từ nhóm quốc gia này trong mẫu cao hơn nhiều so với 50% (giả thuyết null).

+++ Đối với dữ liệu other

Giá trị p rất nhỏ (3e-14) cung cấp bằng chứng mạnh mẽ để bác bỏ giả thuyết null (tỷ lệ sinh viên từ nhóm quốc gia này bằng 50% trong dân số).

Khoảng tin cậy cho thấy chúng ta có thể tin tưởng với độ tin cậy 95% rằng tỷ lệ thực tế của sinh viên từ nhóm quốc gia này nằm trong khoảng 5,44% đến 18,93%.

Ước tính mẫu (10.53%) cho thấy tỷ lệ sinh viên từ nhóm quốc gia này trong mẫu thấp hơn nhiều so với 50% (giả thuyết null). # Ước lượng tỉ lệ 2 biến

tf <- t[t$enrolment == 'full-time',]
tp <- t[t$enrolment == 'part-time',]

ta <- tf[tf$country == 'australia',]
to <- tp[tp$country == 'other',]


b <- c(nrow(ta), nrow(to))
a <- c(nrow(tf), nrow(tp))

prop.test(b,a)
## Warning in prop.test(b, a): Chi-squared approximation may be incorrect
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  b out of a
## X-squared = 47, df = 1, p-value = 8e-12
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.7625 0.9843
## sample estimates:
## prop 1 prop 2 
## 0.8734 0.0000

Giả thuyết null (H0): Tỷ lệ thành công (p) trong hai nhóm là bằng nhau.

Giả thuyết thay thế (H1): Tỷ lệ thành công (p) giữa hai nhóm là khác nhau (khác biệt hai phía).

Giá trị p rất nhỏ (8e-12) cung cấp bằng chứng mạnh mẽ để bác bỏ giả thuyết null (tỷ lệ thành công giữa hai nhóm là bằng nhau).

Khoảng tin cậy cho thấy chúng ta có thể tin tưởng với độ tin cậy 95% rằng sự khác biệt thực tế giữa tỷ lệ thành công của hai nhóm nằm trong khoảng 76,25% đến 98,43%.

Ước tính mẫu cho thấy tỷ lệ thành công trong nhóm 1 (0,8734) cao hơn nhiều so với nhóm 2 (0,0000). # Relative risk

table(t$enrolment,t$country)
##            
##             australia other
##   full-time        69    10
##   part-time        16     0
x <- table(t$enrolment,t$country)
RelRisk(x)
## [1] 0.8734

Rủi ro trong ma trận này là 0.8734 < 1, cho thấy nhóm người không có quốc tịch Úc làm việc full-time có khả năng nhiều hơn nhóm người có quốc tịch khác Úc làm việc part-time # Odds Ratio

OddsRatio(x)
## [1] 0.2006

Chênh lệch trong ma trận này là 0.2006 < 1, cho thấy nhóm người Úc làm việc full-time có khả năng thấp hơn nhóm người Úc làm việc part-time

OddsRatio(x,conf.level = 0.05)
## odds ratio     lwr.ci     upr.ci 
##     0.2006     0.1829     0.2200

lwr.ci = 0.1829: Đây là giới hạn dưới của khoảng tin cậy 95%.

Chúng ta 95% tin tưởng rằng giá trị OR thực tế nằm trên hoặc bằng 0.1829.

upr.ci = 0.2200: Đây là giới hạn trên của khoảng tin cậy 95%.

Chúng ta 95% tin tưởng rằng giá trị OR thực tế nằm dưới hoặc bằng 0.2200. # Ước lượng

fitt <- glm(factor(enrolment) ~ country, family = binomial(link = 'logit'),data = socsupport)

summary(fitt)
## 
## Call:
## glm(formula = factor(enrolment) ~ country, family = binomial(link = "logit"), 
##     data = socsupport)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -1.462      0.277   -5.27  1.4e-07 ***
## countryother  -16.105   1251.054   -0.01     0.99    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 86.141  on 94  degrees of freedom
## Residual deviance: 82.221  on 93  degrees of freedom
## AIC: 86.22
## 
## Number of Fisher Scoring iterations: 16

Nhận xét:

(Intercept):

Estimate = -1.462: Đây là hệ số hồi quy cho hằng số (intercept) của mô hình. Nó đại diện cho log-odds dự đoán của biến phụ thuộc khi tất cả các biến độc lập bằng 0 (không thực tế trong trường hợp này).

Pr(>|z|) = 1.4e-07: Giá trị p rất nhỏ cho thấy hệ số hằng số có ý nghĩa thống kê.

countryother:

Estimate = -16.105: Hệ số hồi quy cho biến countryother (có thể là nhóm tham chiếu cho các quốc gia khác ngoài quốc gia mặc định).

Pr(>|z|) = 0.99: Giá trị p rất lớn cho thấy không đủ bằng chứng để kết luận hệ số hồi quy này khác biệt so với 0. Điều này có thể cho thấy không có sự khác biệt đáng kể về tỷ lệ odds giữa nhóm countryother và nhóm tham chiếu về loại hình ghi danh.

LS0tDQp0aXRsZTogIlVudGl0bGVkIg0KYXV0aG9yOiAiY2FrIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogIHBkZl9kb2N1bWVudDoNCiAgICBleHRyYV9kZXBlbmRlbmNpZXM6DQogICAgICB2aWV0bmFtOiB1dGY4DQogICAgdG9jOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCmdlb21ldHJ5Og0KICAgICAgLSBpbm5lcj0zY20NCiAgICAgIC0gb3V0ZXI9NGNtDQogICAgICAtIHRvcD0zY20NCiAgICAgIC0gYm90dG9tPTRjbQ0KICAgICAgLSBoZWFkc2VwPTIycHQNCiAgICAgIC0gaGVhZGhlaWdodD0xMXB0DQogICAgICAtIGZvb3Rza2lwPTMzcHQNCiAgICAgIC0gaWdub3JlaGVhZA0KICAgICAgLSBpZ25vcmVmb290DQogICAgICAtIGhlaWdodHJvdW5kZWQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgb3B0aW9ucyhkaWdpdHMgPSA0KSwgIGF0dHIuc291cmNlPScubnVtYmVyTGluZXMnKQ0KYGBgDQoNCiMgR2nhu5tpIHRoaeG7h3UgduG7gSBkYXRhc2V0IHNvY3N1cHBvcnQNClNvY1N1cHBvcnQgbMOgIG3hu5l0IGfDs2kgZOG7ryBsaeG7h3UgdHJvbmcgcGjhuqduIG3hu4FtIFIgZMO5bmcgxJHhu4MgbmdoacOqbiBj4bupdSBjw6FjIHnhur91IHThu5EgaOG7lyB0cuG7oyB4w6MgaOG7mWkuIEThu68gbGnhu4d1IG7DoHkgxJHGsOG7o2MgdGh1IHRo4bqtcCB04burIG3hu5l0IGN14buZYyBraOG6o28gc8OhdCB24buBIGjhu5cgdHLhu6MgeMOjIGjhu5lpIHbDoCBjw6FjIGxv4bqhaSBo4buXIHRy4bujIGtow6FjLg0KDQpnZW5kZXI6IEdp4bubaSB0w61uaCAobuG7rywgbmFtKQ0KDQphZ2U6IMSQ4buZIHR14buVaSAoxJHGsOG7o2MgcGjDom4gbG/huqFpIHRoZW8gbmjDs20pDQoNCmNvdW50cnk6IFF14buRYyBnaWEgKMOaYyBob+G6t2MgY8OhYyBuxrDhu5tjIGtow6FjKQ0KDQptYXJpdGFsOiBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gKMSRw6Mga+G6v3QgaMO0biwga2jDoWMsIMSR4buZYyB0aMOibikNCg0KbGl2ZXdpdGg6IEPDuW5nIHPhu5FuZyB24bubaSBhaSAobeG7mXQgbcOsbmgsIGLhuqFuIGLDqCwgZ2lhIMSRw6xuaCBraMOhYywgYuG7kSBt4bq5LCBuZ8aw4budaSB5w6p1LCBrw70gdMO6YyB4w6EpDQoNCmVtcGxveW1lbnQ6IFTDrG5oIHRy4bqhbmcgdmnhu4djIGzDoG0gKGjGsOG7n25nIGzGsMahbmcgdG/DoG4gdGjhu51pIGdpYW4sIGjGsOG7n25nIGzGsMahbmcgYsOhbiB0aOG7nWkgZ2lhbiwgdHLhu6MgY+G6pXAgY2jDrW5oIHBo4bunLCBraMOhYywgdHLhu6MgY+G6pXAgbnXDtGkgY29uKQ0KDQpmaXJzdHlyOiBOxINtIGjhu41jIMSR4bqndSB0acOqbiAobsSDbSBuaOG6pXQgaG/hurdjIGtow6FjKQ0KDQplbnJvbG1lbnQ6IExv4bqhaSBow6xuaCBuaOG6rXAgaOG7jWMgKGZ1bGwtdGltZSAtIHRvw6BuIHRo4budaSBnaWFuLHBhcnQtdGllbSAtIGLDoW4gdGjhu51pIGdpYW4pDQoNCkPDoWMgYmnhur9uIGLhuq90IMSR4bqndSBi4bqxbmcgZW1vdGlvbmFsIChj4bqjbSB4w7pjKToNCg0KZW1vdGlvbmFsOiBN4bupYyDEkeG7mSBz4bq1biBjw7MgY+G7p2EgaOG7lyB0cuG7oyB24buBIG3hurd0IHTDrG5oIGPhuqNtDQoNCmVtb3Rpb25hbHNhdDogTeG7qWMgxJHhu5kgaMOgaSBsw7JuZyB24bubaSBo4buXIHRy4bujIHbhu4EgbeG6t3QgdMOsbmggY+G6o20gDQoNCkPDoWMgYmnhur9uIGLhuq90IMSR4bqndSBi4bqxbmcgdGFuZ2libGUgKHbhuq10IGNo4bqldCk6DQoNCnRhbmdpYmxlOiBN4bupYyDEkeG7mSBz4bq1biBjw7MgY+G7p2EgaOG7lyB0cuG7oyB24buBIG3hurd0IHbhuq10IGNo4bqldCANCg0KdGFuZ2libGVzYXQ6IE3hu6ljIMSR4buZIGjDoGkgbMOybmcgduG7m2kgaOG7lyB0cuG7oyB24buBIG3hurd0IHbhuq10IGNo4bqldCANCg0KQ8OhYyBiaeG6v24gYuG6r3QgxJHhuqd1IGLhurFuZyBhZmZlY3QgKHTDrG5oIGPhuqNtKToNCg0KYWZmZWN0OiBN4bupYyDEkeG7mSBz4bq1biBjw7MgY+G7p2Egbmd14buTbiBo4buXIHRy4bujIHTDrG5oIGPhuqNtIA0KDQphZmZlY3RzYXQ6IE3hu6ljIMSR4buZIGjDoGkgbMOybmcgduG7m2kgbmd14buTbiBo4buXIHRy4bujIHTDrG5oIGPhuqNtIA0KDQpDw6FjIGJp4bq/biBi4bqvdCDEkeG6p3UgYuG6sW5nIHBzaSAodMawxqFuZyB0w6FjIHjDoyBo4buZaSB0w61jaCBj4buxYyk6DQoNCnBzaTogTeG7qWMgxJHhu5kgc+G6tW4gY8OzIGPhu6dhIHTGsMahbmcgdMOhYyB4w6MgaOG7mWkgdMOtY2ggY+G7sWMNCg0KcHNpc2F0OiBN4bupYyDEkeG7mSBow6BpIGzDsm5nIHbhu5tpIHTGsMahbmcgdMOhYyB4w6MgaOG7mWkgdMOtY2ggY+G7sWMNCg0KZXN1cHBvcnQ6IE3hu6ljIMSR4buZIGjhu5cgdHLhu6MgduG7gSBt4bq3dCB0w6xuaCBj4bqjbSANCg0KcHN1cHBvcnQ6IE3hu6ljIMSR4buZIGjhu5cgdHLhu6MgdGhp4bq/dCB0aOG7sWMNCg0Kc3Vwc291cmNlczogVOG7lW5nIG3hu6ljIMSR4buZIGjhu5cgdHLhu6MgeMOjIGjhu5lpIA0KDQpCREk6IMSQaeG7g20gxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgdHLhuqdtIGPhuqNtIHRoZW8gQmVjayBEZXByZXNzaW9uIEludmVudG9yeSANCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZXBpdG9vbHMpDQpsaWJyYXJ5KERlc2NUb29scykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdnY29ycnBsb3QpDQpsaWJyYXJ5KEdMTXNEYXRhKQ0KbGlicmFyeShyZWFkeGwpDQpzb2NzdXBwb3J0IDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL2NoYXVhL0Rvd25sb2Fkcy9zb2NzdXBwb3J0Lnhsc3giKQ0KVmlldyhzb2NzdXBwb3J0KQ0KdCA8LSBzb2NzdXBwb3J0DQoNCmBgYA0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kQ0KYGBge3J9DQptIDwtIHRhYmxlKHQkZW5yb2xtZW50LHQkY291bnRyeSkNCnByb3AudGFibGUobSkNCmBgYA0KTmjhuq1uIHjDqXQ6IEPDsyA3Mi42MyUgbmfGsOG7nWkgbMOgbSB2aeG7h2MgZnVsbCB0aW1lIGzDoCBuZ8aw4budaSDDmmMsIDEwLjUzJSBuZ8aw4budaSBsw6BtIHZp4buHYyBmdWxsIHRpbWUgbMOgIGtow7RuZyBwaOG6o2kgbmfGsOG7nWkgw5pjLCAxNi44NCUgbMOgIG5nxrDhu51pIMOaYyBsw6BtIHZp4buHYyBwYXJ0IHRpbWUNCmBgYHtyfQ0KYWRkbWFyZ2lucyh0YWJsZSh0JGVucm9sbWVudCx0JGNvdW50cnkpKQ0KaCA8LSBhZGRtYXJnaW5zKHRhYmxlKHQkZW5yb2xtZW50LHQkY291bnRyeSkpDQpwcm9wLnRhYmxlKGgpDQpgYGANCk5o4bqtbiB4w6l0OiANCg0KVOG7qyBi4bqjbmcgcGjDom4gcGjhu5FpIGJpw6puLCB0aMOsIG5nxrDhu51pIGPDsyBxdeG7kWMgdOG7i2NoIMOaYyBsw6AgMjIuMzY4JSBjw7JuIG5nxrDhu51pIGPDsyBxdeG7kWMgdOG7i2NoIGtow6FjIGNoaeG6v20gMi42MzIlDQoNCsSQ4buRaSB24bubaSBjw7RuZyB2aeG7h2MgbMOgbSBmdWxsLXRpbWUgY2hp4bq/bSAyMC43ODklLCBjw7JuIHbhu5tpIGPDtG5nIHZp4buHYyBsw6BtIHBhcnQtdGltZSBjaGnhur9tIDQuMjExJQ0KIyBW4bq9IMSR4buTIHRo4buLDQpgYGB7cn0NCnQgfD4gZ2dwbG90KGFlcyh4ID0gdCRjb3VudHJ5LCB5ID0gYWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGwgPSAnc2t5Ymx1ZScpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdyZWQnLCB2anVzdCA9IC0gLjUpICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gJ1F14buRYyB04buLY2ggw5pjJywgeSA9ICdT4buRIG5nxrDhu51pJykNCnQgfD4gZ2dwbG90KGFlcyh4ID0gdCRlbnJvbG1lbnQsIHkgPSBhZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbCA9ICdkYXJrYmx1ZScpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdyZWQnLCB2anVzdCA9IC0gLjUpICsgdGhlbWVfY2xhc3NpYygpICsgbGFicyh4ID0gJ0PDtG5nIHZp4buHYycsIHkgPSAnU+G7kSBuZ8aw4budaScpDQpnZ3Bsb3QodCwgYWVzKGNvdW50cnksIGZpbGwgPSBlbnJvbG1lbnQpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2RvZGdlJykNCmBgYA0KIyDGr+G7m2MgbMaw4bujbmcgdOG7iSBs4buHIA0KIyMgZW5yb2xtZW50DQpgYGB7cn0NCnR0ZiA8LSB0W3QkZW5yb2xtZW50ID09ICdmdWxsLXRpbWUnLF0NCnR0cCA8LSB0W3QkZW5yb2xtZW50ID09ICdwYXJ0LXRpbWUnLF0NCnByb3AudGVzdChsZW5ndGgodHRmJGVucm9sbWVudCksIGxlbmd0aCh0JGVucm9sbWVudCksIHAgPSAwLjUpDQpwcm9wLnRlc3QobGVuZ3RoKHR0cCRlbnJvbG1lbnQpLCBsZW5ndGgodCRlbnJvbG1lbnQpLCBwID0gMC41KQ0KYGBgDQpHaeG6oyB0aHV54bq/dCBudWxsIChIMCk6IFThu7cgbOG7hyB0aOG7sWMgdOG6vyAocCkgY+G7p2EgbeG7mXQgbG/huqFpIGdoaSBkYW5oIG5o4bqldCDEkeG7i25oIHRyb25nIGTDom4gc+G7kSBi4bqxbmcgMCw1ICg1MCUpLg0KDQpHaeG6oyB0aHV54bq/dCB0aGF5IHRo4bq/IChIMSk6IFThu7cgbOG7hyB0aOG7sWMgdOG6vyAocCkga2jDtG5nIGLhurFuZyAwLDUuDQoNCisrKyDEkOG7kWkgduG7m2kgZOG7ryBsaeG7h3UgZnVsbC10aW1lIA0KDQpHacOhIHRy4buLIHAgcuG6pXQgbmjhu48gKDJlLTEwKSBjaG8gdGjhuqV5IGNow7puZyB0YSBjw7MgdGjhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IG51bGwuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBjw7MgYuG6sW5nIGNo4bupbmcgbeG6oW5oIG3hur0gY2hvIHRo4bqleSB04bu3IGzhu4cgdGjhu7FjIHThur8gY+G7p2EgbeG7mXQgbG/huqFpIGdoaSBkYW5oIG5o4bqldCDEkeG7i25oIHRyb25nIGTDom4gc+G7kSBraMO0bmcgcGjhuqNpIGzDoCA1MCUuDQoNCktob+G6o25nIHRpbiBj4bqteSAoMCw3Mzc5IC0gMCw4OTc4KSBjaG8gYmnhur90IHLhurFuZyBjaMO6bmcgdGEgY8OzIDk1JSB0aW4gdMaw4bufbmcgcuG6sW5nIHThu7cgbOG7hyB0aOG7sWMgdOG6vyBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDczLDc5JSDEkeG6v24gODksNzglLg0KDQrGr+G7m2MgdMOtbmggbeG6q3UgKHAgPSAwLDgzMTYpIGNobyB0aOG6pXkgdOG7tyBs4buHIHF1YW4gc8OhdCBjYW8gaMahbiAodHLDqm4gODMlKSByxqFpIHbDoG8gbeG7mXQgbG/huqFpIGdoaSBkYW5oIGPhu6UgdGjhu4Mgc28gduG7m2kgNTAlIGThu7Ega2nhur9uIGTGsOG7m2kgZ2nhuqMgdGh1eeG6v3QgbnVsbC4NCg0KKysrIMSQ4buRaSB24bubaSBk4buvIGxp4buHdSBwYXJ0LXRpbWUNCg0KR2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPICgyZS0xMCkgY2hvIHRo4bqleSBjaMO6bmcgdGEgY8OzIHRo4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBudWxsLiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgY8OzIGLhurFuZyBjaOG7qW5nIG3huqFuaCBt4bq9IGNobyB0aOG6pXkgdOG7tyBs4buHIHRo4buxYyB04bq/IGPhu6dhIG3hu5l0IGxv4bqhaSBnaGkgZGFuaCBuaOG6pXQgxJHhu4tuaCB0cm9uZyBkw6JuIHPhu5Ega2jDtG5nIHBo4bqjaSBsw6AgNTAlLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgKDAuMTAyMiAtIDAuMjYyMSkgY2hvIGJp4bq/dCBy4bqxbmcgY2jDum5nIHRhIGPDsyA5NSUgdGluIHTGsOG7n25nIHLhurFuZyB04bu3IGzhu4cgdGjhu7FjIHThur8gbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAxMCwyMiUgxJHhur9uIDI2LDIxJS4NCg0Kxq/hu5tjIHTDrW5oIG3huqt1IChwID0gMC4xNjg0KSBjaG8gdGjhuqV5IHThu7cgbOG7hyBxdWFuIHPDoXQgKDE2LDg0JSkgcsahaSB2w6BvIG3hu5l0IGxv4bqhaSBnaGkgZGFuaCBj4bulIHRo4buDLCB0aOG6pXAgaMahbiBzbyB24bubaSA1MCUgZOG7sSBraeG6v24gZMaw4bubaSBnaeG6oyB0aHV54bq/dCBudWxsLg0KIyMgY291bnRyeQ0KYGBge3J9DQp0dGEgPC0gdFt0JGNvdW50cnkgPT0gJ2F1c3RyYWxpYScsXQ0KdHRvIDwtIHRbdCRjb3VudHJ5ID09ICdvdGhlcicsXQ0KcHJvcC50ZXN0KGxlbmd0aCh0dGEkY291bnRyeSApLCBsZW5ndGgodCRjb3VudHJ5ICksIHAgPSAwLjUpDQpwcm9wLnRlc3QobGVuZ3RoKHR0byRjb3VudHJ5ICksIGxlbmd0aCh0JGNvdW50cnkgKSwgcCA9IDAuNSkNCmBgYA0KR2nhuqMgdGh1eeG6v3QgbnVsbCAoSDApOiBU4bu3IGzhu4cgdGjhu7FjIHThur8gKHApIGPhu6dhIG3hu5l0IGxv4bqhaSBnaGkgZGFuaCBuaOG6pXQgxJHhu4tuaCB0cm9uZyBkw6JuIHPhu5EgYuG6sW5nIDAsNSAoNTAlKS4NCg0KR2nhuqMgdGh1eeG6v3QgdGhheSB0aOG6vyAoSDEpOiBU4bu3IGzhu4cgdGjhu7FjIHThur8gKHApIGtow7RuZyBi4bqxbmcgMCw1Lg0KKysrIMSQ4buRaSB24bubaSBk4buvIGxp4buHdSBhdXN0cmFsaWENCg0KR2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPICgzZS0xNCkgY3VuZyBj4bqlcCBi4bqxbmcgY2jhu6luZyBt4bqhbmggbeG6vSDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgbnVsbCAodOG7tyBs4buHIHNpbmggdmnDqm4gdOG7qyBuaMOzbSBxdeG7kWMgZ2lhIG7DoHkgYuG6sW5nIDUwJSB0cm9uZyBkw6JuIHPhu5EpLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgY2hvIHRo4bqleSBjaMO6bmcgdGEgY8OzIHRo4buDIHRpbiB0xrDhu59uZyB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIHLhurFuZyB04bu3IGzhu4cgdGjhu7FjIHThur8gY+G7p2Egc2luaCB2acOqbiB04burIG5ow7NtIHF14buRYyBnaWEgbsOgeSBu4bqxbSB0cm9uZyBraG/huqNuZyA4MSwwNyUgxJHhur9uIDk0LDU2JS4NCg0Kxq/hu5tjIHTDrW5oIG3huqt1ICg4OS40NyUpIGNobyB0aOG6pXkgdOG7tyBs4buHIHNpbmggdmnDqm4gdOG7qyBuaMOzbSBxdeG7kWMgZ2lhIG7DoHkgdHJvbmcgbeG6q3UgY2FvIGjGoW4gbmhp4buBdSBzbyB24bubaSA1MCUgKGdp4bqjIHRodXnhur90IG51bGwpLg0KDQorKysgxJDhu5FpIHbhu5tpIGThu68gbGnhu4d1IG90aGVyDQoNCkdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAoM2UtMTQpIGN1bmcgY+G6pXAgYuG6sW5nIGNo4bupbmcgbeG6oW5oIG3hur0gxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IG51bGwgKHThu7cgbOG7hyBzaW5oIHZpw6puIHThu6sgbmjDs20gcXXhu5FjIGdpYSBuw6B5IGLhurFuZyA1MCUgdHJvbmcgZMOibiBz4buRKS4NCg0KS2hv4bqjbmcgdGluIGPhuq15IGNobyB0aOG6pXkgY2jDum5nIHRhIGPDsyB0aOG7gyB0aW4gdMaw4bufbmcgduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSBy4bqxbmcgdOG7tyBs4buHIHRo4buxYyB04bq/IGPhu6dhIHNpbmggdmnDqm4gdOG7qyBuaMOzbSBxdeG7kWMgZ2lhIG7DoHkgbuG6sW0gdHJvbmcga2hv4bqjbmcgNSw0NCUgxJHhur9uIDE4LDkzJS4NCg0Kxq/hu5tjIHTDrW5oIG3huqt1ICgxMC41MyUpIGNobyB0aOG6pXkgdOG7tyBs4buHIHNpbmggdmnDqm4gdOG7qyBuaMOzbSBxdeG7kWMgZ2lhIG7DoHkgdHJvbmcgbeG6q3UgdGjhuqVwIGjGoW4gbmhp4buBdSBzbyB24bubaSA1MCUgKGdp4bqjIHRodXnhur90IG51bGwpLg0KIyDGr+G7m2MgbMaw4bujbmcgdOG7iSBs4buHIDIgYmnhur9uDQpgYGB7cn0NCnRmIDwtIHRbdCRlbnJvbG1lbnQgPT0gJ2Z1bGwtdGltZScsXQ0KdHAgPC0gdFt0JGVucm9sbWVudCA9PSAncGFydC10aW1lJyxdDQoNCnRhIDwtIHRmW3RmJGNvdW50cnkgPT0gJ2F1c3RyYWxpYScsXQ0KdG8gPC0gdHBbdHAkY291bnRyeSA9PSAnb3RoZXInLF0NCg0KDQpiIDwtIGMobnJvdyh0YSksIG5yb3codG8pKQ0KYSA8LSBjKG5yb3codGYpLCBucm93KHRwKSkNCg0KcHJvcC50ZXN0KGIsYSkNCmBgYA0KR2nhuqMgdGh1eeG6v3QgbnVsbCAoSDApOiBU4bu3IGzhu4cgdGjDoG5oIGPDtG5nIChwKSB0cm9uZyBoYWkgbmjDs20gbMOgIGLhurFuZyBuaGF1Lg0KDQpHaeG6oyB0aHV54bq/dCB0aGF5IHRo4bq/IChIMSk6IFThu7cgbOG7hyB0aMOgbmggY8O0bmcgKHApIGdp4buvYSBoYWkgbmjDs20gbMOgIGtow6FjIG5oYXUgKGtow6FjIGJp4buHdCBoYWkgcGjDrWEpLg0KDQpHacOhIHRy4buLIHAgcuG6pXQgbmjhu48gKDhlLTEyKSBjdW5nIGPhuqVwIGLhurFuZyBjaOG7qW5nIG3huqFuaCBt4bq9IMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBudWxsICh04bu3IGzhu4cgdGjDoG5oIGPDtG5nIGdp4buvYSBoYWkgbmjDs20gbMOgIGLhurFuZyBuaGF1KS4NCg0KS2hv4bqjbmcgdGluIGPhuq15IGNobyB0aOG6pXkgY2jDum5nIHRhIGPDsyB0aOG7gyB0aW4gdMaw4bufbmcgduG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgdGjhu7FjIHThur8gZ2nhu69hIHThu7cgbOG7hyB0aMOgbmggY8O0bmcgY+G7p2EgaGFpIG5ow7NtIG7hurFtIHRyb25nIGtob+G6o25nIDc2LDI1JSDEkeG6v24gOTgsNDMlLg0KDQrGr+G7m2MgdMOtbmggbeG6q3UgY2hvIHRo4bqleSB04bu3IGzhu4cgdGjDoG5oIGPDtG5nIHRyb25nIG5ow7NtIDEgKDAsODczNCkgY2FvIGjGoW4gbmhp4buBdSBzbyB24bubaSBuaMOzbSAyICgwLDAwMDApLg0KIyBSZWxhdGl2ZSByaXNrDQpgYGB7cn0NCnRhYmxlKHQkZW5yb2xtZW50LHQkY291bnRyeSkNCnggPC0gdGFibGUodCRlbnJvbG1lbnQsdCRjb3VudHJ5KQ0KUmVsUmlzayh4KQ0KDQpgYGANClLhu6dpIHJvIHRyb25nIG1hIHRy4bqtbiBuw6B5IGzDoCAwLjg3MzQgPCAxLCBjaG8gdGjhuqV5IG5ow7NtIG5nxrDhu51pIGtow7RuZyBjw7MgcXXhu5FjIHThu4tjaCDDmmMgbMOgbSB2aeG7h2MgZnVsbC10aW1lIGPDsyBraOG6oyBuxINuZyBuaGnhu4F1IGjGoW4gbmjDs20gbmfGsOG7nWkgY8OzIHF14buRYyB04buLY2gga2jDoWMgw5pjIGzDoG0gdmnhu4djIHBhcnQtdGltZQ0KIyBPZGRzIFJhdGlvDQpgYGB7cn0NCk9kZHNSYXRpbyh4KQ0KYGBgDQpDaMOqbmggbOG7h2NoIHRyb25nIG1hIHRy4bqtbiBuw6B5IGzDoCAwLjIwMDYgPCAxLCBjaG8gdGjhuqV5IG5ow7NtIG5nxrDhu51pIMOaYyBsw6BtIHZp4buHYyBmdWxsLXRpbWUgY8OzIGto4bqjIG7Eg25nIHRo4bqlcCBoxqFuIG5ow7NtIG5nxrDhu51pIMOaYyBsw6BtIHZp4buHYyBwYXJ0LXRpbWUNCg0KYGBge3J9DQpPZGRzUmF0aW8oeCxjb25mLmxldmVsID0gMC4wNSkNCmBgYA0KbHdyLmNpID0gMC4xODI5OiDEkMOieSBsw6AgZ2nhu5tpIGjhuqFuIGTGsOG7m2kgY+G7p2Ega2hv4bqjbmcgdGluIGPhuq15IDk1JS4NCg0KQ2jDum5nIHRhIDk1JSB0aW4gdMaw4bufbmcgcuG6sW5nIGdpw6EgdHLhu4sgT1IgdGjhu7FjIHThur8gbuG6sW0gdHLDqm4gaG/hurdjIGLhurFuZyAwLjE4MjkuDQoNCnVwci5jaSA9IDAuMjIwMDogxJDDonkgbMOgIGdp4bubaSBo4bqhbiB0csOqbiBj4bunYSBraG/huqNuZyB0aW4gY+G6rXkgOTUlLg0KDQpDaMO6bmcgdGEgOTUlIHRpbiB0xrDhu59uZyBy4bqxbmcgZ2nDoSB0cuG7iyBPUiB0aOG7sWMgdOG6vyBu4bqxbSBkxrDhu5tpIGhv4bq3YyBi4bqxbmcgMC4yMjAwLg0KIyDGr+G7m2MgbMaw4bujbmcNCmBgYHtyfQ0KZml0dCA8LSBnbG0oZmFjdG9yKGVucm9sbWVudCkgfiBjb3VudHJ5LCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ2xvZ2l0JyksZGF0YSA9IHNvY3N1cHBvcnQpDQoNCnN1bW1hcnkoZml0dCkNCmBgYA0KDQpOaOG6rW4geMOpdDoNCg0KKEludGVyY2VwdCk6DQoNCkVzdGltYXRlID0gLTEuNDYyOiDEkMOieSBsw6AgaOG7hyBz4buRIGjhu5NpIHF1eSBjaG8gaOG6sW5nIHPhu5EgKGludGVyY2VwdCkgY+G7p2EgbcO0IGjDrG5oLiBOw7MgxJHhuqFpIGRp4buHbiBjaG8gbG9nLW9kZHMgZOG7sSDEkW/DoW4gY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMga2hpIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIGLhurFuZyAwIChraMO0bmcgdGjhu7FjIHThur8gdHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHkpLg0KDQpQcig+fHp8KSA9IDEuNGUtMDc6IEdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyBjaG8gdGjhuqV5IGjhu4cgc+G7kSBo4bqxbmcgc+G7kSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQpjb3VudHJ5b3RoZXI6DQoNCkVzdGltYXRlID0gLTE2LjEwNTogSOG7hyBz4buRIGjhu5NpIHF1eSBjaG8gYmnhur9uIGNvdW50cnlvdGhlciAoY8OzIHRo4buDIGzDoCBuaMOzbSB0aGFtIGNoaeG6v3UgY2hvIGPDoWMgcXXhu5FjIGdpYSBraMOhYyBuZ2/DoGkgcXXhu5FjIGdpYSBt4bq3YyDEkeG7i25oKS4NCg0KUHIoPnx6fCkgPSAwLjk5OiBHacOhIHRy4buLIHAgcuG6pXQgbOG7m24gY2hvIHRo4bqleSBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4Mga+G6v3QgbHXhuq1uIGjhu4cgc+G7kSBo4buTaSBxdXkgbsOgeSBraMOhYyBiaeG7h3Qgc28gduG7m2kgMC4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBjaG8gdGjhuqV5IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSB04bu3IGzhu4cgb2RkcyBnaeG7r2EgbmjDs20gY291bnRyeW90aGVyIHbDoCBuaMOzbSB0aGFtIGNoaeG6v3UgduG7gSBsb+G6oWkgaMOsbmggZ2hpIGRhbmguDQoNCg==