Nhiệm vụ 3.1: population-and-demography
Giới thiệu:
Nghiên cứu bộ dữ liệu “population-and-demography.csv” là Dataset
thống kê dân số theo từng độ tuổi khác nhau của các nước khác nhau từ
năm 1950 đến năm 2021. Dùng phần mềm R để thao tác
Mô tả cơ bản datasets
- Là một data frame
- Có 24 cột tương ứng với 24 giá trị
- Có 18288 hàng tương ứng với 18288 quan sát
- Dataset không có dữ liệu trống
Thực hiện thao tác đọc và gán dữ liệu vào máy. Bộ dữ liệu là csv nên
đọc dữ liệu theo file csv và gán vào h
h <- read.csv('C:/Users/admin/Downloads/population-and-demography.csv', header = T)
- Bộ dữ liệu có 24 cột cũng như 24 biến, các biến có tên như sau:
names(h)
## [1] "Country.name"
## [2] "Year"
## [3] "Population"
## [4] "Population.of.children.under.the.age.of.1"
## [5] "Population.of.children.under.the.age.of.5"
## [6] "Population.of.children.under.the.age.of.15"
## [7] "Population.under.the.age.of.25"
## [8] "Population.aged.15.to.64.years"
## [9] "Population.older.than.15.years"
## [10] "Population.older.than.18.years"
## [11] "Population.at.age.1"
## [12] "Population.aged.1.to.4.years"
## [13] "Population.aged.5.to.9.years"
## [14] "Population.aged.10.to.14.years"
## [15] "Population.aged.15.to.19.years"
## [16] "Population.aged.20.to.29.years"
## [17] "Population.aged.30.to.39.years"
## [18] "Population.aged.40.to.49.years"
## [19] "Population.aged.50.to.59.years"
## [20] "Population.aged.60.to.69.years"
## [21] "Population.aged.70.to.79.years"
## [22] "Population.aged.80.to.89.years"
## [23] "Population.aged.90.to.99.years"
## [24] "Population.older.than.100.years"
- Kiểm tra xem “h” có phải là data frame hay không, nếu đúng thì true
và ngược lại. Và kết quả trả về là TRUE -> h là một dataframe
is.data.frame(h)
## [1] TRUE
- Xác định số hàng, số cột của h dưới dạng vecto. Kết quả trả về thì h
tương ứng có 18288 hàng và 24 cột
dim(h)
## [1] 18288 24
- Xác định số ô trống của h. Kết quả trả về tương ứng với h không có ô
trống nào
sum(is.na(h))
## [1] 0
Thống kê dữ liệu
Xác định các thông tin cơ bản trong h
library(skimr)
skim(h)
Data summary
| Name |
h |
| Number of rows |
18288 |
| Number of columns |
24 |
| _______________________ |
|
| Column type frequency: |
|
| character |
1 |
| numeric |
23 |
| ________________________ |
|
| Group variables |
None |
Variable type: character
| Country.name |
0 |
1 |
4 |
59 |
0 |
254 |
0 |
Variable type: numeric
| Year |
0 |
1 |
1985.50 |
20.78 |
1950 |
1967.75 |
1985.5 |
2003.25 |
2021 |
▇▇▇▇▇ |
| Population |
0 |
1 |
126470436.62 |
588851230.77 |
1363 |
291591.50 |
3833997.5 |
16785463.50 |
7909295000 |
▇▁▁▁▁ |
| Population.of.children.under.the.age.of.1 |
0 |
1 |
3133496.86 |
14167006.03 |
25 |
6663.75 |
88352.0 |
463000.50 |
139783730 |
▇▁▁▁▁ |
| Population.of.children.under.the.age.of.5 |
0 |
1 |
14825709.57 |
67384368.62 |
136 |
31995.25 |
423784.5 |
2160046.50 |
690360700 |
▇▁▁▁▁ |
| Population.of.children.under.the.age.of.15 |
0 |
1 |
41095227.11 |
188416973.54 |
416 |
89541.50 |
1186121.5 |
5905944.75 |
2015023400 |
▇▁▁▁▁ |
| Population.under.the.age.of.25 |
0 |
1 |
63762600.31 |
294251869.66 |
623 |
139541.50 |
1843099.5 |
9025129.75 |
3239281000 |
▇▁▁▁▁ |
| Population.aged.15.to.64.years |
0 |
1 |
77429505.08 |
367651914.71 |
748 |
170263.50 |
2246772.0 |
9641250.00 |
5132999000 |
▇▁▁▁▁ |
| Population.older.than.15.years |
0 |
1 |
85372101.76 |
404866940.61 |
849 |
186716.00 |
2482104.0 |
10354345.50 |
5893678600 |
▇▁▁▁▁ |
| Population.older.than.18.years |
0 |
1 |
78196242.04 |
372017010.49 |
752 |
166417.50 |
2238130.5 |
9239904.00 |
5516283000 |
▇▁▁▁▁ |
| Population.at.age.1 |
0 |
1 |
3011212.81 |
13661998.41 |
26 |
6473.75 |
85824.0 |
440787.50 |
138478740 |
▇▁▁▁▁ |
| Population.aged.1.to.4.years |
0 |
1 |
11692212.72 |
53238243.89 |
101 |
25269.25 |
334454.0 |
1697850.75 |
550970400 |
▇▁▁▁▁ |
| Population.aged.5.to.9.years |
0 |
1 |
13598575.21 |
62534310.11 |
138 |
29406.25 |
392220.5 |
1947260.75 |
683611800 |
▇▁▁▁▁ |
| Population.aged.10.to.14.years |
0 |
1 |
12670942.28 |
58775457.46 |
73 |
27879.50 |
363895.5 |
1796754.00 |
659934300 |
▇▁▁▁▁ |
| Population.aged.15.to.19.years |
0 |
1 |
11782258.92 |
55126036.18 |
110 |
26296.50 |
336969.5 |
1626210.75 |
623576060 |
▇▁▁▁▁ |
| Population.aged.20.to.29.years |
0 |
1 |
20872880.04 |
98860990.50 |
158 |
45050.75 |
609723.5 |
2758738.50 |
1210493200 |
▇▁▁▁▁ |
| Population.aged.30.to.39.years |
0 |
1 |
17158704.11 |
82404600.95 |
137 |
36608.25 |
486290.5 |
2113149.00 |
1165207300 |
▇▁▁▁▁ |
| Population.aged.40.to.49.years |
0 |
1 |
13622138.99 |
66008221.21 |
119 |
27440.25 |
364712.5 |
1556334.00 |
976407200 |
▇▁▁▁▁ |
| Population.aged.50.to.59.years |
0 |
1 |
10177069.11 |
49288480.77 |
95 |
19649.75 |
264781.5 |
1203386.00 |
851356900 |
▇▁▁▁▁ |
| Population.aged.60.to.69.years |
0 |
1 |
6801756.84 |
32712918.99 |
64 |
12603.00 |
168417.5 |
845242.75 |
598067140 |
▇▁▁▁▁ |
| Population.aged.70.to.79.years |
0 |
1 |
3618710.03 |
17491538.61 |
31 |
6221.00 |
81824.0 |
436710.00 |
330491170 |
▇▁▁▁▁ |
| Population.aged.80.to.89.years |
0 |
1 |
1195799.30 |
6238308.33 |
6 |
1818.75 |
20269.5 |
133380.50 |
131835590 |
▇▁▁▁▁ |
| Population.aged.90.to.99.years |
0 |
1 |
142784.38 |
853350.39 |
0 |
154.75 |
1468.5 |
12499.00 |
22223974 |
▇▁▁▁▁ |
| Population.older.than.100.years |
0 |
1 |
3107.72 |
20951.57 |
0 |
0.00 |
13.0 |
163.00 |
593166 |
▇▁▁▁▁ |
Thực hiện thống kê mô tả dataset này ta được kết quả bên trên, ý
nghĩa các cột như sau:
n_missing: số ô dữ liệu bị miss(trống)
complete_rate: tỷ lệ ô có dữ liệu
mean: trung bình
sd: độ lệch chuẩn
p0: giá trị nhỏ nhất
p25: Phân vị thứ nhất
p50: Phân vị thứ hai cũng chính là trung vị
p75: phân vị thứ ba
p100: giá trị lớn nhất
hist: biểu đồ Histogram
Đổi tên các cột để thao tác
Các ký hiệu tên tương ứng theo thứ tự lần lượt từ cột 1 đến cột
24
Country name= ‘cn’
Year= ‘y’
Population= ‘p’
Population of children under the age of 1= ‘pu1’
Population of children under the age of 5= ‘pu5’
Population of children under the age of 15= ‘pu15’
Population under the age of 25= ‘pu25’
Population aged 15 to 64 years= ‘p15t64’
Population older than 15 years= ‘pt15’
Population older than 18 years= ‘pt18’
Population at age 1= ‘p1’
Population aged 1 to 4 years= ‘p1t4’
Population aged 5 to 9 years= ‘p5t9’
Population aged 10 to 14 years= ‘p10t14’
Population aged 15 to 19 years= ‘p15t19’
Population aged 20 to 29 years= ‘p20t29’
Population aged 30 to 39 years= ‘p30t39’
Population aged 40 to 49 years= ‘p40t49’
Population aged 50 to 59 years= ‘p50t59’
Population aged 60 to 69 years= ‘p60t69’
Population aged 70 to 79 years= ‘p70t79’
Population aged 80 to 89 years= ‘p80t89’
Population aged 90 to 99 years= ‘p90t99’
Population older than 100 years= ‘pt100’
names(h) = c('cn','y','p','pu1','pu5','pu15','pu25','p15t64','pt15','pt18','p1','p1t4','p5t9','p10t14','p15t19','p20t29','p30t39','p40t49','p50t59','p60t69','p70t79','p80t89','p90t99','pt100')
names(h)
## [1] "cn" "y" "p" "pu1" "pu5" "pu15" "pu25" "p15t64"
## [9] "pt15" "pt18" "p1" "p1t4" "p5t9" "p10t14" "p15t19" "p20t29"
## [17] "p30t39" "p40t49" "p50t59" "p60t69" "p70t79" "p80t89" "p90t99" "pt100"
Rút trích dữ liệu
Việc rút trích dữ liệu theo ý muốn cũng như phần dữ liệu được rút sẽ
giúp việc tìm hiểu trở nên tối ưu hơn, để chắc chắn đã rút trích thành
công ta dùng lệnh str(x) với x là tên object mà ta gán dữ liệu để có thể
xem các đối tượng và số lượng của biến của x
Chọn ra 6 cột tương ứng là “cn”,“y”,“p”,“pu15”,“p50t59”,“pt100” và
chọn những hàng bắt đầu bằng chữ “A” gán vào object h1. Kết quả trả về
là h1 gồm có 6 cột và 1152 giá trị
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(stringr)
h1 <- select(h,cn,y,p,pu15,p50t59,pt100) %>% filter(str_detect(cn, "^G"))
str(h1)
## 'data.frame': 1152 obs. of 6 variables:
## $ cn : chr "Gabon" "Gabon" "Gabon" "Gabon" ...
## $ y : int 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
## $ p : num 472913 475839 478905 482194 485704 ...
## $ pu15 : int 136899 138357 139905 141628 143622 145923 148500 151330 154435 157815 ...
## $ p50t59: int 46966 47180 47395 47611 47831 48054 48284 48516 48756 48997 ...
## $ pt100 : num 1 1 1 1 1 0 1 1 1 1 ...
Mã hoá dữ liệu
Câu lệnh biểu thị một điều kiện so sánh trên cột pt100 của bảng dữ
liệu h1. Cụ thể:
- Nếu giá trị trong cột pt100 của hàng nào đó bằng 0 (h1$pt100 == 0),
thì giá trị của cột pt100 trong hàng đó sẽ được thay thế bằng chuỗi
‘Khong Co’.
- Nếu giá trị trong cột pt100 của hàng nào đó không bằng 0 (h1$pt100
== 0 ), thì giá trị của cột pt100 trong hàng đó sẽ được thay thế bằng
chuỗi ‘Co’
h1$pt100.phanloai <- ifelse(h1$pt100 == 0, 'Khong Co', 'Co')
str(h1)
## 'data.frame': 1152 obs. of 7 variables:
## $ cn : chr "Gabon" "Gabon" "Gabon" "Gabon" ...
## $ y : int 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
## $ p : num 472913 475839 478905 482194 485704 ...
## $ pu15 : int 136899 138357 139905 141628 143622 145923 148500 151330 154435 157815 ...
## $ p50t59 : int 46966 47180 47395 47611 47831 48054 48284 48516 48756 48997 ...
## $ pt100 : num 1 1 1 1 1 0 1 1 1 1 ...
## $ pt100.phanloai: chr "Co" "Co" "Co" "Co" ...
Lệnh h1\(p.cut <- cut(h1\)p, 3,
labels = c(‘It’, ‘Trung Binh’, ‘Nhieu’)) trong R được sử dụng để tạo một
biến mới (p.cut) trong bảng dữ liệu h1 bằng cách chia biến hiện tại p
thành các khoảng và gắn tên cho mỗi khoảng dựa trên giá trị của nó. Cụ
thể:
h1$p là biến bạn đang muốn chia thành các khoảng.
3 là số lượng khoảng bạn muốn tạo.
labels = c(‘It’, ‘Trung Binh’, ‘Nhieu’) là nhãn tương ứng với mỗi
khoảng.
Kết quả là, biến mới p.cut sẽ chứa các tên tương ứng với khoảng mà
giá trị của p thuộc vào. Nó tạo ra một biến phân loại dựa trên giá trị
của biến số p.
h1$p.cut <- cut(h1$p,3,labels = c('It','Trung Binh','Nhieu'))
str(h1)
## 'data.frame': 1152 obs. of 8 variables:
## $ cn : chr "Gabon" "Gabon" "Gabon" "Gabon" ...
## $ y : int 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
## $ p : num 472913 475839 478905 482194 485704 ...
## $ pu15 : int 136899 138357 139905 141628 143622 145923 148500 151330 154435 157815 ...
## $ p50t59 : int 46966 47180 47395 47611 47831 48054 48284 48516 48756 48997 ...
## $ pt100 : num 1 1 1 1 1 0 1 1 1 1 ...
## $ pt100.phanloai: chr "Co" "Co" "Co" "Co" ...
## $ p.cut : Factor w/ 3 levels "It","Trung Binh",..: 1 1 1 1 1 1 1 1 1 1 ...
Lập bảng tần số
Lập bảng tần số 1 biến
Muốn biết tần số của một biến xuất hiện bao nhiêu lần ta sử dụng
lệnh table
Trong bộ dữ liệu này kiểm tra tần suất xuất hiện của biến pu15,
ta thu được kết quả bên dưới.
Số lần xuất hiện ở mỗi mức giá là 1.
h2 <- table(h1$pu15)
str(h2)
## 'table' int [1:1146(1d)] 1 1 1 1 1 1 1 1 1 1 ...
## - attr(*, "dimnames")=List of 1
## ..$ : chr [1:1146] "4955" "5004" "5007" "5048" ...
Lập bảng tần số 2 biến
Dưới đây là mô tả chi tiết:
Bảng tần số có 72 hàng (1:72) và 3 cột (1:3).
Chiều thứ nhất (hàng) đại diện cho năm, được đánh số từ 1 đến 72,
tương ứng với mỗi năm từ 1950 đến 2021
Chiều thứ hai (cột) đại diện cho các nhóm hoặc mức độ (It, Trung
Binh, Nhieu).
Mỗi ô trong bảng chứa số lần xuất hiện tương ứng với năm và nhóm
tương ứng.
Attribute “dimnames” bao gồm hai danh sách:
Danh sách đầu tiên (chiều hàng) chứa tên của mỗi năm, ví dụ:
“1950”, “1951”, “1952”, …
Danh sách thứ hai (chiều cột) chứa tên của mỗi nhóm, ví dụ: “It”,
“Trung Binh”, “Nhieu”.
h3 <- table(h1$y,h1$p.cut)
str(h3)
## 'table' int [1:72, 1:3] 15 15 15 15 15 15 15 15 15 15 ...
## - attr(*, "dimnames")=List of 2
## ..$ : chr [1:72] "1950" "1951" "1952" "1953" ...
## ..$ : chr [1:3] "It" "Trung Binh" "Nhieu"
Tính toán các đặc trưng đo lường
Dùng bảng dữ liệu h để phân tích chi tiết nhất của bảng dữ liệu
summary(h$p)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.363e+03 2.916e+05 3.834e+06 1.265e+08 1.679e+07 7.909e+09
Mean là số trung bình hay là một điểm giữa của một tập hợp/ đối
tượng được yêu cầu
Median là sô trung vị trung bình ở chỗ nó chia đối tượng ra làm
đôi và chưa chắc 2 bên đó sẽ cân bằng nhau)
Ngoài ra còn có đặc trưng khác : Max - giá trị lớn nhất, Min -
giá trị nhỏ nhất, 1st Qu.,3rd Qu. - phân vị thứ 1, thứ 3,….
Mean - Tính dân số trung bình - kết quả thu được dân
số trung bình của tất cả các nước là hơn 126 ngàn dân
mean(h$p,na.rm = T)
## [1] 126470437
Median - tính trung vị của population - kết quả thu
được có 50% giá trị lớn hơn và 50% giá trị nhỏ hơn 3833998
median(h$p)
## [1] 3833998
Phân tích dữ liệu theo quốc gia và thời gian
Phân tích dân số trung bình theo từng nhóm quốc gia
Lệnh d4 <- d1 %>% group_by(y) %>% summarise(mean_of_population
= mean(p)) trong R sử dụng gói dplyr để thực hiện một phép tổng hợp dữ
liệu trên cột “cn” của bảng dữ liệu “d1” theo nhóm “y”. Dưới đây là giải
thích chi tiết:
group_by(y): Nhóm dữ liệu theo cột “y”. Điều này có nghĩa là các
phép tổng hợp tiếp theo sẽ được thực hiện cho từng nhóm “y” riêng
biệt.
summarise(mean_of_population = mean(p)): Tính trung bình của cột
“p” cho mỗi nhóm “cn” và tạo ra một cột mới có tên “mean_of_population”
để lưu trữ kết quả.
Kết quả trả về:
h4 <- h1 %>% group_by(cn) %>% summarise(mean_of_population = mean(p))
str(h4)
## tibble [16 × 2] (S3: tbl_df/tbl/data.frame)
## $ cn : chr [1:16] "Gabon" "Gambia" "Georgia" "Germany" ...
## $ mean_of_population: num [1:16] 1048665 1092381 4424246 78358436 15515391 ...
Phân tích và tổng hợp số trẻ em dưới 15 tuổi theo nhóm quốc
gia và năm Kết quả trả về có 1,152 dòng và 4 cột:
- Cột “cn”: Chứa tên quốc gia (cột “cn” trong bảng dữ liệu).
- Cột “y”: Chứa năm (cột “y” trong bảng dữ liệu).
- Cột “n”: Chứa số lượng (số lần xuất hiện) của mỗi cặp giá trị “cn”
và “y”.
- Cột “sum_of_pu15”: Chứa tổng giá trị của cột “pu15” cho mỗi cặp giá
trị “cn” và “y”
h5 <- h1 %>% group_by(cn,y) %>% summarise(n = n(),sum_of_pu15 = sum(pu15),.groups = 'drop')
str(h5)
## tibble [1,152 × 4] (S3: tbl_df/tbl/data.frame)
## $ cn : chr [1:1152] "Gabon" "Gabon" "Gabon" "Gabon" ...
## $ y : int [1:1152] 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
## $ n : int [1:1152] 1 1 1 1 1 1 1 1 1 1 ...
## $ sum_of_pu15: int [1:1152] 136899 138357 139905 141628 143622 145923 148500 151330 154435 157815 ...
Nhiệm vụ 3.2
- Chọn bộ dữ liệu Chỉ số phát triển con người 1990 - 2021
(human-development-index.csv).
Giới thiệu:
Nhiệm vụ 3.2 tiến hành thao tác 1 số lệnh cơ bản trên dataset
“human-development-index.csv”. Chỉ số Phát triển Con người (HDI) là
thước đo tóm tắt các khía cạnh chính của sự phát triển con người: cuộc
sống lâu dài và khỏe mạnh, nền giáo dục tốt và mức sống tốt. Giá trị cao
hơn cho thấy sự phát triển con người cao hơn.
Mô tả cơ bản datasets
- Là một data frame
- Có 24 cột tương ứng với 24 giá trị
- Có 18288 hàng tương ứng với 18288 quan sát
- Dataset không có dữ liệu trống
- Ký hiệu các cột là:
- Enity: quốc gia
- Code: mã quốc gia
- Year: năm
- Human Development Index: chỉ số phát triển con người
Thực hiện thao tác đọc và gán dữ liệu vào máy. Sau thao tác này thì
dữ liệu từ file “human-development-index.csv” đã được gán vào d như bên
dưới - Đọc dữ liệu từ file csv và gán vào object d
d <- read.csv('C:/Users/admin/Downloads/human-development-index.csv', header = T)
- Kiểm tra xem “d” có phải là data frame hay không, nếu đúng thì true
và ngược lại. Và kết quả trả về là TRUE -> dd là một dataframe
is.data.frame(d)
## [1] TRUE
- Xác định số hàng, số cột của h dưới dạng vecto. Kết quả trả về thì d
tương ứng có 18288 hàng và 24 cột
dim(d)
## [1] 5923 4
- Xác định số ô trống của d. Kết quả trả về tương ứng với d không có ô
trống nào
sum(is.na(d))
## [1] 0
Thống kê dữ liệu
Xác định các thông tin cơ bản trong d
library(skimr)
skim(d)
Data summary
| Name |
d |
| Number of rows |
5923 |
| Number of columns |
4 |
| _______________________ |
|
| Column type frequency: |
|
| character |
2 |
| numeric |
2 |
| ________________________ |
|
| Group variables |
None |
Variable type: character
| Entity |
0 |
1 |
4 |
38 |
0 |
202 |
0 |
| Code |
0 |
1 |
0 |
8 |
320 |
193 |
0 |
Variable type: numeric
| Year |
0 |
1 |
2006.37 |
9.04 |
1990.00 |
1999.00 |
2007.00 |
2014.00 |
2021.00 |
▆▆▆▇▇ |
| Human.Development.Index |
0 |
1 |
0.67 |
0.16 |
0.22 |
0.54 |
0.69 |
0.79 |
0.96 |
▁▅▅▇▅ |
Thực hiện thống kê mô tả dataset này ta được kết quả bên trên, ý
nghĩa các cột như sau:
n_missing: số ô dữ liệu bị miss(trống)
complete_rate: tỷ lệ ô có dữ liệu
mean: trung bình
sd: độ lệch chuẩn
p0: giá trị nhỏ nhất
p25: Phân vị thứ nhất
p50: Phân vị thứ hai cũng chính là trung vị
p75: phân vị thứ ba
p100: giá trị lớn nhất
hist: biểu đồ Histogram
Đổi tên các cột để thao tác
Các ký hiệu tên tương ứng theo thứ tự lần lượt từ cột 1 đến cột 4
Enity: quốc gia -> đổi tên thành E
Code: mã quốc gia -> đổi tên thành C
Year: năm -> đổi tên thành Y
Human Development Index: chỉ số phát triển con người -> đổi
tên thành HDI
names(d) = c('E','C','Y','HDI')
names(d)
## [1] "E" "C" "Y" "HDI"
Rút trích dữ liệu
Việc rút trích dữ liệu theo ý muốn cũng như phần dữ liệu được rút sẽ
giúp việc tìm hiểu trở nên tối ưu hơn, để chắc chắn đã rút trích thành
công ta dùng lệnh str(x) với x là tên object mà ta gán dữ liệu để có thể
xem các đối tượng và số lượng của biến của x
Chọn ra 2 cột tương ứng là “E”,“HDI” và chọn những hàng bắt đầu bằng
chữ “D” gán vào object d1. Kết quả trả về là d1 gồm có 2 cột và 343 giá
trị
library(dplyr)
library(stringr)
d1 <- select(d,E,HDI) %>% filter(str_detect(E, "^A"))
str(d1)
## 'data.frame': 343 obs. of 2 variables:
## $ E : chr "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
## $ HDI: num 0.273 0.279 0.287 0.297 0.292 0.31 0.319 0.323 0.324 0.332 ...
Mã hoá dữ liệu
Câu lệnh biểu thị một điều kiện so sánh trên cột HDI của bảng dữ liệu
d1. Cụ thể:
- Nếu giá trị trong cột HDI của hàng nào đó lớn hơn 0.5 (d1$HDI >
0.5), thì giá trị của cột HDI trong hàng đó sẽ được thay thế bằng chuỗi
‘Cao’.
- Nếu giá trị trong cột HDI của hàng nào đó nhỏ hơn 0.5 (d1$HDI >
0), thì giá trị của cột HDI trong hàng đó sẽ được thay thế bằng chuỗi
‘Thấp’
d1$HDI.phanloai <- ifelse(d1$HDI > 0.5, 'Cao', 'Thấp')
str(d1)
## 'data.frame': 343 obs. of 3 variables:
## $ E : chr "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
## $ HDI : num 0.273 0.279 0.287 0.297 0.292 0.31 0.319 0.323 0.324 0.332 ...
## $ HDI.phanloai: chr "Thấp" "Thấp" "Thấp" "Thấp" ...
Lệnh d1\(HDI.cut <- cut(d1\)HDI,
2, labels = c(‘phát triển’, ‘không phát triển’) trong R được sử dụng để
tạo một biến mới (HDI.cut) trong bảng dữ liệu d1 bằng cách chia biến
hiện tại HDI thành các khoảng và gắn tên cho mỗi khoảng dựa trên giá trị
của nó. Cụ thể:
d1$HDI là biến bạn đang muốn chia thành các khoảng.
2 là số lượng khoảng bạn muốn tạo.
labels = c(‘phát triển’, ‘không phát triển’) là nhãn tương ứng
với mỗi khoảng.
Kết quả là, biến mới HDI.cut sẽ chứa các tên tương ứng với khoảng mà
giá trị của HDI thuộc vào. Nó tạo ra một biến phân loại dựa trên giá trị
của biến số HDI.
d1$HDI.cut <- cut(d1$HDI,2,labels = c('phát triển', 'không phát triển'))
str(d1)
## 'data.frame': 343 obs. of 4 variables:
## $ E : chr "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
## $ HDI : num 0.273 0.279 0.287 0.297 0.292 0.31 0.319 0.323 0.324 0.332 ...
## $ HDI.phanloai: chr "Thấp" "Thấp" "Thấp" "Thấp" ...
## $ HDI.cut : Factor w/ 2 levels "phát triển","không phát triển": 1 1 1 1 1 1 1 1 1 1 ...
Lập bảng tần số
Lập bảng tần số 1 biến
Bảng tần số có 12 quốc gia (1d), được đánh số từ 1 đến 12, tương
ứng với mỗi quốc gia
Số lần xuất hiện ở mỗi quốc gia là 32, ngoại trừ Andorra là 22,
Angola là 23, Antigua and Barbuda là 15
Attribue “dimnames” mô tả các tên của mỗi quốc gia, và chúng được
hiển thị dưới dạng chữ, ví dụ: “Afghanistan”, “Albania”, “Algeria”,
…
d2 <- table(d1$E)
str(d2)
## 'table' int [1:12(1d)] 32 32 32 22 23 15 32 32 32 32 ...
## - attr(*, "dimnames")=List of 1
## ..$ : chr [1:12] "Afghanistan" "Albania" "Algeria" "Andorra" ...
Tính toán các đặc trưng đo lường
Dùng bảng dữ liệu h để phân tích chi tiết nhất của bảng dữ liệu
summary(d$HDI)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.2160 0.5435 0.6890 0.6676 0.7940 0.9620
Mean là số trung bình hay là một điểm giữa của một tập hợp/ đối
tượng được yêu cầu
Median là sô trung vị trung bình ở chỗ nó chia đối tượng ra làm
đôi và chưa chắc 2 bên đó sẽ cân bằng nhau)
Ngoài ra còn có đặc trưng khác : Max - giá trị lớn nhất, Min -
giá trị nhỏ nhất, 1st Qu.,3rd Qu. - phân vị thứ 1, thứ 3,….
Mean - Tính chỉ số phát triển trung bình
- kết quả thu được bên dướidưới
mean(d$HDI,na.rm = T)
## [1] 0.6675578
Median - tính trung vị của chỉ số phát triển con
người (HDI) - kết quả thu được có một nửa lớn hơn 0.689 và một nửa còn
lại nhỏ hơn 0.689
median(d$HDI)
## [1] 0.689
Phân tích dữ liệu theo quốc gia và chỉ số phát triển con người
Phân tích dân số chỉ số phát triển trung bình theo từng nhóm
quốc gia Lệnh d3 <- d1 %>% group_by(E) %>%
summarise(mean_of_HDI = mean(HDI)) trong R sử dụng gói dplyr để thực
hiện một phép tổng hợp dữ liệu trên cột “HDI” của bảng dữ liệu “d1” theo
nhóm “E”. Dưới đây là giải thích chi tiết:
group_by(y): Nhóm dữ liệu theo cột “y”. Điều này có nghĩa là các
phép tổng hợp tiếp theo sẽ được thực hiện cho từng nhóm “y” riêng
biệt.
summarise(mean_of_population = mean(p)): Tính trung bình của cột
“p” cho mỗi nhóm “HDI” và tạo ra một cột mới có tên “mean_of_HDI” để lưu
trữ kết quả.
Kết quả trả về:
d3 <- d1 %>% group_by(E) %>% summarise(mean_of_HDI = mean(HDI))
str(d3)
## tibble [12 × 2] (S3: tbl_df/tbl/data.frame)
## $ E : chr [1:12] "Afghanistan" "Albania" "Algeria" "Andorra" ...
## $ mean_of_HDI: num [1:12] 0.395 0.717 0.68 0.851 0.504 ...
LS0tDQp0aXRsZTogIm52MyINCmF1dGhvcjogIlF14buzbmggR2lhbyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIHRoZW1lOiAiZGVmYXVsdCINCiAgICB0b2NfZGVwdGg6IDINCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IFRSVUUNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZGVwdGg6ICcyJw0KICBwZGZfZG9jdW1lbnQ6DQogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4DQotLS0NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojICoqTmhp4buHbSB24bulIDMuMTogcG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeSoqDQoNCg0KIyMgR2nhu5tpIHRoaeG7h3U6IA0KDQpOZ2hpw6puIGPhu6l1ICBi4buZIGThu68gbGnhu4d1ICJwb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5LmNzdiIgbMOgIERhdGFzZXQgdGjhu5FuZyBrw6ogZMOibiBz4buRIHRoZW8gdOG7q25nIMSR4buZIHR14buVaSBraMOhYyBuaGF1IGPhu6dhIGPDoWMgbsaw4bubYyBraMOhYyBuaGF1IHThu6sgbsSDbSAxOTUwIMSR4bq/biBuxINtIDIwMjEuIETDuW5nIHBo4bqnbiBt4buBbSBSIMSR4buDIHRoYW8gdMOhYw0KDQojIyBNw7QgdOG6oyBjxqEgYuG6o24gZGF0YXNldHMNCg0KLSBMw6AgbeG7mXQgZGF0YSBmcmFtZQ0KLSBDw7MgMjQgY+G7mXQgdMawxqFuZyDhu6luZyB24bubaSAyNCBnacOhIHRy4buLDQotIEPDsyAxODI4OCBow6BuZyB0xrDGoW5nIOG7qW5nIHbhu5tpIDE4Mjg4IHF1YW4gc8OhdA0KLSBEYXRhc2V0IGtow7RuZyBjw7MgZOG7ryBsaeG7h3UgdHLhu5FuZyANCg0KDQpUaOG7sWMgaGnhu4duIHRoYW8gdMOhYyDEkeG7jWMgdsOgIGfDoW4gZOG7ryBsaeG7h3UgdsOgbyBtw6F5LiBC4buZIGThu68gbGnhu4d1IGzDoCBjc3YgbsOqbiDEkeG7jWMgZOG7ryBsaeG7h3UgdGhlbyBmaWxlIGNzdiB2w6AgZ8OhbiB2w6BvIGggDQpgYGB7cn0NCmggPC0gcmVhZC5jc3YoJ0M6L1VzZXJzL2FkbWluL0Rvd25sb2Fkcy9wb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5LmNzdicsIGhlYWRlciA9IFQpDQoNCmBgYA0KDQotIELhu5kgZOG7ryBsaeG7h3UgY8OzIDI0IGPhu5l0IGPFqW5nIG5oxrAgMjQgYmnhur9uLCBjw6FjIGJp4bq/biBjw7MgdMOqbiBuaMawIHNhdToNCmBgYHtyfQ0KbmFtZXMoaCkNCmBgYA0KLSBLaeG7g20gdHJhIHhlbSAiaCIgY8OzIHBo4bqjaSBsw6AgZGF0YSBmcmFtZSBoYXkga2jDtG5nLCBu4bq/dSDEkcO6bmcgdGjDrCB0cnVlIHbDoCBuZ8aw4bujYyBs4bqhaS4gVsOgIGvhur90IHF14bqjIHRy4bqjIHbhu4EgbMOgIFRSVUUgLT4gaCBsw6AgbeG7mXQgZGF0YWZyYW1lDQpgYGB7cn0NCmlzLmRhdGEuZnJhbWUoaCkgDQpgYGANCg0KLSBYw6FjIMSR4buLbmggc+G7kSBow6BuZywgc+G7kSBj4buZdCBj4bunYSBoIGTGsOG7m2kgZOG6oW5nIHZlY3RvLiBL4bq/dCBxdeG6oyB0cuG6oyB24buBIHRow6wgaCB0xrDGoW5nIOG7qW5nIGPDsyAxODI4OCBow6BuZyB2w6AgMjQgY+G7mXQNCmBgYHtyfQ0KZGltKGgpDQpgYGANCg0KLSBYw6FjIMSR4buLbmggc+G7kSDDtCB0cuG7kW5nIGPhu6dhIGguIEvhur90IHF14bqjIHRy4bqjIHbhu4EgdMawxqFuZyDhu6luZyB24bubaSBoIGtow7RuZyBjw7Mgw7QgdHLhu5FuZyBuw6BvDQpgYGB7cn0NCnN1bShpcy5uYShoKSkNCmBgYA0KDQojIyBUaOG7kW5nIGvDqiBk4buvIGxp4buHdQ0KDQpYw6FjIMSR4buLbmggY8OhYyB0aMO0bmcgdGluIGPGoSBi4bqjbiB0cm9uZyBoDQpgYGB7cn0NCmxpYnJhcnkoc2tpbXIpDQpza2ltKGgpDQpgYGANCg0KVGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiBtw7QgdOG6oyBkYXRhc2V0IG7DoHkgdGEgxJHGsOG7o2Mga+G6v3QgcXXhuqMgYsOqbiB0csOqbiwgw70gbmdoxKlhIGPDoWMgY+G7mXQgbmjGsCBzYXU6DQoNCiAtIG5fbWlzc2luZzogc+G7kSDDtCBk4buvIGxp4buHdSBi4buLIG1pc3ModHLhu5FuZykNCg0KIC0gY29tcGxldGVfcmF0ZTogdOG7tyBs4buHIMO0IGPDsyBk4buvIGxp4buHdQ0KDQogLSBtZWFuOiB0cnVuZyBiw6xuaA0KDQogLSBzZDogxJHhu5kgbOG7h2NoIGNodeG6qW4NCg0KIC0gcDA6IGdpw6EgdHLhu4sgbmjhu48gbmjhuqV0DQoNCiAtIHAyNTogUGjDom4gduG7iyB0aOG7qSBuaOG6pXQNCg0KIC0gcDUwOiBQaMOibiB24buLIHRo4bupIGhhaSBjxaluZyBjaMOtbmggbMOgIHRydW5nIHbhu4sNCg0KIC0gcDc1OiBwaMOibiB24buLIHRo4bupIGJhDQoNCiAtIHAxMDA6IGdpw6EgdHLhu4sgbOG7m24gbmjhuqV0DQoNCiAtIGhpc3Q6IGJp4buDdSDEkeG7kyBIaXN0b2dyYW0NCiANCiMjIMSQ4buVaSB0w6puIGPDoWMgY+G7mXQgxJHhu4MgdGhhbyB0w6FjDQpDw6FjIGvDvSBoaeG7h3UgdMOqbiB0xrDGoW5nIOG7qW5nIHRoZW8gdGjhu6kgdOG7sSBs4bqnbiBsxrDhu6N0IHThu6sgY+G7mXQgMSDEkeG6v24gY+G7mXQgMjQNCg0KICAtIENvdW50cnkgbmFtZT0gJ2NuJw0KICANCiAgLSBZZWFyPSAneScNCiAgDQogIC0gUG9wdWxhdGlvbj0gJ3AnDQogIA0KICAtIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxPSAncHUxJw0KICANCiAgLSBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgNT0gJ3B1NScNCiAgDQogIC0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE1PSAncHUxNScNCiAgDQogIC0gUG9wdWxhdGlvbiB1bmRlciB0aGUgYWdlIG9mIDI1PSAncHUyNScNCiAgDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDE1IHRvIDY0IHllYXJzPSAncDE1dDY0Jw0KICANCiAgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTUgeWVhcnM9ICdwdDE1Jw0KICANCiAgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTggeWVhcnM9ICdwdDE4Jw0KICANCiAgLSBQb3B1bGF0aW9uIGF0IGFnZSAxPSAncDEnDQogIA0KICAtIFBvcHVsYXRpb24gYWdlZCAxIHRvIDQgeWVhcnM9ICdwMXQ0Jw0KICANCiAgLSBQb3B1bGF0aW9uIGFnZWQgNSB0byA5IHllYXJzPSAncDV0OScNCiAgDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDEwIHRvIDE0IHllYXJzPSAncDEwdDE0Jw0KICANCiAgLSBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gMTkgeWVhcnM9ICdwMTV0MTknDQogIA0KICAtIFBvcHVsYXRpb24gYWdlZCAyMCB0byAyOSB5ZWFycz0gJ3AyMHQyOScNCiAgDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDMwIHRvIDM5IHllYXJzPSAncDMwdDM5Jw0KICANCiAgLSBQb3B1bGF0aW9uIGFnZWQgNDAgdG8gNDkgeWVhcnM9ICdwNDB0NDknDQogIA0KICAtIFBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFycz0gJ3A1MHQ1OScNCiAgDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDYwIHRvIDY5IHllYXJzPSAncDYwdDY5Jw0KICANCiAgLSBQb3B1bGF0aW9uIGFnZWQgNzAgdG8gNzkgeWVhcnM9ICdwNzB0NzknDQogIA0KICAtIFBvcHVsYXRpb24gYWdlZCA4MCB0byA4OSB5ZWFycz0gJ3A4MHQ4OScNCiAgDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDkwIHRvIDk5IHllYXJzPSAncDkwdDk5Jw0KICANCiAgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTAwIHllYXJzPSAncHQxMDAnDQoNCmBgYHtyfQ0KbmFtZXMoaCkgPSBjKCdjbicsJ3knLCdwJywncHUxJywncHU1JywncHUxNScsJ3B1MjUnLCdwMTV0NjQnLCdwdDE1JywncHQxOCcsJ3AxJywncDF0NCcsJ3A1dDknLCdwMTB0MTQnLCdwMTV0MTknLCdwMjB0MjknLCdwMzB0MzknLCdwNDB0NDknLCdwNTB0NTknLCdwNjB0NjknLCdwNzB0NzknLCdwODB0ODknLCdwOTB0OTknLCdwdDEwMCcpDQpuYW1lcyhoKQ0KYGBgDQoNCiMjIFLDunQgdHLDrWNoIGThu68gbGnhu4d1DQpWaeG7h2MgcsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgdGhlbyDDvSBtdeG7kW4gY8WpbmcgbmjGsCBwaOG6p24gZOG7ryBsaeG7h3UgxJHGsOG7o2MgcsO6dCBz4bq9IGdpw7pwIHZp4buHYyB0w6xtIGhp4buDdSB0cuG7nyBuw6puIHThu5FpIMawdSBoxqFuLCDEkeG7gyBjaOG6r2MgY2jhuq9uIMSRw6MgcsO6dCB0csOtY2ggdGjDoG5oIGPDtG5nIHRhIGTDuW5nIGzhu4duaCBzdHIoeCkgduG7m2kgeCBsw6AgdMOqbiBvYmplY3QgbcOgIHRhIGfDoW4gZOG7ryBsaeG7h3UgxJHhu4MgY8OzIHRo4buDIHhlbSBjw6FjIMSR4buRaSB0xrDhu6NuZyB2w6Agc+G7kSBsxrDhu6NuZyBj4bunYSBiaeG6v24gY+G7p2EgeA0KDQpDaOG7jW4gcmEgNiBj4buZdCB0xrDGoW5nIOG7qW5nIGzDoCAiY24iLCJ5IiwicCIsInB1MTUiLCJwNTB0NTkiLCJwdDEwMCIgdsOgIGNo4buNbiBuaOG7r25nIGjDoG5nIGLhuq90IMSR4bqndSBi4bqxbmcgY2jhu68gIkEiIGfDoW4gdsOgbyBvYmplY3QgaDEuIEvhur90IHF14bqjIHRy4bqjIHbhu4EgbMOgIGgxIGfhu5NtIGPDsyA2IGPhu5l0IHbDoCAxMTUyIGdpw6EgdHLhu4sNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCmgxIDwtIHNlbGVjdChoLGNuLHkscCxwdTE1LHA1MHQ1OSxwdDEwMCkgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KGNuLCAiXkciKSkNCnN0cihoMSkNCmBgYA0KDQojIyBNw6MgaG/DoSBk4buvIGxp4buHdQ0KDQpDw6J1IGzhu4duaCBiaeG7g3UgdGjhu4sgbeG7mXQgxJFp4buBdSBraeG7h24gc28gc8OhbmggdHLDqm4gY+G7mXQgcHQxMDAgY+G7p2EgYuG6o25nIGThu68gbGnhu4d1IGgxLiBD4bulIHRo4buDOg0KDQogLSBO4bq/dSBnacOhIHRy4buLIHRyb25nIGPhu5l0IHB0MTAwIGPhu6dhIGjDoG5nIG7DoG8gxJHDsyBi4bqxbmcgMCAoaDEkcHQxMDAgPT0gMCksIHRow6wgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBwdDEwMCB0cm9uZyBow6BuZyDEkcOzIHPhur0gxJHGsOG7o2MgdGhheSB0aOG6vyBi4bqxbmcgY2h14buXaSAnS2hvbmcgQ28nLg0KIC0gTuG6v3UgZ2nDoSB0cuG7iyB0cm9uZyBj4buZdCBwdDEwMCBj4bunYSBow6BuZyBuw6BvIMSRw7Mga2jDtG5nIGLhurFuZyAwIChoMSRwdDEwMCA9PSAwICksIHRow6wgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBwdDEwMCB0cm9uZyBow6BuZyDEkcOzIHPhur0gxJHGsOG7o2MgdGhheSB0aOG6vyBi4bqxbmcgY2h14buXaSAnQ28nDQoNCmBgYHtyfQ0KaDEkcHQxMDAucGhhbmxvYWkgPC0gaWZlbHNlKGgxJHB0MTAwID09IDAsICdLaG9uZyBDbycsICdDbycpDQpzdHIoaDEpDQpgYGANCkzhu4duaCBoMSRwLmN1dCA8LSBjdXQoaDEkcCwgMywgbGFiZWxzID0gYygnSXQnLCAnVHJ1bmcgQmluaCcsICdOaGlldScpKSB0cm9uZyBSIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIG3hu5l0IGJp4bq/biBt4bubaSAocC5jdXQpIHRyb25nIGLhuqNuZyBk4buvIGxp4buHdSBoMSBi4bqxbmcgY8OhY2ggY2hpYSBiaeG6v24gaGnhu4duIHThuqFpIHAgdGjDoG5oIGPDoWMga2hv4bqjbmcgdsOgIGfhuq9uIHTDqm4gY2hvIG3hu5dpIGtob+G6o25nIGThu7FhIHRyw6puIGdpw6EgdHLhu4sgY+G7p2EgbsOzLiBD4bulIHRo4buDOg0KDQogLSBoMSRwIGzDoCBiaeG6v24gYuG6oW4gxJFhbmcgbXXhu5FuIGNoaWEgdGjDoG5oIGPDoWMga2hv4bqjbmcuDQogDQogLSAzIGzDoCBz4buRIGzGsOG7o25nIGtob+G6o25nIGLhuqFuIG114buRbiB04bqhby4NCiANCiAtIGxhYmVscyA9IGMoJ0l0JywgJ1RydW5nIEJpbmgnLCAnTmhpZXUnKSBsw6AgbmjDo24gdMawxqFuZyDhu6luZyB24bubaSBt4buXaSBraG/huqNuZy4NCg0KS+G6v3QgcXXhuqMgbMOgLCBiaeG6v24gbeG7m2kgcC5jdXQgc+G6vSBjaOG7qWEgY8OhYyB0w6puIHTGsMahbmcg4bupbmcgduG7m2kga2hv4bqjbmcgbcOgIGdpw6EgdHLhu4sgY+G7p2EgcCB0aHXhu5ljIHbDoG8uIE7DsyB04bqhbyByYSBt4buZdCBiaeG6v24gcGjDom4gbG/huqFpIGThu7FhIHRyw6puIGdpw6EgdHLhu4sgY+G7p2EgYmnhur9uIHPhu5EgcC4NCg0KYGBge3J9DQpoMSRwLmN1dCA8LSBjdXQoaDEkcCwzLGxhYmVscyA9IGMoJ0l0JywnVHJ1bmcgQmluaCcsJ05oaWV1JykpDQpzdHIoaDEpDQpgYGANCg0KIyMgTOG6rXAgYuG6o25nIHThuqduIHPhu5ENCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSAxIGJp4bq/bioqDQoNCi0gTXXhu5FuIGJp4bq/dCB04bqnbiBz4buRIGPhu6dhIG3hu5l0IGJp4bq/biB4deG6pXQgaGnhu4duIGJhbyBuaGnDqnUgbOG6p24gdGEgc+G7rSBk4bulbmcgbOG7h25oIHRhYmxlIA0KLSBUcm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkga2nhu4NtIHRyYSB04bqnbiBzdeG6pXQgeHXhuqV0IGhp4buHbiBj4bunYSBiaeG6v24gcHUxNSwgdGEgdGh1IMSRxrDhu6NjIGvhur90IHF14bqjIGLDqm4gZMaw4bubaS4NCg0KIC0gU+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIOG7nyBt4buXaSBt4bupYyBnacOhIGzDoCAxLg0KYGBge3J9DQpoMiA8LSB0YWJsZShoMSRwdTE1KQ0Kc3RyKGgyKQ0KYGBgDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgMiBiaeG6v24qKg0KDQpExrDhu5tpIMSRw6J5IGzDoCBtw7QgdOG6oyBjaGkgdGnhur90Og0KDQogLSBC4bqjbmcgdOG6p24gc+G7kSBjw7MgNzIgaMOgbmcgKDE6NzIpIHbDoCAzIGPhu5l0ICgxOjMpLg0KDQogLSBDaGnhu4F1IHRo4bupIG5o4bqldCAoaMOgbmcpIMSR4bqhaSBkaeG7h24gY2hvIG7Eg20sIMSRxrDhu6NjIMSRw6FuaCBz4buRIHThu6sgMSDEkeG6v24gNzIsIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbsSDbSB04burIDE5NTAgxJHhur9uIDIwMjENCg0KIC0gQ2hp4buBdSB0aOG7qSBoYWkgKGPhu5l0KSDEkeG6oWkgZGnhu4duIGNobyBjw6FjIG5ow7NtIGhv4bq3YyBt4bupYyDEkeG7mSAoSXQsIFRydW5nIEJpbmgsIE5oaWV1KS4NCg0KIC0gTeG7l2kgw7QgdHJvbmcgYuG6o25nIGNo4bupYSBz4buRIGzhuqduIHh14bqldCBoaeG7h24gdMawxqFuZyDhu6luZyB24bubaSBuxINtIHbDoCBuaMOzbSB0xrDGoW5nIOG7qW5nLg0KDQpBdHRyaWJ1dGUgImRpbW5hbWVzIiBiYW8gZ+G7k20gaGFpIGRhbmggc8OhY2g6DQoNCiAtIERhbmggc8OhY2ggxJHhuqd1IHRpw6puIChjaGnhu4F1IGjDoG5nKSBjaOG7qWEgdMOqbiBj4bunYSBt4buXaSBuxINtLCB2w60gZOG7pTogIjE5NTAiLCAiMTk1MSIsICIxOTUyIiwgLi4uDQogDQogLSBEYW5oIHPDoWNoIHRo4bupIGhhaSAoY2hp4buBdSBj4buZdCkgY2jhu6lhIHTDqm4gY+G7p2EgbeG7l2kgbmjDs20sIHbDrSBk4bulOiAiSXQiLCAiVHJ1bmcgQmluaCIsICJOaGlldSIuDQogDQpgYGB7cn0NCmgzIDwtIHRhYmxlKGgxJHksaDEkcC5jdXQpDQpzdHIoaDMpDQpgYGANCg0KIyMgVMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyANCg0KRMO5bmcgYuG6o25nIGThu68gbGnhu4d1IGggxJHhu4MgcGjDom4gdMOtY2ggY2hpIHRp4bq/dCBuaOG6pXQgY+G7p2EgYuG6o25nIGThu68gbGnhu4d1DQpgYGB7cn0NCnN1bW1hcnkoaCRwKQ0KYGBgDQotIE1lYW4gbMOgIHPhu5EgdHJ1bmcgYsOsbmggaGF5IGzDoCBt4buZdCDEkWnhu4NtIGdp4buvYSBj4bunYSBt4buZdCB04bqtcCBo4bujcC8gxJHhu5FpIHTGsOG7o25nIMSRxrDhu6NjIHnDqnUgY+G6p3UNCg0KLSBNZWRpYW4gbMOgIHPDtCB0cnVuZyB24buLIHRydW5nIGLDrG5oIOG7nyBjaOG7lyBuw7MgY2hpYSDEkeG7kWkgdMaw4bujbmcgcmEgbMOgbSDEkcO0aSB2w6AgY2jGsGEgY2jhuq9jIDIgYsOqbiDEkcOzIHPhur0gY8OibiBi4bqxbmcgbmhhdSkNCg0KLSBOZ2/DoGkgcmEgY8OybiBjw7MgxJHhurdjIHRyxrBuZyBraMOhYyA6IE1heCAtIGdpw6EgdHLhu4sgbOG7m24gbmjhuqV0LCBNaW4gLSBnacOhIHRy4buLIG5o4buPIG5o4bqldCwgMXN0IFF1LiwzcmQgUXUuIC0gcGjDom4gduG7iyB0aOG7qSAxLCB0aOG7qSAzLOKApi4NCg0KKipNZWFuKioNCi0gVMOtbmggZMOibiBz4buRIHRydW5nIGLDrG5oIA0KLSBr4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgZMOibiBz4buRIHRydW5nIGLDrG5oIGPhu6dhIHThuqV0IGPhuqMgY8OhYyBuxrDhu5tjIGzDoCBoxqFuIDEyNiBuZ8OgbiBkw6JuIA0KDQpgYGB7cn0NCm1lYW4oaCRwLG5hLnJtID0gVCkNCmBgYA0KKipNZWRpYW4qKg0KLSB0w61uaCB0cnVuZyB24buLIGPhu6dhIHBvcHVsYXRpb24NCi0ga+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIGPDsyA1MCUgZ2nDoSB0cuG7iyBs4bubbiBoxqFuIHbDoCA1MCUgZ2nDoSB0cuG7iyBuaOG7jyBoxqFuIDM4MzM5OTggDQpgYGB7cn0NCm1lZGlhbihoJHApDQpgYGANCg0KIyMgUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdGhlbyBxdeG7kWMgZ2lhIHbDoCB0aOG7nWkgZ2lhbg0KDQoqKlBow6JuIHTDrWNoIGTDom4gc+G7kSB0cnVuZyBiw6xuaCB0aGVvIHThu6tuZyBuaMOzbSBxdeG7kWMgZ2lhKioNCkzhu4duaCBkNCA8LSBkMSAlPiUgZ3JvdXBfYnkoeSkgJT4lIHN1bW1hcmlzZShtZWFuX29mX3BvcHVsYXRpb24gPSBtZWFuKHApKSB0cm9uZyBSIHPhu60gZOG7pW5nIGfDs2kgZHBseXIgxJHhu4MgdGjhu7FjIGhp4buHbiBt4buZdCBwaMOpcCB04buVbmcgaOG7o3AgZOG7ryBsaeG7h3UgdHLDqm4gY+G7mXQgImNuIiBj4bunYSBi4bqjbmcgZOG7ryBsaeG7h3UgImQxIiB0aGVvIG5ow7NtICJ5Ii4gRMaw4bubaSDEkcOieSBsw6AgZ2nhuqNpIHRow61jaCBjaGkgdGnhur90Og0KDQogLSBncm91cF9ieSh5KTogTmjDs20gZOG7ryBsaeG7h3UgdGhlbyBj4buZdCAieSIuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBjw6FjIHBow6lwIHThu5VuZyBo4bujcCB0aeG6v3AgdGhlbyBz4bq9IMSRxrDhu6NjIHRo4buxYyBoaeG7h24gY2hvIHThu6tuZyBuaMOzbSAieSIgcmnDqm5nIGJp4buHdC4NCg0KIC0gc3VtbWFyaXNlKG1lYW5fb2ZfcG9wdWxhdGlvbiA9IG1lYW4ocCkpOiBUw61uaCB0cnVuZyBiw6xuaCBj4bunYSBj4buZdCAicCIgY2hvIG3hu5dpIG5ow7NtICJjbiIgdsOgIHThuqFvIHJhIG3hu5l0IGPhu5l0IG3hu5tpIGPDsyB0w6puICJtZWFuX29mX3BvcHVsYXRpb24iIMSR4buDIGzGsHUgdHLhu68ga+G6v3QgcXXhuqMuDQogDQpL4bq/dCBxdeG6oyB0cuG6oyB24buBOg0KDQogLSBD4buZdCAiY24iOiBDaOG7qWEgdMOqbiBxdeG7kWMgZ2lhIChj4buZdCAiY24iIHRyb25nIGLhuqNuZyBk4buvIGxp4buHdSkuDQogDQogLSBD4buZdCAibWVhbl9vZl9wb3B1bGF0aW9uIiBjaOG7qWEgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBj4buZdCAicCIgY2hvIHThu6tuZyBuxINtLg0KIA0KYGBge3J9DQpoNCA8LSBoMSAlPiUgZ3JvdXBfYnkoY24pICU+JSBzdW1tYXJpc2UobWVhbl9vZl9wb3B1bGF0aW9uID0gbWVhbihwKSkNCnN0cihoNCkNCmBgYA0KKipQaMOibiB0w61jaCB2w6AgdOG7lW5nIGjhu6NwIHPhu5EgdHLhursgZW0gZMaw4bubaSAxNSB0deG7lWkgdGhlbyBuaMOzbSBxdeG7kWMgZ2lhIHbDoCBuxINtKioNCkvhur90IHF14bqjIHRy4bqjIHbhu4EgY8OzIDEsMTUyIGTDsm5nIHbDoCA0IGPhu5l0Og0KDQogLSBD4buZdCAiY24iOiBDaOG7qWEgdMOqbiBxdeG7kWMgZ2lhIChj4buZdCAiY24iIHRyb25nIGLhuqNuZyBk4buvIGxp4buHdSkuDQogLSBD4buZdCAieSI6IENo4bupYSBuxINtIChj4buZdCAieSIgdHJvbmcgYuG6o25nIGThu68gbGnhu4d1KS4NCiAtIEPhu5l0ICJuIjogQ2jhu6lhIHPhu5EgbMaw4bujbmcgKHPhu5EgbOG6p24geHXhuqV0IGhp4buHbikgY+G7p2EgbeG7l2kgY+G6t3AgZ2nDoSB0cuG7iyAiY24iIHbDoCAieSIuDQogLSBD4buZdCAic3VtX29mX3B1MTUiOiBDaOG7qWEgdOG7lW5nIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgInB1MTUiIGNobyBt4buXaSBj4bq3cCBnacOhIHRy4buLICJjbiIgdsOgICJ5Ig0KDQpgYGB7cn0NCmg1IDwtIGgxICU+JSBncm91cF9ieShjbix5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCksc3VtX29mX3B1MTUgPSBzdW0ocHUxNSksLmdyb3VwcyA9ICdkcm9wJykNCnN0cihoNSkNCmBgYA0KIyAqKk5oaeG7h20gduG7pSAzLjIqKg0KDQotIENo4buNbiBi4buZIGThu68gbGnhu4d1IENo4buJIHPhu5EgcGjDoXQgdHJp4buDbiBjb24gbmfGsOG7nWkgMTk5MCAtIDIwMjEgKGh1bWFuLWRldmVsb3BtZW50LWluZGV4LmNzdikuDQoNCiMjIEdp4bubaSB0aGnhu4d1OiANCg0KTmhp4buHbSB24bulIDMuMiB0aeG6v24gaMOgbmggdGhhbyB0w6FjIDEgc+G7kSBs4buHbmggY8ahIGLhuqNuIHRyw6puIGRhdGFzZXQg4oCcaHVtYW4tZGV2ZWxvcG1lbnQtaW5kZXguY3N24oCdLiBDaOG7iSBz4buRIFBow6F0IHRyaeG7g24gQ29uIG5nxrDhu51pIChIREkpIGzDoCB0aMaw4bubYyDEkW8gdMOzbSB04bqvdCBjw6FjIGtow61hIGPhuqFuaCBjaMOtbmggY+G7p2Egc+G7sSBwaMOhdCB0cmnhu4NuIGNvbiBuZ8aw4budaTogY3Xhu5ljIHPhu5FuZyBsw6J1IGTDoGkgdsOgIGto4buPZSBt4bqhbmgsIG7hu4FuIGdpw6FvIGThu6VjIHThu5F0IHbDoCBt4bupYyBz4buRbmcgdOG7kXQuIEdpw6EgdHLhu4sgY2FvIGjGoW4gY2hvIHRo4bqleSBz4buxIHBow6F0IHRyaeG7g24gY29uIG5nxrDhu51pIGNhbyBoxqFuLg0KDQojIyBNw7QgdOG6oyBjxqEgYuG6o24gZGF0YXNldHMNCg0KLSBMw6AgbeG7mXQgZGF0YSBmcmFtZQ0KLSBDw7MgMjQgY+G7mXQgdMawxqFuZyDhu6luZyB24bubaSAyNCBnacOhIHRy4buLDQotIEPDsyAxODI4OCBow6BuZyB0xrDGoW5nIOG7qW5nIHbhu5tpIDE4Mjg4IHF1YW4gc8OhdA0KLSBEYXRhc2V0IGtow7RuZyBjw7MgZOG7ryBsaeG7h3UgdHLhu5FuZyANCi0gS8O9IGhp4buHdSBjw6FjIGPhu5l0IGzDoDoNCiAgLSBFbml0eTogcXXhu5FjIGdpYQ0KICAtIENvZGU6IG3DoyBxdeG7kWMgZ2lhDQogIC0gWWVhcjogbsSDbSANCiAgLSBIdW1hbiBEZXZlbG9wbWVudCBJbmRleDogY2jhu4kgc+G7kSBwaMOhdCB0cmnhu4NuIGNvbiBuZ8aw4budaQ0KICANClRo4buxYyBoaeG7h24gdGhhbyB0w6FjIMSR4buNYyB2w6AgZ8OhbiBk4buvIGxp4buHdSB2w6BvIG3DoXkuIFNhdSB0aGFvIHTDoWMgbsOgeSB0aMOsIGThu68gbGnhu4d1IHThu6sgZmlsZSAiaHVtYW4tZGV2ZWxvcG1lbnQtaW5kZXguY3N2IiDEkcOjIMSRxrDhu6NjIGfDoW4gdsOgbyBkIG5oxrAgYsOqbiBkxrDhu5tpDQotIMSQ4buNYyBk4buvIGxp4buHdSB04burIGZpbGUgY3N2IHbDoCBnw6FuIHbDoG8gb2JqZWN0IGQNCmBgYHtyfQ0KZCA8LSByZWFkLmNzdignQzovVXNlcnMvYWRtaW4vRG93bmxvYWRzL2h1bWFuLWRldmVsb3BtZW50LWluZGV4LmNzdicsIGhlYWRlciA9IFQpDQoNCmBgYA0KDQotIEtp4buDbSB0cmEgeGVtICJkIiBjw7MgcGjhuqNpIGzDoCBkYXRhIGZyYW1lIGhheSBraMO0bmcsIG7hur91IMSRw7puZyB0aMOsIHRydWUgdsOgIG5nxrDhu6NjIGzhuqFpLiBWw6Aga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBsw6AgVFJVRSAtPiBkZCBsw6AgbeG7mXQgZGF0YWZyYW1lDQpgYGB7cn0NCmlzLmRhdGEuZnJhbWUoZCkgDQpgYGANCg0KLSBYw6FjIMSR4buLbmggc+G7kSBow6BuZywgc+G7kSBj4buZdCBj4bunYSBoIGTGsOG7m2kgZOG6oW5nIHZlY3RvLiBL4bq/dCBxdeG6oyB0cuG6oyB24buBIHRow6wgZCB0xrDGoW5nIOG7qW5nIGPDsyAxODI4OCBow6BuZyB2w6AgMjQgY+G7mXQNCmBgYHtyfQ0KZGltKGQpDQpgYGANCg0KLSBYw6FjIMSR4buLbmggc+G7kSDDtCB0cuG7kW5nIGPhu6dhIGQuIEvhur90IHF14bqjIHRy4bqjIHbhu4EgdMawxqFuZyDhu6luZyB24bubaSBkIGtow7RuZyBjw7Mgw7QgdHLhu5FuZyBuw6BvDQpgYGB7cn0NCnN1bShpcy5uYShkKSkNCmBgYA0KDQojIyBUaOG7kW5nIGvDqiBk4buvIGxp4buHdQ0KDQpYw6FjIMSR4buLbmggY8OhYyB0aMO0bmcgdGluIGPGoSBi4bqjbiB0cm9uZyBkDQpgYGB7cn0NCmxpYnJhcnkoc2tpbXIpDQpza2ltKGQpDQpgYGANClRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogbcO0IHThuqMgZGF0YXNldCBuw6B5IHRhIMSRxrDhu6NjIGvhur90IHF14bqjIGLDqm4gdHLDqm4sIMO9IG5naMSpYSBjw6FjIGPhu5l0IG5oxrAgc2F1Og0KDQogLSBuX21pc3Npbmc6IHPhu5Egw7QgZOG7ryBsaeG7h3UgYuG7iyBtaXNzKHRy4buRbmcpDQoNCiAtIGNvbXBsZXRlX3JhdGU6IHThu7cgbOG7hyDDtCBjw7MgZOG7ryBsaeG7h3UNCg0KIC0gbWVhbjogdHJ1bmcgYsOsbmgNCg0KIC0gc2Q6IMSR4buZIGzhu4djaCBjaHXhuqluDQoNCiAtIHAwOiBnacOhIHRy4buLIG5o4buPIG5o4bqldA0KDQogLSBwMjU6IFBow6JuIHbhu4sgdGjhu6kgbmjhuqV0DQoNCiAtIHA1MDogUGjDom4gduG7iyB0aOG7qSBoYWkgY8WpbmcgY2jDrW5oIGzDoCB0cnVuZyB24buLDQoNCiAtIHA3NTogcGjDom4gduG7iyB0aOG7qSBiYQ0KDQogLSBwMTAwOiBnacOhIHRy4buLIGzhu5tuIG5o4bqldA0KDQogLSBoaXN0OiBiaeG7g3UgxJHhu5MgSGlzdG9ncmFtDQogDQojIyDEkOG7lWkgdMOqbiBjw6FjIGPhu5l0IMSR4buDIHRoYW8gdMOhYw0KIA0KQ8OhYyBrw70gaGnhu4d1IHTDqm4gdMawxqFuZyDhu6luZyB0aGVvIHRo4bupIHThu7EgbOG6p24gbMaw4bujdCB04burIGPhu5l0IDEgxJHhur9uIGPhu5l0IDQNCg0KICAtIEVuaXR5OiBxdeG7kWMgZ2lhIC0+IMSR4buVaSB0w6puIHRow6BuaCBFDQogDQogIC0gQ29kZTogbcOjIHF14buRYyBnaWEgLT4gxJHhu5VpIHTDqm4gdGjDoG5oIEMNCiAgDQogIC0gWWVhcjogbsSDbSAtPiDEkeG7lWkgdMOqbiB0aMOgbmggWQ0KICANCiAgLSBIdW1hbiBEZXZlbG9wbWVudCBJbmRleDogY2jhu4kgc+G7kSBwaMOhdCB0cmnhu4NuIGNvbiBuZ8aw4budaSAtPiDEkeG7lWkgdMOqbiB0aMOgbmggSERJDQpgYGB7cn0NCm5hbWVzKGQpID0gYygnRScsJ0MnLCdZJywnSERJJykNCm5hbWVzKGQpDQpgYGANCiAgDQojIyBSw7p0IHRyw61jaCBk4buvIGxp4buHdQ0KDQpWaeG7h2MgcsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgdGhlbyDDvSBtdeG7kW4gY8WpbmcgbmjGsCBwaOG6p24gZOG7ryBsaeG7h3UgxJHGsOG7o2MgcsO6dCBz4bq9IGdpw7pwIHZp4buHYyB0w6xtIGhp4buDdSB0cuG7nyBuw6puIHThu5FpIMawdSBoxqFuLCDEkeG7gyBjaOG6r2MgY2jhuq9uIMSRw6MgcsO6dCB0csOtY2ggdGjDoG5oIGPDtG5nIHRhIGTDuW5nIGzhu4duaCBzdHIoeCkgduG7m2kgeCBsw6AgdMOqbiBvYmplY3QgbcOgIHRhIGfDoW4gZOG7ryBsaeG7h3UgxJHhu4MgY8OzIHRo4buDIHhlbSBjw6FjIMSR4buRaSB0xrDhu6NuZyB2w6Agc+G7kSBsxrDhu6NuZyBj4bunYSBiaeG6v24gY+G7p2EgeA0KDQpDaOG7jW4gcmEgMiBj4buZdCB0xrDGoW5nIOG7qW5nIGzDoCAiRSIsIkhESSIgdsOgIGNo4buNbiBuaOG7r25nIGjDoG5nIGLhuq90IMSR4bqndSBi4bqxbmcgY2jhu68gIkQiIGfDoW4gdsOgbyBvYmplY3QgZDEuIEvhur90IHF14bqjIHRy4bqjIHbhu4EgbMOgIGQxIGfhu5NtIGPDsyAyIGPhu5l0IHbDoCAzNDMgZ2nDoSB0cuG7iw0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KZDEgPC0gc2VsZWN0KGQsRSxIREkpICU+JSBmaWx0ZXIoc3RyX2RldGVjdChFLCAiXkEiKSkNCnN0cihkMSkNCmBgYA0KICANCiMjIE3DoyBob8OhIGThu68gbGnhu4d1DQoNCkPDonUgbOG7h25oIGJp4buDdSB0aOG7iyBt4buZdCDEkWnhu4F1IGtp4buHbiBzbyBzw6FuaCB0csOqbiBj4buZdCBIREkgY+G7p2EgYuG6o25nIGThu68gbGnhu4d1IGQxLiBD4bulIHRo4buDOg0KDQogLSBO4bq/dSBnacOhIHRy4buLIHRyb25nIGPhu5l0IEhESSBj4bunYSBow6BuZyBuw6BvIMSRw7MgbOG7m24gaMahbiAwLjUgKGQxJEhESSA+IDAuNSksIHRow6wgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBIREkgdHJvbmcgaMOgbmcgxJHDsyBz4bq9IMSRxrDhu6NjIHRoYXkgdGjhur8gYuG6sW5nIGNodeG7l2kgJ0NhbycuDQogLSBO4bq/dSBnacOhIHRy4buLIHRyb25nIGPhu5l0IEhESSBj4bunYSBow6BuZyBuw6BvIMSRw7Mgbmjhu48gaMahbiAwLjUgKGQxJEhESSA+IDApLCB0aMOsIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgSERJIHRyb25nIGjDoG5nIMSRw7Mgc+G6vSDEkcaw4bujYyB0aGF5IHRo4bq/IGLhurFuZyBjaHXhu5dpICdUaOG6pXAnDQoNCmBgYHtyfQ0KZDEkSERJLnBoYW5sb2FpIDwtIGlmZWxzZShkMSRIREkgPiAwLjUsICdDYW8nLCAnVGjhuqVwJykNCnN0cihkMSkNCmBgYA0KDQpM4buHbmggZDEkSERJLmN1dCA8LSBjdXQoZDEkSERJLCAyLCBsYWJlbHMgPSBjKCdwaMOhdCB0cmnhu4NuJywgJ2tow7RuZyBwaMOhdCB0cmnhu4NuJykgdHJvbmcgUiDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBt4buZdCBiaeG6v24gbeG7m2kgKEhESS5jdXQpIHRyb25nIGLhuqNuZyBk4buvIGxp4buHdSBkMSBi4bqxbmcgY8OhY2ggY2hpYSBiaeG6v24gaGnhu4duIHThuqFpIEhESSB0aMOgbmggY8OhYyBraG/huqNuZyB2w6AgZ+G6r24gdMOqbiBjaG8gbeG7l2kga2hv4bqjbmcgZOG7sWEgdHLDqm4gZ2nDoSB0cuG7iyBj4bunYSBuw7MuIEPhu6UgdGjhu4M6DQoNCiAtIGQxJEhESSBsw6AgYmnhur9uIGLhuqFuIMSRYW5nIG114buRbiBjaGlhIHRow6BuaCBjw6FjIGtob+G6o25nLg0KIA0KIC0gMiBsw6Agc+G7kSBsxrDhu6NuZyBraG/huqNuZyBi4bqhbiBtdeG7kW4gdOG6oW8uDQogDQogLSBsYWJlbHMgPSBjKCdwaMOhdCB0cmnhu4NuJywgJ2tow7RuZyBwaMOhdCB0cmnhu4NuJykgbMOgIG5ow6NuIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kga2hv4bqjbmcuDQoNCkvhur90IHF14bqjIGzDoCwgYmnhur9uIG3hu5tpIEhESS5jdXQgc+G6vSBjaOG7qWEgY8OhYyB0w6puIHTGsMahbmcg4bupbmcgduG7m2kga2hv4bqjbmcgbcOgIGdpw6EgdHLhu4sgY+G7p2EgSERJIHRodeG7mWMgdsOgby4gTsOzIHThuqFvIHJhIG3hu5l0IGJp4bq/biBwaMOibiBsb+G6oWkgZOG7sWEgdHLDqm4gZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gc+G7kSBIREkuDQoNCmBgYHtyfQ0KZDEkSERJLmN1dCA8LSBjdXQoZDEkSERJLDIsbGFiZWxzID0gYygncGjDoXQgdHJp4buDbicsICdraMO0bmcgcGjDoXQgdHJp4buDbicpKQ0Kc3RyKGQxKQ0KYGBgDQoNCiMjIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgMSBiaeG6v24qKg0KDQogLSBC4bqjbmcgdOG6p24gc+G7kSBjw7MgMTIgcXXhu5FjIGdpYSAoMWQpLCDEkcaw4bujYyDEkcOhbmggc+G7kSB04burIDEgxJHhur9uIDEyLCB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5dpIHF14buRYyBnaWEgDQoNCiAtIFPhu5EgbOG6p24geHXhuqV0IGhp4buHbiDhu58gbeG7l2kgcXXhu5FjIGdpYSBsw6AgMzIsIG5nb+G6oWkgdHLhu6sgQW5kb3JyYSBsw6AgMjIsIEFuZ29sYSBsw6AgMjMsIEFudGlndWEgYW5kIEJhcmJ1ZGEgbMOgIDE1DQoNCiAtIEF0dHJpYnVlICJkaW1uYW1lcyIgbcO0IHThuqMgY8OhYyB0w6puIGPhu6dhIG3hu5dpIHF14buRYyBnaWEsIHbDoCBjaMO6bmcgxJHGsOG7o2MgaGnhu4NuIHRo4buLIGTGsOG7m2kgZOG6oW5nIGNo4buvLCB2w60gZOG7pTogIkFmZ2hhbmlzdGFuIiwgIkFsYmFuaWEiLCAiQWxnZXJpYSIsIC4uLg0KDQpgYGB7cn0NCmQyIDwtIHRhYmxlKGQxJEUpDQpzdHIoZDIpDQpgYGANCg0KIyMgVMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyANCg0KRMO5bmcgYuG6o25nIGThu68gbGnhu4d1IGggxJHhu4MgcGjDom4gdMOtY2ggY2hpIHRp4bq/dCBuaOG6pXQgY+G7p2EgYuG6o25nIGThu68gbGnhu4d1DQpgYGB7cn0NCnN1bW1hcnkoZCRIREkpDQpgYGANCi0gTWVhbiBsw6Agc+G7kSB0cnVuZyBiw6xuaCBoYXkgbMOgIG3hu5l0IMSRaeG7g20gZ2nhu69hIGPhu6dhIG3hu5l0IHThuq1wIGjhu6NwLyDEkeG7kWkgdMaw4bujbmcgxJHGsOG7o2MgecOqdSBj4bqndQ0KDQotIE1lZGlhbiBsw6Agc8O0IHRydW5nIHbhu4sgdHJ1bmcgYsOsbmgg4bufIGNo4buXIG7DsyBjaGlhIMSR4buRaSB0xrDhu6NuZyByYSBsw6BtIMSRw7RpIHbDoCBjaMawYSBjaOG6r2MgMiBiw6puIMSRw7Mgc+G6vSBjw6JuIGLhurFuZyBuaGF1KQ0KDQotIE5nb8OgaSByYSBjw7JuIGPDsyDEkeG6t2MgdHLGsG5nIGtow6FjIDogTWF4IC0gZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQsIE1pbiAtIGdpw6EgdHLhu4sgbmjhu48gbmjhuqV0LCAxc3QgUXUuLDNyZCBRdS4gLSBwaMOibiB24buLIHRo4bupIDEsIHRo4bupIDMs4oCmLg0KDQoqKk1lYW4qKg0KLSBUw61uaCBjaOG7iSBz4buRIHBow6F0IHRyaeG7g24gdHJ1bmcgYsOsbmggIA0KLSBr4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgYsOqbiBkxrDhu5tpZMaw4bubaSANCg0KYGBge3J9DQptZWFuKGQkSERJLG5hLnJtID0gVCkNCmBgYA0KKipNZWRpYW4qKg0KLSB0w61uaCB0cnVuZyB24buLIGPhu6dhIGNo4buJIHPhu5EgcGjDoXQgdHJp4buDbiBjb24gbmfGsOG7nWkgKEhESSkNCi0ga+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIGPDsyBt4buZdCBu4butYSBs4bubbiBoxqFuIDAuNjg5IHbDoCBt4buZdCBu4butYSBjw7JuIGzhuqFpIG5o4buPIGjGoW4gMC42ODkNCmBgYHtyfQ0KbWVkaWFuKGQkSERJKQ0KYGBgDQoNCiMjIFBow6JuIHTDrWNoIGThu68gbGnhu4d1IHRoZW8gcXXhu5FjIGdpYSB2w6AgY2jhu4kgc+G7kSBwaMOhdCB0cmnhu4NuIGNvbiBuZ8aw4budaSANCg0KKipQaMOibiB0w61jaCBkw6JuIHPhu5EgY2jhu4kgc+G7kSBwaMOhdCB0cmnhu4NuIHRydW5nIGLDrG5oIHRoZW8gdOG7q25nIG5ow7NtIHF14buRYyBnaWEqKg0KTOG7h25oIGQzIDwtIGQxICU+JSBncm91cF9ieShFKSAlPiUgc3VtbWFyaXNlKG1lYW5fb2ZfSERJID0gbWVhbihIREkpKSB0cm9uZyBSIHPhu60gZOG7pW5nIGfDs2kgZHBseXIgxJHhu4MgdGjhu7FjIGhp4buHbiBt4buZdCBwaMOpcCB04buVbmcgaOG7o3AgZOG7ryBsaeG7h3UgdHLDqm4gY+G7mXQgIkhESSIgY+G7p2EgYuG6o25nIGThu68gbGnhu4d1ICJkMSIgdGhlbyBuaMOzbSAiRSIuIETGsOG7m2kgxJHDonkgbMOgIGdp4bqjaSB0aMOtY2ggY2hpIHRp4bq/dDoNCg0KIC0gZ3JvdXBfYnkoeSk6IE5ow7NtIGThu68gbGnhu4d1IHRoZW8gY+G7mXQgInkiLiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgY8OhYyBwaMOpcCB04buVbmcgaOG7o3AgdGnhur9wIHRoZW8gc+G6vSDEkcaw4bujYyB0aOG7sWMgaGnhu4duIGNobyB04burbmcgbmjDs20gInkiIHJpw6puZyBiaeG7h3QuDQoNCiAtIHN1bW1hcmlzZShtZWFuX29mX3BvcHVsYXRpb24gPSBtZWFuKHApKTogVMOtbmggdHJ1bmcgYsOsbmggY+G7p2EgY+G7mXQgInAiIGNobyBt4buXaSBuaMOzbSAiSERJIiB2w6AgdOG6oW8gcmEgbeG7mXQgY+G7mXQgbeG7m2kgY8OzIHTDqm4gIm1lYW5fb2ZfSERJIiDEkeG7gyBsxrB1IHRy4buvIGvhur90IHF14bqjLg0KIA0KS+G6v3QgcXXhuqMgdHLhuqMgduG7gToNCg0KIC0gQ+G7mXQgIkhESSI6IENo4bupYSB0w6puIHF14buRYyBnaWEgKGPhu5l0ICJIREkiIHRyb25nIGLhuqNuZyBk4buvIGxp4buHdSkuDQogDQogLSBD4buZdCAibWVhbl9vZl9IREkiIGNo4bupYSBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGPhu5l0ICJwIiBjaG8gdOG7q25nIG7Eg20uDQogDQpgYGB7cn0NCmQzIDwtIGQxICU+JSBncm91cF9ieShFKSAlPiUgc3VtbWFyaXNlKG1lYW5fb2ZfSERJID0gbWVhbihIREkpKQ0Kc3RyKGQzKQ0KYGBgDQoNCg0KDQoNCg==