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==