PHẦN 1: TÌM HIỂU VÀ CHUẨN BỊ DỮ LIỆU

1.1 ĐỌC DỮ LIỆU

  • Dữ liệu này được trích xuất từ cơ sở dữ liệu của Cục điều tra dân số năm 1994 (Khai thác và trực quan hóa dữ liệu, Silicon Graphics). Bộ dữ liệu này được trích xuất từ điều tra dân số của Mỹ, dùng để dự đoán liệu thu nhập của một người có vượt mức $50K/năm hay không.

  • Biến phụ thuộc (target): income (<=50K hoặc >50K) → biến định tính

1.1.1 Đọc file dữ liệu gốc

library(xlsx)
## Warning: package 'xlsx' was built under R version 4.3.3
data <- read.xlsx("C:/Users/HP/Downloads/adult_categorical_.xlsx", sheetIndex = 1, header = T)
  • Cấu trúc bộ dữ liệu
str(data)
## 'data.frame':    32561 obs. of  9 variables:
##  $ workclass     : chr  "State-gov" "Self-emp-not-inc" "Private" "Private" ...
##  $ education     : chr  "Bachelors" "Bachelors" "HS-grad" "11th" ...
##  $ marital.status: chr  "Never-married" "Married-civ-spouse" "Divorced" "Married-civ-spouse" ...
##  $ occupation    : chr  "Adm-clerical" "Exec-managerial" "Handlers-cleaners" "Handlers-cleaners" ...
##  $ relationship  : chr  "Not-in-family" "Husband" "Not-in-family" "Husband" ...
##  $ race          : chr  "White" "White" "White" "Black" ...
##  $ sex           : chr  "Male" "Male" "Male" "Male" ...
##  $ native.country: chr  "United-States" "United-States" "United-States" "United-States" ...
##  $ income        : chr  "<=50K" "<=50K" "<=50K" "<=50K" ...
  • Nhóm biến định tính bao gồm các biến dạng chuỗi (character), thể hiện phân loại hoặc thuộc tính không mang tính thứ tự số học, chẳng hạn như: workclass (loại hình công việc như tư nhân, chính phủ, tự doanh…), education (trình độ học vấn như Bachelors, HS-grad, Some-college…), marital.status (tình trạng hôn nhân như Never-married, Married, Divorced…), occupation (ngành nghề), relationship (vai trò trong gia đình như Husband, Not-in-family…), race (chủng tộc như White, Black…), sex (giới tính), native.country (quốc tịch), và income (mức thu nhập hàng năm, phân loại thành <=50K và >50K, cũng chính là biến mục tiêu trong bài toán phân loại).
head(data,4)
##          workclass education     marital.status        occupation  relationship
## 1        State-gov Bachelors      Never-married      Adm-clerical Not-in-family
## 2 Self-emp-not-inc Bachelors Married-civ-spouse   Exec-managerial       Husband
## 3          Private   HS-grad           Divorced Handlers-cleaners Not-in-family
## 4          Private      11th Married-civ-spouse Handlers-cleaners       Husband
##    race  sex native.country income
## 1 White Male  United-States  <=50K
## 2 White Male  United-States  <=50K
## 3 White Male  United-States  <=50K
## 4 Black Male  United-States  <=50K
  • Bốn quan sát đầu tiên trong bộ dữ liệu đều là nam giới có thu nhập dưới 50.000 đô/năm, với độ tuổi dao động từ 54 đến 90 tuổi. Các cá nhân này có trình độ học vấn khác nhau, từ lớp 7–8 đến một phần chương trình đại học, và phần lớn thuộc chủng tộc White. Họ làm việc cho chính phủ hoặc tư nhân và có trinh độ học vấn khá cao. Tất cả đều cư trú tại Hoa Kỳ.

1.1.2 Lựa chọn các biến định tính

Giải thích:

  • c(““): tạo vecto
  • dltt <- data[, dldt]: lấy trong bộ dữ liệu data các cột trong dldt vừa tạo ra (các biến định tính), và lấy tất cả các hàng (full quan sát)
# Chọn các biến định tính
dldt <- c("workclass", "education", "marital.status", 
                      "occupation", "relationship", "race", 
                      "sex", "native.country", "income")
  • Ban đầu, khi kiểm tra kiểu dữ liệu của các biến định tính như marital.status, relationship, race, sex, và education trong danh sách qdt, kết quả cho thấy tất cả đều chưa phải kiểu factor mà vẫn đang ở dạng chuỗi ký tự (character). Điều này không phù hợp nếu ta muốn thực hiện các phân tích thống kê định tính hoặc trực quan hóa dữ liệu phân loại, vì kiểu factor là cách R xử lý hiệu quả các biến phân loại.
for (col in dldt) {
  if (!is.factor(data[[col]])) {
    data[[col]] <- as.factor(data[[col]])
  }
}
sapply(data[dldt], is.factor)
##      workclass      education marital.status     occupation   relationship 
##           TRUE           TRUE           TRUE           TRUE           TRUE 
##           race            sex native.country         income 
##           TRUE           TRUE           TRUE           TRUE

-Sau đó, bằng cách dùng vòng lặp for, từng biến trong danh sách qdt được kiểm tra và chuyển đổi sang kiểu factor nếu chưa phải. Khi kiểm tra lại bằng sapply, kết quả cho thấy tất cả các biến trong qdt đều đã được chuyển thành kiểu factor. Việc chuyển đổi này giúp chuẩn hóa dữ liệu, tăng hiệu suất xử lý và đảm bảo tính tương thích với các hàm phân tích thống kê trong R như table(), prop.table(), glm(), hay các biểu đồ ggplot2. Đây là bước tiền xử lý quan trọng trước khi thực hiện các phân tích định tính trong R.

1.2. TỔNG QUAN VỀ DỮ LIỆU

1.2.1 Nội dung dữ liệu

  • Bộ dữ liệu đang có gồm 9 biến định tính (categorical) và 38.842 dòng dữ liệu.

1.2.2 Danh sách các biến và mô tả

Cấu trúc bộ dữ liệu

Tên cột gốc Mô tả
workclass Loại công việc - định tính danh mục (categorical)
education Trình độ học vấn - định tính danh mục (categorical)
marital-status Tình trạng hôn nhân - định tính danh mục (categorical)
occupation Nghề nghiệp - định tính danh mục (categorical)
relationship Quan hệ trong hộ gia đình - định tính danh mục (categorical)
race Chủng tộc - định tính danh mục (categorical)
sex Giới tính - định tính danh mục (categorical)
native-country Quốc gia - định tính danh mục (categorical)
income Mức thu nhập (<=50K hoặc >50K) - Nhị phân

1.2.3 Kiểm tra dữ liệu

Kiểm tra số lượng NA trong cột định tính*

Giải thích:

sapply(dat, …): áp dụng hàm cho từng cột trong dữ liệu dat.

sum(is.na(x)): đếm số lượng NA trong từng cột.

# Kiểm tra số lượng NA trong mỗi cột định tính
na_counts <- sapply(data, function(x) sum(is.na(x)))
na_counts
##      workclass      education marital.status     occupation   relationship 
##              0              0              0              0              0 
##           race            sex native.country         income 
##              0              0              0              0

Nhận xét

  • Kết quả thu được cho thấy rằng tất cả các cột định tính đều không có giá trị thiếu (NA) vì số lượng NA trong các cột đều hiển thị là 0

PHẦN 2: Phân tích Mô tả Một biến Định tính (Univariate Descriptive Analysis)

2.1 Biến EDUCATION

qq <-  data[,dldt]
table(qq$education)
## 
##         10th         11th         12th      1st-4th      5th-6th      7th-8th 
##          933         1175          433          168          333          646 
##          9th   Assoc-acdm    Assoc-voc    Bachelors    Doctorate      HS-grad 
##          514         1067         1382         5355          413        10501 
##      Masters    Preschool  Prof-school Some-college 
##         1723           51          576         7291
q5 <- table(qq$education)/sum(nrow(qq))
table(qq$education)/sum(nrow(qq))
## 
##         10th         11th         12th      1st-4th      5th-6th      7th-8th 
##  0.028653911  0.036086115  0.013298117  0.005159547  0.010226959  0.019839686 
##          9th   Assoc-acdm    Assoc-voc    Bachelors    Doctorate      HS-grad 
##  0.015785756  0.032769264  0.042443414  0.164460551  0.012683886  0.322502380 
##      Masters    Preschool  Prof-school Some-college 
##  0.052916065  0.001566291  0.017689874  0.223918184

Kết quả phân tích tỷ lệ biến education cho thấy sự phân bố khá rõ ràng giữa các bậc học. Nhóm chiếm tỷ lệ cao nhất là HS-grad (tốt nghiệp trung học phổ thông) với khoảng 32.25%, tiếp theo là Some-college (đã học đại học nhưng chưa tốt nghiệp) chiếm 22.39%, và Bachelors (tốt nghiệp đại học) chiếm 16.45%.

Các nhóm có tỷ lệ thấp hơn gồm Masters (cao học) chiếm 5.29%, Assoc-voc và Assoc-acdm (trình độ cao đẳng nghề hoặc học thuật) lần lượt chiếm 4.24% và 3.28%. Các bậc học thấp như 9th, 10th, 11th, và 7th-8th đều có tỷ lệ dưới 4%. Đặc biệt, các nhóm như Preschool (mẫu giáo – 0.16%) và 1st-4th (lớp 1 đến lớp 4 – 0.52%) chiếm tỷ lệ rất nhỏ, gần như không đáng kể.

Tóm lại, phần lớn người trong bộ dữ liệu có trình độ học vấn từ trung học trở lên, trong đó gần 3/4 đã hoàn tất ít nhất chương trình phổ thông hoặc từng học đại học. Khi mô hình hóa biến education, có thể cân nhắc gộp các nhóm có tỷ lệ rất thấp để giảm nhiễu và tăng hiệu quả dự đoán.

library(ggplot2)
ggplot(qq, aes(x = education)) +
  geom_bar(fill = "white", color = "black") +
  labs(x = "Trình độ học vấn ", y = "Tần suất", title = "Biểu đồ tần số trình độ học vấn") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  coord_flip()

Biểu đồ tần suất giáo dục cho thấy sự phân bố trình độ học vấn trong bộ dữ liệu có xu hướng tập trung mạnh vào một số bậc phổ biến. Trong đó, HS-grad (tốt nghiệp trung học) là nhóm chiếm tỷ lệ cao nhất với hơn 10.000 người, theo sau là Some-college (đã học đại học nhưng chưa tốt nghiệp) với khoảng 7.000 người, và Bachelors (tốt nghiệp đại học) với khoảng 5.000 người.

Các bậc học sau đại học như Masters, Doctorate, và Prof-school chiếm tỷ lệ nhỏ hơn đáng kể. Ngoài ra, một số bậc học dưới trung học như 9th, 7th-8th, hay 5th-6th cũng xuất hiện nhưng số lượng rất thấp. Nhóm có trình độ học vấn thấp nhất – Preschool – gần như không đáng kể.

Phân bố này phản ánh xu hướng học vấn phổ biến trong dân số lao động Mỹ thời điểm khảo sát, với phần lớn dân cư đạt trình độ từ trung học trở lên. Khi đưa biến education vào phân tích hoặc mô hình hóa, có thể cân nhắc gộp các nhóm có tần suất rất thấp để đảm bảo tính ổn định và giảm nhiễu trong mô hình.

2.2 Biến RELATIONSHIP

qq <-  data[,dldt]
table(qq$relationship)
## 
##        Husband  Not-in-family Other-relative      Own-child      Unmarried 
##          13193           8305            981           5068           3446 
##           Wife 
##           1568
q2 <- table(qq$relationship)/sum(nrow(qq))
table(qq$relationship)/sum(nrow(qq))
## 
##        Husband  Not-in-family Other-relative      Own-child      Unmarried 
##     0.40517797     0.25505973     0.03012807     0.15564633     0.10583213 
##           Wife 
##     0.04815577

Kết quả phân tích tỷ lệ của biến relationship cho thấy nhóm Husband (người chồng trong hộ gia đình) chiếm tỷ lệ cao nhất, với khoảng 40.52% tổng số quan sát. Tiếp theo là nhóm Not-in-family (không thuộc gia đình hạt nhân) chiếm 25.51%, và nhóm Own-child (con ruột hoặc con nuôi trong hộ gia đình) chiếm khoảng 15.56%. Các nhóm còn lại có tỷ lệ thấp hơn: Unmarried (chưa kết hôn hoặc độc thân) chiếm 10.58%, Wife (người vợ) chiếm 4.82%, và thấp nhất là nhóm Other-relative (thành viên gia đình khác như anh chị em, ông bà…) với chỉ 3.01%. Phân bố này phản ánh rõ vai trò phổ biến của người chồng trong hộ gia đình thời điểm khảo sát, đồng thời cho thấy tỷ lệ nữ giới giữ vai trò “vợ” thấp hơn đáng kể, có thể do định nghĩa phân loại trong dữ liệu hoặc xu hướng nhân khẩu học đặc thù.

ggplot(qq, aes(x = relationship)) +
  geom_bar(fill = "darkred", color = "white") +
  coord_flip() +
  labs(x = "Mối quan hệ", y = "Tần số", title = "Biểu đồ tần số của biến relationship") +
  theme_minimal()

Biểu đồ tần số của biến relationship thể hiện rõ sự phân bố vai trò trong hộ gia đình của các cá nhân trong bộ dữ liệu. Nhóm chiếm tỷ lệ cao nhất là Husband (người chồng), với hơn 12.000 quan sát, cho thấy số lượng lớn người lao động trong mẫu khảo sát đóng vai trò trụ cột nam trong gia đình. Theo sau là nhóm Not-in-family (không thuộc gia đình hạt nhân), với gần 9.000 trường hợp – đây có thể là những người sống độc thân, ở trọ hoặc sống ngoài hộ gia đình truyền thống.

Các nhóm Own-child (con ruột hoặc con nuôi) và Unmarried (chưa kết hôn) chiếm tỷ lệ trung bình, lần lượt khoảng 5.000 và 4.000 quan sát. Ngược lại, nhóm Wife (người vợ) có số lượng thấp hơn đáng kể so với “Husband”, và nhóm Other-relative (thành viên gia đình khác) là nhóm ít xuất hiện nhất.

Phân bố này cho thấy một đặc điểm đáng chú ý về cấu trúc hộ gia đình trong dữ liệu – trong đó nam giới trong vai trò “chồng” được ghi nhận nhiều hơn so với nữ giới trong vai trò “vợ”, và có một tỷ lệ lớn cá nhân không sống trong hộ gia đình truyền thống. Đây là cơ sở quan trọng để phân tích sâu hơn về nhân khẩu học và xây dựng các mô hình liên quan đến thu nhập, nghề nghiệp hoặc cấu trúc hộ gia đình.

2.3 Biến GENDER

qq <-  data[,dldt]
table(qq$sex)
## 
## Female   Male 
##  10771  21790
q4 <- table(qq$sex)/sum(nrow(qq))
table(qq$sex)/sum(nrow(qq))
## 
##    Female      Male 
## 0.3307945 0.6692055

Phân tích biến sex cho thấy sự chênh lệch đáng kể giữa hai giới tính trong bộ dữ liệu. Cụ thể, nam giới chiếm khoảng 66.92%, trong khi nữ giới chỉ chiếm khoảng 33.08% tổng số quan sát. Tỷ lệ này cho thấy nam giới chiếm ưu thế rõ rệt trong tập dữ liệu, gần gấp đôi so với nữ giới. Điều này có thể phản ánh đặc điểm của mẫu điều tra dân số tại thời điểm thu thập dữ liệu hoặc có thể do cách chọn mẫu nghiêng về nhóm lao động nam. Sự mất cân đối này cũng là yếu tố cần lưu ý trong các phân tích tiếp theo để tránh sai lệch trong đánh giá và mô hình hóa.

q4_df <- as.data.frame(q4)
names(q4_df) <- c("sex", "Tansuat")
ggplot(q4_df, aes(x = sex, y = Tansuat, fill = sex)) +
  geom_col(width = 0.6) +
  geom_text(aes(label = round(Tansuat, 3)), vjust = -0.2, size = 5) +  
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +  
  scale_fill_manual(values = c("Female" = "lightblue", "Male" = "lightyellow")) +  
  labs(
    title = "Biểu đồ tỷ lệ giới tính ",
    x = "Giới tính",
    y = "Tần suất (%)"
  ) +
  theme_minimal(base_size = 14)

2.4 Biến MARITAL.STATUS

qq <-  data[,dldt]
table(qq$marital.status)
## 
##              Divorced     Married-AF-spouse    Married-civ-spouse 
##                  4443                    23                 14976 
## Married-spouse-absent         Never-married             Separated 
##                   418                 10683                  1025 
##               Widowed 
##                   993

Việc tạo bảng tần suất cho biến marital.status bằng lệnh table(qq$marital.status) giúp nhanh chóng thống kê số lượng quan sát cho từng nhóm tình trạng hôn nhân trong bộ dữ liệu. Kết quả cho thấy phần lớn cá nhân thuộc nhóm “Married-civ-spouse” (14.976 người) và “Never-married” (10.683 người), trong khi các nhóm như “Married-AF-spouse” (23 người) và “Married-spouse-absent” (418 người) có số lượng rất ít. Đây là cách đơn giản nhưng hiệu quả để có cái nhìn ban đầu về phân bố của một biến định tính.

q1 <- table(qq$marital.status)/sum(nrow(qq))
table(qq$marital.status)/sum(nrow(qq))
## 
##              Divorced     Married-AF-spouse    Married-civ-spouse 
##          0.1364515832          0.0007063665          0.4599367341 
## Married-spouse-absent         Never-married             Separated 
##          0.0128374436          0.3280918891          0.0314793772 
##               Widowed 
##          0.0304966064

Kết quả phân tích tỷ lệ các nhóm trong biến marital.status cho thấy rằng phần lớn cá nhân trong bộ dữ liệu thuộc nhóm đã kết hôn với vợ/chồng đang sống cùng (Married-civ-spouse), chiếm khoảng 45.99%. Nhóm chưa từng kết hôn (Never-married) cũng chiếm tỷ lệ khá lớn, đạt khoảng 32.81%. Trong khi đó, các nhóm còn lại có tỷ lệ thấp hơn đáng kể: nhóm ly hôn (Divorced) chiếm khoảng 13.65%, ly thân (Separated) chiếm 3.15%, góa (Widowed) chiếm 3.05%, và kết hôn nhưng vắng mặt vợ/chồng (Married-spouse-absent) chiếm 1.28%. Đặc biệt, nhóm Married-AF-spouse xuất hiện rất hiếm trong dữ liệu, chỉ chiếm 0.07%. Nhìn chung, phân bố tình trạng hôn nhân trong tập dữ liệu này cho thấy đa số người dân đã từng hoặc đang trong một mối quan hệ hôn nhân chính thức, trong khi các nhóm đặc biệt chỉ chiếm một phần rất nhỏ.

library(ggplot2)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.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(scales)
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
q1_df <- as.data.frame(q1)
names(q1_df) <- c("marital.status", "Tansuat")
ggplot(q1_df, aes(x = "", y = Tansuat, fill = marital.status)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  scale_fill_manual(values = c("Divorced" = "#00C49A", "Married-AF-spouse" = "#1F77B4", "Married-spouse-absent" = "yellow", "Married-civ-spouse" = "red" ,"Never-married" = "#FF6384", "Separated" = "black", "Widowed" = "green")) +
  labs(title = "Biểu đồ tần suất của marital.status") +
  theme_void() +  
  geom_text(aes(label = paste0(round(Tansuat,3), "%")), 
            position = position_stack(vjust = 0.5),
            color = "white", size = 4)

Biểu đồ tần suất của biến marital.status cho thấy sự phân bố không đồng đều rõ rệt giữa các nhóm tình trạng hôn nhân trong bộ dữ liệu. Cụ thể, nhóm “Married-civ-spouse” (đã kết hôn, sống cùng vợ/chồng) chiếm tỷ lệ cao nhất với khoảng 45.99%, tiếp theo là nhóm “Never-married” (chưa từng kết hôn) với 32.81%. Hai nhóm này cộng lại đã chiếm gần 79% tổng số quan sát, cho thấy đây là hai tình trạng phổ biến áp đảo trong dữ liệu. Các nhóm còn lại có tỷ lệ thấp hơn đáng kể, như “Divorced” (ly hôn) chiếm 13.65%, “Separated” (ly thân) chiếm 3.15%, “Widowed” (góa) chiếm 3.05%, và “Married-spouse-absent” chỉ chiếm 1.28%. Đặc biệt, nhóm “Married-AF-spouse” hầu như không xuất hiện, chỉ chiếm 0.07%. Sự mất cân đối này có ý nghĩa quan trọng trong quá trình mô hình hóa, vì các nhóm có tỷ lệ quá nhỏ có thể gây sai lệch hoặc giảm hiệu quả dự báo nếu không được xử lý thích hợp, chẳng hạn như gộp nhóm, tái phân loại hoặc áp dụng kỹ thuật cân bằng mẫu.

PHẦN 3: Ước lượng Khoảng và Kiểm định Giả thuyết cho Tỷ lệ (Một biến)

Trong phần này, ta tiến hành phân tích tỷ lệ của một hạng mục cụ thể thuộc 5 biến định tính trong bộ dữ liệu: tình trạng hôn nhân (marital.status), quan hệ gia đình (relationship), chủng tộc (race), giới tính (sex), và trình độ học vấn (education). Mỗi biến sẽ được phân tích qua 2 bước: (1) ước lượng khoảng tin cậy 95% cho tỷ lệ của hạng mục quan tâm trong tổng thể, và (2) kiểm định giả thuyết thống kê cho một giả định cụ thể về tỷ lệ đó. Mức ý nghĩa là α = 0.05.

3.1 Xác định hạng mục Quan tâm

“Asian-Pac-Islander” của biến race

“Own-child” của biến relationship

3.2 Ước lượng Khoảng Tin cậy và Kiểm định Giả thuyết của từng hạng mục

3.2.1 Hạng mục “Husband” của biến relationship

prop.test(sum(data$relationship == "Own-child"), nrow(data), conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(data$relationship == "Own-child") out of nrow(data), null probability 0.5
## X-squared = 15443, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.1517342 0.1596400
## sample estimates:
##         p 
## 0.1556463

Ước lượng khoảng tin cậy:

Tỷ lệ mẫu các cá nhân được ghi nhận là “Own-child” trong tập dữ liệu được ước lượng là 15.56%. Dựa trên phân tích thống kê, khoảng tin cậy 95% cho tỷ lệ này được tính từ 15.17% đến 15.96%. Điều này có nghĩa là, với độ tin cậy 95%, chúng ta có thể khẳng định rằng tỷ lệ thực sự các cá nhân là “Own-child” trong tổng thể dân số nằm trong khoảng trên. Khoảng này hoàn toàn nằm dưới mức 50%, cho thấy tỷ lệ này nhỏ hơn đáng kể so với một nửa tổng số quan sát.

Kiểm định Giả thuyết - H₀ (Giả thuyết không): 50% số cá nhân trong tổng thể là “Own-child”

p=0.5 Kết quả kiểm định cho thấy thống kê chi bình phương đạt giá trị rất lớn (X² = 15,443), với 1 bậc tự do, và p-value < 2.2e-16. Do giá trị p nhỏ hơn rất nhiều so với ngưỡng ý nghĩa 0.05, chúng ta bác bỏ giả thuyết gốc. Điều này cho thấy có bằng chứng thống kê mạnh mẽ rằng tỷ lệ thực sự các cá nhân là “Own-child” khác 0.5, và cụ thể là thấp hơn đáng kể. Ta đặt giả thuyết như sau:

  • H₀ (Giả thuyết không): 50% số cá nhân trong tổng thể là “Own-child”

3.2.2 Hạng mục “White” của biến race

prop.test(sum(data$race == "Asian-Pac-Islander"), nrow(data), conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(data$race == "Asian-Pac-Islander") out of nrow(data), null probability 0.5
## X-squared = 28536, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.03003992 0.03389009
## sample estimates:
##          p 
## 0.03190934

Ước lượng khoảng tin cậy:

Tỷ lệ người thuộc nhóm “Asian-Pac-Islander” trong tập dữ liệu được ước lượng là 3.19%. Dựa trên phép ước lượng khoảng, khoảng tin cậy 95% cho tỷ lệ này nằm trong khoảng từ 3.00% đến 3.39%. Điều này có nghĩa là, với độ tin cậy 95%, chúng ta có thể khẳng định rằng tỷ lệ thực sự người “Asian-Pac-Islander” trong tổng thể dân số nằm trong khoảng rất nhỏ, thấp hơn đáng kể so với giả định 50%. Khoảng tin cậy này hoàn toàn nằm dưới mức 0.5, phản ánh rõ sự chênh lệch đáng kể.

Kiểm định Giả thuyết

Ta đặt giả thuyết như sau:

  • H₀ (Giả thuyết không):Tỷ lệ người châu Á = 0.5

  • H₁ (Giả thuyết đối):Tỷ lệ người châu Á ≠ 0.5

Phép kiểm định tỷ lệ một mẫu được thực hiện với giả thuyết gốc

P = 0.5, tức giả định rằng 50% dân số thuộc nhóm “Asian-Pac-Islander”. Kết quả kiểm định cho thấy thống kê chi bình phương có giá trị rất lớn (X² = 28,536), với 1 bậc tự do, và p-value < 2.2e-16. Với p-value nhỏ hơn nhiều so với mức ý nghĩa 0.05, chúng ta bác bỏ giả thuyết gốc. Điều này cho thấy có bằng chứng thống kê mạnh mẽ rằng tỷ lệ người “Asian-Pac-Islander” trong tổng thể khác 50%, và cụ thể là thấp hơn rất nhiều so với mức giả định.

PHẦN 4: Relative risk và Odd Ratio

Để tiếp tục phân tích mối quan hệ giữa các biến định tính, ta lựa chọn hai cặp biến có ý nghĩa thực tiễn cao để tính Relative Risk (nguy cơ tương đối) và Odds Ratio (tỷ số chênh). Hai cặp biến được chọn gồm:

Cặp 1: sex (giới tính: Male/Female) và income (thu nhập: >50K / <=50K) → nhằm so sánh khả năng đạt thu nhập cao giữa nam và nữ.

Cặp 2: marital.status (được rút gọn thành: Married-civ-spouse / Other) và income → để xem liệu tình trạng hôn nhân có ảnh hưởng đến xác suất có thu nhập trên 50.000 đô/năm.

Với mỗi cặp biến, ta tiến hành lập bảng tần suất chéo 2×2, sau đó tính tỷ số chênh (Odds Ratio) bằng hàm oddsratio() từ gói epitools, đồng thời tính nguy cơ tương đối (Relative Risk) thủ công hoặc từ cùng kết quả trả về của hàm. Kết quả sẽ giúp đánh giá xem một nhóm có khả năng (risk) hoặc cơ hội (odds) có thu nhập cao nhiều hơn nhóm còn lại hay không, và mức độ khác biệt đó có ý nghĩa thống kê hay không.

4.1 Sex (giới tính: Male/Female) và Race (chủng tộc) (thu nhập: >50K / <=50K)

4.1.1 Relative risk

library(epitools)
tab1 <- table(data$race, data$sex)
riskratio(tab1)
## $data
##                     
##                      Female  Male Total
##   Amer-Indian-Eskimo    119   192   311
##   Asian-Pac-Islander    346   693  1039
##   Black                1555  1569  3124
##   Other                 109   162   271
##   White                8642 19174 27816
##   Total               10771 21790 32561
## 
## $measure
##                     risk ratio with 95% C.I.
##                       estimate     lower     upper
##   Amer-Indian-Eskimo 1.0000000        NA        NA
##   Asian-Pac-Islander 1.0803808 0.9800393 1.1909958
##   Black              0.8135253 0.7403873 0.8938882
##   Other              0.9682887 0.8492957 1.1039537
##   White              1.1165475 1.0226424 1.2190756
## 
## $p.value
##                     two-sided
##                        midp.exact fisher.exact   chi.square
##   Amer-Indian-Eskimo           NA           NA           NA
##   Asian-Pac-Islander 0.1081675333 0.1176692618 0.1061680084
##   Black              0.0001024734 0.0001070805 0.0001072881
##   Other              0.6304160655 0.6705639149 0.6293606615
##   White              0.0074039380 0.0079961760 0.0064338458
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Bảng số liệu trình bày phân tích về tỷ lệ giới tính (nữ và nam) theo từng nhóm chủng tộc trong tổng số 32.561 người. Mục tiêu là so sánh xác suất xuất hiện giới tính nữ giữa các nhóm chủng tộc khác nhau, với nhóm “Amer-Indian-Eskimo” được chọn làm nhóm tham chiếu (tỷ lệ rủi ro – risk ratio – bằng 1). Các nhóm còn lại được đánh giá dựa trên tỷ lệ rủi ro tương đối, khoảng tin cậy 95% và kiểm định ý nghĩa thống kê thông qua ba phương pháp: midp.exact, fisher.exact và chi-square.

Cụ thể, nhóm Asian-Pac-Islander có tỷ lệ nữ cao hơn nhóm tham chiếu khoảng 8% (risk ratio ≈ 1.08), tuy nhiên sự khác biệt này không có ý nghĩa thống kê vì khoảng tin cậy chứa giá trị 1 (95% CI: 0.98 – 1.19) và p-value > 0.1. Ngược lại, nhóm Black có tỷ lệ nữ thấp hơn rõ rệt với risk ratio khoảng 0.81, tức thấp hơn gần 19% so với nhóm tham chiếu. Đây là một kết quả có ý nghĩa thống kê cao, vì cả ba kiểm định đều cho p-value < 0.001 và khoảng tin cậy (0.74 – 0.89) không chứa giá trị 1. Nhóm Other có risk ratio gần 1 (≈ 0.97), cho thấy không có sự khác biệt đáng kể so với nhóm tham chiếu (p-value ≈ 0.63).

Đáng chú ý, nhóm White có tỷ lệ nữ cao hơn nhóm tham chiếu khoảng 12% (risk ratio ≈ 1.12), và sự khác biệt này có ý nghĩa thống kê (p-value ≈ 0.007), với khoảng tin cậy 95% là từ 1.02 đến 1.22. Như vậy, trong năm nhóm chủng tộc được so sánh, chỉ có nhóm Black và White cho thấy sự khác biệt giới tính có ý nghĩa thống kê, trong đó nhóm Black ít nữ hơn đáng kể, còn nhóm White có tỷ lệ nữ cao hơn. Các phân tích sử dụng phương pháp ước lượng MLE không điều kiện kết hợp với xấp xỉ chuẩn (Wald) để xác định khoảng tin cậy.

4.1.2 Ratio odd

oddsratio(tab1)
## $data
##                     
##                      Female  Male Total
##   Amer-Indian-Eskimo    119   192   311
##   Asian-Pac-Islander    346   693  1039
##   Black                1555  1569  3124
##   Other                 109   162   271
##   White                8642 19174 27816
##   Total               10771 21790 32561
## 
## $measure
##                     odds ratio with 95% C.I.
##                       estimate     lower     upper
##   Amer-Indian-Eskimo 1.0000000        NA        NA
##   Asian-Pac-Islander 1.2416026 0.9532016 1.6129609
##   Black              0.6257675 0.4915141 0.7936976
##   Other              0.9212766 0.6596053 1.2869642
##   White              1.3758378 1.0903719 1.7290110
## 
## $p.value
##                     two-sided
##                        midp.exact fisher.exact   chi.square
##   Amer-Indian-Eskimo           NA           NA           NA
##   Asian-Pac-Islander 0.1081675333 0.1176692618 0.1061680084
##   Black              0.0001024734 0.0001070805 0.0001072881
##   Other              0.6304160655 0.6705639149 0.6293606615
##   White              0.0074039380 0.0079961760 0.0064338458
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Bảng số liệu trên trình bày phân tích tỷ số odds (odds ratio) giữa giới tính nữ và nam trong các nhóm chủng tộc khác nhau, với nhóm “Amer-Indian-Eskimo” được chọn làm nhóm tham chiếu (odds ratio = 1). Tỷ số odds cho biết xác suất là nữ so với nam trong từng nhóm chủng tộc, và so sánh tương đối với nhóm tham chiếu. Phân tích được thực hiện bằng phương pháp ước lượng trung vị không thiên lệch (median-unbiased) kết hợp với khoảng tin cậy mid-p chính xác.

Kết quả cho thấy, nhóm Asian-Pac-Islander có odds ratio xấp xỉ 1.24, tức là xác suất là nữ cao hơn khoảng 24% so với nhóm tham chiếu. Tuy nhiên, sự khác biệt này không có ý nghĩa thống kê vì khoảng tin cậy 95% (0.95 – 1.61) bao gồm 1 và p-value lớn hơn 0.1. Trong khi đó, nhóm Black có odds ratio khoảng 0.63, nghĩa là tỷ lệ nữ trong nhóm này thấp hơn đáng kể (giảm khoảng 37%) so với nhóm tham chiếu. Sự khác biệt này có ý nghĩa thống kê rõ ràng với p-value < 0.001 và khoảng tin cậy (0.49 – 0.79) không chứa 1.

Nhóm Other có odds ratio gần 1 (≈ 0.92), cho thấy không có sự khác biệt đáng kể về giới tính so với nhóm tham chiếu, và kết quả này cũng không có ý nghĩa thống kê (p ≈ 0.63). Ngược lại, nhóm White có odds ratio khoảng 1.38, tức là khả năng là nữ cao hơn khoảng 38% so với nhóm Amer-Indian-Eskimo, và đây là sự khác biệt có ý nghĩa thống kê (p ≈ 0.007; khoảng tin cậy 95% từ 1.09 đến 1.73).

Tóm lại, trong số các nhóm chủng tộc được phân tích, chỉ có hai nhóm – Black và White – thể hiện sự khác biệt giới tính có ý nghĩa thống kê. Nhóm Black có tỷ lệ nữ thấp hơn đáng kể, trong khi nhóm White có tỷ lệ nữ cao hơn so với nhóm tham chiếu. Các nhóm còn lại không cho thấy sự chênh lệch giới tính đáng tin cậy về mặt thống kê.

PHẦN 5: Phân tích Mối quan hệ giữa Hai biến Định tính (Bivariate Analysis)

Ta chọn cặp biến định tính như sau:

  • Race và Marital.status

Cặp biến Race và Marital.status

Tạo bảng tần suất chéo và tính tỷ lệ

tab22 <- table(data$race, data$marital.status)
tab22
##                     
##                      Divorced Married-AF-spouse Married-civ-spouse
##   Amer-Indian-Eskimo       60                 0                116
##   Asian-Pac-Islander       75                 0                508
##   Black                   485                 1                837
##   Other                    26                 0                105
##   White                  3797                22              13410
##                     
##                      Married-spouse-absent Never-married Separated Widowed
##   Amer-Indian-Eskimo                     9           103        11      12
##   Asian-Pac-Islander                    41           372        19      24
##   Black                                 62          1346       265     128
##   Other                                 15           105        13       7
##   White                                291          8757       717     822
prop2 <- prop.table(tab22, margin = 1) * 100

round(prop2, 2)
##                     
##                      Divorced Married-AF-spouse Married-civ-spouse
##   Amer-Indian-Eskimo    19.29              0.00              37.30
##   Asian-Pac-Islander     7.22              0.00              48.89
##   Black                 15.52              0.03              26.79
##   Other                  9.59              0.00              38.75
##   White                 13.65              0.08              48.21
##                     
##                      Married-spouse-absent Never-married Separated Widowed
##   Amer-Indian-Eskimo                  2.89         33.12      3.54    3.86
##   Asian-Pac-Islander                  3.95         35.80      1.83    2.31
##   Black                               1.98         43.09      8.48    4.10
##   Other                               5.54         38.75      4.80    2.58
##   White                               1.05         31.48      2.58    2.96

Trực quan hóa

df_tab22 <- as.data.frame(tab22)
colnames(df_tab22) <- c("race", "marital.status", "Freq")
ggplot(df_tab22, aes(x = race, y = Freq, fill = marital.status)) +
  geom_bar(stat = "identity", position = "fill") +
  labs(title = "Tỷ lệ thu nhập theo vai trò trong hộ gia đình",
       y = "Tỷ lệ", x = "Mối quan hệ") +
  scale_y_continuous(labels = scales::percent)

Kiểm định Thống kê (Kiểm định Chi-bình phương)

chisq.test(tab22)
## Warning in chisq.test(tab22): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  tab22
## X-squared = 923.81, df = 24, p-value < 2.2e-16
LS0tDQp0aXRsZTogIk5WIDQiDQphdXRob3I6ICJIaWV1IFZvIg0KZGF0ZTogIjIwMjUtMDYtMDkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgKioqUEjhuqZOIDE6IFTDjE0gSEnhu4JVIFbDgCBDSFXhuqhOIELhu4ogROG7riBMSeG7hlUqKioNCg0KIyMgKioxLjEgxJDhu4xDIEThu64gTEnhu4ZVKioNCg0KLSBE4buvIGxp4buHdSBuw6B5IMSRxrDhu6NjIHRyw61jaCB4deG6pXQgdOG7qyBjxqEgc+G7nyBk4buvIGxp4buHdSBj4bunYSBD4bulYyDEkWnhu4F1IHRyYSBkw6JuIHPhu5EgbsSDbSAxOTk0IChLaGFpIHRow6FjIHbDoCB0cuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1LCBTaWxpY29uIEdyYXBoaWNzKS4gQuG7mSBk4buvIGxp4buHdSBuw6B5IMSRxrDhu6NjIHRyw61jaCB4deG6pXQgdOG7qyDEkWnhu4F1IHRyYSBkw6JuIHPhu5EgY+G7p2EgTeG7uSwgZMO5bmcgxJHhu4MgZOG7sSDEkW/DoW4gbGnhu4d1IHRodSBuaOG6rXAgY+G7p2EgbeG7mXQgbmfGsOG7nWkgY8OzIHbGsOG7o3QgbeG7qWMgJDUwSy9uxINtIGhheSBraMO0bmcuDQoNCi0gQmnhur9uIHBo4bulIHRodeG7mWMgKHRhcmdldCk6IGluY29tZSAoPD01MEsgaG/hurdjID41MEspIOKGkiBiaeG6v24gxJHhu4tuaCB0w61uaA0KDQojIyMjICoqMS4xLjEgxJDhu41jIGZpbGUgZOG7ryBsaeG7h3UgZ+G7kWMqKg0KDQpgYGB7cn0NCmxpYnJhcnkoeGxzeCkNCmRhdGEgPC0gcmVhZC54bHN4KCJDOi9Vc2Vycy9IUC9Eb3dubG9hZHMvYWR1bHRfY2F0ZWdvcmljYWxfLnhsc3giLCBzaGVldEluZGV4ID0gMSwgaGVhZGVyID0gVCkNCg0KYGBgDQoNCi0gKkPhuqV1IHRyw7pjIGLhu5kgZOG7ryBsaeG7h3UqDQoNCmBgYHtyfQ0Kc3RyKGRhdGEpDQpgYGANCg0KLSBOaMOzbSBiaeG6v24gxJHhu4tuaCB0w61uaCBiYW8gZ+G7k20gY8OhYyBiaeG6v24gZOG6oW5nIGNodeG7l2kgKGNoYXJhY3RlciksIHRo4buDIGhp4buHbiBwaMOibiBsb+G6oWkgaG/hurdjIHRodeG7mWMgdMOtbmgga2jDtG5nIG1hbmcgdMOtbmggdGjhu6kgdOG7sSBz4buRIGjhu41jLCBjaOG6s25nIGjhuqFuIG5oxrA6IHdvcmtjbGFzcyAobG/huqFpIGjDrG5oIGPDtG5nIHZp4buHYyBuaMawIHTGsCBuaMOibiwgY2jDrW5oIHBo4bunLCB04buxIGRvYW5oLi4uKSwgZWR1Y2F0aW9uICh0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gbmjGsCBCYWNoZWxvcnMsIEhTLWdyYWQsIFNvbWUtY29sbGVnZS4uLiksIG1hcml0YWwuc3RhdHVzICh0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gbmjGsCBOZXZlci1tYXJyaWVkLCBNYXJyaWVkLCBEaXZvcmNlZC4uLiksIG9jY3VwYXRpb24gKG5nw6BuaCBuZ2jhu4EpLCByZWxhdGlvbnNoaXAgKHZhaSB0csOyIHRyb25nIGdpYSDEkcOsbmggbmjGsCBIdXNiYW5kLCBOb3QtaW4tZmFtaWx54oCmKSwgcmFjZSAoY2jhu6duZyB04buZYyBuaMawIFdoaXRlLCBCbGFja+KApiksIHNleCAoZ2nhu5tpIHTDrW5oKSwgbmF0aXZlLmNvdW50cnkgKHF14buRYyB04buLY2gpLCB2w6AgaW5jb21lICht4bupYyB0aHUgbmjhuq1wIGjDoG5nIG7Eg20sIHBow6JuIGxv4bqhaSB0aMOgbmggPD01MEsgdsOgID41MEssIGPFqW5nIGNow61uaCBsw6AgYmnhur9uIG3hu6VjIHRpw6p1IHRyb25nIGLDoGkgdG/DoW4gcGjDom4gbG/huqFpKS4NCg0KYGBge3J9DQpoZWFkKGRhdGEsNCkNCmBgYA0KDQotIELhu5FuIHF1YW4gc8OhdCDEkeG6p3UgdGnDqm4gdHJvbmcgYuG7mSBk4buvIGxp4buHdSDEkeG7gXUgbMOgIG5hbSBnaeG7m2kgY8OzIHRodSBuaOG6rXAgZMaw4bubaSA1MC4wMDAgxJHDtC9uxINtLCB24bubaSDEkeG7mSB0deG7lWkgZGFvIMSR4buZbmcgdOG7qyA1NCDEkeG6v24gOTAgdHXhu5VpLiBDw6FjIGPDoSBuaMOibiBuw6B5IGPDsyB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4ga2jDoWMgbmhhdSwgdOG7qyBs4bubcCA34oCTOCDEkeG6v24gbeG7mXQgcGjhuqduIGNoxrDGoW5nIHRyw6xuaCDEkeG6oWkgaOG7jWMsIHbDoCBwaOG6p24gbOG7m24gdGh14buZYyBjaOG7p25nIHThu5ljIFdoaXRlLiBI4buNIGzDoG0gdmnhu4djIGNobyBjaMOtbmggcGjhu6cgaG/hurdjIHTGsCBuaMOibiB2w6AgY8OzIHRyaW5oIMSR4buZIGjhu41jIHbhuqVuIGtow6EgY2FvLiBU4bqldCBj4bqjIMSR4buBdSBjxrAgdHLDuiB04bqhaSBIb2EgS+G7sy4NCg0KIyMjIyAqMS4xLjIgTOG7sWEgY2jhu41uIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgqDQoNCkdp4bqjaSB0aMOtY2g6DQoNCi0gYygiIik6IHThuqFvIHZlY3RvDQotIGRsdHQgPC0gZGF0YVssIGRsZHRdOiBs4bqleSB0cm9uZyBi4buZIGThu68gbGnhu4d1IGRhdGEgY8OhYyBj4buZdCB0cm9uZyBkbGR0IHbhu6thIHThuqFvIHJhIChjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oKSwgdsOgIGzhuqV5IHThuqV0IGPhuqMgY8OhYyBow6BuZyAoZnVsbCBxdWFuIHPDoXQpDQoNCmBgYHtyfQ0KIyBDaOG7jW4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0KZGxkdCA8LSBjKCJ3b3JrY2xhc3MiLCAiZWR1Y2F0aW9uIiwgIm1hcml0YWwuc3RhdHVzIiwgDQogICAgICAgICAgICAgICAgICAgICAgIm9jY3VwYXRpb24iLCAicmVsYXRpb25zaGlwIiwgInJhY2UiLCANCiAgICAgICAgICAgICAgICAgICAgICAic2V4IiwgIm5hdGl2ZS5jb3VudHJ5IiwgImluY29tZSIpDQpgYGANCg0KLSBCYW4gxJHhuqd1LCBraGkga2nhu4NtIHRyYSBraeG7g3UgZOG7ryBsaeG7h3UgY+G7p2EgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBuaMawIG1hcml0YWwuc3RhdHVzLCByZWxhdGlvbnNoaXAsIHJhY2UsIHNleCwgdsOgIGVkdWNhdGlvbiB0cm9uZyBkYW5oIHPDoWNoIHFkdCwga+G6v3QgcXXhuqMgY2hvIHRo4bqleSB04bqldCBj4bqjIMSR4buBdSBjaMawYSBwaOG6o2kga2nhu4N1IGZhY3RvciBtw6AgduG6q24gxJFhbmcg4bufIGThuqFuZyBjaHXhu5dpIGvDvSB04buxIChjaGFyYWN0ZXIpLiDEkGnhu4F1IG7DoHkga2jDtG5nIHBow7kgaOG7o3AgbuG6v3UgdGEgbXXhu5FuIHRo4buxYyBoaeG7h24gY8OhYyBwaMOibiB0w61jaCB0aOG7kW5nIGvDqiDEkeG7i25oIHTDrW5oIGhv4bq3YyB0cuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1IHBow6JuIGxv4bqhaSwgdsOsIGtp4buDdSBmYWN0b3IgbMOgIGPDoWNoIFIgeOG7rSBsw70gaGnhu4d1IHF14bqjIGPDoWMgYmnhur9uIHBow6JuIGxv4bqhaS4NCg0KYGBge3J9DQpmb3IgKGNvbCBpbiBkbGR0KSB7DQogIGlmICghaXMuZmFjdG9yKGRhdGFbW2NvbF1dKSkgew0KICAgIGRhdGFbW2NvbF1dIDwtIGFzLmZhY3RvcihkYXRhW1tjb2xdXSkNCiAgfQ0KfQ0Kc2FwcGx5KGRhdGFbZGxkdF0sIGlzLmZhY3RvcikNCmBgYA0KDQotU2F1IMSRw7MsIGLhurFuZyBjw6FjaCBkw7luZyB2w7JuZyBs4bq3cCBmb3IsIHThu6tuZyBiaeG6v24gdHJvbmcgZGFuaCBzw6FjaCBxZHQgxJHGsOG7o2Mga2nhu4NtIHRyYSB2w6AgY2h1eeG7g24gxJHhu5VpIHNhbmcga2nhu4N1IGZhY3RvciBu4bq/dSBjaMawYSBwaOG6o2kuIEtoaSBraeG7g20gdHJhIGzhuqFpIGLhurFuZyBzYXBwbHksIGvhur90IHF14bqjIGNobyB0aOG6pXkgdOG6pXQgY+G6oyBjw6FjIGJp4bq/biB0cm9uZyBxZHQgxJHhu4F1IMSRw6MgxJHGsOG7o2MgY2h1eeG7g24gdGjDoG5oIGtp4buDdSBmYWN0b3IuIFZp4buHYyBjaHV54buDbiDEkeG7lWkgbsOgeSBnacO6cCBjaHXhuqluIGjDs2EgZOG7ryBsaeG7h3UsIHTEg25nIGhp4buHdSBzdeG6pXQgeOG7rSBsw70gdsOgIMSR4bqjbSBi4bqjbyB0w61uaCB0xrDGoW5nIHRow61jaCB24bubaSBjw6FjIGjDoG0gcGjDom4gdMOtY2ggdGjhu5FuZyBrw6ogdHJvbmcgUiBuaMawIHRhYmxlKCksIHByb3AudGFibGUoKSwgZ2xtKCksIGhheSBjw6FjIGJp4buDdSDEkeG7kyBnZ3Bsb3QyLiDEkMOieSBsw6AgYsaw4bubYyB0aeG7gW4geOG7rSBsw70gcXVhbiB0cuG7jW5nIHRyxrDhu5tjIGtoaSB0aOG7sWMgaGnhu4duIGPDoWMgcGjDom4gdMOtY2ggxJHhu4tuaCB0w61uaCB0cm9uZyBSLg0KDQojIyAqKjEuMi4gVOG7lE5HIFFVQU4gVuG7gCBE4buuIExJ4buGVSoqDQoNCiMjIyMgKjEuMi4xIE7hu5lpIGR1bmcgZOG7ryBsaeG7h3UqDQoNCi0gQuG7mSBk4buvIGxp4buHdSDEkWFuZyBjw7MgZ+G7k20gOSBiaeG6v24gxJHhu4tuaCB0w61uaCAoY2F0ZWdvcmljYWwpIHbDoCAzOC44NDIgZMOybmcgZOG7ryBsaeG7h3UuDQoNCiMjIyMgKjEuMi4yIERhbmggc8OhY2ggY8OhYyBiaeG6v24gdsOgIG3DtCB04bqjKg0KDQoqQ+G6pXUgdHLDumMgYuG7mSBk4buvIGxp4buHdSoNCg0KfCBUw6puIGPhu5l0IGfhu5FjICAgICAgfCBNw7QgdOG6oyAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgd29ya2NsYXNzICAgICAgfCBMb+G6oWkgY8O0bmcgdmnhu4djICAgICAgLSDEkeG7i25oIHTDrW5oIGRhbmggbeG7pWMgKGNhdGVnb3JpY2FsKSAgICAgICAgICAgfA0KfCBlZHVjYXRpb24gICAgICB8IFRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiAgICAtIMSR4buLbmggdMOtbmggZGFuaCBt4bulYyAoY2F0ZWdvcmljYWwpICAgICAgICAgICB8DQp8IG1hcml0YWwtc3RhdHVzIHwgVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIC0gxJHhu4tuaCB0w61uaCBkYW5oIG3hu6VjIChjYXRlZ29yaWNhbCkgICAgICAgICAgIHwNCnwgb2NjdXBhdGlvbiAgICAgfCBOZ2jhu4EgbmdoaeG7h3AgICAgICAgICAtIMSR4buLbmggdMOtbmggZGFuaCBt4bulYyAoY2F0ZWdvcmljYWwpICAgICAgICAgICB8DQp8IHJlbGF0aW9uc2hpcCAgIHwgUXVhbiBo4buHIHRyb25nIGjhu5kgZ2lhIMSRw6xuaCAtIMSR4buLbmggdMOtbmggZGFuaCBt4bulYyAoY2F0ZWdvcmljYWwpICAgICB8DQp8IHJhY2UgICAgICAgICAgIHwgQ2jhu6duZyB04buZYyAgLSAgxJHhu4tuaCB0w61uaCBkYW5oIG3hu6VjIChjYXRlZ29yaWNhbCkgICAgICAgICAgICAgICAgICAgfA0KfCBzZXggICAgICAgICB8IEdp4bubaSB0w61uaCAgLSDEkeG7i25oIHTDrW5oIGRhbmggbeG7pWMgKGNhdGVnb3JpY2FsKSAgICAgICAgICAgICAgICAgICAgfA0KfCBuYXRpdmUtY291bnRyeSB8IFF14buRYyBnaWEgICAtIMSR4buLbmggdMOtbmggZGFuaCBt4bulYyAoY2F0ZWdvcmljYWwpICAgICAgICAgICAgICAgICAgICB8DQp8IGluY29tZSAgICAgICAgIHwgTeG7qWMgdGh1IG5o4bqtcCAoPD01MEsgaG/hurdjID41MEspIC0gTmjhu4sgcGjDom4gICAgICAgICAgICAgICAgICAgICAgICB8IA0KDQojIyMjICoxLjIuMyBLaeG7g20gdHJhIGThu68gbGnhu4d1Kg0KDQpLaeG7g20gdHJhIHPhu5EgbMaw4bujbmcgTkEgdHJvbmcgY+G7mXQgxJHhu4tuaCB0w61uaCoNCg0KR2nhuqNpIHRow61jaDoNCg0Kc2FwcGx5KGRhdCwgLi4uKTogw6FwIGThu6VuZyBow6BtIGNobyB04burbmcgY+G7mXQgdHJvbmcgZOG7ryBsaeG7h3UgKmRhdCouDQoNCnN1bShpcy5uYSh4KSk6IMSR4bq/bSBz4buRIGzGsOG7o25nIE5BIHRyb25nIHThu6tuZyBj4buZdC4NCg0KYGBge3J9DQojIEtp4buDbSB0cmEgc+G7kSBsxrDhu6NuZyBOQSB0cm9uZyBt4buXaSBj4buZdCDEkeG7i25oIHTDrW5oDQpuYV9jb3VudHMgPC0gc2FwcGx5KGRhdGEsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpDQpuYV9jb3VudHMNCmBgYA0KDQoqTmjhuq1uIHjDqXQqIA0KDQotIEvhur90IHF14bqjIHRodSDEkcaw4bujYyBjaG8gdGjhuqV5IHLhurFuZyB04bqldCBj4bqjIGPDoWMgY+G7mXQgxJHhu4tuaCB0w61uaCDEkeG7gXUga2jDtG5nIGPDsyBnacOhIHRy4buLIHRoaeG6v3UgKE5BKSB2w6wgc+G7kSBsxrDhu6NuZyBOQSB0cm9uZyBjw6FjIGPhu5l0IMSR4buBdSBoaeG7g24gdGjhu4sgbMOgIDANCg0KIyAqKipQSOG6pk4gMjogUGjDom4gdMOtY2ggTcO0IHThuqMgTeG7mXQgYmnhur9uIMSQ4buLbmggdMOtbmggKFVuaXZhcmlhdGUgRGVzY3JpcHRpdmUgQW5hbHlzaXMpKioqDQoNCiMjICoqMi4xIEJp4bq/biBFRFVDQVRJT04qKg0KDQpgYGB7cn0NCnFxIDwtICBkYXRhWyxkbGR0XQ0KdGFibGUocXEkZWR1Y2F0aW9uKQ0KYGBgDQoNCg0KYGBge3J9DQpxNSA8LSB0YWJsZShxcSRlZHVjYXRpb24pL3N1bShucm93KHFxKSkNCnRhYmxlKHFxJGVkdWNhdGlvbikvc3VtKG5yb3cocXEpKQ0KYGBgDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIHThu7cgbOG7hyBiaeG6v24gZWR1Y2F0aW9uIGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buRIGtow6EgcsO1IHLDoG5nIGdp4buvYSBjw6FjIGLhuq1jIGjhu41jLiBOaMOzbSBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IGzDoCBIUy1ncmFkICh04buRdCBuZ2hp4buHcCB0cnVuZyBo4buNYyBwaOG7lSB0aMO0bmcpIHbhu5tpIGtob+G6o25nIDMyLjI1JSwgdGnhur9wIHRoZW8gbMOgIFNvbWUtY29sbGVnZSAoxJHDoyBo4buNYyDEkeG6oWkgaOG7jWMgbmjGsG5nIGNoxrBhIHThu5F0IG5naGnhu4dwKSBjaGnhur9tIDIyLjM5JSwgdsOgIEJhY2hlbG9ycyAodOG7kXQgbmdoaeG7h3AgxJHhuqFpIGjhu41jKSBjaGnhur9tIDE2LjQ1JS4NCg0KQ8OhYyBuaMOzbSBjw7MgdOG7tyBs4buHIHRo4bqlcCBoxqFuIGfhu5NtIE1hc3RlcnMgKGNhbyBo4buNYykgY2hp4bq/bSA1LjI5JSwgQXNzb2Mtdm9jIHbDoCBBc3NvYy1hY2RtICh0csOsbmggxJHhu5kgY2FvIMSR4bqzbmcgbmdo4buBIGhv4bq3YyBo4buNYyB0aHXhuq10KSBs4bqnbiBsxrDhu6N0IGNoaeG6v20gNC4yNCUgdsOgIDMuMjglLiBDw6FjIGLhuq1jIGjhu41jIHRo4bqlcCBuaMawIDl0aCwgMTB0aCwgMTF0aCwgdsOgIDd0aC04dGggxJHhu4F1IGPDsyB04bu3IGzhu4cgZMaw4bubaSA0JS4gxJDhurdjIGJp4buHdCwgY8OhYyBuaMOzbSBuaMawIFByZXNjaG9vbCAobeG6q3UgZ2nDoW8g4oCTIDAuMTYlKSB2w6AgMXN0LTR0aCAobOG7m3AgMSDEkeG6v24gbOG7m3AgNCDigJMgMC41MiUpIGNoaeG6v20gdOG7tyBs4buHIHLhuqV0IG5o4buPLCBn4bqnbiBuaMawIGtow7RuZyDEkcOhbmcga+G7gy4NCg0KVMOzbSBs4bqhaSwgcGjhuqduIGzhu5tuIG5nxrDhu51pIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgY8OzIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiB04burIHRydW5nIGjhu41jIHRy4bufIGzDqm4sIHRyb25nIMSRw7MgZ+G6p24gMy80IMSRw6MgaG/DoG4gdOG6pXQgw610IG5o4bqldCBjaMawxqFuZyB0csOsbmggcGjhu5UgdGjDtG5nIGhv4bq3YyB04burbmcgaOG7jWMgxJHhuqFpIGjhu41jLiBLaGkgbcO0IGjDrG5oIGjDs2EgYmnhur9uIGVkdWNhdGlvbiwgY8OzIHRo4buDIGPDom4gbmjhuq9jIGfhu5lwIGPDoWMgbmjDs20gY8OzIHThu7cgbOG7hyBy4bqldCB0aOG6pXAgxJHhu4MgZ2nhuqNtIG5oaeG7hXUgdsOgIHTEg25nIGhp4buHdSBxdeG6oyBk4buxIMSRb8Ohbi4NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QocXEsIGFlcyh4ID0gZWR1Y2F0aW9uKSkgKw0KICBnZW9tX2JhcihmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoeCA9ICJUcsOsbmggxJHhu5kgaOG7jWMgduG6pW4gIiwgeSA9ICJU4bqnbiBzdeG6pXQiLCB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4iKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsNCiAgY29vcmRfZmxpcCgpDQpgYGANCg0KQmnhu4N1IMSR4buTIHThuqduIHN14bqldCBnacOhbyBk4bulYyBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gdHJvbmcgYuG7mSBk4buvIGxp4buHdSBjw7MgeHUgaMaw4bubbmcgdOG6rXAgdHJ1bmcgbeG6oW5oIHbDoG8gbeG7mXQgc+G7kSBi4bqtYyBwaOG7lSBiaeG6v24uIFRyb25nIMSRw7MsIEhTLWdyYWQgKHThu5F0IG5naGnhu4dwIHRydW5nIGjhu41jKSBsw6AgbmjDs20gY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCB24bubaSBoxqFuIDEwLjAwMCBuZ8aw4budaSwgdGhlbyBzYXUgbMOgIFNvbWUtY29sbGVnZSAoxJHDoyBo4buNYyDEkeG6oWkgaOG7jWMgbmjGsG5nIGNoxrBhIHThu5F0IG5naGnhu4dwKSB24bubaSBraG/huqNuZyA3LjAwMCBuZ8aw4budaSwgdsOgIEJhY2hlbG9ycyAodOG7kXQgbmdoaeG7h3AgxJHhuqFpIGjhu41jKSB24bubaSBraG/huqNuZyA1LjAwMCBuZ8aw4budaS4NCg0KQ8OhYyBi4bqtYyBo4buNYyBzYXUgxJHhuqFpIGjhu41jIG5oxrAgTWFzdGVycywgRG9jdG9yYXRlLCB2w6AgUHJvZi1zY2hvb2wgY2hp4bq/bSB04bu3IGzhu4cgbmjhu48gaMahbiDEkcOhbmcga+G7gy4gTmdvw6BpIHJhLCBt4buZdCBz4buRIGLhuq1jIGjhu41jIGTGsOG7m2kgdHJ1bmcgaOG7jWMgbmjGsCA5dGgsIDd0aC04dGgsIGhheSA1dGgtNnRoIGPFqW5nIHh14bqldCBoaeG7h24gbmjGsG5nIHPhu5EgbMaw4bujbmcgcuG6pXQgdGjhuqVwLiBOaMOzbSBjw7MgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIHRo4bqlcCBuaOG6pXQg4oCTIFByZXNjaG9vbCDigJMgZ+G6p24gbmjGsCBraMO0bmcgxJHDoW5nIGvhu4MuDQoNClBow6JuIGLhu5EgbsOgeSBwaOG6o24gw6FuaCB4dSBoxrDhu5tuZyBo4buNYyB24bqlbiBwaOG7lSBiaeG6v24gdHJvbmcgZMOibiBz4buRIGxhbyDEkeG7mW5nIE3hu7kgdGjhu51pIMSRaeG7g20ga2jhuqNvIHPDoXQsIHbhu5tpIHBo4bqnbiBs4bubbiBkw6JuIGPGsCDEkeG6oXQgdHLDrG5oIMSR4buZIHThu6sgdHJ1bmcgaOG7jWMgdHLhu58gbMOqbi4gS2hpIMSRxrBhIGJp4bq/biBlZHVjYXRpb24gdsOgbyBwaMOibiB0w61jaCBob+G6t2MgbcO0IGjDrG5oIGjDs2EsIGPDsyB0aOG7gyBjw6JuIG5o4bqvYyBn4buZcCBjw6FjIG5ow7NtIGPDsyB04bqnbiBzdeG6pXQgcuG6pXQgdGjhuqVwIMSR4buDIMSR4bqjbSBi4bqjbyB0w61uaCDhu5VuIMSR4buLbmggdsOgIGdp4bqjbSBuaGnhu4V1IHRyb25nIG3DtCBow6xuaC4NCg0KDQojIyAqKjIuMiBCaeG6v24gUkVMQVRJT05TSElQKioNCg0KYGBge3J9DQpxcSA8LSAgZGF0YVssZGxkdF0NCnRhYmxlKHFxJHJlbGF0aW9uc2hpcCkNCnEyIDwtIHRhYmxlKHFxJHJlbGF0aW9uc2hpcCkvc3VtKG5yb3cocXEpKQ0KdGFibGUocXEkcmVsYXRpb25zaGlwKS9zdW0obnJvdyhxcSkpDQpgYGANCg0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCB04bu3IGzhu4cgY+G7p2EgYmnhur9uIHJlbGF0aW9uc2hpcCBjaG8gdGjhuqV5IG5ow7NtIEh1c2JhbmQgKG5nxrDhu51pIGNo4buTbmcgdHJvbmcgaOG7mSBnaWEgxJHDrG5oKSBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0LCB24bubaSBraG/huqNuZyA0MC41MiUgdOG7lW5nIHPhu5EgcXVhbiBzw6F0LiBUaeG6v3AgdGhlbyBsw6AgbmjDs20gTm90LWluLWZhbWlseSAoa2jDtG5nIHRodeG7mWMgZ2lhIMSRw6xuaCBo4bqhdCBuaMOibikgY2hp4bq/bSAyNS41MSUsIHbDoCBuaMOzbSBPd24tY2hpbGQgKGNvbiBydeG7mXQgaG/hurdjIGNvbiBudcO0aSB0cm9uZyBo4buZIGdpYSDEkcOsbmgpIGNoaeG6v20ga2hv4bqjbmcgMTUuNTYlLiBDw6FjIG5ow7NtIGPDsm4gbOG6oWkgY8OzIHThu7cgbOG7hyB0aOG6pXAgaMahbjogVW5tYXJyaWVkIChjaMawYSBr4bq/dCBow7RuIGhv4bq3YyDEkeG7mWMgdGjDom4pIGNoaeG6v20gMTAuNTglLCBXaWZlIChuZ8aw4budaSB24bujKSBjaGnhur9tIDQuODIlLCB2w6AgdGjhuqVwIG5o4bqldCBsw6AgbmjDs20gT3RoZXItcmVsYXRpdmUgKHRow6BuaCB2acOqbiBnaWEgxJHDrG5oIGtow6FjIG5oxrAgYW5oIGNo4buLIGVtLCDDtG5nIGLDoC4uLikgduG7m2kgY2jhu4kgMy4wMSUuIFBow6JuIGLhu5EgbsOgeSBwaOG6o24gw6FuaCByw7UgdmFpIHRyw7IgcGjhu5UgYmnhur9uIGPhu6dhIG5nxrDhu51pIGNo4buTbmcgdHJvbmcgaOG7mSBnaWEgxJHDrG5oIHRo4budaSDEkWnhu4NtIGto4bqjbyBzw6F0LCDEkeG7k25nIHRo4budaSBjaG8gdGjhuqV5IHThu7cgbOG7hyBu4buvIGdp4bubaSBnaeG7ryB2YWkgdHLDsiAiduG7oyIgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4MsIGPDsyB0aOG7gyBkbyDEkeG7i25oIG5naMSpYSBwaMOibiBsb+G6oWkgdHJvbmcgZOG7ryBsaeG7h3UgaG/hurdjIHh1IGjGsOG7m25nIG5ow6JuIGto4bqpdSBo4buNYyDEkeG6t2MgdGjDuS4NCg0KYGBge3J9DQpnZ3Bsb3QocXEsIGFlcyh4ID0gcmVsYXRpb25zaGlwKSkgKw0KICBnZW9tX2JhcihmaWxsID0gImRhcmtyZWQiLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh4ID0gIk3hu5FpIHF1YW4gaOG7hyIsIHkgPSAiVOG6p24gc+G7kSIsIHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBz4buRIGPhu6dhIGJp4bq/biByZWxhdGlvbnNoaXAiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCkJp4buDdSDEkeG7kyB04bqnbiBz4buRIGPhu6dhIGJp4bq/biByZWxhdGlvbnNoaXAgdGjhu4MgaGnhu4duIHLDtSBz4buxIHBow6JuIGLhu5EgdmFpIHRyw7IgdHJvbmcgaOG7mSBnaWEgxJHDrG5oIGPhu6dhIGPDoWMgY8OhIG5ow6JuIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuIE5ow7NtIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgbMOgIEh1c2JhbmQgKG5nxrDhu51pIGNo4buTbmcpLCB24bubaSBoxqFuIDEyLjAwMCBxdWFuIHPDoXQsIGNobyB0aOG6pXkgc+G7kSBsxrDhu6NuZyBs4bubbiBuZ8aw4budaSBsYW8gxJHhu5luZyB0cm9uZyBt4bqrdSBraOG6o28gc8OhdCDEkcOzbmcgdmFpIHRyw7IgdHLhu6UgY+G7mXQgbmFtIHRyb25nIGdpYSDEkcOsbmguIFRoZW8gc2F1IGzDoCBuaMOzbSBOb3QtaW4tZmFtaWx5IChraMO0bmcgdGh14buZYyBnaWEgxJHDrG5oIGjhuqF0IG5ow6JuKSwgduG7m2kgZ+G6p24gOS4wMDAgdHLGsOG7nW5nIGjhu6NwIOKAkyDEkcOieSBjw7MgdGjhu4MgbMOgIG5o4buvbmcgbmfGsOG7nWkgc+G7kW5nIMSR4buZYyB0aMOibiwg4bufIHRy4buNIGhv4bq3YyBz4buRbmcgbmdvw6BpIGjhu5kgZ2lhIMSRw6xuaCB0cnV54buBbiB0aOG7kW5nLg0KDQpDw6FjIG5ow7NtIE93bi1jaGlsZCAoY29uIHJ14buZdCBob+G6t2MgY29uIG51w7RpKSB2w6AgVW5tYXJyaWVkIChjaMawYSBr4bq/dCBow7RuKSBjaGnhur9tIHThu7cgbOG7hyB0cnVuZyBiw6xuaCwgbOG6p24gbMaw4bujdCBraG/huqNuZyA1LjAwMCB2w6AgNC4wMDAgcXVhbiBzw6F0LiBOZ8aw4bujYyBs4bqhaSwgbmjDs20gV2lmZSAobmfGsOG7nWkgduG7oykgY8OzIHPhu5EgbMaw4bujbmcgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgIkh1c2JhbmQiLCB2w6AgbmjDs20gT3RoZXItcmVsYXRpdmUgKHRow6BuaCB2acOqbiBnaWEgxJHDrG5oIGtow6FjKSBsw6AgbmjDs20gw610IHh14bqldCBoaeG7h24gbmjhuqV0Lg0KDQpQaMOibiBi4buRIG7DoHkgY2hvIHRo4bqleSBt4buZdCDEkeG6t2MgxJFp4buDbSDEkcOhbmcgY2jDuiDDvSB24buBIGPhuqV1IHRyw7pjIGjhu5kgZ2lhIMSRw6xuaCB0cm9uZyBk4buvIGxp4buHdSDigJMgdHJvbmcgxJHDsyBuYW0gZ2nhu5tpIHRyb25nIHZhaSB0csOyICJjaOG7k25nIiDEkcaw4bujYyBnaGkgbmjhuq1uIG5oaeG7gXUgaMahbiBzbyB24bubaSBu4buvIGdp4bubaSB0cm9uZyB2YWkgdHLDsiAiduG7oyIsIHbDoCBjw7MgbeG7mXQgdOG7tyBs4buHIGzhu5tuIGPDoSBuaMOibiBraMO0bmcgc+G7kW5nIHRyb25nIGjhu5kgZ2lhIMSRw6xuaCB0cnV54buBbiB0aOG7kW5nLiDEkMOieSBsw6AgY8ahIHPhu58gcXVhbiB0cuG7jW5nIMSR4buDIHBow6JuIHTDrWNoIHPDonUgaMahbiB24buBIG5ow6JuIGto4bqpdSBo4buNYyB2w6AgeMOieSBk4buxbmcgY8OhYyBtw7QgaMOsbmggbGnDqm4gcXVhbiDEkeG6v24gdGh1IG5o4bqtcCwgbmdo4buBIG5naGnhu4dwIGhv4bq3YyBj4bqldSB0csO6YyBo4buZIGdpYSDEkcOsbmguDQoNCiMjICoqMi4zIEJp4bq/biBHRU5ERVIqKg0KDQpgYGB7cn0NCnFxIDwtICBkYXRhWyxkbGR0XQ0KdGFibGUocXEkc2V4KQ0KYGBgDQoNCmBgYHtyfQ0KcTQgPC0gdGFibGUocXEkc2V4KS9zdW0obnJvdyhxcSkpDQp0YWJsZShxcSRzZXgpL3N1bShucm93KHFxKSkNCmBgYA0KDQoNClBow6JuIHTDrWNoIGJp4bq/biBzZXggY2hvIHRo4bqleSBz4buxIGNow6puaCBs4buHY2ggxJHDoW5nIGvhu4MgZ2nhu69hIGhhaSBnaeG7m2kgdMOtbmggdHJvbmcgYuG7mSBk4buvIGxp4buHdS4gQ+G7pSB0aOG7gywgbmFtIGdp4bubaSBjaGnhur9tIGtob+G6o25nIDY2LjkyJSwgdHJvbmcga2hpIG7hu68gZ2nhu5tpIGNo4buJIGNoaeG6v20ga2hv4bqjbmcgMzMuMDglIHThu5VuZyBz4buRIHF1YW4gc8OhdC4gVOG7tyBs4buHIG7DoHkgY2hvIHRo4bqleSBuYW0gZ2nhu5tpIGNoaeG6v20gxrB1IHRo4bq/IHLDtSBy4buHdCB0cm9uZyB04bqtcCBk4buvIGxp4buHdSwgZ+G6p24gZ+G6pXAgxJHDtGkgc28gduG7m2kgbuG7ryBnaeG7m2kuIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgcGjhuqNuIMOhbmggxJHhurdjIMSRaeG7g20gY+G7p2EgbeG6q3UgxJFp4buBdSB0cmEgZMOibiBz4buRIHThuqFpIHRo4budaSDEkWnhu4NtIHRodSB0aOG6rXAgZOG7ryBsaeG7h3UgaG/hurdjIGPDsyB0aOG7gyBkbyBjw6FjaCBjaOG7jW4gbeG6q3UgbmdoacOqbmcgduG7gSBuaMOzbSBsYW8gxJHhu5luZyBuYW0uIFPhu7EgbeG6pXQgY8OibiDEkeG7kWkgbsOgeSBjxaluZyBsw6AgeeG6v3UgdOG7kSBj4bqnbiBsxrB1IMO9IHRyb25nIGPDoWMgcGjDom4gdMOtY2ggdGnhur9wIHRoZW8gxJHhu4MgdHLDoW5oIHNhaSBs4buHY2ggdHJvbmcgxJHDoW5oIGdpw6EgdsOgIG3DtCBow6xuaCBow7NhLg0KDQpgYGB7cn0NCnE0X2RmIDwtIGFzLmRhdGEuZnJhbWUocTQpDQpuYW1lcyhxNF9kZikgPC0gYygic2V4IiwgIlRhbnN1YXQiKQ0KZ2dwbG90KHE0X2RmLCBhZXMoeCA9IHNleCwgeSA9IFRhbnN1YXQsIGZpbGwgPSBzZXgpKSArDQogIGdlb21fY29sKHdpZHRoID0gMC42KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChUYW5zdWF0LCAzKSksIHZqdXN0ID0gLTAuMiwgc2l6ZSA9IDUpICsgIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArICANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiRmVtYWxlIiA9ICJsaWdodGJsdWUiLCAiTWFsZSIgPSAibGlnaHR5ZWxsb3ciKSkgKyAgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHThu7cgbOG7hyBnaeG7m2kgdMOtbmggIiwNCiAgICB4ID0gIkdp4bubaSB0w61uaCIsDQogICAgeSA9ICJU4bqnbiBzdeG6pXQgKCUpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkNCmBgYA0KDQojIyAqKjIuNCBCaeG6v24gTUFSSVRBTC5TVEFUVVMqKg0KDQpgYGB7cn0NCnFxIDwtICBkYXRhWyxkbGR0XQ0KdGFibGUocXEkbWFyaXRhbC5zdGF0dXMpDQpgYGANCg0KVmnhu4djIHThuqFvIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biBtYXJpdGFsLnN0YXR1cyBi4bqxbmcgbOG7h25oIHRhYmxlKHFxJG1hcml0YWwuc3RhdHVzKSBnacO6cCBuaGFuaCBjaMOzbmcgdGjhu5FuZyBrw6ogc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgY2hvIHThu6tuZyBuaMOzbSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdHJvbmcgYuG7mSBk4buvIGxp4buHdS4gS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBwaOG6p24gbOG7m24gY8OhIG5ow6JuIHRodeG7mWMgbmjDs20gIk1hcnJpZWQtY2l2LXNwb3VzZSIgKDE0Ljk3NiBuZ8aw4budaSkgdsOgICJOZXZlci1tYXJyaWVkIiAoMTAuNjgzIG5nxrDhu51pKSwgdHJvbmcga2hpIGPDoWMgbmjDs20gbmjGsCAiTWFycmllZC1BRi1zcG91c2UiICgyMyBuZ8aw4budaSkgdsOgICJNYXJyaWVkLXNwb3VzZS1hYnNlbnQiICg0MTggbmfGsOG7nWkpIGPDsyBz4buRIGzGsOG7o25nIHLhuqV0IMOtdC4gxJDDonkgbMOgIGPDoWNoIMSRxqFuIGdp4bqjbiBuaMawbmcgaGnhu4d1IHF14bqjIMSR4buDIGPDsyBjw6FpIG5ow6xuIGJhbiDEkeG6p3UgduG7gSBwaMOibiBi4buRIGPhu6dhIG3hu5l0IGJp4bq/biDEkeG7i25oIHTDrW5oLg0KDQpgYGB7cn0NCnExIDwtIHRhYmxlKHFxJG1hcml0YWwuc3RhdHVzKS9zdW0obnJvdyhxcSkpDQp0YWJsZShxcSRtYXJpdGFsLnN0YXR1cykvc3VtKG5yb3cocXEpKQ0KYGBgDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIHThu7cgbOG7hyBjw6FjIG5ow7NtIHRyb25nIGJp4bq/biBtYXJpdGFsLnN0YXR1cyBjaG8gdGjhuqV5IHLhurFuZyBwaOG6p24gbOG7m24gY8OhIG5ow6JuIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgdGh14buZYyBuaMOzbSDEkcOjIGvhur90IGjDtG4gduG7m2kgduG7oy9jaOG7k25nIMSRYW5nIHPhu5FuZyBjw7luZyAoTWFycmllZC1jaXYtc3BvdXNlKSwgY2hp4bq/bSBraG/huqNuZyA0NS45OSUuIE5ow7NtIGNoxrBhIHThu6tuZyBr4bq/dCBow7RuIChOZXZlci1tYXJyaWVkKSBjxaluZyBjaGnhur9tIHThu7cgbOG7hyBraMOhIGzhu5tuLCDEkeG6oXQga2hv4bqjbmcgMzIuODElLiBUcm9uZyBraGkgxJHDsywgY8OhYyBuaMOzbSBjw7JuIGzhuqFpIGPDsyB04bu3IGzhu4cgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4M6IG5ow7NtIGx5IGjDtG4gKERpdm9yY2VkKSBjaGnhur9tIGtob+G6o25nIDEzLjY1JSwgbHkgdGjDom4gKFNlcGFyYXRlZCkgY2hp4bq/bSAzLjE1JSwgZ8OzYSAoV2lkb3dlZCkgY2hp4bq/bSAzLjA1JSwgdsOgIGvhur90IGjDtG4gbmjGsG5nIHbhuq9uZyBt4bq3dCB24bujL2No4buTbmcgKE1hcnJpZWQtc3BvdXNlLWFic2VudCkgY2hp4bq/bSAxLjI4JS4gxJDhurdjIGJp4buHdCwgbmjDs20gTWFycmllZC1BRi1zcG91c2UgeHXhuqV0IGhp4buHbiBy4bqldCBoaeG6v20gdHJvbmcgZOG7ryBsaeG7h3UsIGNo4buJIGNoaeG6v20gMC4wNyUuIE5ow6xuIGNodW5nLCBwaMOibiBi4buRIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBuw6B5IGNobyB0aOG6pXkgxJFhIHPhu5EgbmfGsOG7nWkgZMOibiDEkcOjIHThu6tuZyBob+G6t2MgxJFhbmcgdHJvbmcgbeG7mXQgbeG7kWkgcXVhbiBo4buHIGjDtG4gbmjDom4gY2jDrW5oIHRo4bupYywgdHJvbmcga2hpIGPDoWMgbmjDs20gxJHhurdjIGJp4buHdCBjaOG7iSBjaGnhur9tIG3hu5l0IHBo4bqnbiBy4bqldCBuaOG7jy4NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2NhbGVzKQ0KcTFfZGYgPC0gYXMuZGF0YS5mcmFtZShxMSkNCm5hbWVzKHExX2RmKSA8LSBjKCJtYXJpdGFsLnN0YXR1cyIsICJUYW5zdWF0IikNCmdncGxvdChxMV9kZiwgYWVzKHggPSAiIiwgeSA9IFRhbnN1YXQsIGZpbGwgPSBtYXJpdGFsLnN0YXR1cykpICsNCiAgZ2VvbV9jb2wod2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiRGl2b3JjZWQiID0gIiMwMEM0OUEiLCAiTWFycmllZC1BRi1zcG91c2UiID0gIiMxRjc3QjQiLCAiTWFycmllZC1zcG91c2UtYWJzZW50IiA9ICJ5ZWxsb3ciLCAiTWFycmllZC1jaXYtc3BvdXNlIiA9ICJyZWQiICwiTmV2ZXItbWFycmllZCIgPSAiI0ZGNjM4NCIsICJTZXBhcmF0ZWQiID0gImJsYWNrIiwgIldpZG93ZWQiID0gImdyZWVuIikpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IGPhu6dhIG1hcml0YWwuc3RhdHVzIikgKw0KICB0aGVtZV92b2lkKCkgKyAgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQoVGFuc3VhdCwzKSwgIiUiKSksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksDQogICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSA0KQ0KYGBgDQoNCkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIG1hcml0YWwuc3RhdHVzIGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buRIGtow7RuZyDEkeG7k25nIMSR4buBdSByw7UgcuG7h3QgZ2nhu69hIGPDoWMgbmjDs20gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuIEPhu6UgdGjhu4MsIG5ow7NtICJNYXJyaWVkLWNpdi1zcG91c2UiICjEkcOjIGvhur90IGjDtG4sIHPhu5FuZyBjw7luZyB24bujL2No4buTbmcpIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgduG7m2kga2hv4bqjbmcgNDUuOTklLCB0aeG6v3AgdGhlbyBsw6AgbmjDs20gIk5ldmVyLW1hcnJpZWQiIChjaMawYSB04burbmcga+G6v3QgaMO0bikgduG7m2kgMzIuODElLiBIYWkgbmjDs20gbsOgeSBj4buZbmcgbOG6oWkgxJHDoyBjaGnhur9tIGfhuqduIDc5JSB04buVbmcgc+G7kSBxdWFuIHPDoXQsIGNobyB0aOG6pXkgxJHDonkgbMOgIGhhaSB0w6xuaCB0cuG6oW5nIHBo4buVIGJp4bq/biDDoXAgxJHhuqNvIHRyb25nIGThu68gbGnhu4d1LiBDw6FjIG5ow7NtIGPDsm4gbOG6oWkgY8OzIHThu7cgbOG7hyB0aOG6pXAgaMahbiDEkcOhbmcga+G7gywgbmjGsCAiRGl2b3JjZWQiIChseSBow7RuKSBjaGnhur9tIDEzLjY1JSwgIlNlcGFyYXRlZCIgKGx5IHRow6JuKSBjaGnhur9tIDMuMTUlLCAiV2lkb3dlZCIgKGfDs2EpIGNoaeG6v20gMy4wNSUsIHbDoCAiTWFycmllZC1zcG91c2UtYWJzZW50IiBjaOG7iSBjaGnhur9tIDEuMjglLiDEkOG6t2MgYmnhu4d0LCBuaMOzbSAiTWFycmllZC1BRi1zcG91c2UiIGjhuqd1IG5oxrAga2jDtG5nIHh14bqldCBoaeG7h24sIGNo4buJIGNoaeG6v20gMC4wNyUuIFPhu7EgbeG6pXQgY8OibiDEkeG7kWkgbsOgeSBjw7Mgw70gbmdoxKlhIHF1YW4gdHLhu41uZyB0cm9uZyBxdcOhIHRyw6xuaCBtw7QgaMOsbmggaMOzYSwgdsOsIGPDoWMgbmjDs20gY8OzIHThu7cgbOG7hyBxdcOhIG5o4buPIGPDsyB0aOG7gyBnw6J5IHNhaSBs4buHY2ggaG/hurdjIGdp4bqjbSBoaeG7h3UgcXXhuqMgZOG7sSBiw6FvIG7hur91IGtow7RuZyDEkcaw4bujYyB44butIGzDvSB0aMOtY2ggaOG7o3AsIGNo4bqzbmcgaOG6oW4gbmjGsCBn4buZcCBuaMOzbSwgdMOhaSBwaMOibiBsb+G6oWkgaG/hurdjIMOhcCBk4bulbmcga+G7uSB0aHXhuq10IGPDom4gYuG6sW5nIG3huqt1Lg0KDQojICoqKlBI4bqmTiAzOiDGr+G7m2MgbMaw4bujbmcgS2hv4bqjbmcgdsOgIEtp4buDbSDEkeG7i25oIEdp4bqjIHRodXnhur90IGNobyBU4bu3IGzhu4cgKE3hu5l0IGJp4bq/bikqKioNCg0KVHJvbmcgcGjhuqduIG7DoHksIHRhIHRp4bq/biBow6BuaCBwaMOibiB0w61jaCB04bu3IGzhu4cgY+G7p2EgbeG7mXQgaOG6oW5nIG3hu6VjIGPhu6UgdGjhu4MgdGh14buZYyA1IGJp4bq/biDEkeG7i25oIHTDrW5oIHRyb25nIGLhu5kgZOG7ryBsaeG7h3U6IHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAobWFyaXRhbC5zdGF0dXMpLCBxdWFuIGjhu4cgZ2lhIMSRw6xuaCAocmVsYXRpb25zaGlwKSwgY2jhu6duZyB04buZYyAocmFjZSksIGdp4bubaSB0w61uaCAoc2V4KSwgdsOgIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiAoZWR1Y2F0aW9uKS4gTeG7l2kgYmnhur9uIHPhur0gxJHGsOG7o2MgcGjDom4gdMOtY2ggcXVhIDIgYsaw4bubYzogKDEpIMaw4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgY+G7p2EgaOG6oW5nIG3hu6VjIHF1YW4gdMOibSB0cm9uZyB04buVbmcgdGjhu4MsIHbDoCAoMikga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgdGjhu5FuZyBrw6ogY2hvIG3hu5l0IGdp4bqjIMSR4buLbmggY+G7pSB0aOG7gyB24buBIHThu7cgbOG7hyDEkcOzLiBN4bupYyDDvSBuZ2jEqWEgbMOgIM6xID0gMC4wNS4NCg0KIyMgKiozLjEgWMOhYyDEkeG7i25oIGjhuqFuZyBt4bulYyBRdWFuIHTDom0qKg0KDQoiQXNpYW4tUGFjLUlzbGFuZGVyIiBj4bunYSBiaeG6v24gcmFjZQ0KDQoiT3duLWNoaWxkIiBj4bunYSBiaeG6v24gcmVsYXRpb25zaGlwDQoNCiMjICoqMy4yIMav4bubYyBsxrDhu6NuZyBLaG/huqNuZyBUaW4gY+G6rXkgdsOgIEtp4buDbSDEkeG7i25oIEdp4bqjIHRodXnhur90IGPhu6dhIHThu6tuZyBo4bqhbmcgbeG7pWMqKg0KDQojIyMgKjMuMi4xIEjhuqFuZyBt4bulYyAiSHVzYmFuZCIgY+G7p2EgYmnhur9uIHJlbGF0aW9uc2hpcCoNCg0KYGBge3J9DQpwcm9wLnRlc3Qoc3VtKGRhdGEkcmVsYXRpb25zaGlwID09ICJPd24tY2hpbGQiKSwgbnJvdyhkYXRhKSwgY29uZi5sZXZlbCA9IDAuOTUpDQpgYGANCirGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15OioNCg0KVOG7tyBs4buHIG3huqt1IGPDoWMgY8OhIG5ow6JuIMSRxrDhu6NjIGdoaSBuaOG6rW4gbMOgICJPd24tY2hpbGQiIHRyb25nIHThuq1wIGThu68gbGnhu4d1IMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBsw6AgMTUuNTYlLiBE4buxYSB0csOqbiBwaMOibiB0w61jaCB0aOG7kW5nIGvDqiwga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIG7DoHkgxJHGsOG7o2MgdMOtbmggdOG7qyAxNS4xNyUgxJHhur9uIDE1Ljk2JS4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgLCB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlLCBjaMO6bmcgdGEgY8OzIHRo4buDIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcgdOG7tyBs4buHIHRo4buxYyBz4buxIGPDoWMgY8OhIG5ow6JuIGzDoCAiT3duLWNoaWxkIiB0cm9uZyB04buVbmcgdGjhu4MgZMOibiBz4buRIG7hurFtIHRyb25nIGtob+G6o25nIHRyw6puLiBLaG/huqNuZyBuw6B5IGhvw6BuIHRvw6BuIG7hurFtIGTGsOG7m2kgbeG7qWMgNTAlLCBjaG8gdGjhuqV5IHThu7cgbOG7hyBuw6B5IG5o4buPIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbeG7mXQgbuG7rWEgdOG7lW5nIHPhu5EgcXVhbiBzw6F0Lg0KDQoNCipLaeG7g20gxJHhu4tuaCBHaeG6oyB0aHV54bq/dCAqDQotIEjigoAgKEdp4bqjIHRodXnhur90IGtow7RuZyk6IDUwJSBz4buRIGPDoSBuaMOibiB0cm9uZyB04buVbmcgdGjhu4MgbMOgICJPd24tY2hpbGQiDQoNCiBwPTAuNSANCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgdGjhu5FuZyBrw6ogY2hpIGLDrG5oIHBoxrDGoW5nIMSR4bqhdCBnacOhIHRy4buLIHLhuqV0IGzhu5tuIChYwrIgPSAxNSw0NDMpLCB24bubaSAxIGLhuq1jIHThu7EgZG8sIHbDoCBwLXZhbHVlIDwgMi4yZS0xNi4gRG8gZ2nDoSB0cuG7iyBwIG5o4buPIGjGoW4gcuG6pXQgbmhp4buBdSBzbyB24bubaSBuZ8aw4buhbmcgw70gbmdoxKlhIDAuMDUsIGNow7puZyB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgZ+G7kWMuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBt4bqhbmggbeG6vSBy4bqxbmcgdOG7tyBs4buHIHRo4buxYyBz4buxIGPDoWMgY8OhIG5ow6JuIGzDoCAiT3duLWNoaWxkIiBraMOhYyAwLjUsIHbDoCBj4bulIHRo4buDIGzDoCB0aOG6pXAgaMahbiDEkcOhbmcga+G7gy4NClRhIMSR4bq3dCBnaeG6oyB0aHV54bq/dCBuaMawIHNhdToNCg0KLSBI4oKAIChHaeG6oyB0aHV54bq/dCBraMO0bmcpOiA1MCUgc+G7kSBjw6EgbmjDom4gdHJvbmcgdOG7lW5nIHRo4buDIGzDoCAiT3duLWNoaWxkIg0KDQojIyMgKjMuMi4yIEjhuqFuZyBt4bulYyAiV2hpdGUiIGPhu6dhIGJp4bq/biByYWNlKg0KDQpgYGB7cn0NCnByb3AudGVzdChzdW0oZGF0YSRyYWNlID09ICJBc2lhbi1QYWMtSXNsYW5kZXIiKSwgbnJvdyhkYXRhKSwgY29uZi5sZXZlbCA9IDAuOTUpDQpgYGANCg0KKsav4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXk6Kg0KDQpU4bu3IGzhu4cgbmfGsOG7nWkgdGh14buZYyBuaMOzbSAiQXNpYW4tUGFjLUlzbGFuZGVyIiB0cm9uZyB04bqtcCBk4buvIGxp4buHdSDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgbMOgIDMuMTklLiBE4buxYSB0csOqbiBwaMOpcCDGsOG7m2MgbMaw4bujbmcga2hv4bqjbmcsIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBuw6B5IG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMy4wMCUgxJHhur9uIDMuMzklLiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AsIHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIGNow7puZyB0YSBjw7MgdGjhu4Mga2jhurNuZyDEkeG7i25oIHLhurFuZyB04bu3IGzhu4cgdGjhu7FjIHPhu7EgbmfGsOG7nWkgIkFzaWFuLVBhYy1Jc2xhbmRlciIgdHJvbmcgdOG7lW5nIHRo4buDIGTDom4gc+G7kSBu4bqxbSB0cm9uZyBraG/huqNuZyBy4bqldCBuaOG7jywgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgZ2nhuqMgxJHhu4tuaCA1MCUuIEtob+G6o25nIHRpbiBj4bqteSBuw6B5IGhvw6BuIHRvw6BuIG7hurFtIGTGsOG7m2kgbeG7qWMgMC41LCBwaOG6o24gw6FuaCByw7Ugc+G7sSBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDLg0KDQojIyMjICpLaeG7g20gxJHhu4tuaCBHaeG6oyB0aHV54bq/dCAqDQoNClRhIMSR4bq3dCBnaeG6oyB0aHV54bq/dCBuaMawIHNhdToNCg0KLSBI4oKAIChHaeG6oyB0aHV54bq/dCBraMO0bmcpOlThu7cgbOG7hyBuZ8aw4budaSBjaMOidSDDgSA9IDAuNSANCg0KLSBI4oKBIChHaeG6oyB0aHV54bq/dCDEkeG7kWkpOlThu7cgbOG7hyBuZ8aw4budaSBjaMOidSDDgSDiiaAgMC41DQoNClBow6lwIGtp4buDbSDEkeG7i25oIHThu7cgbOG7hyBt4buZdCBt4bqrdSDEkcaw4bujYyB0aOG7sWMgaGnhu4duIHbhu5tpIGdp4bqjIHRodXnhur90IGfhu5FjIA0KDQpQID0gMC41LCB04bupYyBnaeG6oyDEkeG7i25oIHLhurFuZyA1MCUgZMOibiBz4buRIHRodeG7mWMgbmjDs20gIkFzaWFuLVBhYy1Jc2xhbmRlciIuIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgdGjhu5FuZyBrw6ogY2hpIGLDrG5oIHBoxrDGoW5nIGPDsyBnacOhIHRy4buLIHLhuqV0IGzhu5tuIChYwrIgPSAyOCw1MzYpLCB24bubaSAxIGLhuq1jIHThu7EgZG8sIHbDoCBwLXZhbHVlIDwgMi4yZS0xNi4gVuG7m2kgcC12YWx1ZSBuaOG7jyBoxqFuIG5oaeG7gXUgc28gduG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMDUsIGNow7puZyB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgZ+G7kWMuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBt4bqhbmggbeG6vSBy4bqxbmcgdOG7tyBs4buHIG5nxrDhu51pICJBc2lhbi1QYWMtSXNsYW5kZXIiIHRyb25nIHThu5VuZyB0aOG7gyBraMOhYyA1MCUsIHbDoCBj4bulIHRo4buDIGzDoCB0aOG6pXAgaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIG3hu6ljIGdp4bqjIMSR4buLbmguDQoNCiMgKioqUEjhuqZOIDQ6IFJlbGF0aXZlIHJpc2sgdsOgIE9kZCBSYXRpbyoqKg0KDQrEkOG7gyB0aeG6v3AgdOG7pWMgcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oLCB0YSBs4buxYSBjaOG7jW4gaGFpIGPhurdwIGJp4bq/biBjw7Mgw70gbmdoxKlhIHRo4buxYyB0aeG7hW4gY2FvIMSR4buDIHTDrW5oIFJlbGF0aXZlIFJpc2sgKG5ndXkgY8ahIHTGsMahbmcgxJHhu5FpKSB2w6AgT2RkcyBSYXRpbyAodOG7tyBz4buRIGNow6puaCkuIEhhaSBj4bq3cCBiaeG6v24gxJHGsOG7o2MgY2jhu41uIGfhu5NtOg0KDQpD4bq3cCAxOiBzZXggKGdp4bubaSB0w61uaDogTWFsZS9GZW1hbGUpIHbDoCBpbmNvbWUgKHRodSBuaOG6rXA6ID41MEsgLyA8PTUwSykNCuKGkiBuaOG6sW0gc28gc8Ohbmgga2jhuqMgbsSDbmcgxJHhuqF0IHRodSBuaOG6rXAgY2FvIGdp4buvYSBuYW0gdsOgIG7hu68uDQoNCkPhurdwIDI6IG1hcml0YWwuc3RhdHVzICjEkcaw4bujYyByw7p0IGfhu41uIHRow6BuaDogTWFycmllZC1jaXYtc3BvdXNlIC8gT3RoZXIpIHbDoCBpbmNvbWUNCuKGkiDEkeG7gyB4ZW0gbGnhu4d1IHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHjDoWMgc3XhuqV0IGPDsyB0aHUgbmjhuq1wIHRyw6puIDUwLjAwMCDEkcO0L27Eg20uDQoNClbhu5tpIG3hu5dpIGPhurdwIGJp4bq/biwgdGEgdGnhur9uIGjDoG5oIGzhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gMsOXMiwgc2F1IMSRw7MgdMOtbmggdOG7tyBz4buRIGNow6puaCAoT2RkcyBSYXRpbykgYuG6sW5nIGjDoG0gb2Rkc3JhdGlvKCkgdOG7qyBnw7NpIGVwaXRvb2xzLCDEkeG7k25nIHRo4budaSB0w61uaCBuZ3V5IGPGoSB0xrDGoW5nIMSR4buRaSAoUmVsYXRpdmUgUmlzaykgdGjhu6cgY8O0bmcgaG/hurdjIHThu6sgY8O5bmcga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBj4bunYSBow6BtLiBL4bq/dCBxdeG6oyBz4bq9IGdpw7pwIMSRw6FuaCBnacOhIHhlbSBt4buZdCBuaMOzbSBjw7Mga2jhuqMgbsSDbmcgKHJpc2spIGhv4bq3YyBjxqEgaOG7mWkgKG9kZHMpIGPDsyB0aHUgbmjhuq1wIGNhbyBuaGnhu4F1IGjGoW4gbmjDs20gY8OybiBs4bqhaSBoYXkga2jDtG5nLCB2w6AgbeG7qWMgxJHhu5kga2jDoWMgYmnhu4d0IMSRw7MgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkga2jDtG5nLg0KDQojIyAqKjQuMSAgU2V4IChnaeG7m2kgdMOtbmg6IE1hbGUvRmVtYWxlKSB2w6AgUmFjZSAoY2jhu6duZyB04buZYykgKHRodSBuaOG6rXA6ID41MEsgLyA8PTUwSykqKg0KDQojIyMgKjQuMS4xIFJlbGF0aXZlIHJpc2sqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnRhYjEgPC0gdGFibGUoZGF0YSRyYWNlLCBkYXRhJHNleCkNCnJpc2tyYXRpbyh0YWIxKQ0KYGBgDQoNCkLhuqNuZyBz4buRIGxp4buHdSB0csOsbmggYsOgeSBwaMOibiB0w61jaCB24buBIHThu7cgbOG7hyBnaeG7m2kgdMOtbmggKG7hu68gdsOgIG5hbSkgdGhlbyB04burbmcgbmjDs20gY2jhu6duZyB04buZYyB0cm9uZyB04buVbmcgc+G7kSAzMi41NjEgbmfGsOG7nWkuIE3hu6VjIHRpw6p1IGzDoCBzbyBzw6FuaCB4w6FjIHN14bqldCB4deG6pXQgaGnhu4duIGdp4bubaSB0w61uaCBu4buvIGdp4buvYSBjw6FjIG5ow7NtIGNo4bunbmcgdOG7mWMga2jDoWMgbmhhdSwgduG7m2kgbmjDs20gIkFtZXItSW5kaWFuLUVza2ltbyIgxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91ICh04bu3IGzhu4cgcuG7p2kgcm8g4oCTIHJpc2sgcmF0aW8g4oCTIGLhurFuZyAxKS4gQ8OhYyBuaMOzbSBjw7JuIGzhuqFpIMSRxrDhu6NjIMSRw6FuaCBnacOhIGThu7FhIHRyw6puIHThu7cgbOG7hyBy4bunaSBybyB0xrDGoW5nIMSR4buRaSwga2hv4bqjbmcgdGluIGPhuq15IDk1JSB2w6Aga2nhu4NtIMSR4buLbmggw70gbmdoxKlhIHRo4buRbmcga8OqIHRow7RuZyBxdWEgYmEgcGjGsMahbmcgcGjDoXA6IG1pZHAuZXhhY3QsIGZpc2hlci5leGFjdCB2w6AgY2hpLXNxdWFyZS4NCg0KQ+G7pSB0aOG7gywgbmjDs20gQXNpYW4tUGFjLUlzbGFuZGVyIGPDsyB04bu3IGzhu4cgbuG7ryBjYW8gaMahbiBuaMOzbSB0aGFtIGNoaeG6v3Uga2hv4bqjbmcgOCUgKHJpc2sgcmF0aW8g4omIIDEuMDgpLCB0dXkgbmhpw6puIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdsOsIGtob+G6o25nIHRpbiBj4bqteSBjaOG7qWEgZ2nDoSB0cuG7iyAxICg5NSUgQ0k6IDAuOTgg4oCTIDEuMTkpIHbDoCBwLXZhbHVlID4gMC4xLiBOZ8aw4bujYyBs4bqhaSwgbmjDs20gQmxhY2sgY8OzIHThu7cgbOG7hyBu4buvIHRo4bqlcCBoxqFuIHLDtSBy4buHdCB24bubaSByaXNrIHJhdGlvIGtob+G6o25nIDAuODEsIHThu6ljIHRo4bqlcCBoxqFuIGfhuqduIDE5JSBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UuIMSQw6J5IGzDoCBt4buZdCBr4bq/dCBxdeG6oyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGNhbywgdsOsIGPhuqMgYmEga2nhu4NtIMSR4buLbmggxJHhu4F1IGNobyBwLXZhbHVlIDwgMC4wMDEgdsOgIGtob+G6o25nIHRpbiBj4bqteSAoMC43NCDigJMgMC44OSkga2jDtG5nIGNo4bupYSBnacOhIHRy4buLIDEuIE5ow7NtIE90aGVyIGPDsyByaXNrIHJhdGlvIGfhuqduIDEgKOKJiCAwLjk3KSwgY2hvIHRo4bqleSBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dSAocC12YWx1ZSDiiYggMC42MykuDQoNCsSQw6FuZyBjaMO6IMO9LCBuaMOzbSBXaGl0ZSBjw7MgdOG7tyBs4buHIG7hu68gY2FvIGjGoW4gbmjDs20gdGhhbSBjaGnhur91IGtob+G6o25nIDEyJSAocmlzayByYXRpbyDiiYggMS4xMiksIHbDoCBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogKHAtdmFsdWUg4omIIDAuMDA3KSwgduG7m2kga2hv4bqjbmcgdGluIGPhuq15IDk1JSBsw6AgdOG7qyAxLjAyIMSR4bq/biAxLjIyLiBOaMawIHbhuq15LCB0cm9uZyBuxINtIG5ow7NtIGNo4bunbmcgdOG7mWMgxJHGsOG7o2Mgc28gc8OhbmgsIGNo4buJIGPDsyBuaMOzbSBCbGFjayB2w6AgV2hpdGUgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBnaeG7m2kgdMOtbmggY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiwgdHJvbmcgxJHDsyBuaMOzbSBCbGFjayDDrXQgbuG7ryBoxqFuIMSRw6FuZyBr4buDLCBjw7JuIG5ow7NtIFdoaXRlIGPDsyB04bu3IGzhu4cgbuG7ryBjYW8gaMahbi4gQ8OhYyBwaMOibiB0w61jaCBz4butIGThu6VuZyBwaMawxqFuZyBwaMOhcCDGsOG7m2MgbMaw4bujbmcgTUxFIGtow7RuZyDEkWnhu4F1IGtp4buHbiBr4bq/dCBo4bujcCB24bubaSB44bqlcCB44buJIGNodeG6qW4gKFdhbGQpIMSR4buDIHjDoWMgxJHhu4tuaCBraG/huqNuZyB0aW4gY+G6rXkuDQoNCiMjIyAqNC4xLjIgUmF0aW8gb2RkKg0KDQpgYGB7cn0NCm9kZHNyYXRpbyh0YWIxKQ0KYGBgDQoNCkLhuqNuZyBz4buRIGxp4buHdSB0csOqbiB0csOsbmggYsOgeSBwaMOibiB0w61jaCB04bu3IHPhu5Egb2RkcyAob2RkcyByYXRpbykgZ2nhu69hIGdp4bubaSB0w61uaCBu4buvIHbDoCBuYW0gdHJvbmcgY8OhYyBuaMOzbSBjaOG7p25nIHThu5ljIGtow6FjIG5oYXUsIHbhu5tpIG5ow7NtICJBbWVyLUluZGlhbi1Fc2tpbW8iIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSAob2RkcyByYXRpbyA9IDEpLiBU4bu3IHPhu5Egb2RkcyBjaG8gYmnhur90IHjDoWMgc3XhuqV0IGzDoCBu4buvIHNvIHbhu5tpIG5hbSB0cm9uZyB04burbmcgbmjDs20gY2jhu6duZyB04buZYywgdsOgIHNvIHPDoW5oIHTGsMahbmcgxJHhu5FpIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dS4gUGjDom4gdMOtY2ggxJHGsOG7o2MgdGjhu7FjIGhp4buHbiBi4bqxbmcgcGjGsMahbmcgcGjDoXAgxrDhu5tjIGzGsOG7o25nIHRydW5nIHbhu4sga2jDtG5nIHRoacOqbiBs4buHY2ggKG1lZGlhbi11bmJpYXNlZCkga+G6v3QgaOG7o3AgduG7m2kga2hv4bqjbmcgdGluIGPhuq15IG1pZC1wIGNow61uaCB4w6FjLg0KDQpL4bq/dCBxdeG6oyBjaG8gdGjhuqV5LCBuaMOzbSBBc2lhbi1QYWMtSXNsYW5kZXIgY8OzIG9kZHMgcmF0aW8geOG6pXAgeOG7iSAxLjI0LCB04bupYyBsw6AgeMOhYyBzdeG6pXQgbMOgIG7hu68gY2FvIGjGoW4ga2hv4bqjbmcgMjQlIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dS4gVHV5IG5oacOqbiwgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiB2w6wga2hv4bqjbmcgdGluIGPhuq15IDk1JSAoMC45NSDigJMgMS42MSkgYmFvIGfhu5NtIDEgdsOgIHAtdmFsdWUgbOG7m24gaMahbiAwLjEuIFRyb25nIGtoaSDEkcOzLCBuaMOzbSBCbGFjayBjw7Mgb2RkcyByYXRpbyBraG/huqNuZyAwLjYzLCBuZ2jEqWEgbMOgIHThu7cgbOG7hyBu4buvIHRyb25nIG5ow7NtIG7DoHkgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4MgKGdp4bqjbSBraG/huqNuZyAzNyUpIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dS4gU+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLDtSByw6BuZyB24bubaSBwLXZhbHVlIDwgMC4wMDEgdsOgIGtob+G6o25nIHRpbiBj4bqteSAoMC40OSDigJMgMC43OSkga2jDtG5nIGNo4bupYSAxLg0KDQpOaMOzbSBPdGhlciBjw7Mgb2RkcyByYXRpbyBn4bqnbiAxICjiiYggMC45MiksIGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIGdp4bubaSB0w61uaCBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UsIHbDoCBr4bq/dCBxdeG6oyBuw6B5IGPFqW5nIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIChwIOKJiCAwLjYzKS4gTmfGsOG7o2MgbOG6oWksIG5ow7NtIFdoaXRlIGPDsyBvZGRzIHJhdGlvIGtob+G6o25nIDEuMzgsIHThu6ljIGzDoCBraOG6oyBuxINuZyBsw6AgbuG7ryBjYW8gaMahbiBraG/huqNuZyAzOCUgc28gduG7m2kgbmjDs20gQW1lci1JbmRpYW4tRXNraW1vLCB2w6AgxJHDonkgbMOgIHPhu7Ega2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogKHAg4omIIDAuMDA3OyBraG/huqNuZyB0aW4gY+G6rXkgOTUlIHThu6sgMS4wOSDEkeG6v24gMS43MykuDQoNClTDs20gbOG6oWksIHRyb25nIHPhu5EgY8OhYyBuaMOzbSBjaOG7p25nIHThu5ljIMSRxrDhu6NjIHBow6JuIHTDrWNoLCBjaOG7iSBjw7MgaGFpIG5ow7NtIOKAkyBCbGFjayB2w6AgV2hpdGUg4oCTIHRo4buDIGhp4buHbiBz4buxIGtow6FjIGJp4buHdCBnaeG7m2kgdMOtbmggY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gTmjDs20gQmxhY2sgY8OzIHThu7cgbOG7hyBu4buvIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDLCB0cm9uZyBraGkgbmjDs20gV2hpdGUgY8OzIHThu7cgbOG7hyBu4buvIGNhbyBoxqFuIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dS4gQ8OhYyBuaMOzbSBjw7JuIGzhuqFpIGtow7RuZyBjaG8gdGjhuqV5IHPhu7EgY2jDqm5oIGzhu4djaCBnaeG7m2kgdMOtbmggxJHDoW5nIHRpbiBj4bqteSB24buBIG3hurd0IHRo4buRbmcga8OqLg0KDQoNCiMgKioqUEjhuqZOIDU6IFBow6JuIHTDrWNoIE3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgSGFpIGJp4bq/biDEkOG7i25oIHTDrW5oIChCaXZhcmlhdGUgQW5hbHlzaXMpKioqDQoNClRhIGNo4buNbiBj4bq3cCBiaeG6v24gxJHhu4tuaCB0w61uaCBuaMawIHNhdToNCg0KLSBSYWNlIHbDoCBNYXJpdGFsLnN0YXR1cw0KDQojIyAqKkPhurdwIGJp4bq/biBSYWNlIHbDoCBNYXJpdGFsLnN0YXR1cyoqDQoNCiMjIyAqVOG6oW8gYuG6o25nIHThuqduIHN14bqldCBjaMOpbyB2w6AgdMOtbmggdOG7tyBs4buHKg0KDQpgYGB7cn0NCnRhYjIyIDwtIHRhYmxlKGRhdGEkcmFjZSwgZGF0YSRtYXJpdGFsLnN0YXR1cykNCnRhYjIyDQpgYGANCg0KYGBge3J9DQpwcm9wMiA8LSBwcm9wLnRhYmxlKHRhYjIyLCBtYXJnaW4gPSAxKSAqIDEwMA0KDQpyb3VuZChwcm9wMiwgMikNCmBgYA0KDQojIyMgKlRy4buxYyBxdWFuIGjDs2EqDQoNCmBgYHtyfQ0KZGZfdGFiMjIgPC0gYXMuZGF0YS5mcmFtZSh0YWIyMikNCmNvbG5hbWVzKGRmX3RhYjIyKSA8LSBjKCJyYWNlIiwgIm1hcml0YWwuc3RhdHVzIiwgIkZyZXEiKQ0KZ2dwbG90KGRmX3RhYjIyLCBhZXMoeCA9IHJhY2UsIHkgPSBGcmVxLCBmaWxsID0gbWFyaXRhbC5zdGF0dXMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIikgKw0KICBsYWJzKHRpdGxlID0gIlThu7cgbOG7hyB0aHUgbmjhuq1wIHRoZW8gdmFpIHRyw7IgdHJvbmcgaOG7mSBnaWEgxJHDrG5oIiwNCiAgICAgICB5ID0gIlThu7cgbOG7hyIsIHggPSAiTeG7kWkgcXVhbiBo4buHIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KQ0KYGBgDQoNCiMjIyAqS2nhu4NtIMSR4buLbmggVGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykqDQoNCmBgYHtyfQ0KY2hpc3EudGVzdCh0YWIyMikNCmBgYA0K