Nhiệm vụ 3.1
Nhiệm vụ 3.1 yêu cầu thực hiện các thao tác đã học trên bộ dữ liệu
population-and-demography
1. Mô tả bộ dữ liệu
population-and-demography
Các thông tin cơ bản về bộ dữ liệu
- Bộ dư liệu cung cấp thông tin về Dân số và Nhân khẩu
học của các quốc gia theo các năm và từng độ tuổi
Đọc bộ dữ liệu
population-and-demography là file
csv, nên ta đọc từ file csv
Thao tác thực hiện : Ta gán bộ dữ liệu
population-and-demography với tên là
pp
pp <- read.csv(file.choose(), header = T)
Các thông tin tổng quan về bộ dữ liệu
Số quan sát và số biến
Bộ dữ liệu pp bao gồm 18288 obs (quan
sát) và 24 variables (biến)
Có thể biết được số quan sát và số biến thông qua
lệnh dim*, kết quả trả về gồm 2 giá trị số
dim(pp)
## [1] 18288 24
Độ dài
Độ dài của bộ dữ liệu pp là
24
Có thể biết được độ dài hay cũng có thể là
số biến thông qua lệnh
length, kết quả trả về giá trị số
- Với bộ dữ liệu, kết quả là 24 - nghĩa là
bộ dữ liệu có 24 biến (cột)
length(pp)
## [1] 24
Một số thông tin khác của bộ dữ liệu pp
- skim - cho biết thêm các thông tin khác về bộ dữ
liệu
Các thông tin được biết như : số lỗ hỏng/ bỏ trống
(n_missing), số trung bình (mean), độ lệch chuẩn (sd) ,…
Có thể xem thêm các thông tin khác bên dưới :
library(skimr)
skim(pp)
Data summary
| Name |
pp |
| Number of rows |
18288 |
| Number of columns |
24 |
| _______________________ |
|
| Column type frequency: |
|
| character |
1 |
| numeric |
23 |
| ________________________ |
|
| Group variables |
None |
Variable type: character
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 |
▇▁▁▁▁ |
Tên cụ thể của các biến
names(pp)
## [1] "Country"
## [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"
Đổi tên các biến
Với bộ dữ liệu pp, tên của các biến được đặt để
người đọc của thể hiểu rõ về thông tin dân số cụ thể của từng độ tuổi,
nhưng độ dài trong mỗi tên cũng gây khó khăn và mất thời gian trong việc
rút trích dữ liệu
Thông qua lệnh names - giúp đổi
tên các biến, từ đó dữ liệu trở nên ngắn gọn, dễ dàng thao tác
và tiết kiệm thời gian
Với bộ dữ liệu pp ta tiến hành đổi :
names(pp) <- c('ten','year','popu','un1','un5','un15','un25','15to64','old15','old18','at1','a1to4','a5to9','a10to14','a15to19','a20to29','a30to39','a40to49','a50to59','a60to69','a70to79','a80to89','a90to99','old100')
names(pp)
## [1] "ten" "year" "popu" "un1" "un5" "un15" "un25"
## [8] "15to64" "old15" "old18" "at1" "a1to4" "a5to9" "a10to14"
## [15] "a15to19" "a20to29" "a30to39" "a40to49" "a50to59" "a60to69" "a70to79"
## [22] "a80to89" "a90to99" "old100"
2. Phân tích các quốc gia, các độ tuổi và tổng dân
số
Trong bộ dữ liệu pp, cung cấp rất nhiều thông tin
của nhiều quốc gia và vùng lãnh thổ trên thế giới về dân số và nhân khẩu
học của nước đó. Ta có thể tiến hành một trong số đó để tiến hành phân
tích
Ta chọn 6 trong số các quốc gia và vùng lãnh thổ
có trong bộ dữ liệu để phân tích, 6 quốc gia được chọn thuộc khu vực**
East Asia - Đông Á ,trong đó gồm :
1. China - Trung Quốc
2. Hong Kong - Hồng Kong
3. Taiwan - Đài Loan
4. South Korea - Hàn Quốc
5. North Korea - Triều Tiên
6. Japan - Nhật Bản
Trong bộ dữ liệu pp cũng đã tổng hợp số liệu về
tổng dân số cũng như số dân ở các độ tuổi khác nhau theo từng
năm (bắt đầu từ năm 1950 - đến năm 2021) của các quốc gia và
vùng lãnh thổ đã nêu trên
Ta tiến hành chọn 5 trong các mức độ tuổi đã có trong bộ dữ liệu,
5 mức độ tuổi gồm :
1. Population of children under the age of 15 - Dân
số về trẻ em dưới 15 tuổi
2. Population aged 20 to 29 years - Dân số độ tuổi
từ 20 - 29 tuổi
3. Population aged 50 to 59 years - Dân số độ tuổi
từ 50 - 59 tuổi
4. Population aged 80 to 89 years - Dân số độ tuổi
từ 80 - 89 tuổi
5. Population older than 100 years - Dân số trên 100
tuổi
Trung Quốc
Trung Quốc - quốc hiệu là Cộng hòa Nhân dân
Trung Hoa là một quốc gia nằm ở khu vực Đông Á. Là một trong hai quốc
gia tỷ dân và là quốc gia có số dân đông thứ 2 thế giới, nên ta sẽ phân
tích nó ở phần tổng dân số - population
Tổng dân số
Trước tiên trong 18,288 quan sát có trong bộ dữ liệu, sẽ có rất
nhiều quốc gia và vùng lãnh thổ khác nhau, hiện tại ta đang muốn phân
tích về dân số của Trung Quốc
Ta tiến hành kiểm tra trong 18288 quan sát, có bao nhiêu
quan sát của của Trung Quốc
CN <- pp
CN$ten.Coded <- ifelse(CN$ten == 'China', 'Trung Quốc', 'Nước khác')
table(CN$ten.Coded)
##
## Nước khác Trung Quốc
## 18216 72
Kết quả thu được có 72 quan sát là của Trung Quốc,
18,216 quan sát là của quốc gia khác trong bộ dữ liệu
pp
Và không chỉ riêng Trung Quốc, mỗi quốc gia khác đều có số liệu tính
trong 72 năm (1950-2021)
Thông tin cung cấp của bộ dữ liệu pp là của
nhiều quốc gia, nên ta tiến hành lọc các thông tin/ quan sát của
China - Trung Quốc để phân tích được thuận tiện
hơn
Sau đó, ta tiếp tục tiến hành xem xét trong hơn 72 năm
(1950-2021), với mệnh danh là đất nước tỷ dân - Trung Quốc đã có
bao nhiêu năm có tổng số dân vượt quá 1 tỷ người
China <- CN[CN$ten == 'China',]
CN1 <- China
CN1$popu.Coded1 <- ifelse(CN1$popu >= 1000000000, 'More1B', 'Under1B')
table(CN1$popu.Coded1)
##
## More1B Under1B
## 40 32
Với dữ liệu đã lọc/ rút tríc từ dữ liệu gốc, ta có 1 bộ dữ liệu mang
tên China - bao gồm 72 obs quan sát, 26
variables biến
Và trong 72 năm (1950-2021), Trung Quốc đã có 40 năm hơn 1 tỷ
dân - More1B và 32 năm dưới 1 tỷ dân -
Under1B
Đài Loan Taiwan - Hong Kong
Đài Loan là đảo quốc và là một quốc gia có
chủ quyền thuộc khu vực Đông Á
Hong Kong là một vùng đô thị đặc biệt, cũng
như một trong hai đặc khu hành chính của Cộng hòa Nhân dân Trung Hoa
(cùng với Ma Cao)
Dân số của Đài Loan - Taiwan và Hong Kong sẽ có
phần khiêm tốn hơn so với đất nước tỷ dân Trung Quốc và cả trên thế
giới. Mặc dù vậy, nhưng quốc gia và vùng lãnh thổ này lại có nền kinh tế
không hề khiêm tốn như vậy
Với 2 quốc gia/vùng lãnh thổ đặc biệt này, ta sẽ tiến hành phân
tích Dân số dưới 15 tuổi
Dân số dưới 15 tuổi - Population of children under the age
of 15
- Ta sẽ tiến hành phân tích dân số dưới 15 tuổi - Population
of children under the age of 15 của Đài Loan và Hong Kong
TK <- pp
Taikong <- TK[TK$ten =='Taiwan' | TK$ten =='Hong Kong',]
table(cut(Taikong$un15,3))
##
## (5.89e+05,2.48e+06] (2.48e+06,4.36e+06] (4.36e+06,6.25e+06]
## 72 24 48
Taikong$un15.c <- cut(Taikong$un15,3, labels = c('Ít','Vừa','Nhiều'))
Đầu tiên ta tiến hành rút dữ liệu chỉ còn có biến của Đài Loan và
Hong Kong, dữ liệu đó mang tên TaiKong
Sau đó ta dùng lệnh cut để chia thông tin
dân số dưới 15 tuổi thành 3 khoảng, bao gồm :
Khoảng thứ nhất được gọi là Ít
với dân số khoảng 500 ngàn người - đến hơn 2 triệu
người
Khoảng thứ hai được gọi là Vừa
với dân số khoảng 2 triệu người - đến hơn 4 triệu
người
Khoảng thứ ba được gọi là Nhiều
với dân số khoảng 4 triệu người - đến hơn 6 triệu
người
Người ở đây là tổng dân số dưới 15 tuổi ở Hong
Kong và Taiwan
table(Taikong$un15.c)
##
## Ít Vừa Nhiều
## 72 24 48
table(Taikong$un15.c,Taikong$ten)
##
## Hong Kong Taiwan
## Ít 72 0
## Vừa 0 24
## Nhiều 0 48
Hàn Quốc và Triều Tiên
Hàn Quốc là một quốc gia ở Đông Á, cấu
thành nửa phía nam của bán đảo Triều Tiên và ngăn cách với Triều Tiên
qua Khu phi quân sự vĩ tuyến 38
Triều Tiên là một quốc gia cũng ở Đông Á
trên nửa phía Bắc của Bán đảo Triều Tiên, tách biệt với Hàn Quốc ở miền
Nam
Hàn Quốc và Triều Tiên luôn là 2 quốc gia làm tốn không ít giấy
mực của các tờ báo quốc tế không chỉ về mặt kinh tế, quân sự, dân
số,….
Với bài phân tích hiện tại, ta sẽ phân tích về dân số của 2 quốc
gia này với 2 độ tuổi :
Dân số từ 20 - 29 tuổi - Population aged 20 to 29
years
KR <- pp
HanTrieu <- KR[KR$ten =='North Korea' | KR$ten =='South Korea',]
table(cut(HanTrieu$a20to29,3))
##
## (1.64e+06,4.1e+06] (4.1e+06,6.56e+06] (6.56e+06,9.02e+06]
## 72 28 44
HanTrieu$a20to29.c <- cut(HanTrieu$a20to29,3, labels = c('Còn ít','Trung bình','Nhiều'))
table(HanTrieu$a20to29.c,HanTrieu$ten)
##
## North Korea South Korea
## Còn ít 63 9
## Trung bình 9 19
## Nhiều 0 44
Sau đó ta tiến hành lập bảng tần số cho khoảng
mà ta đã chia ở phía trên, và thu được kết quả :
Triều tiên - North Korea có :
Hàn Quốc - South Korea có :
9 năm có số dân từ 20-29 tuổi rơi vào
khoảng Còn ít
19 năm có số dân từ 20-29 tuổi rơi vào
khoảng Trung bình
44 năm có số dân từ 20-29 tuổi rơi vào
khoảng Nhiều
Từ đó, ta có thể so sánh dễ dàng, số người trẻ ở Hàn Quốc nhiều hơn
hẳn so với Triều Tiên
Dân số từ 50 - 59 tuổi - Population aged 50 to 59
years
HanTrieu$a50to59.c <- cut(HanTrieu$a50to59,3)
table(cut(HanTrieu$a50to59,3))
##
## (5.51e+05,3.24e+06] (3.24e+06,5.91e+06] (5.91e+06,8.6e+06]
## 104 27 13
HanTrieu$a50to59.c <- cut(HanTrieu$a50to59,3, labels = c('Ít','Vừa','Đông'))
Với cách hiểu giống như độ tuổi 20-29, thì ở độ tuổi 50-59 cũng giống
như vậy
Ta cũng dùng lệnh cut để chia thông tin Dân
số từ 50 - 59 tuổi thành 3 khoảng Ít, Vừa,
Đông
table(HanTrieu$a50to59.c,HanTrieu$ten)
##
## North Korea South Korea
## Ít 66 38
## Vừa 6 21
## Đông 0 13
Kết Quả ta có thể thấy như phía trên - ta phân tích và đưa ra so sánh
tương tự như ở độ tuổi 20-29
Nhật Bản
Nhật Bản là một quốc gia và đảo quốc có chủ
quyền nằm ở khu vực Đông Á
Nhật Bản nổi tiếng với tuổi thọ cao nhất thế giới, vì họ có bí
quyết và chế độ ăn rất lành mạnh
Nên ta sẽ tiến hành phân tích Dân số của Nhật Bản trên
100 tuổi - Population older than 100 years
Dân số trên 100 tuổi - Population older than 100
years
Ngoài ra ta cũng sẽ tiến hành so sánh Nhật Bản so với các
nước trong khu vực Đông Á
Đấu tiên ta tiến hành rút dữ liệu của 6 quốc gia
khu vực Đông Á đã nêu trên, với tên DongA gồm
432 quan sát và 24 biến
EA <- pp
DongA <- EA[EA$ten == 'China'| EA$ten == 'Hong Kong'| EA$ten == 'Taiwan'| EA$ten =='North Korea'| EA$ten =='South Korea'| EA$ten =='Japan',]
Sau đó ta lại tiến hành cut/chia số dân có tuổi
trên 100 thành 4 khoảng
Khoảng thứ nhất : từ 0 - hơn 30 ngàn
người
Khoảng thứ hai : từ 30 ngàn - hơn 60 ngàn
người
Khoảng thứ ba : từ 60 ngàn - hơn 90 ngàn
người
Khoảng thứ tư : từ 90 ngàn - 100 ngàn
người
Khác với các bảng tần số phía trên, ta sẽ ghi số liệu
người cụ thể thay vì là Ít Vừa Nhiều như các
so sánh phía trên
DongA$old100.C <- cut(DongA$old100,4)
table(cut(DongA$old100,4))
##
## (-132,3.29e+04] (3.29e+04,6.59e+04] (6.59e+04,9.88e+04] (9.88e+04,1.32e+05]
## 411 9 6 6
DongA$old100.c <- cut(DongA$old100,4, labels = c('ít hơn 30k người','Từ 30k-60k người','Từ 60k-90k người','Từ 90k-100k người'))
table(DongA$old100.c,DongA$ten)
##
## China Hong Kong Japan North Korea South Korea Taiwan
## ít hơn 30k người 70 72 53 72 72 72
## Từ 30k-60k người 2 0 7 0 0 0
## Từ 60k-90k người 0 0 6 0 0 0
## Từ 90k-100k người 0 0 6 0 0 0
Kết quả cho ta thấy được sự khác biệt rõ rệt của Nhật Bản so với các
nước còn lại
Trong khi nhật bản có tới 12 năm có số dân trên
100 tuổi từ 60 ngàn tới 100 ngàn người, thì các nước
khác lại số năm lại bằng 0
Các nước khác như Hàn Quốc, Triều Tiên,… thì 72
năm, số dân trên 100 tuổi chỉ ít hơn 30 ngàn người
3. Tính toán các đặc trưng đo lường theo nhóm
Tóm tắt các giá trị đo lường
1. Mean - 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
2. Median - sô trung vị hay là một điểm trung tâm
trong một danh sách được sắp xếp tăng hoặc giảm dần (nó khác 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)
3. Variance - phương sai là phép đo mức chênh lệch
giữa các số liệu trong một tập dữ liệu được yêu cầu so với giá trị trung
bình
4. Standard deviation - Sd - độ lệch chuẩn là độ
lệch so với tiêu chuẩn, dữ liệu nào cũng sẽ có sai số nhất định. Nên nếu
sự chênh lệch không đáng kể thì độ lệch chuẩn cũng như tính biến động ở
mức thấp và ngược lại
5. 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,….
Ta sẽ đa số tiến hành tính toán 2 trong số các giá trị phía trên là
Mean và Med
Theo quốc gia
Ta tính các giá trị đặc trưng đo lường của tổng dân số của
Trung Quốc trong 72 năm
Summary - Bản tóm tắt các đặc trưng
Lệnh summary() như một bản tóm tắt các giá trị
đặc trưng đã nêu bên trên về một đối tượng nào đó mà ta yêu cầu, ta có
thể tính từng đặc trưng riêng hoặc có thể xem chỉ trong summary
Với lệnh summary(China$popu) - biểu thị các đặc
trưng về tổng dân số của Trung Quốc trong 72 năm, ta có
thể xem :
summary(China$popu)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 5.440e+08 7.755e+08 1.069e+09 1.036e+09 1.291e+09 1.426e+09
Kết quả có ý nghĩa như sau :
Min - Giá trị nhỏ nhất : Tổng dân số ít nhất của
Trung Quốc từng ghi nhận trong 72 năm là khoảng 543 triệu
người
1st Qu. - Phân vị thứ nhất :là con số chia tách
dữ liệu thành 2 phần bằng nhau, trong đó 25% dữ liệu thấp hơn và 75% dữ
liệu cao hơn số phân vị
Cụ thể - Số phân vị thứ nhất 775 triệu chia tách
tổng dân số TQ lúc này làm 2, trong đó :
25% tổng dân số sẽ thấp hơn 775 triệu người
75% tổng dân số sẽ cao hơn 775 triệu
Median - Trung vị : là khoảng 1,06
tỷ, nó giống tứ phân vị thứ nhất nhưng khác ở chỗ chia
tổng dân số làm 50%-50%
50% tổng dân số sẽ thấp hơn 1,06 tỷ
50% tổng dân số sẽ cao hơn 1,06 tỷ
Mean - Gía trị trung bình : là khoảng
1,03 tỷ, con số này là giá trị trung bình mỗi năm tổng
dân số Trung Quốc là khoảng 1,03 tỷ người
3rd Qu. - Phân vị thứ ba : là 1.03
tỷ, nó giống tứ phân vị thứ nhất nhưng khác ở chỗ chia
tổng dân số làm 75%-25%
Max - Gía trị lớn nhất : ổng dân số đông nhất
của Trung Quốc từng ghi nhận trong 72 năm là khoảng 1,4 tỷ
người
Theo nhóm quốc gia
Mean - Số trung bình
Ta sẽ tiến hành tính Tổng trung bình dân số của các
quốc gia tại Đông Á đã nêu trên trong 72 năm
Cụ thể tính trung bình tổng dân số của 6 nước Đông Á trong 72 năm
bằng lệnh mean(popu)
ten - là tên các quốc gia cụ thể
n - là số năm, kết quả của mỗi nước là
72, có nghĩa là tổng trung bình được tính trong
72 năm
meanofAE - là tên ta đặt cho lệnh
mean(popu), có nghĩa là trung bình dân số của quốc gia
Đông Á #### Mean - Số trung bình
Ta có thể xem tóm tắt trong bảng summary hoặc tính riêng bằng
lệnh mean()
Lệnh mean() cho biết số trung
bình của đối tượng được yêu cầu
Cụ thể tính trung bình tổng dân số của Trung Quốc trong 72 năm
bằng lệnh mean(China$popu)
Kết quả thu được là : 1,035,531,645
người
Ý nghĩa : trung bình mỗi năm tổng dân số ghi
nhận được của Trung Quốc là 1,035,531,645 người
mean(China$popu,na.rm = T)
## [1] 1035531645
Med - Số trung vị
median(China$popu)
## [1] 1069005250
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
trungbinhpp <- DongA %>% group_by(ten) %>% summarise(n = n(),meanofAE = mean(popu))
trungbinhpp
| China |
72 |
1035531645 |
| Hong Kong |
72 |
5244305 |
| Japan |
72 |
114649992 |
| North Korea |
72 |
18871336 |
| South Korea |
72 |
39063442 |
| Taiwan |
72 |
18042708 |
Med - Số trung vị
Ta sẽ tiến hành tính Trung vị của các quốc gia tại
Đông Á đã nêu trên trong 72 năm
trungviQG <- DongA %>% group_by(ten) %>% summarise(medTQ = median(un1))
trungviQG
| China |
20224508.0 |
| Hong Kong |
74874.0 |
| Japan |
1384374.0 |
| North Korea |
377300.5 |
| South Korea |
706925.0 |
| Taiwan |
337925.5 |
Theo thời gian - năm
Ta sẽ tiến hành tính trung bình tổng dân số của các
quốc gia tại Đông Á - cụ thể là 6 nước đã nêu trên tại năm
2004
Lệnh mean() cho biết số trung
bình của đối tượng được yêu cầu, ngoài ra ta có yêu cầu cụ thể
về năm cho lệnh group_by(year=2004) là năm
2004
Kết quả thu được tổng dân số trong năm 2004 của 6 quốc gia là
205,233,905 người
trungbinhtheonam <- DongA %>% group_by(year=2004) %>% summarise(meankhoang = mean(popu))
trungbinhtheonam
Nhiệm vụ 3.2
1. Tóm tắt
Bộ dữ liệu phân tích dân số của hơn 100 quốc gia qua các năm từ 1950
- 2021 theo từng độ tuổi, từ đó ta sẽ thấy được tốc độ gia tăng dân số,
sự già hóa dân số và các quốc gia có số dân đông nhất.
Chi tiết các biến có trong bộ dữ liệu:
Bộ dữ liệu có 18288 quan sát và 24 biến
- Country name (Na): Tên quốc gia
- Year (Y): năm
- Population: dân số
- Population of children under the age of 1 (U1): dân
số trẻ em dưới 1 tuổi
- Population of children under the age of 5 (U5): dân
số trẻ em dưới 5 tuổi
- Population of children under the age of 15 (U15):
dân số trẻ em dưới 15 tuổi
- Population under the age of 25 (U25): dân số dưới
25 tuổi
- Population aged 15 to 64 years (15T64): số dân từ
15 đến 64 tuổi
- Population older than 15 years (O15): dân số trên
15 tuổi
- Population older than 18 years (O18): dân số trên
18 tuổi
- Population at age 1 (1): dân số 1 tuổi
- Population aged 1 to 4 years (1T): dân số 1 đến 4
tuổi
- Population aged 5 to 9 years (5T9): dân số 5 đến 9
tuổi
- Population aged 10 to 14 years (10T14): dân số 10
đến 14 tuổi
- Population aged 15 to 19 years (15T19): dân số 15
đến 19 tuổi
- Population aged 20 to 29 years (20T9): dân số 20
đến 29 tuổi
- Population aged 30 to 39 years (30T39): dân số 30
đến 39 tuổi
- Population aged 40 to 49 years (40T49): dân số 40
đến 49 tuổi
- Population aged 50 to 59 years (50T59): dân số 50
đến 59 tuổi
- Population aged 60 to 69 years (60T69): dân số 60
đến 69 tuổi
- Population aged 70 to 79 years (70T79): dân số 70
đến 79 tuổi
- Population aged 80 to 89 years (80T89): dân số 80
đến 89 tuổi
- Population aged 90 to 99 years (90T99): dân số 90
đến 99 tuổi
- Population older than 100 years (O100): dân số hơn
100 tuổi
na <- read.csv(file.choose(), header = T)
2. Phân tích dữ liệu
- Quan sát dữ liệu 5 quốc gia có số dân đông: China, India, United
States, Indonesia, Brazil từ năm 1951 - 2021 theo từng độ tuổi
(dưới 15 tuổi, dưới 25 tuổi, từ 15 đến 19 tuổi, từ 20 đến 29 tuổi, từ 30
đến 39 tuổi, từ 60 đến 69 tuối,từ 15 đến 64 tuổi, hơn 100 tuổi)
names(na) <- c('Na','Y','Pop','U1','U5','U15','U25','15T64','O15','O18','1','1T4','5T9','10T14','15T19','20T29','30T39','40T49','50T59','60T69','70T79','80T89','90T99','O100')
d <- na %>% filter(Na %in% c('China','India','United States', 'Indonesia', 'Brazil'))%>%select(Na,Y,Pop,U15,U25,'15T19','20T29','30T39','60T69','15T64','O100')
3. Giải thích
- Các số liệu này cung cấp thông tin về sự phân bố dân số theo các độ
tuổi khác nhau trong mỗi quốc gia. Chúng có thể được sử dụng để so sánh
mức độ tuổi trẻ, mức độ già, và sự phân bố dân số của các quốc gia khác
nhau.
4. Mã hóa dữ liệu
d2 <- d
- Thêm một cột Na.Code để chia China với 4 nước còn lại
d2$Na.Code <- ifelse(d2$Na == 'China','China','Not China')
- Thêm một cột Na.Code1 để chia năm thành thế kỷ 20 và thế kỷ 21
d2$Y.Code1 <- ifelse(d2$Y >= 2001,'TK21', 'TK20')
- Thêm một cột Pop.Code để chia dân số thành 3 nhóm: nhóm 1 với số dân
nhỏ hơn 100000000, nhóm 2 với số dân từ 100000000 đến 999999999 , nhóm 3
với số dân lớn hơn 1000000000
d2$Pop.Code <- case_when(d2$Pop < 100000000 ~ 'Nhóm 1', d2$Pop >= 100000000 & d2$Pop < 999999999 ~ 'Nhóm 2', d2$Pop >1000000000 ~ 'Nhóm 3')
- Thêm một cột O100.Code để phân loại người lớn tuổi trên 100 tuổi
thành 4 nhóm: nhóm 1 dưới 100, nhóm 2 từ 100 đến 999, nhóm 3 từ 1000 đến
9999, nhóm 4 lớn hơn 10000
d2$O100.Code <- case_when(d2$O100 < 100 ~ 'Nhóm 1', d2$O100 >= 100 & d2$O100 < 999 ~ 'Nhóm 2', d2$O100 >= 1000 & d2$O100 <9999 ~ 'Nhóm 3',d2$O100 >= 10000 ~ 'Nhóm 4')
Bảng số liệu mới mà ta nhận được sau khi mã
hóa
5. Bảng tần số
- Với tần suất xuất hiện 72 lần thì chúng ta thấy được bộ dữ liệu đang
phân tích dân số của các nước trong thời gian 72 năm
table(d$Na)
##
## Brazil China India Indonesia United States
## 72 72 72 72 72
- Lập bảng tần số về số người lớn tuổi có độ tuổi hơn 100 tuổi của 5
nước
Từ bảng tần số trên ta thấy người lớn tuổi ở nhóm số 2 có tần
số xuất hiện nhiều nhất. Trong đó ta thấy Indonesia có số dân thuộc nhóm
2 ở độ tuổi hơn 100 nhiều nhất, sau đó là Brazil.
6. Phân tích số liệu
Tính toán đặc trưng đo lường theo Brazil
Br <- d%>% filter(Na=='Brazil')
- Dân số trung bình ở độ tuổi dưới 15 tuổi
mean(Br$U15,na.rm = T)
## [1] 43998992
- Từ số liệu bên dưới ta thấy dân số thấp nhất của Brazil là 53955360,
cao nhất là 21326220
- Phân vị thứ nhất bằng 91075260
- Trung vị bằng 138213270
- Dân số trung bình lad 136542332
- Phân vị thứ ba bằng 183152472
summary(Br$Pop)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 53955360 91075260 138213270 136542332 183152472 214326220
- Tổng số người dân hơn 100 qua các năm
sum(Br$O100)
## [1] 38468
- Phương sai của các giá trị trong biến từ 15 đến 19
var(Br$'15T19')
## [1] 1.73329e+13
- Giá trị ở vị trí trung vị của các giá trị trong độ tuổi 15 đến
64
median(Br$'15T64')
## [1] 81616995
Tính toán đặc trưng đo lường theo nhóm quốc
gia
- Dân số trung bình theo nhóm quốc gia: Từ bảng số liệu ta thấy dân số
trung bình của China là cao nhất
moc <- d%>% group_by(Na) %>% summarise(n = n(),mean_of_Pop = mean(Pop))
moc
| Brazil |
72 |
136542333 |
| China |
72 |
1035531645 |
| India |
72 |
829637465 |
| Indonesia |
72 |
167585644 |
| United States |
72 |
241932229 |
- Tính trung vị theo nhóm quốc gia: Từ bảng số liệu ta thấy trung vị
của China là cao nhất
medoc <- d %>% group_by(Na) %>% summarise(med_of_Pop = median(Pop))
medoc
| Brazil |
138213270 |
| China |
1069005250 |
| India |
789060550 |
| Indonesia |
167463490 |
| United States |
236329480 |
- Tính dân số trung bình theo năm và quốc gia
moc2 <- d2%>% group_by(Na,Y.Code1) %>% summarise(n = n(),mean_of_Pop = mean(Pop),.groups = 'drop')
moc2
| Brazil |
TK20 |
51 |
111405843 |
| Brazil |
TK21 |
21 |
197588093 |
| China |
TK20 |
51 |
903556212 |
| China |
TK21 |
21 |
1356043410 |
| India |
TK20 |
51 |
655156644 |
| India |
TK21 |
21 |
1253376600 |
| Indonesia |
TK20 |
51 |
135039123 |
| Indonesia |
TK21 |
21 |
246627196 |
| United States |
TK20 |
51 |
212599363 |
| United States |
TK21 |
21 |
313169189 |
Từ bảng số liệu ta có một số kết luận sau:
TK 20 thì dân số trung bình của China là cao nhất TK 21 thì dân số
trung bình của China là cao nhất
Vậy China là nước có số dân cao nhất trong 5 nước
So sánh dân số 5 quốc gia ở 2 mốc thời gian 2000 và
2021
d5 <- d%>% filter(Y =="2000"| Y=='2021')%>% select(Na,Y,Pop)
Từ bảng số liệu trên ta thấy được dân số của 5 quốc gia đều tăng
mạnh, trong đó dân số của China và India có sự tăng trưởng
nhanh.
Trong năm 2000 Brazil là quốc gia có số dân thấp nhất so với 4
nước còn lại.
Trong năm 2021 Brazil là quốc gia có số dân thấp nhất.
Vậy từ đó tà thấy được China và India có sự tăng tưởng nhanh,
Brazil tăng tưởng còn chậm hơn so với 4 quốc gia còn lại.
LS0tDQp0aXRsZTogIk5oaeG7h20gVuG7pSAzIg0KYXV0aG9yOiAibmhoYW8iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgICBkZl9wcmludDoga2FibGUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQoNCiMgKipOaGnhu4dtIHbhu6UgMy4xKioNCg0KTmhp4buHbSB24bulIDMuMSB5w6p1IGPhuqd1IHRo4buxYyBoaeG7h24gY8OhYyB0aGFvIHTDoWMgxJHDoyBo4buNYyB0csOqbiBi4buZIGThu68gbGnhu4d1ICoqcG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeSoqDQoNCiMjIDEuIE3DtCB04bqjIGLhu5kgZOG7ryBsaeG7h3UgKioqcG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeSoqKg0KDQojIyMgQ8OhYyB0aMO0bmcgdGluIGPGoSBi4bqjbiB24buBIGLhu5kgZOG7ryBsaeG7h3UNCg0KLSBC4buZIGTGsCBsaeG7h3UgY3VuZyBj4bqlcCB0aMO0bmcgdGluIHbhu4EgKioqRMOibiBz4buRIHbDoCBOaMOibiBraOG6qXUgaOG7jWMqKiogY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRoZW8gY8OhYyBuxINtIHbDoCB04burbmcgxJHhu5kgdHXhu5VpDQoNCi0tLQ0KDQojIyMgKirEkOG7jWMgYuG7mSBk4buvIGxp4buHdSoqIA0KDQotICoqKnBvcHVsYXRpb24tYW5kLWRlbW9ncmFwaHkqKiogbMOgIGZpbGUgKipjc3YqKiwgbsOqbiB0YSDEkeG7jWMgdOG7qyBmaWxlIGNzdg0KDQotICoqVGhhbyB0w6FjIHRo4buxYyBoaeG7h24gOioqIFRhIGfDoW4gYuG7mSBk4buvIGxp4buHdSAqKipwb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5KioqIHbhu5tpIHTDqm4gbMOgICoqcHAqKg0KDQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnBwIDwtIHJlYWQuY3N2KGZpbGUuY2hvb3NlKCksIGhlYWRlciA9IFQpDQpgYGAgDQoNCi0tLQ0KDQojIyMgKipDw6FjIHRow7RuZyB0aW4gdOG7lW5nIHF1YW4gduG7gSBi4buZIGThu68gbGnhu4d1KioNCg0KIyMjIyAqKlPhu5EgcXVhbiBzw6F0IHbDoCBz4buRIGJp4bq/bioqDQoNCi0gQuG7mSBk4buvIGxp4buHdSAqKnBwKiogYmFvIGfhu5NtICoqMTgyODggb2JzIChxdWFuIHPDoXQpIHbDoCAyNCB2YXJpYWJsZXMgKGJp4bq/bikqKg0KDQotIEPDsyB0aOG7gyBiaeG6v3QgxJHGsOG7o2MgKipz4buRIHF1YW4gc8OhdCB2w6Agc+G7kSBiaeG6v24gdGjDtG5nIHF1YSBs4buHbmgqKiAqKmRpbSoqKiwga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBn4buTbSAyIGdpw6EgdHLhu4sgc+G7kQ0KDQogICAtIFPhu5EgMTgyODggxJHhuqFpIGRp4buHbiBjaG8gdOG7lW5nIHPhu5EgcXVhbiBzw6F0DQoNCiAgIC0gU+G7kSAyNCDEkeG6oWkgZGnhu4duIGNobyB04buRbmcgc+G7kSBiaeG6v24NCg0KYGBge3J9DQpkaW0ocHApDQpgYGANCg0KLS0tDQoNCiMjIyMgKirEkOG7mSBkw6BpKioNCg0KLSAqKsSQ4buZIGTDoGkqKiBj4bunYSBi4buZIGThu68gbGnhu4d1ICoqcHAqKiBsw6AgKioyNCoqIA0KDQotIEPDsyB0aOG7gyBiaeG6v3QgxJHGsOG7o2MgKirEkeG7mSBkw6BpKiogaGF5IGPFqW5nIGPDsyB0aOG7gyBsw6AgKipz4buRICpiaeG6v24qKiB0aMO0bmcgcXVhIGzhu4duaCAqKipsZW5ndGgqKiwga+G6v3QgcXXhuqMgdHLhuqMgduG7gSBnacOhIHRy4buLIHPhu5ENCg0KICAgLSBW4bubaSBi4buZIGThu68gbGnhu4d1LCBr4bq/dCBxdeG6oyBsw6AgKioqMjQqKiogLSBuZ2jEqWEgbMOgIGLhu5kgZOG7ryBsaeG7h3UgY8OzICoqMjQgYmnhur9uIChj4buZdCkqKg0KDQpgYGB7cn0NCmxlbmd0aChwcCkNCmBgYA0KDQotLS0NCg0KIyMjIyAqKk3hu5l0IHPhu5EgdGjDtG5nIHRpbiBraMOhYyBj4bunYSBi4buZIGThu68gbGnhu4d1IHBwKioNCg0KLSAqKnNraW0qKiAtIGNobyBiaeG6v3QgdGjDqm0gY8OhYyB0aMO0bmcgdGluIGtow6FjIHbhu4EgYuG7mSBk4buvIGxp4buHdSAgDQoNCkPDoWMgdGjDtG5nIHRpbiDEkcaw4bujYyBiaeG6v3QgbmjGsCA6ICoqKnPhu5EgbOG7lyBo4buPbmcvIGLhu48gdHLhu5FuZyAobl9taXNzaW5nKSwgc+G7kSB0cnVuZyBiw6xuaCAobWVhbiksIMSR4buZIGzhu4djaCBjaHXhuqluIChzZCkgLC4uLioqKg0KQ8OzIHRo4buDIHhlbSB0aMOqbSBjw6FjIHRow7RuZyB0aW4ga2jDoWMgYsOqbiBkxrDhu5tpIDoNCg0KYGBge3J9DQpsaWJyYXJ5KHNraW1yKQ0Kc2tpbShwcCkNCmBgYA0KDQoNCi0tLQ0KDQojIyMjICoqVMOqbiBj4bulIHRo4buDIGPhu6dhIGPDoWMgYmnhur9uKioNCg0KLSBC4buZIGThu68gbGnhu4d1ICoqcHAqKiBjw7MgKioyNCBiaeG6v24gdsOgIHTDqm4gdMawxqFuZyDhu6luZyoqIA0KDQotIEPDsyB0aOG7gyBiaeG6v3QgxJHGsOG7o2MgdMOqbiBj4bunYSB04burbmcgYmnhur9uIGPhu6UgdGjhu4MgdGjDtG5nIHF1YSBs4buHbmggKipuYW1lcyoqICANCg0KICAgLSBW4bubaSBi4buZIGThu68gbGnhu4d1LCBr4bq/dCBxdeG6oyBjw7MgKioqMjQgYmnhur9uKioqIHbhu5tpIGPDoWMgdMOqbiB0xrDGoW5nIOG7qW5nLCBj4bulIHRo4buDIG5oxrAgc2F1IDoNCg0KYGBge3J9DQpuYW1lcyhwcCkNCmBgYA0KDQotLS0NCg0KIyMjIyAqKsSQ4buVaSB0w6puIGPDoWMgYmnhur9uKioNCg0KLSBW4bubaSBi4buZIGThu68gbGnhu4d1ICoqcHAqKiwgdMOqbiBj4bunYSBjw6FjIGJp4bq/biDEkcaw4bujYyDEkeG6t3QgxJHhu4MgbmfGsOG7nWkgxJHhu41jIGPhu6dhIHRo4buDIGhp4buDdSByw7UgduG7gSB0aMO0bmcgdGluIGTDom4gc+G7kSBj4bulIHRo4buDIGPhu6dhIHThu6tuZyDEkeG7mSB0deG7lWksIG5oxrBuZyDEkeG7mSBkw6BpIHRyb25nIG3hu5dpIHTDqm4gY8WpbmcgZ8OieSBraMOzIGtoxINuIHbDoCBt4bqldCB0aOG7nWkgZ2lhbiB0cm9uZyB2aeG7h2MgcsO6dCB0csOtY2ggZOG7ryBsaeG7h3UNCg0KLSBUaMO0bmcgcXVhIGzhu4duaCAqKm5hbWVzKiogLSBnacO6cCAqKsSR4buVaSB0w6puKiogY8OhYyBiaeG6v24sIHThu6sgxJHDsyBk4buvIGxp4buHdSB0cuG7nyBuw6puIG5n4bqvbiBn4buNbiwgZOG7hSBkw6BuZyB0aGFvIHTDoWMgdsOgIHRp4bq/dCBraeG7h20gdGjhu51pIGdpYW4NCg0KLSBW4bubaSBi4buZIGThu68gbGnhu4d1ICoqcHAqKiB0YSB0aeG6v24gaMOgbmggxJHhu5VpIDogIA0KDQoNCmBgYHtyfQ0KbmFtZXMocHApIDwtIGMoJ3RlbicsJ3llYXInLCdwb3B1JywndW4xJywndW41JywndW4xNScsJ3VuMjUnLCcxNXRvNjQnLCdvbGQxNScsJ29sZDE4JywnYXQxJywnYTF0bzQnLCdhNXRvOScsJ2ExMHRvMTQnLCdhMTV0bzE5JywnYTIwdG8yOScsJ2EzMHRvMzknLCdhNDB0bzQ5JywnYTUwdG81OScsJ2E2MHRvNjknLCdhNzB0bzc5JywnYTgwdG84OScsJ2E5MHRvOTknLCdvbGQxMDAnKQ0KbmFtZXMocHApDQpgYGANCg0KDQoNCiMjICoqMi4gUGjDom4gdMOtY2ggY8OhYyBxdeG7kWMgZ2lhLCBjw6FjIMSR4buZIHR14buVaSB2w6AgdOG7lW5nIGTDom4gc+G7kSoqIA0KDQpUcm9uZyBi4buZIGThu68gbGnhu4d1ICoqcHAqKiwgY3VuZyBj4bqlcCBy4bqldCBuaGnhu4F1IHRow7RuZyB0aW4gY+G7p2Egbmhp4buBdSBxdeG7kWMgZ2lhIHbDoCB2w7luZyBsw6NuaCB0aOG7lSB0csOqbiB0aOG6vyBnaeG7m2kgduG7gSBkw6JuIHPhu5EgdsOgIG5ow6JuIGto4bqpdSBo4buNYyBj4bunYSBuxrDhu5tjIMSRw7MuIFRhIGPDsyB0aOG7gyB0aeG6v24gaMOgbmggbeG7mXQgdHJvbmcgc+G7kSDEkcOzIMSR4buDIHRp4bq/biBow6BuaCBwaMOibiB0w61jaA0KDQotIFRhIGNo4buNbiA2IHRyb25nIHPhu5EgY8OhYyAqKnF14buRYyBnaWEgdsOgIHbDuW5nIGzDo25oIHRo4buVKiogY8OzIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgxJHhu4MgcGjDom4gdMOtY2gsIDYgcXXhu5FjIGdpYSDEkcaw4bujYyBjaOG7jW4gdGh14buZYyBraHUgduG7sWMqKiAqKipFYXN0IEFzaWEgLSDEkMO0bmcgw4EqKiogLHRyb25nIMSRw7MgZ+G7k20gOiANCg0KICAgKioxLiBDaGluYSoqIC0gVHJ1bmcgUXXhu5FjDQogICANCiAgICoqMi4gSG9uZyBLb25nKiogLSBI4buTbmcgS29uZw0KICAgDQogICAqKjMuIFRhaXdhbioqIC0gxJDDoGkgTG9hbg0KICAgDQogICAqKjQuIFNvdXRoIEtvcmVhKiogLSBIw6BuIFF14buRYw0KICAgDQogICAqKjUuIE5vcnRoIEtvcmVhKiogLSBUcmnhu4F1IFRpw6puDQogICANCiAgICoqNi4gSmFwYW4qKiAtIE5o4bqtdCBC4bqjbg0KDQoNClRyb25nIGLhu5kgZOG7ryBsaeG7h3UgKipwcCoqIGPFqW5nIMSRw6MgdOG7lW5nIGjhu6NwIHPhu5EgbGnhu4d1IHbhu4EgKip04buVbmcgZMOibiBz4buRIGPFqW5nIG5oxrAgc+G7kSBkw6JuIOG7nyBjw6FjIMSR4buZIHR14buVaSBraMOhYyBuaGF1IHRoZW8gdOG7q25nIG7Eg20qKiAoYuG6r3QgxJHhuqd1IHThu6sgbsSDbSAxOTUwIC0gxJHhur9uIG7Eg20gMjAyMSkgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHbDoCB2w7luZyBsw6NuaCB0aOG7lSDEkcOjIG7DqnUgdHLDqm4NCg0KLSBUYSB0aeG6v24gaMOgbmggY2jhu41uIDUgdHJvbmcgY8OhYyBt4bupYyDEkeG7mSB0deG7lWkgxJHDoyBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdSwgKio1IG3hu6ljIMSR4buZIHR14buVaSoqIGfhu5NtIDogDQoNCiAgICoqMS4gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE1KiogLSBEw6JuIHPhu5EgduG7gSB0cuG6uyBlbSBkxrDhu5tpIDE1IHR14buVaQ0KICAgDQogICAqKjIuIFBvcHVsYXRpb24gYWdlZCAyMCB0byAyOSB5ZWFycyoqIC0gRMOibiBz4buRIMSR4buZIHR14buVaSB04burIDIwIC0gMjkgdHXhu5VpDQogICANCiAgICoqMy4gUG9wdWxhdGlvbiBhZ2VkIDUwIHRvIDU5IHllYXJzKiogLSBEw6JuIHPhu5EgxJHhu5kgdHXhu5VpIHThu6sgNTAgLSA1OSB0deG7lWkNCiAgIA0KICAgKio0LiBQb3B1bGF0aW9uIGFnZWQgODAgdG8gODkgeWVhcnMqKiAtIETDom4gc+G7kSDEkeG7mSB0deG7lWkgdOG7qyA4MCAtIDg5IHR14buVaQ0KICAgDQogICAqKjUuIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxMDAgeWVhcnMqKiAtIETDom4gc+G7kSB0csOqbiAxMDAgdHXhu5VpDQogICANCg0KIyMjICoqVHJ1bmcgUXXhu5FjKioNCg0KKioqVHJ1bmcgUXXhu5FjKioqIC0gcXXhu5FjIGhp4buHdSBsw6AgQ+G7mW5nIGjDsmEgTmjDom4gZMOibiBUcnVuZyBIb2EgbMOgIG3hu5l0IHF14buRYyBnaWEgbuG6sW0g4bufIGtodSB24buxYyDEkMO0bmcgw4EuIEzDoCBt4buZdCB0cm9uZyBoYWkgcXXhu5FjIGdpYSB04bu3IGTDom4gdsOgIGzDoCBxdeG7kWMgZ2lhIGPDsyBz4buRIGTDom4gxJHDtG5nIHRo4bupIDIgdGjhur8gZ2nhu5tpLCBuw6puIHRhIHPhur0gcGjDom4gdMOtY2ggbsOzIOG7nyBwaOG6p24gKip04buVbmcgZMOibiBz4buRIC0gcG9wdWxhdGlvbioqDQoNCiMjIyMgKipU4buVbmcgZMOibiBz4buRKioNCg0KLS0tDQoNCi0gVHLGsOG7m2MgdGnDqm4gdHJvbmcgMTgsMjg4IHF1YW4gc8OhdCBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdSwgc+G6vSBjw7MgcuG6pXQgbmhp4buBdSBxdeG7kWMgZ2lhIHbDoCB2w7luZyBsw6NuaCB0aOG7lSBraMOhYyBuaGF1LCBoaeG7h24gdOG6oWkgdGEgxJFhbmcgbXXhu5FuIHBow6JuIHTDrWNoIHbhu4EgZMOibiBz4buRIGPhu6dhIFRydW5nIFF14buRYw0KDQotIFRhIHRp4bq/biBow6BuaCBraeG7g20gdHJhIHRyb25nIDE4Mjg4IHF1YW4gc8OhdCwgKipjw7MgYmFvIG5oacOqdSBxdWFuIHPDoXQgY+G7p2EgY+G7p2EgVHJ1bmcgUXXhu5FjKiogDQoNCg0KYGBge3J9DQpDTiA8LSBwcA0KQ04kdGVuLkNvZGVkIDwtIGlmZWxzZShDTiR0ZW4gPT0gJ0NoaW5hJywgJ1RydW5nIFF14buRYycsICdOxrDhu5tjIGtow6FjJykNCnRhYmxlKENOJHRlbi5Db2RlZCkNCmBgYA0KDQpL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgY8OzICoqNzIgcXVhbiBzw6F0IGzDoCBj4bunYSBUcnVuZyBRdeG7kWMqKiwgKioxOCwyMTYgcXVhbiBzw6F0IGzDoCBj4bunYSBxdeG7kWMgZ2lhIGtow6FjKiogdHJvbmcgYuG7mSBk4buvIGxp4buHdSAqKnBwKioNCg0KVsOgIGtow7RuZyBjaOG7iSByacOqbmcgVHJ1bmcgUXXhu5FjLCBt4buXaSBxdeG7kWMgZ2lhIGtow6FjIMSR4buBdSBjw7Mgc+G7kSBsaeG7h3UgdMOtbmggdHJvbmcgNzIgbsSDbSAoMTk1MC0yMDIxKQ0KDQotLS0NCg0KLSBUaMO0bmcgdGluIGN1bmcgY+G6pXAgY+G7p2EgYuG7mSBk4buvIGxp4buHdSAqKnBwKiogbMOgIGPhu6dhIG5oaeG7gXUgcXXhu5FjIGdpYSwgbsOqbiB0YSB0aeG6v24gaMOgbmggbOG7jWMgY8OhYyB0aMO0bmcgdGluLyBxdWFuIHPDoXQgY+G7p2EgKipDaGluYSAtIFRydW5nIFF14buRYyoqIMSR4buDIHBow6JuIHTDrWNoIMSRxrDhu6NjIHRodeG6rW4gdGnhu4duIGjGoW4NCg0KLSBTYXUgxJHDsywgdGEgdGnhur9wIHThu6VjIHRp4bq/biBow6BuaCB4ZW0geMOpdCB0cm9uZyBoxqFuIDcyIG7Eg20gKDE5NTAtMjAyMSksIHbhu5tpIG3hu4duaCBkYW5oIGzDoCDEkeG6pXQgbsaw4bubYyB04bu3IGTDom4gLSAqKlRydW5nIFF14buRYyDEkcOjIGPDsyBiYW8gbmhpw6p1IG7Eg20gY8OzIHThu5VuZyBz4buRIGTDom4gdsaw4bujdCBxdcOhIDEgdOG7tyBuZ8aw4budaSoqDQoNCg0KYGBge3J9DQpDaGluYSA8LSBDTltDTiR0ZW4gPT0gJ0NoaW5hJyxdDQpDTjEgPC0gQ2hpbmENCg0KQ04xJHBvcHUuQ29kZWQxIDwtIGlmZWxzZShDTjEkcG9wdSA+PSAxMDAwMDAwMDAwLCAnTW9yZTFCJywgJ1VuZGVyMUInKQ0KdGFibGUoQ04xJHBvcHUuQ29kZWQxKQ0KYGBgDQoNClbhu5tpIGThu68gbGnhu4d1IMSRw6MgbOG7jWMvIHLDunQgdHLDrWMgdOG7qyBk4buvIGxp4buHdSBn4buRYywgdGEgY8OzIDEgYuG7mSBk4buvIGxp4buHdSBtYW5nIHTDqm4gKipDaGluYSoqIC0gYmFvIGfhu5NtICoqNzIgb2JzIHF1YW4gc8OhdCwgMjYgdmFyaWFibGVzIGJp4bq/bioqDQoNClbDoCB0cm9uZyA3MiBuxINtICgxOTUwLTIwMjEpLCBUcnVuZyBRdeG7kWMgxJHDoyBjw7MgKio0MCBuxINtIGjGoW4gMSB04bu3IGTDom4gLSBNb3JlMUIqKiB2w6AgKiozMiBuxINtIGTGsOG7m2kgMSB04bu3IGTDom4gLSBVbmRlcjFCKioNCg0KLS0tDQoNCiMjIyAqKsSQw6BpIExvYW4gVGFpd2FuIC0gSG9uZyBLb25nKioNCg0KKioqxJDDoGkgTG9hbioqKiBsw6AgxJHhuqNvIHF14buRYyB2w6AgbMOgIG3hu5l0IHF14buRYyBnaWEgY8OzIGNo4bunIHF1eeG7gW4gdGh14buZYyBraHUgduG7sWMgxJDDtG5nIMOBDQoNCioqKkhvbmcgS29uZyoqKiBsw6AgbeG7mXQgdsO5bmcgxJHDtCB0aOG7iyDEkeG6t2MgYmnhu4d0LCBjxaluZyBuaMawIG3hu5l0IHRyb25nIGhhaSDEkeG6t2Mga2h1IGjDoG5oIGNow61uaCBj4bunYSBD4buZbmcgaMOyYSBOaMOibiBkw6JuIFRydW5nIEhvYSAoY8O5bmcgduG7m2kgTWEgQ2FvKQ0KDQotIETDom4gc+G7kSBj4bunYSAqKsSQw6BpIExvYW4gLSBUYWl3YW4gdsOgIEhvbmcgS29uZyoqIHPhur0gY8OzIHBo4bqnbiBraGnDqm0gdOG7kW4gaMahbiBzbyB24bubaSDEkeG6pXQgbsaw4bubYyB04bu3IGTDom4gVHJ1bmcgUXXhu5FjIHbDoCBj4bqjIHRyw6puIHRo4bq/IGdp4bubaS4gTeG6t2MgZMO5IHbhuq15LCBuaMawbmcgcXXhu5FjIGdpYSB2w6AgdsO5bmcgbMOjbmggdGjhu5UgbsOgeSBs4bqhaSBjw7MgbuG7gW4ga2luaCB04bq/IGtow7RuZyBo4buBIGtoacOqbSB04buRbiBuaMawIHbhuq15DQoNCi0gVuG7m2kgMiBxdeG7kWMgZ2lhL3bDuW5nIGzDo25oIHRo4buVIMSR4bq3YyBiaeG7h3QgbsOgeSwgdGEgc+G6vSB0aeG6v24gaMOgbmggcGjDom4gdMOtY2ggKipEw6JuIHPhu5EgZMaw4bubaSAxNSB0deG7lWkqKg0KDQojIyMjICoqRMOibiBz4buRIGTGsOG7m2kgMTUgdHXhu5VpIC0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE1KioNCg0KLS0tDQoNCi0gVGEgc+G6vSB0aeG6v24gaMOgbmggcGjDom4gdMOtY2ggKipkw6JuIHPhu5EgZMaw4bubaSAxNSB0deG7lWkgLSBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgMTUqKiBj4bunYSDEkMOgaSBMb2FuIHbDoCBIb25nIEtvbmcgDQoNCg0KYGBge3J9DQpUSyA8LSBwcA0KVGFpa29uZyA8LSBUS1tUSyR0ZW4gPT0nVGFpd2FuJyB8IFRLJHRlbiA9PSdIb25nIEtvbmcnLF0NCg0KdGFibGUoY3V0KFRhaWtvbmckdW4xNSwzKSkNClRhaWtvbmckdW4xNS5jIDwtIGN1dChUYWlrb25nJHVuMTUsMywgbGFiZWxzID0gYygnw410JywnVuG7q2EnLCdOaGnhu4F1JykpDQoNCmBgYA0KDQoNCi0gxJDhuqd1IHRpw6puIHRhIHRp4bq/biBow6BuaCByw7p0IGThu68gbGnhu4d1IGNo4buJIGPDsm4gY8OzIGJp4bq/biBj4bunYSDEkMOgaSBMb2FuIHbDoCBIb25nIEtvbmcsIGThu68gbGnhu4d1IMSRw7MgbWFuZyB0w6puICoqVGFpS29uZyoqDQoNCi0gU2F1IMSRw7MgdGEgZMO5bmcgbOG7h25oICoqY3V0KiogxJHhu4MgY2hpYSB0aMO0bmcgdGluICoqZMOibiBz4buRIGTGsOG7m2kgMTUgdHXhu5VpKiogdGjDoG5oIDMga2hv4bqjbmcsIGJhbyBn4buTbSA6DQoNCiAgIC0gKipLaG/huqNuZyB0aOG7qSBuaOG6pXQqKiDEkcaw4bujYyBn4buNaSBsw6AgKirDjXQqKiB24bubaSBkw6JuIHPhu5Ega2hv4bqjbmcgKio1MDAgbmfDoG4gbmfGsOG7nWkgLSDEkeG6v24gaMahbiAyIHRyaeG7h3UgbmfGsOG7nWkqKg0KICAgDQogICAtICoqS2hv4bqjbmcgdGjhu6kgaGFpKiogxJHGsOG7o2MgZ+G7jWkgbMOgICoqVuG7q2EqKiB24bubaSBkw6JuIHPhu5Ega2hv4bqjbmcgKioyIHRyaeG7h3UgbmfGsOG7nWkgLSDEkeG6v24gaMahbiA0IHRyaeG7h3UgbmfGsOG7nWkqKg0KICAgDQogICAtICoqS2hv4bqjbmcgdGjhu6kgYmEqKiDEkcaw4bujYyBn4buNaSBsw6AgKipOaGnhu4F1KiogduG7m2kgZMOibiBz4buRIGtob+G6o25nICoqNCB0cmnhu4d1IG5nxrDhu51pIC0gxJHhur9uIGjGoW4gNiB0cmnhu4d1IG5nxrDhu51pKioNCiAgIA0KICAgLSBOZ8aw4budaSDhu58gxJHDonkgbMOgICoqdOG7lW5nIGTDom4gc+G7kSBkxrDhu5tpIDE1IHR14buVaSoqIOG7nyBIb25nIEtvbmcgdsOgIFRhaXdhbg0KDQoNCmBgYHtyfQ0KdGFibGUoVGFpa29uZyR1bjE1LmMpDQp0YWJsZShUYWlrb25nJHVuMTUuYyxUYWlrb25nJHRlbikNCmBgYA0KDQotIFNhdSDEkcOzIHRhIHRp4bq/biBow6BuaCAqKmzhuq1wIGLhuqNuZyB04bqnbiBz4buRKiogY2hvIGtob+G6o25nIG3DoCB0YSDEkcOjIGNoaWEg4bufIHBow61hIHRyw6puLCB2w6AgdGh1IMSRxrDhu6NjIGvhur90IHF14bqjIDoNCg0KICAgLSBIb25nIEtvbmcgY8OzICoqNzIgbsSDbSoqIGPDsyBz4buRIGTDom4gZMaw4bubaSAxNSB0deG7lWkgcsahaSB2w6BvIGtob+G6o25nICoqNTAwIG5nw6BuIG5nxrDhu51pIC0gxJHhur9uIGjGoW4gMiB0cmnhu4d1IG5nxrDhu51pKioNCiAgIA0KICAgLSDEkMOgaSBMb2FuIGPDsyAqKjI0IG7Eg20qKiBjw7Mgc+G7kSBkw6JuIGTGsOG7m2kgMTUgdHXhu5VpIHLGoWkgdsOgbyBraG/huqNuZyAqKjIgdHJp4buHdSBuZ8aw4budaSAtIMSR4bq/biBoxqFuIDQgdHJp4buHdSBuZ8aw4budaSoqIHbDoCAqKjQ4IG7Eg20qKiBjw7Mgc+G7kSBkw6JuIGTGsOG7m2kgMTUgdHXhu5VpIHLGoWkgdsOgbyBraG/huqNuZyAqKjQgdHJp4buHdSBuZ8aw4budaSAtIMSR4bq/biBoxqFuIDYgdHJp4buHdSBuZ8aw4budaSoqDQogICAgDQotLS0NCg0KIyMjICoqSMOgbiBRdeG7kWMgdsOgIFRyaeG7gXUgVGnDqm4qKg0KDQoqKipIw6BuIFF14buRYyoqKiBsw6AgbeG7mXQgcXXhu5FjIGdpYSDhu58gxJDDtG5nIMOBLCBj4bqldSB0aMOgbmggbuG7rWEgcGjDrWEgbmFtIGPhu6dhIGLDoW4gxJHhuqNvIFRyaeG7gXUgVGnDqm4gdsOgIG5nxINuIGPDoWNoIHbhu5tpIFRyaeG7gXUgVGnDqm4gcXVhIEtodSBwaGkgcXXDom4gc+G7sSB2xKkgdHV54bq/biAzOA0KDQoqKipUcmnhu4F1IFRpw6puKioqIGzDoCBt4buZdCBxdeG7kWMgZ2lhIGPFqW5nIOG7nyDEkMO0bmcgw4EgdHLDqm4gbuG7rWEgcGjDrWEgQuG6r2MgY+G7p2EgQsOhbiDEkeG6o28gVHJp4buBdSBUacOqbiwgdMOhY2ggYmnhu4d0IHbhu5tpIEjDoG4gUXXhu5FjIOG7nyBtaeG7gW4gTmFtDQoNCi0gSMOgbiBRdeG7kWMgdsOgIFRyaeG7gXUgVGnDqm4gbHXDtG4gbMOgIDIgcXXhu5FjIGdpYSBsw6BtIHThu5FuIGtow7RuZyDDrXQgZ2nhuqV5IG3hu7FjIGPhu6dhIGPDoWMgdOG7nSBiw6FvIHF14buRYyB04bq/IGtow7RuZyBjaOG7iSB24buBIG3hurd0IGtpbmggdOG6vywgcXXDom4gc+G7sSwgZMOibiBz4buRLC4uLi4gDQoNCi0gVuG7m2kgYsOgaSBwaMOibiB0w61jaCBoaeG7h24gdOG6oWksIHRhIHPhur0gcGjDom4gdMOtY2ggduG7gSBkw6JuIHPhu5EgY+G7p2EgMiBxdeG7kWMgZ2lhIG7DoHkgduG7m2kgKioyIMSR4buZIHR14buVaSoqIDogDQoNCiAgIC0gRMOibiBz4buRIHThu6sgKioyMCAtIDI5IHR14buVaSAoUG9wdWxhdGlvbiBhZ2VkIDIwIHRvIDI5IHllYXJzKSoqDQogICANCiAgIC0gRMOibiBz4buRIHThu6sgKio1MCAtIDU5IHR14buVaSAoUG9wdWxhdGlvbiBhZ2VkIDUwIHRvIDU5IHllYXJzKSoqDQogICANCi0tLQ0KDQojIyMjICoqRMOibiBz4buRIHThu6sgMjAgLSAyOSB0deG7lWkgLSBQb3B1bGF0aW9uIGFnZWQgMjAgdG8gMjkgeWVhcnMqKg0KDQpgYGB7cn0NCktSIDwtIHBwDQpIYW5UcmlldSA8LSBLUltLUiR0ZW4gPT0nTm9ydGggS29yZWEnIHwgS1IkdGVuID09J1NvdXRoIEtvcmVhJyxdDQp0YWJsZShjdXQoSGFuVHJpZXUkYTIwdG8yOSwzKSkNCkhhblRyaWV1JGEyMHRvMjkuYyA8LSBjdXQoSGFuVHJpZXUkYTIwdG8yOSwzLCBsYWJlbHMgPSBjKCdDw7JuIMOtdCcsJ1RydW5nIGLDrG5oJywnTmhp4buBdScpKQ0KDQpgYGANCg0KLSBUYSBkw7luZyBs4buHbmggKipjdXQqKiDEkeG7gyBjaGlhIHRow7RuZyB0aW4gKipEw6JuIHPhu5EgdOG7qyAyMCAtIDI5IHR14buVaSoqIHRow6BuaCAzIGtob+G6o25nLCBiYW8gZ+G7k20gOg0KDQogICAtICoqS2hv4bqjbmcgdGjhu6kgbmjhuqV0KiogxJHGsOG7o2MgZ+G7jWkgbMOgICoqQ8OybiDDrXQqKiB24bubaSBkw6JuIHPhu5Ega2hv4bqjbmcgKipoxqFuIDEgdHJp4buHdSBuZ8OgbiBuZ8aw4budaSAtIMSR4bq/biBoxqFuIDQgdHJp4buHdSBuZ8aw4budaSoqDQogICANCiAgIC0gKipLaG/huqNuZyB0aOG7qSBoYWkqKiDEkcaw4bujYyBn4buNaSBsw6AgKipUcnVuZyBiw6xuaCoqIHbhu5tpIGTDom4gc+G7kSBraG/huqNuZyAqKmjGoW4gNCB0cmnhu4d1IG5nxrDhu51pIC0gxJHhur9uIGjGoW4gNiB0cmnhu4d1IG5nxrDhu51pKioNCiAgIA0KICAgLSAqKktob+G6o25nIHRo4bupIGJhKiogxJHGsOG7o2MgZ+G7jWkgbMOgICoqTmhp4buBdSoqIHbhu5tpIGTDom4gc+G7kSBraG/huqNuZyAqKmjGoW4gNCB0cmnhu4d1IG5nxrDhu51pIC0gxJHhur9uIGjGoW4gOSB0cmnhu4d1IG5nxrDhu51pKioNCiAgIA0KDQpgYGB7cn0NCnRhYmxlKEhhblRyaWV1JGEyMHRvMjkuYyxIYW5UcmlldSR0ZW4pDQpgYGANCg0KLSBTYXUgxJHDsyB0YSB0aeG6v24gaMOgbmggKips4bqtcCBi4bqjbmcgdOG6p24gc+G7kSoqIGNobyBraG/huqNuZyBtw6AgdGEgxJHDoyBjaGlhIOG7nyBwaMOtYSB0csOqbiwgdsOgIHRodSDEkcaw4bujYyBr4bq/dCBxdeG6oyA6DQoNCi0gKipUcmnhu4F1IHRpw6puIC0gTm9ydGggS29yZWEqKiBjw7MgOiANCg0KICAgLSAqKjYzIG7Eg20qKiBjw7Mgc+G7kSBkw6JuIHThu6sgMjAtMjkgdHXhu5VpIHLGoWkgdsOgbyAqKmtob+G6o25nIEPDsm4gw610KioNCiAgIA0KICAgLSAqKjkgbsSDbSoqIGPDsyBz4buRIGTDom4gdOG7qyAyMC0yOSB0deG7lWkgcsahaSB2w6BvICoqa2hv4bqjbmcgVHJ1bmcgYsOsbmgqKg0KICAgDQotICoqSMOgbiBRdeG7kWMgLSBTb3V0aCBLb3JlYSoqIGPDsyA6IA0KDQogICAtICoqOSBuxINtKiogY8OzIHPhu5EgZMOibiB04burIDIwLTI5IHR14buVaSByxqFpIHbDoG8gKipraG/huqNuZyBDw7JuIMOtdCoqDQogICANCiAgIC0gKioxOSBuxINtKiogY8OzIHPhu5EgZMOibiB04burIDIwLTI5IHR14buVaSByxqFpIHbDoG8gKipraG/huqNuZyBUcnVuZyBiw6xuaCoqDQogICANCiAgIC0gKio0NCBuxINtKiogY8OzIHPhu5EgZMOibiB04burIDIwLTI5IHR14buVaSByxqFpIHbDoG8gKipraG/huqNuZyBOaGnhu4F1KioNCg0KVOG7qyDEkcOzLCB0YSBjw7MgdGjhu4Mgc28gc8OhbmggZOG7hSBkw6BuZywgc+G7kSBuZ8aw4budaSB0cuG6uyDhu58gSMOgbiBRdeG7kWMgbmhp4buBdSBoxqFuIGjhurNuIHNvIHbhu5tpIFRyaeG7gXUgVGnDqm4NCg0KLS0tDQoNCiMjIyMgKipEw6JuIHPhu5EgdOG7qyA1MCAtIDU5IHR14buVaSAtIFBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFycyoqDQoNCg0KYGBge3J9DQpIYW5UcmlldSRhNTB0bzU5LmMgPC0gY3V0KEhhblRyaWV1JGE1MHRvNTksMykNCnRhYmxlKGN1dChIYW5UcmlldSRhNTB0bzU5LDMpKQ0KSGFuVHJpZXUkYTUwdG81OS5jIDwtIGN1dChIYW5UcmlldSRhNTB0bzU5LDMsIGxhYmVscyA9IGMoJ8ONdCcsJ1bhu6thJywnxJDDtG5nJykpDQoNCmBgYA0KDQpW4bubaSBjw6FjaCBoaeG7g3UgZ2nhu5FuZyBuaMawIMSR4buZIHR14buVaSAyMC0yOSwgdGjDrCDhu58gxJHhu5kgdHXhu5VpIDUwLTU5IGPFqW5nIGdp4buRbmcgbmjGsCB24bqteQ0KDQpUYSBjxaluZyBkw7luZyBs4buHbmggKipjdXQqKiDEkeG7gyBjaGlhIHRow7RuZyB0aW4gKipEw6JuIHPhu5EgdOG7qyA1MCAtIDU5IHR14buVaSoqIHRow6BuaCAzIGtob+G6o25nICoqw410LCBW4burYSwgxJDDtG5nKioNCg0KDQpgYGB7cn0NCnRhYmxlKEhhblRyaWV1JGE1MHRvNTkuYyxIYW5UcmlldSR0ZW4pDQpgYGANCg0KS+G6v3QgUXXhuqMgdGEgY8OzIHRo4buDIHRo4bqleSBuaMawIHBow61hIHRyw6puIC0gdGEgcGjDom4gdMOtY2ggdsOgIMSRxrBhIHJhIHNvIHPDoW5oIHTGsMahbmcgdOG7sSBuaMawIOG7nyDEkeG7mSB0deG7lWkgMjAtMjkNCg0KLS0tDQoNCg0KIyMjICoqTmjhuq10IELhuqNuKioNCg0KKioqTmjhuq10IELhuqNuKioqIGzDoCBt4buZdCBxdeG7kWMgZ2lhIHbDoCDEkeG6o28gcXXhu5FjIGPDsyBjaOG7pyBxdXnhu4FuIG7hurFtIOG7nyBraHUgduG7sWMgxJDDtG5nIMOBDQoNCi0gTmjhuq10IELhuqNuIG7hu5VpIHRp4bq/bmcgduG7m2kgdHXhu5VpIHRo4buNIGNhbyBuaOG6pXQgdGjhur8gZ2nhu5tpLCB2w6wgaOG7jSBjw7MgYsOtIHF1eeG6v3QgdsOgIGNo4bq/IMSR4buZIMSDbiBy4bqldCBsw6BuaCBt4bqhbmgNCg0KLSBOw6puIHRhIHPhur0gdGnhur9uIGjDoG5oIHBow6JuIHTDrWNoICoqRMOibiBz4buRIGPhu6dhIE5o4bqtdCBC4bqjbiB0csOqbiAxMDAgdHXhu5VpIC0gUG9wdWxhdGlvbiBvbGRlciB0aGFuIDEwMCB5ZWFycyoqDQoNCi0tLQ0KDQojIyMjICoqRMOibiBz4buRIHRyw6puIDEwMCB0deG7lWkgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTAwIHllYXJzKioNCg0KLSBOZ2/DoGkgcmEgdGEgY8Wpbmcgc+G6vSB0aeG6v24gaMOgbmggKipzbyBzw6FuaCBOaOG6rXQgQuG6o24gc28gduG7m2kgY8OhYyBuxrDhu5tjIHRyb25nIGtodSB24buxYyDEkMO0bmcgw4EqKg0KDQotIMSQ4bqldSB0acOqbiB0YSB0aeG6v24gaMOgbmggKipyw7p0IGThu68gbGnhu4d1IGPhu6dhIDYgcXXhu5FjIGdpYSoqIGtodSB24buxYyDEkMO0bmcgw4EgxJHDoyBuw6p1IHRyw6puLCB24bubaSB0w6puICoqRG9uZ0EqKiBn4buTbSAqKjQzMiBxdWFuIHPDoXQgdsOgIDI0IGJp4bq/bioqDQoNCmBgYHtyfQ0KRUEgPC0gcHANCkRvbmdBIDwtIEVBW0VBJHRlbiA9PSAnQ2hpbmEnfCBFQSR0ZW4gPT0gJ0hvbmcgS29uZyd8IEVBJHRlbiA9PSAnVGFpd2FuJ3wgRUEkdGVuID09J05vcnRoIEtvcmVhJ3wgRUEkdGVuID09J1NvdXRoIEtvcmVhJ3wgRUEkdGVuID09J0phcGFuJyxdDQpgYGANCg0KLSBTYXUgxJHDsyB0YSBs4bqhaSB0aeG6v24gaMOgbmggKipjdXQvY2hpYSoqIHPhu5EgZMOibiBjw7MgdHXhu5VpIHRyw6puIDEwMCB0aMOgbmggNCBraG/huqNuZw0KDQogICAtIEtob+G6o25nIHRo4bupIG5o4bqldCA6IHThu6sgKiowIC0gaMahbiAzMCBuZ8OgbiBuZ8aw4budaSoqDQogICANCiAgIC0gS2hv4bqjbmcgdGjhu6kgaGFpIDogdOG7qyAqKjMwIG5nw6BuIC0gaMahbiA2MCBuZ8OgbiBuZ8aw4budaSoqDQogICANCiAgIC0gS2hv4bqjbmcgdGjhu6kgYmEgOiB04burICoqNjAgbmfDoG4gLSBoxqFuIDkwIG5nw6BuIG5nxrDhu51pKioNCiAgIA0KICAgLSBLaG/huqNuZyB0aOG7qSB0xrAgOiB04burICoqOTAgbmfDoG4gLSAxMDAgbmfDoG4gbmfGsOG7nWkqKg0KDQotIEtow6FjIHbhu5tpIGPDoWMgYuG6o25nIHThuqduIHPhu5EgcGjDrWEgdHLDqm4sIHRhIHPhur0gZ2hpICoqc+G7kSBsaeG7h3UgbmfGsOG7nWkgY+G7pSB0aOG7gyoqIHRoYXkgdsOsIGzDoCAqKsONdCBW4burYSBOaGnhu4F1KiogbmjGsCBjw6FjIHNvIHPDoW5oIHBow61hIHRyw6puDQoNCg0KYGBge3J9DQpEb25nQSRvbGQxMDAuQyA8LSBjdXQoRG9uZ0Ekb2xkMTAwLDQpDQp0YWJsZShjdXQoRG9uZ0Ekb2xkMTAwLDQpKQ0KYGBgDQoNCmBgYHtyfQ0KRG9uZ0Ekb2xkMTAwLmMgPC0gY3V0KERvbmdBJG9sZDEwMCw0LCBsYWJlbHMgPSBjKCfDrXQgaMahbiAzMGsgbmfGsOG7nWknLCdU4burIDMway02MGsgbmfGsOG7nWknLCdU4burIDYway05MGsgbmfGsOG7nWknLCdU4burIDkway0xMDBrIG5nxrDhu51pJykpDQp0YWJsZShEb25nQSRvbGQxMDAuYyxEb25nQSR0ZW4pDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIHRo4bqleSDEkcaw4bujYyBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgY+G7p2EgTmjhuq10IELhuqNuIHNvIHbhu5tpIGPDoWMgbsaw4bubYyBjw7JuIGzhuqFpDQoNCi0gVHJvbmcga2hpIG5o4bqtdCBi4bqjbiBjw7MgdOG7m2kgKioxMiBuxINtKiogY8OzIHPhu5EgZMOibiB0csOqbiAxMDAgdHXhu5VpIHThu6sgKio2MCBuZ8OgbiB04bubaSAxMDAgbmfDoG4gbmfGsOG7nWkqKiwgdGjDrCBjw6FjIG7GsOG7m2Mga2jDoWMgbOG6oWkgc+G7kSBuxINtIGzhuqFpIGLhurFuZyAwIA0KDQotIEPDoWMgbsaw4bubYyBraMOhYyBuaMawIEjDoG4gUXXhu5FjLCBUcmnhu4F1IFRpw6puLC4uLiB0aMOsICoqNzIgbsSDbSoqLCBz4buRIGTDom4gdHLDqm4gMTAwIHR14buVaSBjaOG7iSDDrXQgaMahbiAzMCBuZ8OgbiBuZ8aw4budaQ0KDQotLS0NCg0KIyMgKiozLiBUw61uaCB0b8OhbiBjw6FjIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gbmjDs20qKg0KDQojIyMgKipUw7NtIHThuq90IGPDoWMgZ2nDoSB0cuG7iyDEkW8gbMaw4budbmcqKg0KDQogICAqKjEuIE1lYW4gLSBz4buRIHRydW5nIGLDrG5oKiogaGF5IGzDoCBt4buZdCDEkWnhu4NtIGdp4buvYSBj4bunYSBt4buZdCB04bqtcCBo4bujcC8gxJHhu5FpIHTGsOG7o25nIMSRxrDhu6NjIHnDqnUgY+G6p3UNCg0KICAgKioyLiBNZWRpYW4gLSBzw7QgdHJ1bmcgduG7iyoqIGhheSBsw6AgbeG7mXQgxJFp4buDbSB0cnVuZyB0w6JtIHRyb25nIG3hu5l0IGRhbmggc8OhY2ggxJHGsOG7o2Mgc+G6r3AgeOG6v3AgdMSDbmcgaG/hurdjIGdp4bqjbSBk4bqnbiAobsOzIGtow6FjIHRydW5nIGLDrG5oIOG7nyBjaOG7lyBuw7MgY2hpYSDEkeG7kWkgdMaw4bujbmcgcmEgbMOgbSDEkcO0aSB2w6AgY2jGsGEgY2jhuq9jIDIgYsOqbiDEkcOzIHPhur0gY8OibiBi4bqxbmcgbmhhdSkNCg0KICAgKiozLiBWYXJpYW5jZSAtIHBoxrDGoW5nIHNhaSoqIGzDoCBwaMOpcCDEkW8gbeG7qWMgY2jDqm5oIGzhu4djaCBnaeG7r2EgY8OhYyBz4buRIGxp4buHdSB0cm9uZyBt4buZdCB04bqtcCBk4buvIGxp4buHdSDEkcaw4bujYyB5w6p1IGPhuqd1IHNvIHbhu5tpIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgNCg0KICAgKio0LiBTdGFuZGFyZCBkZXZpYXRpb24gLSBTZCAtIMSR4buZIGzhu4djaCBjaHXhuqluKiogbMOgIMSR4buZIGzhu4djaCBzbyB24bubaSB0acOqdSBjaHXhuqluLCBk4buvIGxp4buHdSBuw6BvIGPFqW5nIHPhur0gY8OzIHNhaSBz4buRIG5o4bqldCDEkeG7i25oLiBOw6puIG7hur91IHPhu7EgY2jDqm5oIGzhu4djaCBraMO0bmcgxJHDoW5nIGvhu4MgdGjDrCDEkeG7mSBs4buHY2ggY2h14bqpbiBjxaluZyBuaMawIHTDrW5oIGJp4bq/biDEkeG7mW5nIOG7nyBt4bupYyB0aOG6pXAgdsOgIG5nxrDhu6NjIGzhuqFpDQogICANCiAgICoqNS4gTmdvw6BpIHJhKiogY8OybiBjw7MgxJHhurdjIHRyxrBuZyBraMOhYyA6ICoqTWF4IC0gZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQqKiwgKipNaW4gLSBnacOhIHRy4buLIG5o4buPIG5o4bqldCoqLCAqKjFzdCBRdS4sM3JkIFF1LiAtIHBow6JuIHbhu4sgdGjhu6kgMSwgdGjhu6kgMyoqLC4uLi4NCg0KVGEgc+G6vSDEkWEgc+G7kSB0aeG6v24gaMOgbmggdMOtbmggdG/DoW4gMiB0cm9uZyBz4buRIGPDoWMgZ2nDoSB0cuG7iyBwaMOtYSB0csOqbiBsw6AgKipNZWFuIHbDoCBNZWQqKg0KDQoNCiMjIyAqKlRoZW8gcXXhu5FjIGdpYSoqDQoNClRhIHTDrW5oIGPDoWMgZ2nDoSB0cuG7iyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyBj4bunYSAqKnThu5VuZyBkw6JuIHPhu5EgY+G7p2EgVHJ1bmcgUXXhu5FjKiogdHJvbmcgNzIgbsSDbSANCg0KLS0tDQoNCiMjIyMgKipTdW1tYXJ5IC0gQuG6o24gdMOzbSB04bqvdCBjw6FjIMSR4bq3YyB0csawbmcqKg0KDQotIEzhu4duaCAqKnN1bW1hcnkoKSoqIG5oxrAgbeG7mXQgYuG6o24gdMOzbSB04bqvdCBjw6FjIGdpw6EgdHLhu4sgxJHhurdjIHRyxrBuZyDEkcOjIG7DqnUgYsOqbiB0csOqbiB24buBIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBuw6BvIMSRw7MgbcOgIHRhIHnDqnUgY+G6p3UsIHRhIGPDsyB0aOG7gyB0w61uaCB04burbmcgxJHhurdjIHRyxrBuZyByacOqbmcgaG/hurdjIGPDsyB0aOG7gyB4ZW0gY2jhu4kgdHJvbmcgc3VtbWFyeQ0KDQotIFbhu5tpIGzhu4duaCAqKnN1bW1hcnkoQ2hpbmEkcG9wdSkqKiAtIGJp4buDdSB0aOG7iyBjw6FjIMSR4bq3YyB0csawbmcgduG7gSAqKnThu5VuZyBkw6JuIHPhu5EgY+G7p2EgVHJ1bmcgUXXhu5FjKiogdHJvbmcgNzIgbsSDbSwgdGEgY8OzIHRo4buDIHhlbSA6DQoNCg0KYGBge3J9DQpzdW1tYXJ5KENoaW5hJHBvcHUpDQpgYGANCg0KS+G6v3QgcXXhuqMgY8OzIMO9IG5naMSpYSBuaMawIHNhdSA6IA0KDQotICoqTWluIC0gR2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQqKiA6IFThu5VuZyBkw6JuIHPhu5Egw610IG5o4bqldCBj4bunYSBUcnVuZyBRdeG7kWMgdOG7q25nIGdoaSBuaOG6rW4gdHJvbmcgNzIgbsSDbSBsw6Aga2hv4bqjbmcgKio1NDMgdHJp4buHdSBuZ8aw4budaSoqDQoNCi0gKioxc3QgUXUuIC0gUGjDom4gduG7iyB0aOG7qSBuaOG6pXQqKiA6bMOgIGNvbiBz4buRIGNoaWEgdMOhY2ggZOG7ryBsaeG7h3UgdGjDoG5oIDIgcGjhuqduIGLhurFuZyBuaGF1LCB0cm9uZyDEkcOzIDI1JSBk4buvIGxp4buHdSB0aOG6pXAgaMahbiB2w6AgNzUlIGThu68gbGnhu4d1IGNhbyBoxqFuIHPhu5EgcGjDom4gduG7iw0KICAgDQogICAtIEPhu6UgdGjhu4MgLSBT4buRIHBow6JuIHbhu4sgdGjhu6kgbmjhuqV0ICoqNzc1IHRyaeG7h3UqKiBjaGlhIHTDoWNoIHThu5VuZyBkw6JuIHPhu5EgVFEgbMO6YyBuw6B5IGzDoG0gMiwgdHJvbmcgxJHDsyA6IA0KICAgDQogICAtIDI1JSB04buVbmcgZMOibiBz4buRIHPhur0gdGjhuqVwIGjGoW4gNzc1IHRyaeG7h3UgbmfGsOG7nWkNCiAgIA0KICAgLSA3NSUgdOG7lW5nIGTDom4gc+G7kSBz4bq9IGNhbyBoxqFuIDc3NSB0cmnhu4d1DQoNCi0gKipNZWRpYW4gLSBUcnVuZyB24buLKiogOiBsw6Aga2hv4bqjbmcgKioxLDA2IHThu7cqKiwgbsOzIGdp4buRbmcgdOG7qSBwaMOibiB24buLIHRo4bupIG5o4bqldCBuaMawbmcga2jDoWMg4bufIGNo4buXICoqY2hpYSB04buVbmcgZMOibiBz4buRIGzDoG0gNTAlLTUwJSoqDQoNCiAgIC0gNTAlIHThu5VuZyBkw6JuIHPhu5Egc+G6vSB0aOG6pXAgaMahbiAxLDA2IHThu7cNCiAgIA0KICAgLSA1MCUgdOG7lW5nIGTDom4gc+G7kSBz4bq9IGNhbyBoxqFuIDEsMDYgdOG7tw0KDQotICoqTWVhbiAtIEfDrWEgdHLhu4sgdHJ1bmcgYsOsbmgqKiA6IGzDoCBraG/huqNuZyAqKjEsMDMgdOG7tyoqLCBjb24gc+G7kSBuw6B5IGzDoCBnacOhIHRy4buLIHRydW5nIGLDrG5oIG3hu5dpIG7Eg20gdOG7lW5nIGTDom4gc+G7kSBUcnVuZyBRdeG7kWMgbMOgIGtob+G6o25nIDEsMDMgdOG7tyBuZ8aw4budaQ0KDQotICoqM3JkIFF1LiAtIFBow6JuIHbhu4sgdGjhu6kgYmEqKiA6IGzDoCAqKjEuMDMgdOG7tyoqLCBuw7MgZ2nhu5FuZyB04bupIHBow6JuIHbhu4sgdGjhu6kgbmjhuqV0IG5oxrBuZyBraMOhYyDhu58gY2jhu5cgKipjaGlhIHThu5VuZyBkw6JuIHPhu5EgbMOgbSA3NSUtMjUlKioNCg0KICAgLSA3NSUgdOG7lW5nIGTDom4gc+G7kSBz4bq9IHRo4bqlcCBoxqFuIDEuMDMgdOG7tyBuZ8aw4budaQ0KICAgDQogICAtIDI1JSB04buVbmcgZMOibiBz4buRIHPhur0gY2FvIGjGoW4gMSwwMyB04bu3IG5nxrDhu51pDQoNCi0gKipNYXggLSBHw61hIHRy4buLIGzhu5tuIG5o4bqldCoqIDog4buVbmcgZMOibiBz4buRIMSRw7RuZyBuaOG6pXQgY+G7p2EgVHJ1bmcgUXXhu5FjIHThu6tuZyBnaGkgbmjhuq1uIHRyb25nIDcyIG7Eg20gbMOgIGtob+G6o25nICoqMSw0IHThu7cgbmfGsOG7nWkqKg0KDQoNCi0tLQ0KDQoNCiMjIyAqKlRoZW8gbmjDs20gcXXhu5FjIGdpYSoqDQoNCiMjIyMgKipNZWFuIC0gU+G7kSB0cnVuZyBiw6xuaCoqDQoNClRhIHPhur0gdGnhur9uIGjDoG5oIHTDrW5oICoqVOG7lW5nIHRydW5nIGLDrG5oIGTDom4gc+G7kSoqIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSB04bqhaSDEkMO0bmcgw4EgxJHDoyBuw6p1IHRyw6puIHRyb25nIDcyIG7Eg20NCg0KLSBD4bulIHRo4buDIHTDrW5oIHRydW5nIGLDrG5oIHThu5VuZyBkw6JuIHPhu5EgY+G7p2EgNiBuxrDhu5tjIMSQw7RuZyDDgSB0cm9uZyA3MiBuxINtIGLhurFuZyBs4buHbmggKioqbWVhbihwb3B1KSoqKg0KDQogICAtICoqdGVuKiogLSBsw6AgdMOqbiBjw6FjIHF14buRYyBnaWEgY+G7pSB0aOG7gw0KICAgDQogICAtICoqbioqIC0gbMOgIHPhu5EgbsSDbSwga+G6v3QgcXXhuqMgY+G7p2EgbeG7l2kgbsaw4bubYyBsw6AgKio3MioqLCBjw7MgbmdoxKlhIGzDoCB04buVbmcgdHJ1bmcgYsOsbmggxJHGsOG7o2MgdMOtbmggKip0cm9uZyA3MiBuxINtKioNCg0KICAgLSAqKm1lYW5vZkFFKiogLSBsw6AgdMOqbiB0YSDEkeG6t3QgY2hvIGzhu4duaCAqKm1lYW4ocG9wdSkqKiwgY8OzIG5naMSpYSBsw6AgdHJ1bmcgYsOsbmggZMOibiBz4buRIGPhu6dhIHF14buRYyBnaWEgxJDDtG5nIMOBDQojIyMjICoqTWVhbiAtIFPhu5EgdHJ1bmcgYsOsbmgqKg0KDQotIFRhIGPDsyB0aOG7gyB4ZW0gdMOzbSB04bqvdCB0cm9uZyBi4bqjbmcgc3VtbWFyeSBob+G6t2MgdMOtbmggcmnDqm5nIGLhurFuZyBs4buHbmggKiptZWFuKCkqKg0KDQotIEzhu4duaCAqKiptZWFuKCkqKiogY2hvIGJp4bq/dCAqKnPhu5EgdHJ1bmcgYsOsbmgqKiBj4bunYSDEkeG7kWkgdMaw4bujbmcgxJHGsOG7o2MgecOqdSBj4bqndQ0KDQogICAtIEPhu6UgdGjhu4MgdMOtbmggdHJ1bmcgYsOsbmggdOG7lW5nIGTDom4gc+G7kSBj4bunYSBUcnVuZyBRdeG7kWMgdHJvbmcgNzIgbsSDbSBi4bqxbmcgbOG7h25oICoqKm1lYW4oQ2hpbmEkcG9wdSkqKioNCiAgIA0KICAgLSBL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgbMOgIDogKioxLDAzNSw1MzEsNjQ1IG5nxrDhu51pKioNCiAgIA0KICAgLSAqKsOdIG5naMSpYSoqIDogdHJ1bmcgYsOsbmggbeG7l2kgbsSDbSB04buVbmcgZMOibiBz4buRIGdoaSBuaOG6rW4gxJHGsOG7o2MgY+G7p2EgVHJ1bmcgUXXhu5FjIGzDoCAxLDAzNSw1MzEsNjQ1IG5nxrDhu51pDQogICANCg0KYGBge3J9DQoNCm1lYW4oQ2hpbmEkcG9wdSxuYS5ybSA9IFQpDQoNCmBgYA0KDQojIyMjICoqTWVkIC0gU+G7kSB0cnVuZyB24buLKioNCg0KLSBUYSBjw7MgdGjhu4MgeGVtIHTDs20gdOG6r3QgdHJvbmcgYuG6o25nIHN1bW1hcnkgaG/hurdjIHTDrW5oIHJpw6puZyBi4bqxbmcgbOG7h25oICoqbWVkaWFuKCkqKg0KDQotIEzhu4duaCAqKiptZWRpYW4oKSoqKiBjaG8gYmnhur90ICoqc+G7kSB0cnVuZyB24buLKiogY+G7p2EgxJHhu5FpIHTGsOG7o25nIMSRxrDhu6NjIHnDqnUgY+G6p3UNCg0KICAgLSBD4bulIHRo4buDIHTDrW5oIHRydW5nIHbhu4sgY+G7p2EgdOG7lW5nIGTDom4gc+G7kSBj4bunYSBUcnVuZyBRdeG7kWMgdHJvbmcgNzIgbsSDbSBi4bqxbmcgbOG7h25oICoqKm1lZGlhbihDaGluYSRwb3B1KSoqKg0KICAgDQogICAtIEvhur90IHF14bqjIHRodSDEkcaw4bujYyBsw6AgOiAqKjEsMDY5LDAwNSwyNTAgbmfGsOG7nWkqKg0KICAgDQogICAtICoqw50gbmdoxKlhKiogOiBjb24gc+G7kSAqKjEsMDY5LDAwNSwyNTAqKiBjaGlhIHThu5VuZyBkw6JuIHPhu5EgVHJ1bmcgUXXhu5FjIGzDoG0gMiwgbeG7mXQgbuG7rWEgc+G6vSB0csOqbiAxIHThu7cgbmfGsOG7nWkgdsOgIG3hu5l0IG7hu61hIHPhur0gZMaw4bubaSAxIHThu7cgbmfGsOG7nWkgxJHDsw0KDQoNCmBgYHtyfQ0KbWVkaWFuKENoaW5hJHBvcHUpDQpgYGANCg0KLS0tDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KDQp0cnVuZ2JpbmhwcCA8LSBEb25nQSAlPiUgZ3JvdXBfYnkodGVuKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCksbWVhbm9mQUUgPSBtZWFuKHBvcHUpKQ0KdHJ1bmdiaW5ocHANCmBgYA0KDQotLS0NCg0KIyMjIyAqKk1lZCAtIFPhu5EgdHJ1bmcgduG7iyoqDQoNClRhIHPhur0gdGnhur9uIGjDoG5oIHTDrW5oICoqVHJ1bmcgduG7iyoqIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSB04bqhaSDEkMO0bmcgw4EgxJHDoyBuw6p1IHRyw6puIHRyb25nIDcyIG7Eg20NCg0KLSBD4bulIHRo4buDIHTDrW5oICoqdHJ1bmcgduG7iyBkw6JuIHPhu5EgZMaw4bubaSAxIHR14buVaSBj4bunYSA2IG7GsOG7m2MgxJDDtG5nIMOBKiogYuG6sW5nIGzhu4duaCAqKiptbWVkaWFuKHVuMSkqKioNCg0KICAgLSAqKnRlbioqIC0gbMOgIHTDqm4gY8OhYyBxdeG7kWMgZ2lhIGPhu6UgdGjhu4MNCg0KICAgLSAqKnRydW5ndmlRRyoqIC0gbMOgIHTDqm4gdGEgxJHhurd0IGNobyBs4buHbmggKiptZWQodW4xKSoqDQogICANCiAgIC0gS+G6v3QgcXXhuqMgdHLhuqMgduG7gSBjw7Mgw70gbmdoxKlhIDogVsOtIGThu6UgduG7gSBUcnVuZyBRdeG7kWMgVHJvbmcgdOG7lW5nIGTDom4gc+G7kSBkxrDhu5tpIDEgdHXhu5VpIGPhu6dhIFRydW5nIFF14buRYywgc+G7kSB0cnVuZyB24buLIGzDoCAqKjIwLDIyNCw1MDgqKiwgY2jDrW5oIGzDoCBz4buRIGNow61uaCBnaeG7r2EvIGNoaWEgbMOgbSDEkcO0aSB04buVbmcgZMOibiBz4buRIDEgdHXhu5VpIMSRw7MsIG7DsyBraMO0bmcgcGjhuqNpIGzDoCB0cnVuZyBiw6xuaCBtw6AgY2jhu4kgbMOgIHPhu5EgbmfEg24gZ2nhu69hIGPDoWMgZ2nDoSB0cuG7iyAoQ8OhYyBuxrDhu5tjIGPDsm4gbOG6oWkgdMawxqFuZyB04buxIG5oxrAgduG6rXkpDQoNCg0KYGBge3J9DQp0cnVuZ3ZpUUcgPC0gRG9uZ0EgJT4lIGdyb3VwX2J5KHRlbikgJT4lIHN1bW1hcmlzZShtZWRUUSA9IG1lZGlhbih1bjEpKQ0KdHJ1bmd2aVFHDQpgYGANCg0KIyMjICoqVGhlbyB0aOG7nWkgZ2lhbiAtIG7Eg20qKg0KDQpUYSBz4bq9IHRp4bq/biBow6BuaCB0w61uaCB0cnVuZyBiw6xuaCAqKnThu5VuZyBkw6JuIHPhu5EqKiBj4bunYSBjw6FjIHF14buRYyBnaWEgdOG6oWkgxJDDtG5nIMOBIC0gY+G7pSB0aOG7gyBsw6AgNiBuxrDhu5tjIMSRw6MgbsOqdSB0csOqbiAqKnThuqFpIG7Eg20gMjAwNCoqDQoNCi0gTOG7h25oICoqKm1lYW4oKSoqKiBjaG8gYmnhur90ICoqc+G7kSB0cnVuZyBiw6xuaCoqIGPhu6dhIMSR4buRaSB0xrDhu6NuZyDEkcaw4bujYyB5w6p1IGPhuqd1LCBuZ2/DoGkgcmEgdGEgY8OzIHnDqnUgY+G6p3UgY+G7pSB0aOG7gyB24buBIG7Eg20gY2hvIGzhu4duaCAqKmdyb3VwX2J5KHllYXI9MjAwNCkqKiBsw6AgbsSDbSAyMDA0DQoNCi0gS+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIHThu5VuZyBkw6JuIHPhu5EgdHJvbmcgbsSDbSAyMDA0IGPhu6dhIDYgcXXhu5FjIGdpYSBsw6AgKioyMDUsMjMzLDkwNSoqIG5nxrDhu51pDQoNCg0KYGBge3J9DQp0cnVuZ2Jpbmh0aGVvbmFtIDwtIERvbmdBICU+JSBncm91cF9ieSh5ZWFyPTIwMDQpICU+JSBzdW1tYXJpc2UobWVhbmtob2FuZyA9IG1lYW4ocG9wdSkpDQp0cnVuZ2Jpbmh0aGVvbmFtDQpgYGANCg0KIyAqKk5oaeG7h20gduG7pSAzLjIqKg0KDQojIyAqKjEuIFTDs20gdOG6r3QqKg0KDQpC4buZIGThu68gbGnhu4d1IHBow6JuIHTDrWNoIGTDom4gc+G7kSBj4bunYSBoxqFuIDEwMCBxdeG7kWMgZ2lhIHF1YSBjw6FjIG7Eg20gdOG7qyAxOTUwIC0gMjAyMSB0aGVvIHThu6tuZyDEkeG7mSB0deG7lWksIHThu6sgxJHDsyB0YSBz4bq9IHRo4bqleSDEkcaw4bujYyB04buRYyDEkeG7mSBnaWEgdMSDbmcgZMOibiBz4buRLCBz4buxIGdpw6AgaMOzYSBkw6JuIHPhu5EgdsOgIGPDoWMgcXXhu5FjIGdpYSBjw7Mgc+G7kSBkw6JuIMSRw7RuZyBuaOG6pXQuDQogDQoqKipDaGkgdGnhur90IGPDoWMgYmnhur9uIGPDsyB0cm9uZyBi4buZIGThu68gbGnhu4d1OioqKg0KDQoqQuG7mSBk4buvIGxp4buHdSBjw7MgMTgyODggcXVhbiBzw6F0IHbDoCAyNCBiaeG6v24qDQoNCi0gQ291bnRyeSBuYW1lICoqKE5hKSoqOiBUw6puIHF14buRYyBnaWENCi0gWWVhciAqKihZKSoqOiBuxINtDQotIFBvcHVsYXRpb246IGTDom4gc+G7kQ0KLSBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgMSAqKihVMSkqKjogZMOibiBz4buRIHRy4bq7IGVtIGTGsOG7m2kgMSB0deG7lWkNCi0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDUgKiooVTUpKio6IGTDom4gc+G7kSB0cuG6uyBlbSBkxrDhu5tpIDUgdHXhu5VpDQotIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxNSAqKihVMTUpKio6IGTDom4gc+G7kSB0cuG6uyBlbSBkxrDhu5tpIDE1IHR14buVaQ0KLSBQb3B1bGF0aW9uIHVuZGVyIHRoZSBhZ2Ugb2YgMjUgKiooVTI1KSoqOiBkw6JuIHPhu5EgZMaw4bubaSAyNSB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDE1IHRvIDY0IHllYXJzICoqKDE1VDY0KSoqOiBz4buRIGTDom4gdOG7qyAxNSDEkeG6v24gNjQgdHXhu5VpDQotIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxNSB5ZWFycyAqKihPMTUpKio6IGTDom4gc+G7kSB0csOqbiAxNSB0deG7lWkNCi0gUG9wdWxhdGlvbiBvbGRlciB0aGFuIDE4IHllYXJzICoqKE8xOCkqKjogZMOibiBz4buRIHRyw6puIDE4IHR14buVaQ0KLSBQb3B1bGF0aW9uIGF0IGFnZSAxICoqKDEpKio6IGTDom4gc+G7kSAxIHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgMSB0byA0IHllYXJzICoqKDFUKSoqOiBkw6JuIHPhu5EgMSDEkeG6v24gNCB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDUgdG8gOSB5ZWFycyAqKig1VDkpKio6IGTDom4gc+G7kSA1IMSR4bq/biA5IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgMTAgdG8gMTQgeWVhcnMgKiooMTBUMTQpKio6IGTDom4gc+G7kSAxMCDEkeG6v24gMTQgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCAxNSB0byAxOSB5ZWFycyAqKigxNVQxOSkqKjogZMOibiBz4buRIDE1IMSR4bq/biAxOSB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDIwIHRvIDI5IHllYXJzICoqKDIwVDkpKio6IGTDom4gc+G7kSAyMCDEkeG6v24gMjkgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCAzMCB0byAzOSB5ZWFycyAqKigzMFQzOSkqKjogZMOibiBz4buRIDMwIMSR4bq/biAzOSB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDQwIHRvIDQ5IHllYXJzICoqKDQwVDQ5KSoqOiBkw6JuIHPhu5EgNDAgxJHhur9uIDQ5IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgNTAgdG8gNTkgeWVhcnMgKiooNTBUNTkpKio6IGTDom4gc+G7kSA1MCDEkeG6v24gNTkgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCA2MCB0byA2OSB5ZWFycyAqKig2MFQ2OSkqKjogZMOibiBz4buRIDYwIMSR4bq/biA2OSB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDcwIHRvIDc5IHllYXJzICoqKDcwVDc5KSoqOiBkw6JuIHPhu5EgNzAgxJHhur9uIDc5IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgODAgdG8gODkgeWVhcnMgKiooODBUODkpKio6IGTDom4gc+G7kSA4MCDEkeG6v24gODkgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCA5MCB0byA5OSB5ZWFycyAqKig5MFQ5OSkqKjogZMOibiBz4buRIDkwIMSR4bq/biA5OSB0deG7lWkNCi0gUG9wdWxhdGlvbiBvbGRlciB0aGFuIDEwMCB5ZWFycyAqKihPMTAwKSoqOiBkw6JuIHPhu5EgaMahbiAxMDAgdHXhu5VpDQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCm5hIDwtIHJlYWQuY3N2KGZpbGUuY2hvb3NlKCksIGhlYWRlciA9IFQpDQpgYGANCiMjICoqMi4gUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UqKg0KLSBRdWFuIHPDoXQgZOG7ryBsaeG7h3UgNSBxdeG7kWMgZ2lhIGPDsyBz4buRIGTDom4gxJHDtG5nOiAqQ2hpbmEsIEluZGlhLCBVbml0ZWQgU3RhdGVzLCBJbmRvbmVzaWEsIEJyYXppbCogdOG7qyBuxINtIDE5NTEgLSAyMDIxIHRoZW8gdOG7q25nIMSR4buZIHR14buVaSAoZMaw4bubaSAxNSB0deG7lWksIGTGsOG7m2kgMjUgdHXhu5VpLCB04burIDE1IMSR4bq/biAxOSB0deG7lWksIHThu6sgMjAgxJHhur9uIDI5IHR14buVaSwgdOG7qyAzMCDEkeG6v24gMzkgdHXhu5VpLCB04burIDYwIMSR4bq/biA2OSB0deG7kWksdOG7qyAxNSDEkeG6v24gNjQgdHXhu5VpLCBoxqFuIDEwMCB0deG7lWkpDQoNCmBgYHtyfQ0KbmFtZXMobmEpIDwtIGMoJ05hJywnWScsJ1BvcCcsJ1UxJywnVTUnLCdVMTUnLCdVMjUnLCcxNVQ2NCcsJ08xNScsJ08xOCcsJzEnLCcxVDQnLCc1VDknLCcxMFQxNCcsJzE1VDE5JywnMjBUMjknLCczMFQzOScsJzQwVDQ5JywnNTBUNTknLCc2MFQ2OScsJzcwVDc5JywnODBUODknLCc5MFQ5OScsJ08xMDAnKQ0KDQpgYGANCmBgYHtyfQ0KZCA8LSBuYSAlPiUgZmlsdGVyKE5hICVpbiUgYygnQ2hpbmEnLCdJbmRpYScsJ1VuaXRlZCBTdGF0ZXMnLCAnSW5kb25lc2lhJywgJ0JyYXppbCcpKSU+JXNlbGVjdChOYSxZLFBvcCxVMTUsVTI1LCcxNVQxOScsJzIwVDI5JywnMzBUMzknLCc2MFQ2OScsJzE1VDY0JywnTzEwMCcpDQpgYGANCg0KIyMgKiozLiBHaeG6o2kgdGjDrWNoKioNCg0KLSBDw6FjIHPhu5EgbGnhu4d1IG7DoHkgY3VuZyBj4bqlcCB0aMO0bmcgdGluIHbhu4Egc+G7sSBwaMOibiBi4buRIGTDom4gc+G7kSB0aGVvIGPDoWMgxJHhu5kgdHXhu5VpIGtow6FjIG5oYXUgdHJvbmcgbeG7l2kgcXXhu5FjIGdpYS4gQ2jDum5nIGPDsyB0aOG7gyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBzbyBzw6FuaCBt4bupYyDEkeG7mSB0deG7lWkgdHLhurssIG3hu6ljIMSR4buZIGdpw6AsIHbDoCBz4buxIHBow6JuIGLhu5EgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSBraMOhYyBuaGF1Lg0KDQojIyAqKjQuIE3DoyBow7NhIGThu68gbGnhu4d1KioNCmBgYHtyfQ0KZDIgPC0gZA0KYGBgDQotIFRow6ptIG3hu5l0IGPhu5l0IE5hLkNvZGUgxJHhu4MgY2hpYSBDaGluYSB24bubaSA0IG7GsOG7m2MgY8OybiBs4bqhaQ0KYGBge3J9DQpkMiROYS5Db2RlIDwtIGlmZWxzZShkMiROYSA9PSAnQ2hpbmEnLCdDaGluYScsJ05vdCBDaGluYScpDQpgYGANCi0gVGjDqm0gbeG7mXQgY+G7mXQgTmEuQ29kZTEgxJHhu4MgY2hpYSBuxINtIHRow6BuaCB0aOG6vyBr4bu3IDIwIHbDoCB0aOG6vyBr4bu3IDIxDQpgYGB7cn0NCmQyJFkuQ29kZTEgPC0gaWZlbHNlKGQyJFkgPj0gMjAwMSwnVEsyMScsICdUSzIwJykNCmBgYA0KLSBUaMOqbSBt4buZdCBj4buZdCBQb3AuQ29kZSDEkeG7gyBjaGlhIGTDom4gc+G7kSB0aMOgbmggMyBuaMOzbTogbmjDs20gMSB24bubaSBz4buRIGTDom4gbmjhu48gaMahbiAxMDAwMDAwMDAsIG5ow7NtIDIgduG7m2kgc+G7kSBkw6JuIHThu6sgMTAwMDAwMDAwIMSR4bq/biA5OTk5OTk5OTkgLCBuaMOzbSAzIHbhu5tpIHPhu5EgZMOibiBs4bubbiBoxqFuIDEwMDAwMDAwMDANCmBgYHtyfQ0KZDIkUG9wLkNvZGUgPC0gY2FzZV93aGVuKGQyJFBvcCA8IDEwMDAwMDAwMCB+ICdOaMOzbSAxJywgZDIkUG9wID49IDEwMDAwMDAwMCAmIGQyJFBvcCA8IDk5OTk5OTk5OSAgfiAnTmjDs20gMicsIGQyJFBvcCA+MTAwMDAwMDAwMCB+ICdOaMOzbSAzJykNCmBgYA0KLSBUaMOqbSBt4buZdCBj4buZdCBPMTAwLkNvZGUgxJHhu4MgcGjDom4gbG/huqFpIG5nxrDhu51pIGzhu5tuIHR14buVaSB0csOqbiAxMDAgdHXhu5VpIHRow6BuaCA0IG5ow7NtOiBuaMOzbSAxIGTGsOG7m2kgMTAwLCBuaMOzbSAyIHThu6sgMTAwIMSR4bq/biA5OTksIG5ow7NtIDMgdOG7qyAxMDAwIMSR4bq/biA5OTk5LCBuaMOzbSA0IGzhu5tuIGjGoW4gMTAwMDAgDQpgYGB7cn0NCmQyJE8xMDAuQ29kZSA8LSBjYXNlX3doZW4oZDIkTzEwMCA8IDEwMCB+ICdOaMOzbSAxJywgZDIkTzEwMCA+PSAxMDAgJiBkMiRPMTAwIDwgOTk5ICB+ICdOaMOzbSAyJywgZDIkTzEwMCA+PSAxMDAwICYgZDIkTzEwMCA8OTk5OSB+ICdOaMOzbSAzJyxkMiRPMTAwID49IDEwMDAwIH4gJ05ow7NtIDQnKQ0KYGBgDQoNCioqKkLhuqNuZyBz4buRIGxp4buHdSBt4bubaSBtw6AgdGEgbmjhuq1uIMSRxrDhu6NjIHNhdSBraGkgbcOjIGjDs2EqKioNCg0KIyMgKio1LiBC4bqjbmcgdOG6p24gc+G7kSoqDQoNCi0gVuG7m2kgdOG6p24gc3XhuqV0IHh14bqldCBoaeG7h24gNzIgbOG6p24gdGjDrCBjaMO6bmcgdGEgdGjhuqV5IMSRxrDhu6NjIGLhu5kgZOG7ryBsaeG7h3UgxJFhbmcgcGjDom4gdMOtY2ggZMOibiBz4buRIGPhu6dhIGPDoWMgbsaw4bubYyB0cm9uZyB0aOG7nWkgZ2lhbiA3MiBuxINtIA0KYGBge3J9DQp0YWJsZShkJE5hKQ0KDQpgYGANCg0KLSBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB24buBIHPhu5EgbmfGsOG7nWkgbOG7m24gdHXhu5VpIGPDsyDEkeG7mSB0deG7lWkgaMahbiAxMDAgdHXhu5VpIGPhu6dhIDUgbsaw4bubYw0KDQoqKlThu6sgYuG6o25nIHThuqduIHPhu5EgdHLDqm4gdGEgdGjhuqV5IG5nxrDhu51pIGzhu5tuIHR14buVaSDhu58gbmjDs20gc+G7kSAyIGPDsyB04bqnbiBz4buRIHh14bqldCBoaeG7h24gbmhp4buBdSBuaOG6pXQuIFRyb25nIMSRw7MgdGEgdGjhuqV5IEluZG9uZXNpYSBjw7Mgc+G7kSBkw6JuIHRodeG7mWMgbmjDs20gMiDhu58gxJHhu5kgdHXhu5VpIGjGoW4gMTAwIG5oaeG7gXUgbmjhuqV0LCBzYXUgxJHDsyBsw6AgQnJhemlsLioqDQoNCg0KIyMgKio2LiBQaMOibiB0w61jaCBz4buRIGxp4buHdSoqDQoNCiMjIyAqKlTDrW5oIHRvw6FuIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gQnJhemlsKioNCmBgYHtyfQ0KQnIgPC0gZCU+JSBmaWx0ZXIoTmE9PSdCcmF6aWwnKQ0KYGBgDQotIETDom4gc+G7kSB0cnVuZyBiw6xuaCDhu58gxJHhu5kgdHXhu5VpIGTGsOG7m2kgMTUgdHXhu5VpDQpgYGB7cn0NCm1lYW4oQnIkVTE1LG5hLnJtID0gVCkNCmBgYA0KLSBU4burIHPhu5EgbGnhu4d1IGLDqm4gZMaw4bubaSB0YSB0aOG6pXkgZMOibiBz4buRIHRo4bqlcCBuaOG6pXQgY+G7p2EgQnJhemlsIGzDoCA1Mzk1NTM2MCwgY2FvIG5o4bqldCBsw6AgMjEzMjYyMjANCi0gUGjDom4gduG7iyB0aOG7qSBuaOG6pXQgYuG6sW5nIDkxMDc1MjYwDQotIFRydW5nIHbhu4sgYuG6sW5nIDEzODIxMzI3MA0KLSBEw6JuIHPhu5EgdHJ1bmcgYsOsbmggbGFkIDEzNjU0MjMzMg0KLSBQaMOibiB24buLIHRo4bupIGJhIGLhurFuZyAxODMxNTI0NzINCmBgYHtyfQ0Kc3VtbWFyeShCciRQb3ApDQpgYGANCi0gVOG7lW5nIHPhu5EgbmfGsOG7nWkgZMOibiBoxqFuIDEwMCBxdWEgY8OhYyBuxINtDQpgYGB7cn0NCnN1bShCciRPMTAwKQ0KYGBgDQotIFBoxrDGoW5nIHNhaSBj4bunYSBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgYmnhur9uIHThu6sgMTUgxJHhur9uIDE5DQoNCmBgYHtyfQ0KdmFyKEJyJCcxNVQxOScpDQpgYGANCi0gR2nDoSB0cuG7iyDhu58gduG7iyB0csOtIHRydW5nIHbhu4sgY+G7p2EgY8OhYyBnacOhIHRy4buLIHRyb25nIMSR4buZIHR14buVaSAxNSDEkeG6v24gNjQNCmBgYHtyfQ0KbWVkaWFuKEJyJCcxNVQ2NCcpDQpgYGANCiMjIyAqKlTDrW5oIHRvw6FuIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gbmjDs20gcXXhu5FjIGdpYSoqIyMjDQoNCi0gRMOibiBz4buRIHRydW5nIGLDrG5oIHRoZW8gbmjDs20gcXXhu5FjIGdpYTogVOG7qyBi4bqjbmcgc+G7kSBsaeG7h3UgdGEgdGjhuqV5IGTDom4gc+G7kSB0cnVuZyBiw6xuaCBj4bunYSBDaGluYSBsw6AgY2FvIG5o4bqldA0KYGBge3J9DQptb2MgPC0gIGQlPiUgZ3JvdXBfYnkoTmEpICU+JSBzdW1tYXJpc2UobiA9IG4oKSxtZWFuX29mX1BvcCA9IG1lYW4oUG9wKSkNCm1vYw0KDQpgYGANCi0gVMOtbmggdHJ1bmcgduG7iyB0aGVvIG5ow7NtIHF14buRYyBnaWE6IFThu6sgYuG6o25nIHPhu5EgbGnhu4d1IHRhIHRo4bqleSB0cnVuZyB24buLIGPhu6dhIENoaW5hIGzDoCBjYW8gbmjhuqV0DQpgYGB7cn0NCm1lZG9jIDwtIGQgJT4lIGdyb3VwX2J5KE5hKSAlPiUgc3VtbWFyaXNlKG1lZF9vZl9Qb3AgPSBtZWRpYW4oUG9wKSkNCm1lZG9jDQpgYGANCi0gVMOtbmggZMOibiBz4buRIHRydW5nIGLDrG5oIHRoZW8gbsSDbSB2w6AgcXXhu5FjIGdpYQ0KYGBge3J9DQptb2MyIDwtIGQyJT4lIGdyb3VwX2J5KE5hLFkuQ29kZTEpICU+JSBzdW1tYXJpc2UobiA9IG4oKSxtZWFuX29mX1BvcCA9IG1lYW4oUG9wKSwuZ3JvdXBzID0gJ2Ryb3AnKQ0KbW9jMg0KYGBgDQoNCioqVOG7qyBi4bqjbmcgc+G7kSBsaeG7h3UgdGEgY8OzIG3hu5l0IHPhu5Ega+G6v3QgbHXhuq1uIHNhdToqKg0KDQpUSyAyMCB0aMOsIGTDom4gc+G7kSB0cnVuZyBiw6xuaCBj4bunYSBDaGluYSBsw6AgY2FvIG5o4bqldA0KVEsgMjEgdGjDrCBkw6JuIHPhu5EgdHJ1bmcgYsOsbmggY+G7p2EgQ2hpbmEgbMOgIGNhbyBuaOG6pXQNCg0KKlbhuq15IENoaW5hIGzDoCBuxrDhu5tjIGPDsyBz4buRIGTDom4gY2FvIG5o4bqldCB0cm9uZyA1IG7GsOG7m2MqDQoNCiMjIyAqKlNvIHPDoW5oIGTDom4gc+G7kSA1IHF14buRYyBnaWEg4bufIDIgbeG7kWMgdGjhu51pIGdpYW4gMjAwMCB2w6AgMjAyMSoqICMjIw0KDQpgYGB7cn0NCmQ1IDwtIGQlPiUgZmlsdGVyKFkgPT0iMjAwMCJ8IFk9PScyMDIxJyklPiUgc2VsZWN0KE5hLFksUG9wKQ0KYGBgDQotIFThu6sgYuG6o25nIHPhu5EgbGnhu4d1IHRyw6puIHRhIHRo4bqleSDEkcaw4bujYyBkw6JuIHPhu5EgY+G7p2EgNSBxdeG7kWMgZ2lhIMSR4buBdSB0xINuZyBt4bqhbmgsIHRyb25nIMSRw7MgZMOibiBz4buRIGPhu6dhIENoaW5hIHbDoCBJbmRpYSBjw7Mgc+G7sSB0xINuZyB0csaw4bufbmcgbmhhbmguIA0KDQotIFRyb25nIG7Eg20gMjAwMCBCcmF6aWwgbMOgIHF14buRYyBnaWEgY8OzIHPhu5EgZMOibiB0aOG6pXAgbmjhuqV0IHNvIHbhu5tpIDQgbsaw4bubYyBjw7JuIGzhuqFpLg0KDQotIFRyb25nIG7Eg20gMjAyMSBCcmF6aWwgbMOgIHF14buRYyBnaWEgY8OzIHPhu5EgZMOibiB0aOG6pXAgbmjhuqV0Lg0KDQotIFbhuq15IHThu6sgxJHDsyB0w6AgdGjhuqV5IMSRxrDhu6NjIENoaW5hIHbDoCBJbmRpYSBjw7Mgc+G7sSB0xINuZyB0xrDhu59uZyBuaGFuaCwgQnJhemlsIHTEg25nIHTGsOG7n25nIGPDsm4gY2jhuq1tIGjGoW4gc28gduG7m2kgNCBxdeG7kWMgZ2lhIGPDsm4gbOG6oWkuDQo=