Nhiệm vụ 3.1

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("D:/Ngôn Ngữ Lập Trình/population-and-demography.csv")
dim(na)
## [1] 18288    24

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)
library(tidyverse)
library(DT)
library(flextable)
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')
datatable(d)

3. Giải thích

  • China, India, United States, Indonesia, Brazil có số dân đông
d1 <- d%>%select(Na,Y,Pop)
datatable(d1)
  • 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

datatable(d2)

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
table(d2$O100.Code)
## 
## Nhóm 1 Nhóm 2 Nhóm 3 Nhóm 4 
##     23    164     93     80
d4 <- d2%>% group_by(Na,O100.Code) %>% summarise(n= n())
datatable(d4)

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
## # A tibble: 5 × 3
##   Na                n mean_of_Pop
##   <chr>         <int>       <dbl>
## 1 Brazil           72  136542332.
## 2 China            72 1035531645.
## 3 India            72  829637465.
## 4 Indonesia        72  167585644.
## 5 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
## # A tibble: 5 × 2
##   Na            med_of_Pop
##   <chr>              <dbl>
## 1 Brazil         138213270
## 2 China         1069005250
## 3 India          789060550
## 4 Indonesia      167463490
## 5 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
## # A tibble: 10 × 4
##    Na            Y.Code1     n mean_of_Pop
##    <chr>         <chr>   <int>       <dbl>
##  1 Brazil        TK20       51  111405843.
##  2 Brazil        TK21       21  197588093.
##  3 China         TK20       51  903556212.
##  4 China         TK21       21 1356043410.
##  5 India         TK20       51  655156644.
##  6 India         TK21       21 1253376600 
##  7 Indonesia     TK20       51  135039123.
##  8 Indonesia     TK21       21  246627196.
##  9 United States TK20       51  212599363.
## 10 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)
datatable(d5)
  • 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.

Nhiệm vụ 3.2

1. Tóm tắt

  • Có hàng ngàn (nếu không muốn nói là hàng trăm ngàn) cơ sở giáo dục đại học trên khắp thế giới nhận sinh viên mới mỗi năm. Do đó, sinh viên tương lai thường được giao nhiệm vụ nghiên cứu các tổ chức tốt nhất phù hợp với sở thích học tập của họ trước khi nộp đơn. Cách dễ nhất thường là xem một trường đại học quan tâm xếp hạng như thế nào trên toàn cầu (hoặc ở quốc gia bản địa của nó) và sau đó so sánh nó với một trường đại học khác. Một cách tiếp cận chi tiết hơn sẽ là so sánh các trường đại học không chỉ trên bảng xếp hạng của họ mà còn về các số liệu như môi trường nghiên cứu, tiêu chuẩn giảng dạy, lòng hiếu khách đối với sinh viên nước ngoài và thu nhập của ngành trong số những người khác.
  • Cuối cùng, bộ dữ liệu này cung cấp một danh sách các trường đại học cùng với bảng xếp hạng của họ và nhiều số liệu quan tâm khác theo Times Higher Education.
library(tidyverse)
library(DT)
library(flextable)
na1 <- read.csv("D:/Ngôn Ngữ Lập Trình/Nhiệm vụ 3/THE World University Rankings 2016-2024.csv")
library(skimr)
skim(na1)
Data summary
Name na1
Number of rows 12430
Number of columns 13
_______________________
Column type frequency:
character 3
numeric 10
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Name 0 1 3 91 0 2105 0
Country 0 1 4 22 0 108 0
International.Students 0 1 1 3 0 89 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Rank 0 1 736.83 467.96 1.00 346.00 691.00 1078.00 1904.00 ▇▇▇▅▂
Student.Population 0 1 23367.00 34987.15 25.00 10149.50 17824.00 29218.50 1824383.00 ▇▁▁▁▁
Students.to.Staff.Ratio 0 1 18.90 17.06 0.30 12.30 16.30 22.00 865.80 ▇▁▁▁▁
Overall.Score 0 1 35.33 16.88 8.22 21.73 32.40 45.19 98.46 ▇▇▅▁▁
Teaching 0 1 28.54 14.06 8.20 18.80 24.30 33.80 99.00 ▇▅▁▁▁
Research.Environment 0 1 24.11 17.60 0.80 11.70 18.10 30.50 100.00 ▇▅▁▁▁
Research.Quality 0 1 49.19 27.53 0.70 24.50 47.45 72.97 100.00 ▇▇▇▇▆
Industry.Impact 0 1 46.51 18.70 0.00 35.30 39.50 52.20 100.00 ▁▇▅▂▂
International.Outlook 0 1 47.60 23.00 7.10 28.22 43.30 63.60 100.00 ▅▇▆▃▃
Year 0 1 2020.66 2.48 2016.00 2019.00 2021.00 2023.00 2024.00 ▃▅▃▇▇

Chi tiết các biến có trong bộ dữ liệu:

Bộ dữ liệu có 12430 quan sát và 14 biến

  • Rank: xếp hạng
  • Name (Na): tên Trường
  • Country: Quốc gia
  • Student Population (S.Pop): số sinh viên
  • Students to Staff Ratio (StS): Tỷ lệ sinh viên trên nhân viên
  • International Students (InterS): Sinh viên quốc tế
  • Overall Score (OverS): Điểm tổng thể
  • Teaching: Giảng dạy
  • Research Environment (Res.En): Môi trường nghiên cứu
  • Research Quality (Res.Qu): Chất lượng nghiên cứu
  • Industry Impac (Ind)t: Tác động của ngành
  • International Outlook (Inter): Triển vọng quốc tế
  • Year (Y): Năm
dim(na1)
## [1] 12430    13

2. Phân tích dữ liệu

  • Quan sát dữ liệu của một số quốc gia ở Đông Nam Á (Singapore,Thailand, Malaysia, Philippines,Indonesia, Vietnam) với các dữ liệu gồm tên số sinh viên, sinh viên quốc tế, Điểm tổng thể, Môi trường nghiên cứu, Chất lượng nghiên cứu, Tác động của ngành, Triển vọng quốc tế, năm.
library(tidyverse)
names(na1) <- c('Rank','Na','Country','S.Pop','StS','InterS','OverS','Teaching','Res.En','Res.Qu','Ind','Inter','Y')
names(na1)
##  [1] "Rank"     "Na"       "Country"  "S.Pop"    "StS"      "InterS"  
##  [7] "OverS"    "Teaching" "Res.En"   "Res.Qu"   "Ind"      "Inter"   
## [13] "Y"
d6 <- na1%>%select(Y,Country,S.Pop,InterS,OverS,Res.En,Res.Qu,Ind,Inter)
d7 <- d6%>%filter(Country=='Vietnam'|Country=='Singapore'|Country=='Thailand'|Country=='Malaysia'|Country=='Philippiens'|Country=='Indonesia')
datatable(d7)

3. Mã hóa dữ liệu

  • Thêm một cột Na.Code để chia Vietnam với 4 nước còn lại
d8 <- d7
d8$Country.Code <- ifelse(d8$Country == 'Vietnam','Việt Nam','Not Việt Nam')
  • Thêm một cột Y.Code để chia năm thành trước năm 2020 và sau năm 2020
d8$Y.Code2 <- ifelse(d8$Y >= 2020,'Sau năm 2020', 'Trước năm 2020')

datatable(d8)

Từ bảng dữ liệu trên ta thấy được sau năm 2020 thì Trường Đại học của Việt Nam đã được đưa vào danh sách trường Đại học có tiếng thế giới.

4. Bảng tần số

  • Từ số liệu bên dưới ta thấy được trong vòng khoảng thời gian 2016 đến 2024 Việt Nam đã có 23 lần được đưa vào danh sách có các trường đại học thế giới
table(d8$Country)
## 
## Indonesia  Malaysia Singapore  Thailand   Vietnam 
##        83       123        18       127        23

6. Phân tích số liệu

Tính toán đặc trưng đo lường theo Vietnam

VN <- d6%>% filter(Country=='Vietnam')
  • Số sinh viên trùn bình của trường ĐH ở Việt Nam
mean(VN$S.Pop,na.rm = T)
## [1] 42765.74
  • Kết quả bên dưới cho thấy: Min - Gía trị nhỏ nhất : Số sinh viên ít nhất 21519

1st Qu. - Phân vị thứ nhất : là 29647 sinh viên

Median - Trung vị : là 36140 sinh viên

Mean - Gía trị trung bình : là 42766, nghĩa là số sinh viên trung bình là 42766

3rd Qu. - Phân vị thứ ba : là 50474 sinh viên

Max - Gía trị lớn nhất : Số sinh viên cao nhất từng chạm đến là 83599

summary(VN$S.Pop)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   21519   29647   36410   42766   50474   83599
  • Tổng số sinh viên của Việt Nam từ 2016-2024
sum(VN$S.Pop)
## [1] 983612
  • Phương sai của các giá trị điểm tổng thể
var(VN$OverS)
## [1] 104.5054
  • Giá trị ở vị trí trung vị triển vọng quốc tế
median(VN$Inter)
## [1] 45.6

Tính toán đặc trưng đo lường theo nhóm quốc gia

  • Số sinh viên 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 Vietnam là cao nhất
ltna <-  d8%>% group_by(Country) %>% summarise(n = n(),mean_of_S.Pop = mean(S.Pop))
ltna
## # A tibble: 5 × 3
##   Country       n mean_of_S.Pop
##   <chr>     <int>         <dbl>
## 1 Indonesia    83        31153.
## 2 Malaysia    123        17530.
## 3 Singapore    18        28242.
## 4 Thailand    127        30164.
## 5 Vietnam      23        42766.
  • Tính trung vị theo nhóm quốc gia: Từ bảng số liệu ta thấy trung vị của Vietnam là cao nhất
ltna1 <- d8 %>% group_by(Country) %>% summarise(med_of_S.Pop = median(S.Pop))
ltna1
## # A tibble: 5 × 2
##   Country   med_of_S.Pop
##   <chr>            <dbl>
## 1 Indonesia       32695 
## 2 Malaysia        15858 
## 3 Singapore       28248.
## 4 Thailand        28611 
## 5 Vietnam         36410
  • Tính số sinh viên trung bình theo năm và quốc gia
ltna2 <- d8%>% group_by(Country,Y.Code2) %>% summarise(n = n(),mean_of_S.Pop = mean(S.Pop),.groups = 'drop')
ltna2
## # A tibble: 9 × 4
##   Country   Y.Code2            n mean_of_S.Pop
##   <chr>     <chr>          <int>         <dbl>
## 1 Indonesia Sau năm 2020      71        31128.
## 2 Indonesia Trước năm 2020    12        31300.
## 3 Malaysia  Sau năm 2020      91        15905.
## 4 Malaysia  Trước năm 2020    32        22151.
## 5 Singapore Sau năm 2020      10        28279.
## 6 Singapore Trước năm 2020     8        28197.
## 7 Thailand  Sau năm 2020      87        29180.
## 8 Thailand  Trước năm 2020    40        32304.
## 9 Vietnam   Sau năm 2020      23        42766.
  • Từ bảng số liệu trên ta thấy được số sinh viên của 5 nước đều tăng qua các năm, riêng Việt Nam thì số sinh viên sau năm 2020 mới có.

  • Trước năm 2020 và sau năm 2020 Malaysia có số sinh viên thấp hơn só với các nước khác trong khoảng thời gian đó.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAzIg0KYXV0aG9yOiAiTMOqIFRo4buLIE5n4buNYyDDgW5oIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDogDQogaHRtbF9kb2N1bWVudDogDQogICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgdG9jOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmBgYA0KDQojICoqTmhp4buHbSB24bulIDMuMSoqDQoNCiMjICoqMS4gVMOzbSB04bqvdCoqDQoNCkLhu5kgZOG7ryBsaeG7h3UgcGjDom4gdMOtY2ggZMOibiBz4buRIGPhu6dhIGjGoW4gMTAwIHF14buRYyBnaWEgcXVhIGPDoWMgbsSDbSB04burIDE5NTAgLSAyMDIxIHRoZW8gdOG7q25nIMSR4buZIHR14buVaSwgdOG7qyDEkcOzIHRhIHPhur0gdGjhuqV5IMSRxrDhu6NjIHThu5FjIMSR4buZIGdpYSB0xINuZyBkw6JuIHPhu5EsIHPhu7EgZ2nDoCBow7NhIGTDom4gc+G7kSB2w6AgY8OhYyBxdeG7kWMgZ2lhIGPDsyBz4buRIGTDom4gxJHDtG5nIG5o4bqldC4NCiANCioqKkNoaSB0aeG6v3QgY8OhYyBiaeG6v24gY8OzIHRyb25nIGLhu5kgZOG7ryBsaeG7h3U6KioqDQoNCipC4buZIGThu68gbGnhu4d1IGPDsyAxODI4OCBxdWFuIHPDoXQgdsOgIDI0IGJp4bq/bioNCg0KLSBDb3VudHJ5IG5hbWUgKiooTmEpKio6IFTDqm4gcXXhu5FjIGdpYQ0KLSBZZWFyICoqKFkpKio6IG7Eg20NCi0gUG9wdWxhdGlvbjogZMOibiBz4buRDQotIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxICoqKFUxKSoqOiBkw6JuIHPhu5EgdHLhursgZW0gZMaw4bubaSAxIHR14buVaQ0KLSBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgNSAqKihVNSkqKjogZMOibiBz4buRIHRy4bq7IGVtIGTGsOG7m2kgNSB0deG7lWkNCi0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE1ICoqKFUxNSkqKjogZMOibiBz4buRIHRy4bq7IGVtIGTGsOG7m2kgMTUgdHXhu5VpDQotIFBvcHVsYXRpb24gdW5kZXIgdGhlIGFnZSBvZiAyNSAqKihVMjUpKio6IGTDom4gc+G7kSBkxrDhu5tpIDI1IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gNjQgeWVhcnMgKiooMTVUNjQpKio6IHPhu5EgZMOibiB04burIDE1IMSR4bq/biA2NCB0deG7lWkNCi0gUG9wdWxhdGlvbiBvbGRlciB0aGFuIDE1IHllYXJzICoqKE8xNSkqKjogZMOibiBz4buRIHRyw6puIDE1IHR14buVaQ0KLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTggeWVhcnMgKiooTzE4KSoqOiBkw6JuIHPhu5EgdHLDqm4gMTggdHXhu5VpDQotIFBvcHVsYXRpb24gYXQgYWdlIDEgKiooMSkqKjogZMOibiBz4buRIDEgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCAxIHRvIDQgeWVhcnMgKiooMVQpKio6IGTDom4gc+G7kSAxIMSR4bq/biA0IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgNSB0byA5IHllYXJzICoqKDVUOSkqKjogZMOibiBz4buRIDUgxJHhur9uIDkgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCAxMCB0byAxNCB5ZWFycyAqKigxMFQxNCkqKjogZMOibiBz4buRIDEwIMSR4bq/biAxNCB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDE1IHRvIDE5IHllYXJzICoqKDE1VDE5KSoqOiBkw6JuIHPhu5EgMTUgxJHhur9uIDE5IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgMjAgdG8gMjkgeWVhcnMgKiooMjBUOSkqKjogZMOibiBz4buRIDIwIMSR4bq/biAyOSB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDMwIHRvIDM5IHllYXJzICoqKDMwVDM5KSoqOiBkw6JuIHPhu5EgMzAgxJHhur9uIDM5IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgNDAgdG8gNDkgeWVhcnMgKiooNDBUNDkpKio6IGTDom4gc+G7kSA0MCDEkeG6v24gNDkgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFycyAqKig1MFQ1OSkqKjogZMOibiBz4buRIDUwIMSR4bq/biA1OSB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDYwIHRvIDY5IHllYXJzICoqKDYwVDY5KSoqOiBkw6JuIHPhu5EgNjAgxJHhur9uIDY5IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgNzAgdG8gNzkgeWVhcnMgKiooNzBUNzkpKio6IGTDom4gc+G7kSA3MCDEkeG6v24gNzkgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCA4MCB0byA4OSB5ZWFycyAqKig4MFQ4OSkqKjogZMOibiBz4buRIDgwIMSR4bq/biA4OSB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDkwIHRvIDk5IHllYXJzICoqKDkwVDk5KSoqOiBkw6JuIHPhu5EgOTAgxJHhur9uIDk5IHR14buVaQ0KLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTAwIHllYXJzICoqKE8xMDApKio6IGTDom4gc+G7kSBoxqFuIDEwMCB0deG7lWkNCg0KYGBge3J9DQpuYSA8LSByZWFkLmNzdigiRDovTmfDtG4gTmfhu68gTOG6rXAgVHLDrG5oL3BvcHVsYXRpb24tYW5kLWRlbW9ncmFwaHkuY3N2IikNCmRpbShuYSkNCmBgYA0KIyMgKioyLiBQaMOibiB0w61jaCBk4buvIGxp4buHdSoqDQotIFF1YW4gc8OhdCBk4buvIGxp4buHdSA1IHF14buRYyBnaWEgY8OzIHPhu5EgZMOibiDEkcO0bmc6ICpDaGluYSwgSW5kaWEsIFVuaXRlZCBTdGF0ZXMsIEluZG9uZXNpYSwgQnJhemlsKiB04burIG7Eg20gMTk1MSAtIDIwMjEgdGhlbyB04burbmcgxJHhu5kgdHXhu5VpIChkxrDhu5tpIDE1IHR14buVaSwgZMaw4bubaSAyNSB0deG7lWksIHThu6sgMTUgxJHhur9uIDE5IHR14buVaSwgdOG7qyAyMCDEkeG6v24gMjkgdHXhu5VpLCB04burIDMwIMSR4bq/biAzOSB0deG7lWksIHThu6sgNjAgxJHhur9uIDY5IHR14buRaSx04burIDE1IMSR4bq/biA2NCB0deG7lWksIGjGoW4gMTAwIHR14buVaSkNCg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbmFtZXMobmEpIDwtIGMoJ05hJywnWScsJ1BvcCcsJ1UxJywnVTUnLCdVMTUnLCdVMjUnLCcxNVQ2NCcsJ08xNScsJ08xOCcsJzEnLCcxVDQnLCc1VDknLCcxMFQxNCcsJzE1VDE5JywnMjBUMjknLCczMFQzOScsJzQwVDQ5JywnNTBUNTknLCc2MFQ2OScsJzcwVDc5JywnODBUODknLCc5MFQ5OScsJ08xMDAnKQ0KDQpkIDwtIG5hICU+JSBmaWx0ZXIoTmEgJWluJSBjKCdDaGluYScsJ0luZGlhJywnVW5pdGVkIFN0YXRlcycsICdJbmRvbmVzaWEnLCAnQnJhemlsJykpJT4lc2VsZWN0KE5hLFksUG9wLFUxNSxVMjUsJzE1VDE5JywnMjBUMjknLCczMFQzOScsJzYwVDY5JywnMTVUNjQnLCdPMTAwJykNCmRhdGF0YWJsZShkKQ0KDQpgYGANCg0KIyMgKiozLiBHaeG6o2kgdGjDrWNoKioNCg0KLSBDaGluYSwgSW5kaWEsIFVuaXRlZCBTdGF0ZXMsIEluZG9uZXNpYSwgQnJhemlsIGPDsyBz4buRIGTDom4gxJHDtG5nDQpgYGB7cn0NCmQxIDwtIGQlPiVzZWxlY3QoTmEsWSxQb3ApDQpkYXRhdGFibGUoZDEpDQpgYGANCg0KLSBDw6FjIHPhu5EgbGnhu4d1IG7DoHkgY3VuZyBj4bqlcCB0aMO0bmcgdGluIHbhu4Egc+G7sSBwaMOibiBi4buRIGTDom4gc+G7kSB0aGVvIGPDoWMgxJHhu5kgdHXhu5VpIGtow6FjIG5oYXUgdHJvbmcgbeG7l2kgcXXhu5FjIGdpYS4gQ2jDum5nIGPDsyB0aOG7gyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBzbyBzw6FuaCBt4bupYyDEkeG7mSB0deG7lWkgdHLhurssIG3hu6ljIMSR4buZIGdpw6AsIHbDoCBz4buxIHBow6JuIGLhu5EgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSBraMOhYyBuaGF1Lg0KDQojIyAqKjQuIE3DoyBow7NhIGThu68gbGnhu4d1KioNCmBgYHtyfQ0KZDIgPC0gZA0KYGBgDQotIFRow6ptIG3hu5l0IGPhu5l0IE5hLkNvZGUgxJHhu4MgY2hpYSBDaGluYSB24bubaSA0IG7GsOG7m2MgY8OybiBs4bqhaQ0KYGBge3J9DQpkMiROYS5Db2RlIDwtIGlmZWxzZShkMiROYSA9PSAnQ2hpbmEnLCdDaGluYScsJ05vdCBDaGluYScpDQpgYGANCi0gVGjDqm0gbeG7mXQgY+G7mXQgTmEuQ29kZTEgxJHhu4MgY2hpYSBuxINtIHRow6BuaCB0aOG6vyBr4bu3IDIwIHbDoCB0aOG6vyBr4bu3IDIxDQpgYGB7cn0NCmQyJFkuQ29kZTEgPC0gaWZlbHNlKGQyJFkgPj0gMjAwMSwnVEsyMScsICdUSzIwJykNCmBgYA0KLSBUaMOqbSBt4buZdCBj4buZdCBQb3AuQ29kZSDEkeG7gyBjaGlhIGTDom4gc+G7kSB0aMOgbmggMyBuaMOzbTogbmjDs20gMSB24bubaSBz4buRIGTDom4gbmjhu48gaMahbiAxMDAwMDAwMDAsIG5ow7NtIDIgduG7m2kgc+G7kSBkw6JuIHThu6sgMTAwMDAwMDAwIMSR4bq/biA5OTk5OTk5OTkgLCBuaMOzbSAzIHbhu5tpIHPhu5EgZMOibiBs4bubbiBoxqFuIDEwMDAwMDAwMDANCmBgYHtyfQ0KZDIkUG9wLkNvZGUgPC0gY2FzZV93aGVuKGQyJFBvcCA8IDEwMDAwMDAwMCB+ICdOaMOzbSAxJywgZDIkUG9wID49IDEwMDAwMDAwMCAmIGQyJFBvcCA8IDk5OTk5OTk5OSAgfiAnTmjDs20gMicsIGQyJFBvcCA+MTAwMDAwMDAwMCB+ICdOaMOzbSAzJykNCmBgYA0KLSBUaMOqbSBt4buZdCBj4buZdCBPMTAwLkNvZGUgxJHhu4MgcGjDom4gbG/huqFpIG5nxrDhu51pIGzhu5tuIHR14buVaSB0csOqbiAxMDAgdHXhu5VpIHRow6BuaCA0IG5ow7NtOiBuaMOzbSAxIGTGsOG7m2kgMTAwLCBuaMOzbSAyIHThu6sgMTAwIMSR4bq/biA5OTksIG5ow7NtIDMgdOG7qyAxMDAwIMSR4bq/biA5OTk5LCBuaMOzbSA0IGzhu5tuIGjGoW4gMTAwMDAgDQpgYGB7cn0NCmQyJE8xMDAuQ29kZSA8LSBjYXNlX3doZW4oZDIkTzEwMCA8IDEwMCB+ICdOaMOzbSAxJywgZDIkTzEwMCA+PSAxMDAgJiBkMiRPMTAwIDwgOTk5ICB+ICdOaMOzbSAyJywgZDIkTzEwMCA+PSAxMDAwICYgZDIkTzEwMCA8OTk5OSB+ICdOaMOzbSAzJyxkMiRPMTAwID49IDEwMDAwIH4gJ05ow7NtIDQnKQ0KYGBgDQoNCioqKkLhuqNuZyBz4buRIGxp4buHdSBt4bubaSBtw6AgdGEgbmjhuq1uIMSRxrDhu6NjIHNhdSBraGkgbcOjIGjDs2EqKioNCmBgYHtyfQ0KZGF0YXRhYmxlKGQyKQ0KYGBgDQoNCg0KDQojIyAqKjUuIELhuqNuZyB04bqnbiBz4buRKioNCg0KLSBW4bubaSB04bqnbiBzdeG6pXQgeHXhuqV0IGhp4buHbiA3MiBs4bqnbiB0aMOsIGNow7puZyB0YSB0aOG6pXkgxJHGsOG7o2MgYuG7mSBk4buvIGxp4buHdSDEkWFuZyBwaMOibiB0w61jaCBkw6JuIHPhu5EgY+G7p2EgY8OhYyBuxrDhu5tjIHRyb25nIHRo4budaSBnaWFuIDcyIG7Eg20gDQpgYGB7cn0NCnRhYmxlKGQkTmEpDQoNCmBgYA0KDQotIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbhu4Egc+G7kSBuZ8aw4budaSBs4bubbiB0deG7lWkgY8OzIMSR4buZIHR14buVaSBoxqFuIDEwMCB0deG7lWkgY+G7p2EgNSBuxrDhu5tjDQpgYGB7cn0NCnRhYmxlKGQyJE8xMDAuQ29kZSkNCmBgYA0KYGBge3J9DQpkNCA8LSBkMiU+JSBncm91cF9ieShOYSxPMTAwLkNvZGUpICU+JSBzdW1tYXJpc2Uobj0gbigpKQ0KZGF0YXRhYmxlKGQ0KQ0KYGBgDQoNCioqVOG7qyBi4bqjbmcgdOG6p24gc+G7kSB0csOqbiB0YSB0aOG6pXkgbmfGsOG7nWkgbOG7m24gdHXhu5VpIOG7nyBuaMOzbSBz4buRIDIgY8OzIHThuqduIHPhu5EgeHXhuqV0IGhp4buHbiBuaGnhu4F1IG5o4bqldC4gVHJvbmcgxJHDsyB0YSB0aOG6pXkgSW5kb25lc2lhIGPDsyBz4buRIGTDom4gdGh14buZYyBuaMOzbSAyIOG7nyDEkeG7mSB0deG7lWkgaMahbiAxMDAgbmhp4buBdSBuaOG6pXQsIHNhdSDEkcOzIGzDoCBCcmF6aWwuKioNCg0KDQojIyAqKjYuIFBow6JuIHTDrWNoIHPhu5EgbGnhu4d1KioNCg0KIyMjICoqVMOtbmggdG/DoW4gxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBCcmF6aWwqKg0KYGBge3J9DQpCciA8LSBkJT4lIGZpbHRlcihOYT09J0JyYXppbCcpDQpgYGANCi0gRMOibiBz4buRIHRydW5nIGLDrG5oIOG7nyDEkeG7mSB0deG7lWkgZMaw4bubaSAxNSB0deG7lWkNCmBgYHtyfQ0KbWVhbihCciRVMTUsbmEucm0gPSBUKQ0KYGBgDQotIFThu6sgc+G7kSBsaeG7h3UgYsOqbiBkxrDhu5tpIHRhIHRo4bqleSBkw6JuIHPhu5EgdGjhuqVwIG5o4bqldCBj4bunYSBCcmF6aWwgbMOgIDUzOTU1MzYwLCBjYW8gbmjhuqV0IGzDoCAyMTMyNjIyMA0KLSBQaMOibiB24buLIHRo4bupIG5o4bqldCBi4bqxbmcgOTEwNzUyNjANCi0gVHJ1bmcgduG7iyBi4bqxbmcgMTM4MjEzMjcwDQotIETDom4gc+G7kSB0cnVuZyBiw6xuaCBsYWQgMTM2NTQyMzMyDQotIFBow6JuIHbhu4sgdGjhu6kgYmEgYuG6sW5nIDE4MzE1MjQ3Mg0KYGBge3J9DQpzdW1tYXJ5KEJyJFBvcCkNCmBgYA0KLSBU4buVbmcgc+G7kSBuZ8aw4budaSBkw6JuIGjGoW4gMTAwIHF1YSBjw6FjIG7Eg20NCmBgYHtyfQ0Kc3VtKEJyJE8xMDApDQpgYGANCi0gUGjGsMahbmcgc2FpIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gdOG7qyAxNSDEkeG6v24gMTkNCg0KYGBge3J9DQp2YXIoQnIkJzE1VDE5JykNCmBgYA0KLSBHacOhIHRy4buLIOG7nyB24buLIHRyw60gdHJ1bmcgduG7iyBj4bunYSBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgxJHhu5kgdHXhu5VpIDE1IMSR4bq/biA2NA0KYGBge3J9DQptZWRpYW4oQnIkJzE1VDY0JykNCmBgYA0KIyMjICoqVMOtbmggdG/DoW4gxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBuaMOzbSBxdeG7kWMgZ2lhKiojIyMNCg0KLSBEw6JuIHPhu5EgdHJ1bmcgYsOsbmggdGhlbyBuaMOzbSBxdeG7kWMgZ2lhOiBU4burIGLhuqNuZyBz4buRIGxp4buHdSB0YSB0aOG6pXkgZMOibiBz4buRIHRydW5nIGLDrG5oIGPhu6dhIENoaW5hIGzDoCBjYW8gbmjhuqV0DQpgYGB7cn0NCm1vYyA8LSAgZCU+JSBncm91cF9ieShOYSkgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5fb2ZfUG9wID0gbWVhbihQb3ApKQ0KbW9jDQoNCmBgYA0KLSBUw61uaCB0cnVuZyB24buLIHRoZW8gbmjDs20gcXXhu5FjIGdpYTogVOG7qyBi4bqjbmcgc+G7kSBsaeG7h3UgdGEgdGjhuqV5IHRydW5nIHbhu4sgY+G7p2EgQ2hpbmEgbMOgIGNhbyBuaOG6pXQNCmBgYHtyfQ0KbWVkb2MgPC0gZCAlPiUgZ3JvdXBfYnkoTmEpICU+JSBzdW1tYXJpc2UobWVkX29mX1BvcCA9IG1lZGlhbihQb3ApKQ0KbWVkb2MNCmBgYA0KLSBUw61uaCBkw6JuIHPhu5EgdHJ1bmcgYsOsbmggdGhlbyBuxINtIHbDoCBxdeG7kWMgZ2lhDQpgYGB7cn0NCm1vYzIgPC0gZDIlPiUgZ3JvdXBfYnkoTmEsWS5Db2RlMSkgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5fb2ZfUG9wID0gbWVhbihQb3ApLC5ncm91cHMgPSAnZHJvcCcpDQptb2MyDQpgYGANCg0KKipU4burIGLhuqNuZyBz4buRIGxp4buHdSB0YSBjw7MgbeG7mXQgc+G7kSBr4bq/dCBsdeG6rW4gc2F1OioqDQoNClRLIDIwIHRow6wgZMOibiBz4buRIHRydW5nIGLDrG5oIGPhu6dhIENoaW5hIGzDoCBjYW8gbmjhuqV0DQpUSyAyMSB0aMOsIGTDom4gc+G7kSB0cnVuZyBiw6xuaCBj4bunYSBDaGluYSBsw6AgY2FvIG5o4bqldA0KDQoqVuG6rXkgQ2hpbmEgbMOgIG7GsOG7m2MgY8OzIHPhu5EgZMOibiBjYW8gbmjhuqV0IHRyb25nIDUgbsaw4bubYyoNCg0KIyMjICoqU28gc8OhbmggZMOibiBz4buRIDUgcXXhu5FjIGdpYSDhu58gMiBt4buRYyB0aOG7nWkgZ2lhbiAyMDAwIHbDoCAyMDIxKiogIyMjDQoNCmBgYHtyfQ0KZDUgPC0gZCU+JSBmaWx0ZXIoWSA9PSIyMDAwInwgWT09JzIwMjEnKSU+JSBzZWxlY3QoTmEsWSxQb3ApDQpkYXRhdGFibGUoZDUpDQpgYGANCi0gVOG7qyBi4bqjbmcgc+G7kSBsaeG7h3UgdHLDqm4gdGEgdGjhuqV5IMSRxrDhu6NjIGTDom4gc+G7kSBj4bunYSA1IHF14buRYyBnaWEgxJHhu4F1IHTEg25nIG3huqFuaCwgdHJvbmcgxJHDsyBkw6JuIHPhu5EgY+G7p2EgQ2hpbmEgdsOgIEluZGlhIGPDsyBz4buxIHTEg25nIHRyxrDhu59uZyBuaGFuaC4gDQoNCi0gVHJvbmcgbsSDbSAyMDAwIEJyYXppbCBsw6AgcXXhu5FjIGdpYSBjw7Mgc+G7kSBkw6JuIHRo4bqlcCBuaOG6pXQgc28gduG7m2kgNCBuxrDhu5tjIGPDsm4gbOG6oWkuDQoNCi0gVHJvbmcgbsSDbSAyMDIxIEJyYXppbCBsw6AgcXXhu5FjIGdpYSBjw7Mgc+G7kSBkw6JuIHRo4bqlcCBuaOG6pXQuDQoNCi0gVuG6rXkgdOG7qyDEkcOzIHTDoCB0aOG6pXkgxJHGsOG7o2MgQ2hpbmEgdsOgIEluZGlhIGPDsyBz4buxIHTEg25nIHTGsOG7n25nIG5oYW5oLCBCcmF6aWwgdMSDbmcgdMaw4bufbmcgY8OybiBjaOG6rW0gaMahbiBzbyB24bubaSA0IHF14buRYyBnaWEgY8OybiBs4bqhaS4NCg0KIyAqKk5oaeG7h20gduG7pSAzLjIqKg0KDQojIyAqKjEuIFTDs20gdOG6r3QqKg0KLSBDw7MgaMOgbmcgbmfDoG4gKG7hur91IGtow7RuZyBtdeG7kW4gbsOzaSBsw6AgaMOgbmcgdHLEg20gbmfDoG4pIGPGoSBz4bufIGdpw6FvIGThu6VjIMSR4bqhaSBo4buNYyB0csOqbiBraOG6r3AgdGjhur8gZ2nhu5tpIG5o4bqtbiBzaW5oIHZpw6puIG3hu5tpIG3hu5dpIG7Eg20uIERvIMSRw7MsIHNpbmggdmnDqm4gdMawxqFuZyBsYWkgdGjGsOG7nW5nIMSRxrDhu6NjIGdpYW8gbmhp4buHbSB24bulIG5naGnDqm4gY+G7qXUgY8OhYyB04buVIGNo4bupYyB04buRdCBuaOG6pXQgcGjDuSBo4bujcCB24bubaSBz4bufIHRow61jaCBo4buNYyB04bqtcCBj4bunYSBo4buNIHRyxrDhu5tjIGtoaSBu4buZcCDEkcahbi4gQ8OhY2ggZOG7hSBuaOG6pXQgdGjGsOG7nW5nIGzDoCB4ZW0gbeG7mXQgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyBxdWFuIHTDom0geOG6v3AgaOG6oW5nIG5oxrAgdGjhur8gbsOgbyB0csOqbiB0b8OgbiBj4bqndSAoaG/hurdjIOG7nyBxdeG7kWMgZ2lhIGLhuqNuIMSR4buLYSBj4bunYSBuw7MpIHbDoCBzYXUgxJHDsyBzbyBzw6FuaCBuw7MgduG7m2kgbeG7mXQgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyBraMOhYy4gTeG7mXQgY8OhY2ggdGnhur9wIGPhuq1uIGNoaSB0aeG6v3QgaMahbiBz4bq9IGzDoCBzbyBzw6FuaCBjw6FjIHRyxrDhu51uZyDEkeG6oWkgaOG7jWMga2jDtG5nIGNo4buJIHRyw6puIGLhuqNuZyB44bq/cCBo4bqhbmcgY+G7p2EgaOG7jSBtw6AgY8OybiB24buBIGPDoWMgc+G7kSBsaeG7h3UgbmjGsCBtw7RpIHRyxrDhu51uZyBuZ2hpw6puIGPhu6l1LCB0acOqdSBjaHXhuqluIGdp4bqjbmcgZOG6oXksIGzDsm5nIGhp4bq/dSBraMOhY2ggxJHhu5FpIHbhu5tpIHNpbmggdmnDqm4gbsaw4bubYyBuZ2/DoGkgdsOgIHRodSBuaOG6rXAgY+G7p2EgbmfDoG5oIHRyb25nIHPhu5Egbmjhu69uZyBuZ8aw4budaSBraMOhYy4NCi0gQ3Xhu5FpIGPDuW5nLCBi4buZIGThu68gbGnhu4d1IG7DoHkgY3VuZyBj4bqlcCBt4buZdCBkYW5oIHPDoWNoIGPDoWMgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyBjw7luZyB24bubaSBi4bqjbmcgeOG6v3AgaOG6oW5nIGPhu6dhIGjhu40gdsOgIG5oaeG7gXUgc+G7kSBsaeG7h3UgcXVhbiB0w6JtIGtow6FjIHRoZW8gVGltZXMgSGlnaGVyIEVkdWNhdGlvbi4NCg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbmExIDwtIHJlYWQuY3N2KCJEOi9OZ8O0biBOZ+G7ryBM4bqtcCBUcsOsbmgvTmhp4buHbSB24bulIDMvVEhFIFdvcmxkIFVuaXZlcnNpdHkgUmFua2luZ3MgMjAxNi0yMDI0LmNzdiIpDQpsaWJyYXJ5KHNraW1yKQ0Kc2tpbShuYTEpDQpgYGANCg0KKioqQ2hpIHRp4bq/dCBjw6FjIGJp4bq/biBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdToqKioNCg0KKkLhu5kgZOG7ryBsaeG7h3UgY8OzIDEyNDMwIHF1YW4gc8OhdCB2w6AgMTQgYmnhur9uKg0KDQotIFJhbms6IHjhur9wIGjhuqFuZw0KLSBOYW1lICoqKE5hKSoqOiB0w6puIFRyxrDhu51uZw0KLSBDb3VudHJ5OiBRdeG7kWMgZ2lhDQotIFN0dWRlbnQgUG9wdWxhdGlvbiAqKihTLlBvcCkqKjogc+G7kSBzaW5oIHZpw6puDQotIFN0dWRlbnRzIHRvIFN0YWZmIFJhdGlvICoqKFN0UykqKjogVOG7tyBs4buHIHNpbmggdmnDqm4gdHLDqm4gbmjDom4gdmnDqm4NCi0gSW50ZXJuYXRpb25hbCBTdHVkZW50cyAqKihJbnRlclMpKio6IFNpbmggdmnDqm4gcXXhu5FjIHThur8NCi0gT3ZlcmFsbCBTY29yZSAqKihPdmVyUykqKjogxJBp4buDbSB04buVbmcgdGjhu4MNCi0gVGVhY2hpbmc6IEdp4bqjbmcgZOG6oXkNCi0gUmVzZWFyY2ggRW52aXJvbm1lbnQgKiooUmVzLkVuKSoqOiBNw7RpIHRyxrDhu51uZyBuZ2hpw6puIGPhu6l1DQotIFJlc2VhcmNoIFF1YWxpdHkgKiooUmVzLlF1KSoqOiBDaOG6pXQgbMaw4bujbmcgbmdoacOqbiBj4bupdQ0KLSBJbmR1c3RyeSBJbXBhYyAqKihJbmQpKip0OiBUw6FjIMSR4buZbmcgY+G7p2EgbmfDoG5oDQotIEludGVybmF0aW9uYWwgT3V0bG9vayAqKihJbnRlcikqKjogVHJp4buDbiB24buNbmcgcXXhu5FjIHThur8NCi0gWWVhciAqKihZKSoqOiBOxINtDQoNCmBgYHtyfQ0KZGltKG5hMSkNCmBgYA0KIyMgKioyLiBQaMOibiB0w61jaCBk4buvIGxp4buHdSoqDQoNCi0gUXVhbiBzw6F0IGThu68gbGnhu4d1IGPhu6dhIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSDhu58gxJDDtG5nIE5hbSDDgSAoU2luZ2Fwb3JlLFRoYWlsYW5kLCBNYWxheXNpYSwgUGhpbGlwcGluZXMsSW5kb25lc2lhLCBWaWV0bmFtKSB24bubaSBjw6FjIGThu68gbGnhu4d1IGfhu5NtIHTDqm4gIHPhu5Egc2luaCB2acOqbiwgc2luaCB2acOqbiBxdeG7kWMgdOG6vywgxJBp4buDbSB04buVbmcgdGjhu4MsIE3DtGkgdHLGsOG7nW5nIG5naGnDqm4gY+G7qXUsIENo4bqldCBsxrDhu6NuZyBuZ2hpw6puIGPhu6l1LCBUw6FjIMSR4buZbmcgY+G7p2EgbmfDoG5oLCBUcmnhu4NuIHbhu41uZyBxdeG7kWMgdOG6vywgbsSDbS4NCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpuYW1lcyhuYTEpIDwtIGMoJ1JhbmsnLCdOYScsJ0NvdW50cnknLCdTLlBvcCcsJ1N0UycsJ0ludGVyUycsJ092ZXJTJywnVGVhY2hpbmcnLCdSZXMuRW4nLCdSZXMuUXUnLCdJbmQnLCdJbnRlcicsJ1knKQ0KbmFtZXMobmExKQ0KYGBgDQpgYGB7cn0NCmQ2IDwtIG5hMSU+JXNlbGVjdChZLENvdW50cnksUy5Qb3AsSW50ZXJTLE92ZXJTLFJlcy5FbixSZXMuUXUsSW5kLEludGVyKQ0KZDcgPC0gZDYlPiVmaWx0ZXIoQ291bnRyeT09J1ZpZXRuYW0nfENvdW50cnk9PSdTaW5nYXBvcmUnfENvdW50cnk9PSdUaGFpbGFuZCd8Q291bnRyeT09J01hbGF5c2lhJ3xDb3VudHJ5PT0nUGhpbGlwcGllbnMnfENvdW50cnk9PSdJbmRvbmVzaWEnKQ0KZGF0YXRhYmxlKGQ3KQ0KYGBgDQoNCiMjICoqMy4gTcOjIGjDs2EgZOG7ryBsaeG7h3UqKg0KLSBUaMOqbSBt4buZdCBj4buZdCBOYS5Db2RlIMSR4buDIGNoaWEgVmlldG5hbSB24bubaSA0IG7GsOG7m2MgY8OybiBs4bqhaQ0KYGBge3J9DQpkOCA8LSBkNw0KZDgkQ291bnRyeS5Db2RlIDwtIGlmZWxzZShkOCRDb3VudHJ5ID09ICdWaWV0bmFtJywnVmnhu4d0IE5hbScsJ05vdCBWaeG7h3QgTmFtJykNCg0KYGBgDQoNCi0gVGjDqm0gbeG7mXQgY+G7mXQgWS5Db2RlIMSR4buDIGNoaWEgbsSDbSB0aMOgbmggdHLGsOG7m2MgbsSDbSAyMDIwIHbDoCBzYXUgbsSDbSAyMDIwDQpgYGB7cn0NCmQ4JFkuQ29kZTIgPC0gaWZlbHNlKGQ4JFkgPj0gMjAyMCwnU2F1IG7Eg20gMjAyMCcsICdUcsaw4bubYyBuxINtIDIwMjAnKQ0KDQpkYXRhdGFibGUoZDgpDQpgYGANCg0KDQoqKlThu6sgYuG6o25nIGThu68gbGnhu4d1IHRyw6puIHRhIHRo4bqleSDEkcaw4bujYyBzYXUgbsSDbSAyMDIwIHRow6wgVHLGsOG7nW5nIMSQ4bqhaSBo4buNYyBj4bunYSBWaeG7h3QgTmFtIMSRw6MgxJHGsOG7o2MgxJHGsGEgdsOgbyBkYW5oIHPDoWNoIHRyxrDhu51uZyDEkOG6oWkgaOG7jWMgY8OzIHRp4bq/bmcgdGjhur8gZ2nhu5tpLioqIA0KDQojIyAqKjQuIELhuqNuZyB04bqnbiBz4buRKioNCi0gVOG7qyBz4buRIGxp4buHdSBiw6puIGTGsOG7m2kgdGEgdGjhuqV5IMSRxrDhu6NjIHRyb25nIHbDsm5nIGtob+G6o25nIHRo4budaSBnaWFuIDIwMTYgxJHhur9uIDIwMjQgVmnhu4d0IE5hbSDEkcOjIGPDsyAyMyBs4bqnbiDEkcaw4bujYyDEkcawYSB2w6BvIGRhbmggc8OhY2ggY8OzIGPDoWMgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyB0aOG6vyBnaeG7m2kNCmBgYHtyfQ0KdGFibGUoZDgkQ291bnRyeSkNCmBgYA0KIyMgKio2LiBQaMOibiB0w61jaCBz4buRIGxp4buHdSoqDQoNCiMjIyAqKlTDrW5oIHRvw6FuIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gVmlldG5hbSoqDQoNCmBgYHtyfQ0KVk4gPC0gZDYlPiUgZmlsdGVyKENvdW50cnk9PSdWaWV0bmFtJykNCmBgYA0KLSBT4buRIHNpbmggdmnDqm4gdHLDuW4gYsOsbmggY+G7p2EgdHLGsOG7nW5nIMSQSCDhu58gVmnhu4d0IE5hbQ0KYGBge3J9DQptZWFuKFZOJFMuUG9wLG5hLnJtID0gVCkNCmBgYA0KLSBL4bq/dCBxdeG6oyBiw6puIGTGsOG7m2kgY2hvIHRo4bqleToNCioqTWluIC0gR8OtYSB0cuG7iyBuaOG7jyBuaOG6pXQgOioqIFPhu5Egc2luaCB2acOqbiDDrXQgbmjhuqV0IDIxNTE5DQoNCioqMXN0IFF1LiAtIFBow6JuIHbhu4sgdGjhu6kgbmjhuqV0IDoqKiBsw6AgMjk2NDcgc2luaCB2acOqbiANCg0KKipNZWRpYW4gLSBUcnVuZyB24buLIDoqKiBsw6AgMzYxNDAgc2luaCB2acOqbg0KDQoqKk1lYW4gLSBHw61hIHRy4buLIHRydW5nIGLDrG5oIDoqKiBsw6AgNDI3NjYsIG5naMSpYSBsw6Agc+G7kSBzaW5oIHZpw6puIHRydW5nIGLDrG5oIGzDoCA0Mjc2Ng0KDQoqKjNyZCBRdS4gLSBQaMOibiB24buLIHRo4bupIGJhIDoqKiBsw6AgNTA0NzQgc2luaCB2acOqbg0KDQoqKk1heCAtIEfDrWEgdHLhu4sgbOG7m24gbmjhuqV0IDoqKiBT4buRIHNpbmggdmnDqm4gY2FvIG5o4bqldCB04burbmcgY2jhuqFtIMSR4bq/biBsw6AgODM1OTkNCg0KYGBge3J9DQpzdW1tYXJ5KFZOJFMuUG9wKQ0KYGBgDQotIFThu5VuZyBz4buRIHNpbmggdmnDqm4gY+G7p2EgVmnhu4d0IE5hbSB04burIDIwMTYtMjAyNA0KYGBge3J9DQpzdW0oVk4kUy5Qb3ApDQpgYGANCi0gUGjGsMahbmcgc2FpIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyDEkWnhu4NtIHThu5VuZyB0aOG7gw0KDQpgYGB7cn0NCnZhcihWTiRPdmVyUykNCmBgYA0KLSBHacOhIHRy4buLIOG7nyB24buLIHRyw60gdHJ1bmcgduG7iyB0cmnhu4NuIHbhu41uZyBxdeG7kWMgdOG6vw0KYGBge3J9DQptZWRpYW4oVk4kSW50ZXIpDQpgYGANCiMjIyAqKlTDrW5oIHRvw6FuIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gbmjDs20gcXXhu5FjIGdpYSoqIyMjDQoNCi0gU+G7kSBzaW5oIHZpw6puIHRydW5nIGLDrG5oIHRoZW8gbmjDs20gcXXhu5FjIGdpYTogVOG7qyBi4bqjbmcgc+G7kSBsaeG7h3UgdGEgdGjhuqV5IGTDom4gc+G7kSB0cnVuZyBiw6xuaCBj4bunYSBWaWV0bmFtIGzDoCBjYW8gbmjhuqV0DQpgYGB7cn0NCmx0bmEgPC0gIGQ4JT4lIGdyb3VwX2J5KENvdW50cnkpICU+JSBzdW1tYXJpc2UobiA9IG4oKSxtZWFuX29mX1MuUG9wID0gbWVhbihTLlBvcCkpDQpsdG5hDQoNCmBgYA0KLSBUw61uaCB0cnVuZyB24buLIHRoZW8gbmjDs20gcXXhu5FjIGdpYTogVOG7qyBi4bqjbmcgc+G7kSBsaeG7h3UgdGEgdGjhuqV5IHRydW5nIHbhu4sgY+G7p2EgVmlldG5hbSBsw6AgY2FvIG5o4bqldA0KYGBge3J9DQpsdG5hMSA8LSBkOCAlPiUgZ3JvdXBfYnkoQ291bnRyeSkgJT4lIHN1bW1hcmlzZShtZWRfb2ZfUy5Qb3AgPSBtZWRpYW4oUy5Qb3ApKQ0KbHRuYTENCmBgYA0KLSBUw61uaCBz4buRIHNpbmggdmnDqm4gdHJ1bmcgYsOsbmggdGhlbyBuxINtIHbDoCBxdeG7kWMgZ2lhDQpgYGB7cn0NCmx0bmEyIDwtIGQ4JT4lIGdyb3VwX2J5KENvdW50cnksWS5Db2RlMikgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5fb2ZfUy5Qb3AgPSBtZWFuKFMuUG9wKSwuZ3JvdXBzID0gJ2Ryb3AnKQ0KbHRuYTINCmBgYA0KLSBU4burIGLhuqNuZyBz4buRIGxp4buHdSB0csOqbiB0YSB0aOG6pXkgxJHGsOG7o2Mgc+G7kSBzaW5oIHZpw6puIGPhu6dhIDUgbsaw4bubYyDEkeG7gXUgdMSDbmcgcXVhIGPDoWMgbsSDbSwgcmnDqm5nIFZp4buHdCBOYW0gdGjDrCBz4buRIHNpbmggdmnDqm4gc2F1IG7Eg20gMjAyMCBt4bubaSBjw7MuIA0KDQotIFRyxrDhu5tjIG7Eg20gMjAyMCB2w6Agc2F1IG7Eg20gMjAyMCBNYWxheXNpYSBjw7Mgc+G7kSBzaW5oIHZpw6puIHRo4bqlcCBoxqFuIHPDsyB24bubaSBjw6FjIG7GsOG7m2Mga2jDoWMgdHJvbmcga2hv4bqjbmcgdGjhu51pIGdpYW4gxJHDsy4NCg0K