Giới thiệu về dataset “PSID1982”

  • Miêu tả: Dữ liệu chéo về sơ yếu lý lịch, cuộc gọi lại và thông tin về nhà tuyển dụng cho 4.870 sơ yếu lý lịch giả mạo.

  • Khung dữ liệu gồm có 4,870 quan sát và 27 biến.

  • Mô tả: Dữ liệu chéo về sơ yếu lý lịch, cuộc gọi lại và thông tin nhà tuyển dụng cho 4.870 sơ yếu lý lịch giả mạo được gửi để đáp lại các quảng cáo tuyển dụng ở Chicago và Boston vào năm 2001, trong một thử nghiệm ngẫu nhiên có kiểm soát do Bertrand và Mullainathan (2004) thực hiện. Sơ yếu lý lịch chứa thông tin liên quan đến dân tộc của người nộp đơn. Bởi vì dân tộc thường không được đưa vào sơ yếu lý lịch nên các sơ yếu lý lịch được phân biệt dựa trên cái gọi là “tên nghe giống người da trắng” (chẳng hạn như Emily Walsh hoặc Gregory Baker) và “tên nghe giống người Mỹ gốc Phi” (chẳng hạn như Lakisha Washington hoặc Jamal Jones) . Một bộ sưu tập lớn các sơ yếu lý lịch giả mạo đã được tạo ra và dân tộc được cho là trước (dựa trên âm thanh của tên) được chỉ định ngẫu nhiên cho mỗi sơ yếu lý lịch. Những hồ sơ này được gửi đến các nhà tuyển dụng tiềm năng để xem hồ sơ nào đã nhận được cuộc gọi từ nhà tuyển dụng tiềm năng.

Thống kê mô tả

Lập bảng tần số

  • Lập bảng tần số với biến “gender” và “call” để xem xét rằng:

  • Có bao nhiêu người nộp đơn là nữ được/ không được gọi lại?

  • Có bao nhiêu người nộp đơn là nam được/ không được gọi lại?

table(d$gender, d$call)
##         
##            no  yes
##   female 3437  309
##   male   1041   83

Bảng tần số trên cho thấy:

  • Có 3437 số người là nữ không được gọi lại sau khi nộp đơn

  • Có 309 số người là nữ được gọi lại sau khi nộp đơn

  • Có 1041 số người là nam không được gọi lại sau khi nộp đơn

  • Có 83 số người là nam được gọi lại sau khi nộp đơn

  • Để tìm hiểu rõ hơn ở 2 thành phố Boston và Chicago có bao nhiêu người nam/ nữ, được gọi/ không được gọi lại ta lập bảng tần số với 3 biến “gender”, “call” và “city”

table(d$gender, d$call, d$city)
## , ,  = boston
## 
##         
##            no  yes
##   female 1224  161
##   male    732   49
## 
## , ,  = chicago
## 
##         
##            no  yes
##   female 2213  148
##   male    309   34

Bảng tần số trên cho thấy:

  • Ở thành phố Boston:

    • Có 1224 số người là nữ không được gọi lại sau khi nộp đơn

    • Có 161 số người là nữ được gọi lại sau khi nộp đơn

    • Có 732 số người là nam không được gọi lại sau khi nộp đơn

    • Có 49 số người là nam không được gọi lại sau khi nộp đơn

  • Ở thành phố Chicago:

    • Có 2213 số người là nữ không được gọi lại sau khi nộp đơn

    • Có 148 số người là nữ được gọi lại sau khi nộp đơn

    • Có 309 số người là nam không được gọi lại sau khi nộp đơn

    • Có 34 số người là nam không được gọi lại sau khi nộp đơn

Tương tự với những biến định tính khác

Đồ thị

  • Đồ thị dựa trên bảng tần suất của biến gender và call
d |> ggplot(aes(x = gender, fill = call)) +
  geom_bar() +
  labs(title = "Stacked Bar Chart",
       x = "Gender",
       y = "Count",
       fill = "Call")

Đồ thị trên cho ta thấy:

  • Tổng số người nữ được gọi lại và không được gọi lại sau khi nộp đơn lớn hơn rất nhiều so với tổng số người nam được gọi lại và không được gọi lại sau khi nộp đơn. Điều này cho thấy tỷ lệ người nữ tham gia vào quá trình tuyển dụng có thể lớn hơn so với người nam

  • Đối với nữ thì số người được gọi lại sau khi nộp đơn là chưa đến 500 người

  • Đối với nam thì số người được gọi lại sau khi nộp đơn là rất ít

  • Đồ thị dựa trên bảng tần suất của biến gender, call và city

d |> 
  ggplot(aes(x = gender, fill = call)) +
  geom_bar(position = "stack") +
  facet_wrap(~city) +
  labs(title = "Stacked Bar Chart",
       x = "Gender",
       y = "Count",
       fill = "Call")

Đồ thị trên cho ta thấy:

  • Tổng số người nộp đơn ứng tuyển ở thành phố Chicago lớn hơn tổng số người nộp đơn ứng tuyển ở thành phố Boston

  • Tổng số người nữ được gọi lại và không được gọi lại sau khi nộp đơn ở Chicago lớn hơn rất nhiều so với tổng số người nữ được gọi lại và không được gọi lại sau khi nộp đơn ở Boston. Nhưng tổng số người nam đc gọi lại và không được gọi lại ở thành phố Chicago lại thấp hơn so với thành phố Boston.

prop.table(table(d$gender, d$call))
##         
##               no     yes
##   female 0.70575 0.06345
##   male   0.21376 0.01704
  • Dựa vào bảng tần suất trên ta thấy:

    • Số người là nữ không được gọi lại sau khi nộp đơn chiếm 70.57%, số người là nữ được gọi lại sau khi nộp đơn chiếm 6.3%

    • Số người là nam không được gọi lại sau khi nộp đơn chiếm 21.38%, số người là nam được gọi lại sau khi nộp đơn chiếm 1.7%

prop.table(addmargins(table(d$gender, d$call)))
##         
##                no      yes      Sum
##   female 0.176437 0.015862 0.192300
##   male   0.053439 0.004261 0.057700
##   Sum    0.229877 0.020123 0.250000

Trong bảng trên thì:

  • Có 17.64% số người là nữ nộp đơn mà không được gọi lại

  • Có 1.6% số người là nữ nộp đơn được gọi lại

  • Tổng số người nộp đơn là nữ chiếm 19.23%

  • Tổng số người nộp đơn mà không được gọi lại chiểm 23%

  • Có 5.3% số người là nam nộp đơn mà không được gọi lại

  • Có 0.43% số người là nam nộp đơn được gọi lại

  • Tổng số người nộp đơn là nam chiếm 5.77%

  • Tổng số người nộp đơn mà không được gọi lại chiểm 2.01%

prop.table(table(d$gender, d$call, d$city))
## , ,  = boston
## 
##         
##                no      yes
##   female 0.251335 0.033060
##   male   0.150308 0.010062
## 
## , ,  = chicago
## 
##         
##                no      yes
##   female 0.454415 0.030390
##   male   0.063450 0.006982

Bảng tần suất trên cho thấy:

  • Ở thành phố Boston:

    • Số người là nữ không được gọi lại sau khi nộp đơn chiếm 25.13%, số người là nữ được gọi lại sau khi nộp đơn chiếm 3.31%

    • Số người là nam không được gọi lại sau khi nộp đơn chiếm 15.03%, số người là nam được gọi lại sau khi nộp đơn chiếm 1%

  • Ở thành phố Chicago:

    • Số người là nữ không được gọi lại sau khi nộp đơn chiếm 45.44%, số người là nữ được gọi lại sau khi nộp đơn chiếm 3.04%

    • Số người là nam không được gọi lại sau khi nộp đơn chiếm 6.34%, số người là nam được gọi lại sau khi nộp đơn chiếm 0.7%

prop.table(addmargins(table(d$gender, d$call, d$city)))
## , ,  = boston
## 
##         
##                 no       yes       Sum
##   female 0.0314168 0.0041324 0.0355493
##   male   0.0187885 0.0012577 0.0200462
##   Sum    0.0502053 0.0053901 0.0555955
## 
## , ,  = chicago
## 
##         
##                 no       yes       Sum
##   female 0.0568018 0.0037988 0.0606006
##   male   0.0079312 0.0008727 0.0088039
##   Sum    0.0647331 0.0046715 0.0694045
## 
## , ,  = Sum
## 
##         
##                 no       yes       Sum
##   female 0.0882187 0.0079312 0.0961499
##   male   0.0267197 0.0021304 0.0288501
##   Sum    0.1149384 0.0100616 0.1250000

Trong bảng trên thì:

  • Ở thành phố Boston:

  • Có 3.14% số người là nữ nộp đơn mà không được gọi lại

  • Có 0.41% số người là nữ nộp đơn được gọi lại

  • Tổng số người nộp đơn là nữ chiếm 3.55%

  • Tổng số người nộp đơn mà không được gọi lại chiểm 5%

  • Có 1.88% số người là nam nộp đơn mà không được gọi lại

  • Có 0.13% số người là nam nộp đơn được gọi lại

  • Tổng số người nộp đơn là nam chiếm 2%

  • Tổng số người nộp đơn mà không được gọi lại chiểm 0.54%

  • Ở thành phố Chicago: Phân tích tương tự như Boston

  • Ở cả 2 thành phố :

  • Có 8.82% số người là nữ nộp đơn mà không được gọi lại

  • Có 0.79% số người là nữ nộp đơn được gọi lại

  • Tổng số người nộp đơn là nữ chiếm 9.61%

  • Tổng số người nộp đơn mà không được gọi lại chiểm 11.49%

  • Có 2.67% số người là nam nộp đơn mà không được gọi lại

  • Có 0.21% số người là nam nộp đơn được gọi lại

  • Tổng số người nộp đơn là nam chiếm 2.89%

  • Tổng số người nộp đơn mà không được gọi lại chiểm 10%

Ước lượng tỷ lệ và ước lượng chệnh lệch tỷ lệ

  • Ước lượng với số người nộp đơn được gọi lại

Để kiểm định xem tỷ lệ (%) Tổng số người nộp đơn được gọi lại có bằng 50% không ta có giả thiết sau:

Gọi H(0): p = 0.5, tức là tổng số người nộp đơn được gọi lại bằng 50%

d1 <- d[d$call == 'yes',]
prop.test(length(d1$call), length(d1$call), p = 0.05)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(d1$call) out of length(d1$call), null probability 0.05
## X-squared = 7428, df = 1, p-value <2e-16
## alternative hypothesis: true p is not equal to 0.05
## 95 percent confidence interval:
##  0.9879 1.0000
## sample estimates:
## p 
## 1

Dựa vào kết quả trên ta thấy, giá trị p-value = 1 > 0.5%. Vậy ta bác bỏ H(0), tức là

tổng số người nộp đơn được gọi lại không bằng 50%

  • Ước lượng với số người nộp đơn không được gọi lại

Để kiểm định xem tỷ lệ (%) Tổng số người nộp đơn không được gọi lại có bằng 50% không ta có giả thiết sau:

Gọi H(0): p = 0.5, tức là tổng số người nộp đơn không được gọi lại bằng 50%

d2 <- d[d$call == 'no',]
prop.test(length(d2$call), length(d2$call), p = 0.05)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(d2$call) out of length(d2$call), null probability 0.05
## X-squared = 85062, df = 1, p-value <2e-16
## alternative hypothesis: true p is not equal to 0.05
## 95 percent confidence interval:
##  0.9989 1.0000
## sample estimates:
## p 
## 1

Dựa vào kết quả trên ta thấy, giá trị p-value = 1 > 0.5%. Vậy ta bác bỏ H(0), tức là

tổng số người nộp đơn không được gọi lại bé hơn 50%

  • Ước lượng tỷ lệ chênh lệch giữa nam và nữ của những người nộp đơn được gọi lại

Để kiểm định xem tỷ lệ (%) của số người nộp đơn được gọi lại giữa nam và nữ có bằng nhau hay không ta có giả thiết sau:

Gọi H(0): p1 = p2, tức là số người nộp đơn được gọi lại giữa nam và nữ có bằng nhau

dm <- d[d$gender == 'male',]
df <- d[d$gender == 'female',]

dmyes <- dm[dm$call == "yes",]
dfyes <- df[df$call == "yes",]

a <- c(nrow(dm), nrow(df))
b <- c(nrow(dmyes), nrow(dfyes))

prop.test(b,a)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  b out of a
## X-squared = 0.76, df = 1, p-value = 0.4
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.026868  0.009579
## sample estimates:
##  prop 1  prop 2 
## 0.07384 0.08249

Dựa vào kết quả trên ta thấy, giá trị p-value = 0.4 > mức ý nghĩa 0.05. Điều này có nghĩa là không có đủ bằng chứng để bác bỏ giả thiết không H(0). Do đó, chúng ta không thể kết luận rằng tỷ lệ người nộp đơn được gọi lại giữa nam và nữ là khác nhau.

  • Ước lượng tỷ lệ chênh lệch giữa nam và nữ của những người nộp đơn không được gọi lại

Để kiểm định xem tỷ lệ (%) của số người nộp đơn không được gọi lại giữa nam và nữ có bằng nhau hay không ta có giả thiết sau:

Gọi H(0): p1 = p2, tức là số người nộp đơn không được gọi lại giữa nam và nữ có bằng nhau

dmno <- dm[dm$call == "no",]
dfno <- df[df$call == "no",]

y <- c(nrow(dm), nrow(df))
k <- c(nrow(dmno), nrow(dfno))

prop.test(k,y)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  k out of y
## X-squared = 0.76, df = 1, p-value = 0.4
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.009579  0.026868
## sample estimates:
## prop 1 prop 2 
## 0.9262 0.9175

Dựa vào kết quả trên ta thấy, giá trị p-value = 0.4 > mức ý nghĩa 0.05. Điều này có nghĩa là không có đủ bằng chứng để bác bỏ giả thiết không H(0). Do đó, chúng ta không thể kết luận rằng tỷ lệ người nộp đơn không được gọi lại giữa nam và nữ là khác nhau.

relative risk, oddsratio và khoảng ước lượng của 2 chỉ số đó, ý nghĩa

d$quality[d$quality == "high"] <- "high"
qual <- table(d$gender, d$quality)

addmargins(qual)
##         
##          high  low  Sum
##   female 1879 1867 3746
##   male    567  557 1124
##   Sum    2446 2424 4870
RelRisk(qual)
## [1] 0.9944
oddsratio(qual)
## $data
##         
##          high  low Total
##   female 1879 1867  3746
##   male    567  557  1124
##   Total  2446 2424  4870
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate  lower upper
##   female   1.0000     NA    NA
##   male     0.9887 0.8652  1.13
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   female         NA           NA         NA
##   male       0.8672       0.8918      0.867
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Dựa vào bảng trên: Tỷ số chênh lệch (oddsratio) cho nam so với nữ là 0.9887, với khoảng tin cậy 95% từ 0.8652 đến 1.1300. Vì khoảng tin cậy bao gồm giá trị 1, chúng ta không có đủ bằng chứng để kết luận rằng odds của việc rơi vào nhóm “high” so với “low” khác biệt có ý nghĩa giữa nam và nữ.

Kiểm định tính đọc lập cho 2 biến

Giả thuyết H(0): gender, quality độc lập

chisq.test(qual)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  qual
## X-squared = 0.018, df = 1, p-value = 0.9

Kết quả kiểm định cho thấy p−value = 0.9 > 0.05. Vậy ta chấp nhận giả thiết H(0), nghĩa là giới tính và bằng cấp không liên quan đến nhau.

Hồi quy

fitted <- glm(factor(call) ~ city, family = binomial(link = 'logit'), data = d)

summary(fitted)
## 
## Call:
## glm(formula = factor(call) ~ city, family = binomial(link = "logit"), 
##     data = d)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -2.2315     0.0726  -30.73  < 2e-16 ***
## citychicago  -0.3973     0.1057   -3.76  0.00017 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2726.9  on 4869  degrees of freedom
## Residual deviance: 2712.7  on 4868  degrees of freedom
## AIC: 2717
## 
## Number of Fisher Scoring iterations: 5
LS0tDQp0aXRsZTogIkJUVk4iDQphdXRob3I6ICJOZ3V54buFbiBUaOG7iyBUaGFuaCBUcsO6YyINCmRhdGU6ICIyMDI0LTA2LTAzIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogIHBkZl9kb2N1bWVudDoNCiAgICBleHRyYV9kZXBlbmRlbmNpZXM6DQogICAgICB2aWV0bmFtOiB1dGY4DQogICAgdG9jOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCmdlb21ldHJ5Og0KICAgICAgLSBpbm5lcj0zY20NCiAgICAgIC0gb3V0ZXI9NGNtDQogICAgICAtIHRvcD0zY20NCiAgICAgIC0gYm90dG9tPTRjbQ0KICAgICAgLSBoZWFkc2VwPTIycHQNCiAgICAgIC0gaGVhZGhlaWdodD0xMXB0DQogICAgICAtIGZvb3Rza2lwPTMzcHQNCiAgICAgIC0gaWdub3JlaGVhZA0KICAgICAgLSBpZ25vcmVmb290DQogICAgICAtIGhlaWdodHJvdW5kZWQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgb3B0aW9ucyhkaWdpdHMgPSA0KSwgIGF0dHIuc291cmNlPScubnVtYmVyTGluZXMnKQ0KbGlicmFyeSh4bHN4KQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpkIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL0hvYW4gTmd1eWVuL0Rvd25sb2Fkcy9SZXN1bWVOYW1lcy54bHN4IikNClZpZXcoZCkNCnIgPSBnZXRPcHRpb24oInJlcG9zIikNCnJbIkNSQU4iXSA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIg0Kb3B0aW9ucyhyZXBvcyA9IHIpDQppbnN0YWxsLnBhY2thZ2VzKCJEZXNjVG9vbHMiKQ0KbGlicmFyeShEZXNjVG9vbHMpDQppbnN0YWxsLnBhY2thZ2VzKCJlcGl0b29scyIpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KYGBgDQoNCiMgR2nhu5tpIHRoaeG7h3UgduG7gSBkYXRhc2V0ICJQU0lEMTk4MiINCg0KICAqIE1pw6p1IHThuqM6IEThu68gbGnhu4d1IGNow6lvIHbhu4Egc8ahIHnhur91IGzDvSBs4buLY2gsIGN14buZYyBn4buNaSBs4bqhaSB2w6AgdGjDtG5nIHRpbiB24buBIG5ow6AgdHV54buDbiBk4bulbmcgY2hvIDQuODcwIHPGoSB54bq/dSBsw70gbOG7i2NoIGdp4bqjIG3huqFvLg0KDQogICogS2h1bmcgZOG7ryBsaeG7h3UgZ+G7k20gY8OzIDQsODcwIHF1YW4gc8OhdCB2w6AgMjcgYmnhur9uLg0KICANCiAgKiBNw7QgdOG6ozogROG7ryBsaeG7h3UgY2jDqW8gduG7gSBzxqEgeeG6v3UgbMO9IGzhu4tjaCwgY3Xhu5ljIGfhu41pIGzhuqFpIHbDoCB0aMO0bmcgdGluIG5ow6AgdHV54buDbiBk4bulbmcgY2hvIDQuODcwIHPGoSB54bq/dSBsw70gbOG7i2NoIGdp4bqjIG3huqFvIMSRxrDhu6NjIGfhu61pIMSR4buDIMSRw6FwIGzhuqFpIGPDoWMgcXXhuqNuZyBjw6FvIHR1eeG7g24gZOG7pW5nIOG7nyBDaGljYWdvIHbDoCBCb3N0b24gdsOgbyBuxINtIDIwMDEsIHRyb25nIG3hu5l0IHRo4butIG5naGnhu4dtIG5n4bqrdSBuaGnDqm4gY8OzIGtp4buDbSBzb8OhdCBkbyBCZXJ0cmFuZCB2w6AgTXVsbGFpbmF0aGFuICgyMDA0KSB0aOG7sWMgaGnhu4duLiBTxqEgeeG6v3UgbMO9IGzhu4tjaCBjaOG7qWEgdGjDtG5nIHRpbiBsacOqbiBxdWFuIMSR4bq/biBkw6JuIHThu5ljIGPhu6dhIG5nxrDhu51pIG7hu5lwIMSRxqFuLiBC4bufaSB2w6wgZMOibiB04buZYyB0aMaw4budbmcga2jDtG5nIMSRxrDhu6NjIMSRxrBhIHbDoG8gc8ahIHnhur91IGzDvSBs4buLY2ggbsOqbiBjw6FjIHPGoSB54bq/dSBsw70gbOG7i2NoIMSRxrDhu6NjIHBow6JuIGJp4buHdCBk4buxYSB0csOqbiBjw6FpIGfhu41pIGzDoCDigJx0w6puIG5naGUgZ2nhu5FuZyBuZ8aw4budaSBkYSB0cuG6r25n4oCdIChjaOG6s25nIGjhuqFuIG5oxrAgRW1pbHkgV2Fsc2ggaG/hurdjIEdyZWdvcnkgQmFrZXIpIHbDoCDigJx0w6puIG5naGUgZ2nhu5FuZyBuZ8aw4budaSBN4bu5IGfhu5FjIFBoaeKAnSAoY2jhurNuZyBo4bqhbiBuaMawIExha2lzaGEgV2FzaGluZ3RvbiBob+G6t2MgSmFtYWwgSm9uZXMpIC4gTeG7mXQgYuG7mSBzxrB1IHThuq1wIGzhu5tuIGPDoWMgc8ahIHnhur91IGzDvSBs4buLY2ggZ2nhuqMgbeG6oW8gxJHDoyDEkcaw4bujYyB04bqhbyByYSB2w6AgZMOibiB04buZYyDEkcaw4bujYyBjaG8gbMOgIHRyxrDhu5tjIChk4buxYSB0csOqbiDDom0gdGhhbmggY+G7p2EgdMOqbikgxJHGsOG7o2MgY2jhu4kgxJHhu4tuaCBuZ+G6q3Ugbmhpw6puIGNobyBt4buXaSBzxqEgeeG6v3UgbMO9IGzhu4tjaC4gTmjhu69uZyBo4buTIHPGoSBuw6B5IMSRxrDhu6NjIGfhu61pIMSR4bq/biBjw6FjIG5ow6AgdHV54buDbiBk4bulbmcgdGnhu4FtIG7Eg25nIMSR4buDIHhlbSBo4buTIHPGoSBuw6BvIMSRw6Mgbmjhuq1uIMSRxrDhu6NjIGN14buZYyBn4buNaSB04burIG5ow6AgdHV54buDbiBk4bulbmcgdGnhu4FtIG7Eg25nLg0KDQojIFRo4buRbmcga8OqIG3DtCB04bqjDQoNCiMjIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRDQoNCiAqIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbhu5tpIGJp4bq/biAiZ2VuZGVyIiB2w6AgImNhbGwiIMSR4buDIHhlbSB4w6l0IHLhurFuZzogIA0KICANCiAgLSBDw7MgYmFvIG5oacOqdSBuZ8aw4budaSBu4buZcCDEkcahbiBsw6AgbuG7ryDEkcaw4bujYy8ga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpPw0KICAgIA0KICAtIEPDsyBiYW8gbmhpw6p1IG5nxrDhu51pIG7hu5lwIMSRxqFuIGzDoCBuYW0gxJHGsOG7o2MvIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaT8NCg0KYGBge3J9DQp0YWJsZShkJGdlbmRlciwgZCRjYWxsKQ0KYGBgDQoNCkLhuqNuZyB04bqnbiBz4buRIHRyw6puIGNobyB0aOG6pXk6DQoNCiAgLSBDw7MgMzQzNyBz4buRIG5nxrDhu51pIGzDoCBu4buvIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBzYXUga2hpIG7hu5lwIMSRxqFuDQogIA0KICAtIEPDsyAzMDkgc+G7kSBuZ8aw4budaSBsw6AgbuG7ryDEkcaw4bujYyBn4buNaSBs4bqhaSBzYXUga2hpIG7hu5lwIMSRxqFuDQogIA0KICAtIEPDsyAxMDQxIHPhu5EgbmfGsOG7nWkgbMOgIG5hbSBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbg0KICANCiAgLSBDw7MgODMgc+G7kSBuZ8aw4budaSBsw6AgbmFtIMSRxrDhu6NjIGfhu41pIGzhuqFpIHNhdSBraGkgbuG7mXAgxJHGoW4NCiAgDQogKiDEkOG7gyB0w6xtIGhp4buDdSByw7UgaMahbiDhu58gMiB0aMOgbmggcGjhu5EgQm9zdG9uIHbDoCBDaGljYWdvIGPDsyBiYW8gbmhpw6p1IG5nxrDhu51pIG5hbS8gbuG7rywgxJHGsOG7o2MgZ+G7jWkvIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSB0YSBs4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB24bubaSAzIGJp4bq/biAiZ2VuZGVyIiwgImNhbGwiIHbDoCAiY2l0eSIgDQogIA0KYGBge3J9DQp0YWJsZShkJGdlbmRlciwgZCRjYWxsLCBkJGNpdHkpDQpgYGANCiAgDQpC4bqjbmcgdOG6p24gc+G7kSB0csOqbiBjaG8gdGjhuqV5Og0KDQogKiDhu54gdGjDoG5oIHBo4buRIEJvc3RvbjoNCiAgIA0KICAgIC0gQ8OzIDEyMjQgc+G7kSBuZ8aw4budaSBsw6AgbuG7ryBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbg0KICAgICAgDQogICAgLSBDw7MgMTYxIHPhu5EgbmfGsOG7nWkgbMOgIG7hu68gxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbg0KICAgICAgDQogICAgLSBDw7MgNzMyIHPhu5EgbmfGsOG7nWkgbMOgIG5hbSBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbg0KICAgICAgDQogICAgLSBDw7MgNDkgc+G7kSBuZ8aw4budaSBsw6AgbmFtIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBzYXUga2hpIG7hu5lwIMSRxqFuDQoNCiAqIOG7niB0aMOgbmggcGjhu5EgQ2hpY2FnbzoNCiAgIA0KICAgIC0gQ8OzIDIyMTMgc+G7kSBuZ8aw4budaSBsw6AgbuG7ryBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbg0KICAgICAgDQogICAgLSBDw7MgMTQ4IHPhu5EgbmfGsOG7nWkgbMOgIG7hu68gxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbg0KICAgICAgDQogICAgLSBDw7MgMzA5IHPhu5EgbmfGsOG7nWkgbMOgIG5hbSBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbg0KICAgICAgDQogICAgLSBDw7MgMzQgc+G7kSBuZ8aw4budaSBsw6AgbmFtIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBzYXUga2hpIG7hu5lwIMSRxqFuICANCiAgICANClTGsMahbmcgdOG7sSB24bubaSBuaOG7r25nIGJp4bq/biDEkeG7i25oIHTDrW5oIGtow6FjICAgIA0KICANCiMjIMSQ4buTIHRo4buLDQoNCiAqIMSQ4buTIHRo4buLIGThu7FhIHRyw6puIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIGdlbmRlciB2w6AgY2FsbA0KDQpgYGB7cn0NCmQgfD4gZ2dwbG90KGFlcyh4ID0gZ2VuZGVyLCBmaWxsID0gY2FsbCkpICsNCiAgZ2VvbV9iYXIoKSArDQogIGxhYnModGl0bGUgPSAiU3RhY2tlZCBCYXIgQ2hhcnQiLA0KICAgICAgIHggPSAiR2VuZGVyIiwNCiAgICAgICB5ID0gIkNvdW50IiwNCiAgICAgICBmaWxsID0gIkNhbGwiKQ0KYGBgDQoNCsSQ4buTIHRo4buLIHRyw6puIGNobyB0YSB0aOG6pXk6IA0KDQogIC0gVOG7lW5nIHPhu5EgbmfGsOG7nWkgbuG7ryDEkcaw4bujYyBn4buNaSBs4bqhaSB2w6Aga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpIHNhdSBraGkgbuG7mXAgxJHGoW4gbOG7m24gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIHThu5VuZyBz4buRIG5nxrDhu51pIG5hbSDEkcaw4bujYyBn4buNaSBs4bqhaSB2w6Aga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpIHNhdSBraGkgbuG7mXAgxJHGoW4uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHThu7cgbOG7hyBuZ8aw4budaSBu4buvIHRoYW0gZ2lhIHbDoG8gcXXDoSB0csOsbmggdHV54buDbiBk4bulbmcgY8OzIHRo4buDIGzhu5tuIGjGoW4gc28gduG7m2kgbmfGsOG7nWkgbmFtDQogIA0KICAtIMSQ4buRaSB24bubaSBu4buvIHRow6wgc+G7kSBuZ8aw4budaSDEkcaw4bujYyBn4buNaSBs4bqhaSBzYXUga2hpIG7hu5lwIMSRxqFuIGzDoCBjaMawYSDEkeG6v24gNTAwIG5nxrDhu51pDQogIA0KICAtIMSQ4buRaSB24bubaSBuYW0gdGjDrCBz4buRIG5nxrDhu51pIMSRxrDhu6NjIGfhu41pIGzhuqFpIHNhdSBraGkgbuG7mXAgxJHGoW4gbMOgIHLhuqV0IMOtdA0KICANCiAqIMSQ4buTIHRo4buLIGThu7FhIHRyw6puIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIGdlbmRlciwgY2FsbCB2w6AgY2l0eSAgDQoNCmBgYHtyfQ0KZCB8PiANCiAgZ2dwbG90KGFlcyh4ID0gZ2VuZGVyLCBmaWxsID0gY2FsbCkpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAic3RhY2siKSArDQogIGZhY2V0X3dyYXAofmNpdHkpICsNCiAgbGFicyh0aXRsZSA9ICJTdGFja2VkIEJhciBDaGFydCIsDQogICAgICAgeCA9ICJHZW5kZXIiLA0KICAgICAgIHkgPSAiQ291bnQiLA0KICAgICAgIGZpbGwgPSAiQ2FsbCIpDQpgYGANCg0KxJDhu5MgdGjhu4sgdHLDqm4gY2hvIHRhIHRo4bqleTogDQoNCiAgLSBU4buVbmcgc+G7kSBuZ8aw4budaSBu4buZcCDEkcahbiDhu6luZyB0dXnhu4NuIOG7nyB0aMOgbmggcGjhu5EgQ2hpY2FnbyBs4bubbiBoxqFuIHThu5VuZyBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIOG7qW5nIHR1eeG7g24g4bufIHRow6BuaCBwaOG7kSBCb3N0b24NCg0KICAtIFThu5VuZyBz4buRIG5nxrDhu51pIG7hu68gxJHGsOG7o2MgZ+G7jWkgbOG6oWkgdsOgIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBzYXUga2hpIG7hu5lwIMSRxqFuIOG7nyBDaGljYWdvIGzhu5tuIGjGoW4gcuG6pXQgbmhp4buBdSBzbyB24bubaSB04buVbmcgc+G7kSBuZ8aw4budaSBu4buvIMSRxrDhu6NjIGfhu41pIGzhuqFpIHbDoCBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbiDhu58gQm9zdG9uLiBOaMawbmcgdOG7lW5nIHPhu5EgbmfGsOG7nWkgbmFtIMSRYyBn4buNaSBs4bqhaSB2w6Aga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpIOG7nyB0aMOgbmggcGjhu5EgQ2hpY2FnbyBs4bqhaSB0aOG6pXAgaMahbiBzbyB24bubaSB0aMOgbmggcGjhu5EgQm9zdG9uLg0KICANCg0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlKGQkZ2VuZGVyLCBkJGNhbGwpKQ0KYGBgDQoNCiAgKiBE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBzdeG6pXQgdHLDqm4gdGEgdGjhuqV5Og0KICANCiAgICAtIFPhu5EgbmfGsOG7nWkgbMOgIG7hu68ga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpIHNhdSBraGkgbuG7mXAgxJHGoW4gY2hp4bq/bSA3MC41NyUsIHPhu5EgbmfGsOG7nWkgbMOgIG7hu68gxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbiBjaGnhur9tIDYuMyUNCiAgICANCiAgICAtIFPhu5EgbmfGsOG7nWkgbMOgIG5hbSBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbiBjaGnhur9tIDIxLjM4JSwgc+G7kSBuZ8aw4budaSBsw6AgbmFtIMSRxrDhu6NjIGfhu41pIGzhuqFpIHNhdSBraGkgbuG7mXAgxJHGoW4gY2hp4bq/bSAxLjclDQogICAgDQpgYGB7cn0NCnByb3AudGFibGUoYWRkbWFyZ2lucyh0YWJsZShkJGdlbmRlciwgZCRjYWxsKSkpDQpgYGANCg0KVHJvbmcgYuG6o25nIHRyw6puIHRow6w6DQoNCiAgLSBDw7MgMTcuNjQlIHPhu5EgbmfGsOG7nWkgbMOgIG7hu68gbuG7mXAgxJHGoW4gbcOgIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaQ0KICANCiAgLSBDw7MgMS42JSBz4buRIG5nxrDhu51pIGzDoCBu4buvIG7hu5lwIMSRxqFuIMSRxrDhu6NjIGfhu41pIGzhuqFpDQogIA0KICAtIFThu5VuZyBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIGzDoCBu4buvIGNoaeG6v20gMTkuMjMlDQogIA0KICAtIFThu5VuZyBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIG3DoCBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkgY2hp4buDbSAyMyUNCiAgDQogIC0gQ8OzIDUuMyUgc+G7kSBuZ8aw4budaSBsw6AgbmFtIG7hu5lwIMSRxqFuIG3DoCBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkNCiAgDQogIC0gQ8OzIDAuNDMlIHPhu5EgbmfGsOG7nWkgbMOgIG5hbSBu4buZcCDEkcahbiDEkcaw4bujYyBn4buNaSBs4bqhaQ0KICANCiAgLSBU4buVbmcgc+G7kSBuZ8aw4budaSBu4buZcCDEkcahbiBsw6AgbmFtIGNoaeG6v20gNS43NyUNCiAgDQogIC0gVOG7lW5nIHPhu5EgbmfGsOG7nWkgbuG7mXAgxJHGoW4gbcOgIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBjaGnhu4NtIDIuMDElICANCiAgICANCiAgICANCmBgYHtyfQ0KcHJvcC50YWJsZSh0YWJsZShkJGdlbmRlciwgZCRjYWxsLCBkJGNpdHkpKQ0KYGBgDQogICANCkLhuqNuZyB04bqnbiBzdeG6pXQgdHLDqm4gY2hvIHRo4bqleToNCg0KICog4bueIHRow6BuaCBwaOG7kSBCb3N0b246DQogICANCiAgICAtIFPhu5EgbmfGsOG7nWkgbMOgIG7hu68ga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpIHNhdSBraGkgbuG7mXAgxJHGoW4gY2hp4bq/bSAyNS4xMyUsIHPhu5EgbmfGsOG7nWkgbMOgIG7hu68gxJHGsOG7o2MgZ+G7jWkgbOG6oWkgc2F1IGtoaSBu4buZcCDEkcahbiBjaGnhur9tIDMuMzElDQogICAgDQogICAgLSBT4buRIG5nxrDhu51pIGzDoCBuYW0ga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpIHNhdSBraGkgbuG7mXAgxJHGoW4gY2hp4bq/bSAxNS4wMyUsIHPhu5EgbmfGsOG7nWkgbMOgIG5hbSDEkcaw4bujYyBn4buNaSBs4bqhaSBzYXUga2hpIG7hu5lwIMSRxqFuIGNoaeG6v20gMSUNCg0KICog4bueIHRow6BuaCBwaOG7kSBDaGljYWdvOg0KICAgDQogICAgLSBT4buRIG5nxrDhu51pIGzDoCBu4buvIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBzYXUga2hpIG7hu5lwIMSRxqFuIGNoaeG6v20gNDUuNDQlLCBz4buRIG5nxrDhu51pIGzDoCBu4buvIMSRxrDhu6NjIGfhu41pIGzhuqFpIHNhdSBraGkgbuG7mXAgxJHGoW4gY2hp4bq/bSAzLjA0JQ0KICAgIA0KICAgIC0gU+G7kSBuZ8aw4budaSBsw6AgbmFtIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBzYXUga2hpIG7hu5lwIMSRxqFuIGNoaeG6v20gNi4zNCUsIHPhu5EgbmfGsOG7nWkgbMOgIG5hbSDEkcaw4bujYyBn4buNaSBs4bqhaSBzYXUga2hpIG7hu5lwIMSRxqFuIGNoaeG6v20gMC43JQ0KICAgIA0KDQpgYGB7cn0NCnByb3AudGFibGUoYWRkbWFyZ2lucyh0YWJsZShkJGdlbmRlciwgZCRjYWxsLCBkJGNpdHkpKSkNCmBgYA0KDQpUcm9uZyBi4bqjbmcgdHLDqm4gdGjDrDoNCg0KICog4bueIHRow6BuaCBwaOG7kSBCb3N0b246DQoNCiAgLSBDw7MgMy4xNCUgc+G7kSBuZ8aw4budaSBsw6AgbuG7ryBu4buZcCDEkcahbiBtw6Aga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpDQogIA0KICAtIEPDsyAwLjQxJSBz4buRIG5nxrDhu51pIGzDoCBu4buvIG7hu5lwIMSRxqFuIMSRxrDhu6NjIGfhu41pIGzhuqFpDQogIA0KICAtIFThu5VuZyBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIGzDoCBu4buvIGNoaeG6v20gMy41NSUNCiAgDQogIC0gVOG7lW5nIHPhu5EgbmfGsOG7nWkgbuG7mXAgxJHGoW4gbcOgIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBjaGnhu4NtIDUlDQogIA0KICAtIEPDsyAxLjg4JSBz4buRIG5nxrDhu51pIGzDoCBuYW0gbuG7mXAgxJHGoW4gbcOgIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaQ0KICANCiAgLSBDw7MgMC4xMyUgc+G7kSBuZ8aw4budaSBsw6AgbmFtIG7hu5lwIMSRxqFuIMSRxrDhu6NjIGfhu41pIGzhuqFpDQogIA0KICAtIFThu5VuZyBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIGzDoCBuYW0gY2hp4bq/bSAyJQ0KICANCiAgLSBU4buVbmcgc+G7kSBuZ8aw4budaSBu4buZcCDEkcahbiBtw6Aga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpIGNoaeG7g20gMC41NCUgIA0KICANCiAqIOG7niB0aMOgbmggcGjhu5EgQ2hpY2FnbzogUGjDom4gdMOtY2ggdMawxqFuZyB04buxIG5oxrAgQm9zdG9uDQogDQogKiDhu54gY+G6oyAyIHRow6BuaCBwaOG7kSA6DQoNCiAgLSBDw7MgOC44MiUgc+G7kSBuZ8aw4budaSBsw6AgbuG7ryBu4buZcCDEkcahbiBtw6Aga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpDQogIA0KICAtIEPDsyAwLjc5JSBz4buRIG5nxrDhu51pIGzDoCBu4buvIG7hu5lwIMSRxqFuIMSRxrDhu6NjIGfhu41pIGzhuqFpDQogIA0KICAtIFThu5VuZyBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIGzDoCBu4buvIGNoaeG6v20gOS42MSUNCiAgDQogIC0gVOG7lW5nIHPhu5EgbmfGsOG7nWkgbuG7mXAgxJHGoW4gbcOgIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBjaGnhu4NtIDExLjQ5JQ0KICANCiAgLSBDw7MgMi42NyUgc+G7kSBuZ8aw4budaSBsw6AgbmFtIG7hu5lwIMSRxqFuIG3DoCBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkNCiAgDQogIC0gQ8OzIDAuMjElIHPhu5EgbmfGsOG7nWkgbMOgIG5hbSBu4buZcCDEkcahbiDEkcaw4bujYyBn4buNaSBs4bqhaQ0KICANCiAgLSBU4buVbmcgc+G7kSBuZ8aw4budaSBu4buZcCDEkcahbiBsw6AgbmFtIGNoaeG6v20gMi44OSUNCiAgDQogIC0gVOG7lW5nIHPhu5EgbmfGsOG7nWkgbuG7mXAgxJHGoW4gbcOgIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBjaGnhu4NtIDEwJSAgDQogDQogICAgDQojIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgdsOgIMaw4bubYyBsxrDhu6NuZyBjaOG7h25oIGzhu4djaCB04bu3IGzhu4cNCg0KICAqIMav4bubYyBsxrDhu6NuZyB24bubaSBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIMSRxrDhu6NjIGfhu41pIGzhuqFpDQoNCsSQ4buDIGtp4buDbSDEkeG7i25oIHhlbSB04bu3IGzhu4cgKCUpIFThu5VuZyBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIMSRxrDhu6NjIGfhu41pIGzhuqFpIGPDsyBi4bqxbmcgNTAlIGtow7RuZyB0YSBjw7MgZ2nhuqMgdGhp4bq/dCBzYXU6DQoNCiAgR+G7jWkgSCgwKTogcCA9IDAuNSwgdOG7qWMgbMOgIHThu5VuZyBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIMSRxrDhu6NjIGfhu41pIGzhuqFpIGLhurFuZyA1MCUNCg0KYGBge3J9DQpkMSA8LSBkW2QkY2FsbCA9PSAneWVzJyxdDQpwcm9wLnRlc3QobGVuZ3RoKGQxJGNhbGwpLCBsZW5ndGgoZDEkY2FsbCksIHAgPSAwLjA1KQ0KYGBgDQoNCkThu7FhIHbDoG8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5LCBnacOhIHRy4buLIHAtdmFsdWUgPSAxID4gMC41JS4gVuG6rXkgdGEgYsOhYyBi4buPIEgoMCksIHThu6ljIGzDoA0KDQp04buVbmcgc+G7kSBuZ8aw4budaSBu4buZcCDEkcahbiDEkcaw4bujYyBn4buNaSBs4bqhaSBraMO0bmcgYuG6sW5nIDUwJSANCg0KICAqIMav4bubYyBsxrDhu6NuZyB24bubaSBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaQ0KICANCsSQ4buDIGtp4buDbSDEkeG7i25oIHhlbSB04bu3IGzhu4cgKCUpIFThu5VuZyBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBjw7MgYuG6sW5nIDUwJSBraMO0bmcgdGEgY8OzIGdp4bqjIHRoaeG6v3Qgc2F1Og0KDQogIEfhu41pIEgoMCk6IHAgPSAwLjUsIHThu6ljIGzDoCB04buVbmcgc+G7kSBuZ8aw4budaSBu4buZcCDEkcahbiBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkgYuG6sW5nIDUwJQ0KDQpgYGB7cn0NCmQyIDwtIGRbZCRjYWxsID09ICdubycsXQ0KcHJvcC50ZXN0KGxlbmd0aChkMiRjYWxsKSwgbGVuZ3RoKGQyJGNhbGwpLCBwID0gMC4wNSkNCmBgYA0KDQpE4buxYSB2w6BvIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSwgZ2nDoSB0cuG7iyBwLXZhbHVlID0gMSA+IDAuNSUuIFbhuq15IHRhIGLDoWMgYuG7jyBIKDApLCB04bupYyBsw6ANCg0KdOG7lW5nIHPhu5EgbmfGsOG7nWkgbuG7mXAgxJHGoW4ga2jDtG5nIMSRxrDhu6NjIGfhu41pIGzhuqFpIGLDqSBoxqFuIDUwJSANCg0KICAqIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgY2jDqm5oIGzhu4djaCBnaeG7r2EgbmFtIHbDoCBu4buvIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkgbuG7mXAgxJHGoW4gxJHGsOG7o2MgZ+G7jWkgbOG6oWkNCiAgDQrEkOG7gyBraeG7g20gxJHhu4tuaCB4ZW0gdOG7tyBs4buHICglKSBj4bunYSBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIMSRxrDhu6NjIGfhu41pIGzhuqFpIGdp4buvYSBuYW0gdsOgIG7hu68gY8OzIGLhurFuZyBuaGF1IGhheSBraMO0bmcgdGEgY8OzIGdp4bqjIHRoaeG6v3Qgc2F1Og0KDQogIEfhu41pIEgoMCk6IHAxID0gcDIsIHThu6ljIGzDoCBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIMSRxrDhu6NjIGfhu41pIGzhuqFpIGdp4buvYSBuYW0gdsOgIG7hu68gY8OzIGLhurFuZyBuaGF1DQoNCmBgYHtyfQ0KZG0gPC0gZFtkJGdlbmRlciA9PSAnbWFsZScsXQ0KZGYgPC0gZFtkJGdlbmRlciA9PSAnZmVtYWxlJyxdDQoNCmRteWVzIDwtIGRtW2RtJGNhbGwgPT0gInllcyIsXQ0KZGZ5ZXMgPC0gZGZbZGYkY2FsbCA9PSAieWVzIixdDQoNCmEgPC0gYyhucm93KGRtKSwgbnJvdyhkZikpDQpiIDwtIGMobnJvdyhkbXllcyksIG5yb3coZGZ5ZXMpKQ0KDQpwcm9wLnRlc3QoYixhKQ0KYGBgDQoNCkThu7FhIHbDoG8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5LCBnacOhIHRy4buLIHAtdmFsdWUgPSAwLjQgPiBt4bupYyDDvSBuZ2jEqWEgMC4wNS4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgDQpraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aGnhur90IGtow7RuZyBIKDApLiBEbyDEkcOzLCBjaMO6bmcgdGEga2jDtG5nIHRo4buDIGvhur90IGx14bqtbiANCnLhurFuZyB04bu3IGzhu4cgbmfGsOG7nWkgbuG7mXAgxJHGoW4gxJHGsOG7o2MgZ+G7jWkgbOG6oWkgZ2nhu69hIG5hbSB2w6AgbuG7ryBsw6Aga2jDoWMgbmhhdS4NCg0KICogxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyBjaMOqbmggbOG7h2NoIGdp4buvYSBuYW0gdsOgIG7hu68gY+G7p2Egbmjhu69uZyBuZ8aw4budaSBu4buZcCDEkcahbiBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkNCiAgDQrEkOG7gyBraeG7g20gxJHhu4tuaCB4ZW0gdOG7tyBs4buHICglKSBj4bunYSBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBnaeG7r2EgbmFtIHbDoCBu4buvIGPDsyBi4bqxbmcgDQpuaGF1IGhheSBraMO0bmcgdGEgY8OzIGdp4bqjIHRoaeG6v3Qgc2F1Og0KDQogIEfhu41pIEgoMCk6IHAxID0gcDIsIHThu6ljIGzDoCBz4buRIG5nxrDhu51pIG7hu5lwIMSRxqFuIGtow7RuZyDEkcaw4bujYyBn4buNaSBs4bqhaSBnaeG7r2EgbmFtIHbDoCBu4buvIGPDsyBi4bqxbmcgbmhhdQ0KDQpgYGB7cn0NCg0KZG1ubyA8LSBkbVtkbSRjYWxsID09ICJubyIsXQ0KZGZubyA8LSBkZltkZiRjYWxsID09ICJubyIsXQ0KDQp5IDwtIGMobnJvdyhkbSksIG5yb3coZGYpKQ0KayA8LSBjKG5yb3coZG1ubyksIG5yb3coZGZubykpDQoNCnByb3AudGVzdChrLHkpDQpgYGANCg0KROG7sWEgdsOgbyBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXksIGdpw6EgdHLhu4sgcC12YWx1ZSA9IDAuNCA+IG3hu6ljIMO9IG5naMSpYSAwLjA1LiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6ANCmtow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRoaeG6v3Qga2jDtG5nIEgoMCkuIERvIMSRw7MsIGNow7puZyB0YSBraMO0bmcgdGjhu4Mga+G6v3QgbHXhuq1uIA0KcuG6sW5nIHThu7cgbOG7hyBuZ8aw4budaSBu4buZcCDEkcahbiBraMO0bmcgxJHGsOG7o2MgZ+G7jWkgbOG6oWkgZ2nhu69hIG5hbSB2w6AgbuG7ryBsw6Aga2jDoWMgbmhhdS4NCg0KIyByZWxhdGl2ZSByaXNrLCBvZGRzcmF0aW8gdsOgIGtob+G6o25nIMaw4bubYyBsxrDhu6NuZyBj4bunYSAyIGNo4buJIHPhu5EgxJHDsywgw70gbmdoxKlhDQoNCg0KYGBge3J9DQpkJHF1YWxpdHlbZCRxdWFsaXR5ID09ICJoaWdoIl0gPC0gImhpZ2giDQpxdWFsIDwtIHRhYmxlKGQkZ2VuZGVyLCBkJHF1YWxpdHkpDQoNCmFkZG1hcmdpbnMocXVhbCkNCmBgYA0KDQpgYGB7cn0NClJlbFJpc2socXVhbCkNCmBgYA0KDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKHF1YWwpDQpgYGANCg0KROG7sWEgdsOgbyBi4bqjbmcgdHLDqm46IFThu7cgc+G7kSBjaMOqbmggbOG7h2NoIChvZGRzcmF0aW8pIGNobyBuYW0gc28gduG7m2kgbuG7ryBsw6AgMC45ODg3LCB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlIHThu6sgMC44NjUyIMSR4bq/biAxLjEzMDAuIFbDrCBraG/huqNuZyB0aW4gY+G6rXkgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMSwgY2jDum5nIHRhIGtow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBvZGRzIGPhu6dhIHZp4buHYyByxqFpIHbDoG8gbmjDs20gImhpZ2giIHNvIHbhu5tpICJsb3ciIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIGdp4buvYSBuYW0gdsOgIG7hu68uDQoNCiMgS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu41jIGzhuq1wIGNobyAyIGJp4bq/bg0KDQpHaeG6oyB0aHV54bq/dCBIKDApOiBnZW5kZXIsIHF1YWxpdHkgxJHhu5ljIGzhuq1wDQoNCmBgYHtyfQ0KY2hpc3EudGVzdChxdWFsKQ0KYGBgDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcOKIknZhbHVlID0gMC45ID4gMC4wNS4gVuG6rXkgdGEgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aGnhur90IEgoMCksIG5naMSpYSBsw6AgZ2nhu5tpIHTDrW5oIHbDoCBi4bqxbmcgY+G6pXAga2jDtG5nIGxpw6puIHF1YW4gxJHhur9uIG5oYXUuDQoNCiMgSOG7k2kgcXV5DQoNCmBgYHtyfQ0KZml0dGVkIDwtIGdsbShmYWN0b3IoY2FsbCkgfiBjaXR5LCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ2xvZ2l0JyksIGRhdGEgPSBkKQ0KDQpzdW1tYXJ5KGZpdHRlZCkNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=