1 Nhiệm vụ 3.1

1.1 Giải thích bộ dữ liệu “Population-and-demography.csn”

  • “Population-and-demography.csn” là bộ dữ liệu về tổng dân số của các quốc gia trên thế giới được tính theo các năm và theo độ tuổi khác nhau. Bộ dữ liệu gồm có 18288 quan sát và 24 biến, trong đó gồm có 1 biến định tính và 23 biến định lượng. Tên cụ thể của các biến như sau: Cụ thể, là tổng dân số ở độ tuổi: Dưới 1 tuổi, dưới 5 tuổi, dưới 15 tuổi, dưới 25 tuổi, 15-64 tuổi, trên 15 tuổi, trên 18 tuổi, 1 tuổi, từ 1-4 tuổi, 5-9 tuổi, 10-14 tuổi, 15-19 tuổi, 20-29 tuổi, 30-39 tuổi, 40-49 tuổi, 50-59 tuổi, 60-69 tuổi, 70-79 tuổi, 80-89 tuổi, 90-99 tuổi và từ 100 tuổitrở lên.

  • Đọc bộ dữ liệu bằng câu lệnh read.csv(file.choose(), header =T) và gán vào data để dễ gọi tên trong phần phân tích bên dưới.

library(csv)
data <- read.csv(file.choose(), header =T)
datatable(data)
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html
  • Lấy ra tổng dân số của 5 quốc gia là Mexico, Malaysia, Campuchia, Việt Nam, Trung Quốc và chọn ra 5 nhóm tuổi là tổng dân số trẻ em 1 tuổi, từ 1 đến 4 tuổi, từ 5 đến 9 tuổi, từ 10 đến 14 tuổi và từ 15 đến 19 tuổi của 5 quốc gia này để phân tích.
d <- data %>% select("Country.name","Year","Population","Population.at.age.1","Population.aged.1.to.4.years","Population.aged.5.to.9.years","Population.aged.10.to.14.years","Population.aged.15.to.19.years")
names(d) <- c("Country","Year","Population","age.1","1-4","5-9","10-14","15-19")
da <- d[d$Country==c("Mexico","Malaysia","Cambodia","Vietnam","China"),]
## Warning in d$Country == c("Mexico", "Malaysia", "Cambodia", "Vietnam",
## "China"): longer object length is not a multiple of shorter object length
datatable(da)

1.2 Mã hóa dữ liệu

  • Dùng “recode” để đặt lại tên của 5 quốc gia đã chọn theo các nhóm 1,2,3,4,5.

  • Dùng “ifelse” để phân loại tổng dân số của 5 quốc gia, nếu tổng dân số lớn hơn hoặc bằng 50000000 (người) thì xếp loại “Cao”, nhỏ hơn 50000000 (người) thì xếp loại thấp.

  • Dùng “ifelse” để phân loại tổng dân số trẻ em ở độ tuổi là 1 tuổi của 5 quốc gia, nếu tổng dân số đó nằm trong khoảng từ 1000000 (người) đến 10000000 (người) thì xếp loại “Bình thường”, còn lại xếp vào “Không bình thường”.

  • Dùng “case_when” để mã hóa lại dữ liệu tổng dân số đã phân loại, Nếu tổng dân số nhỏ hơn 10000000 (người) thì đặt là “Quá ít”, nếu nằm trong khoảng từ 10000000 (người) đến 1000000000 (người) thì đặt là “Trung bình”, và lớn hơn 1000000000 (người) đặt là “Quá đông”.

  • Dùng “cut” để chia tổng dân số ra làm 4 nhóm và đặt tên là nhóm A, nhóm B, nhóm C và nhóm D.

Thực hiện các câu lệnh và ta thu được bảng sau:

da$C.code <- recode(da$Country, Mexico = "Nhóm 1", Malaysia = "Nhóm 2", Cambodia = "Nhóm 3", Vietnam = "Nhóm 4", China ="Nhóm 5" )

da$P.code <- ifelse(da$Population >= 50000000, "Cao","Không cao")

da$P.code1 <- ifelse(da$age.1 >= 1000000 & da$age.1 <= 10000000, "Bình thường","Không Bình Thường")

da$P.code2 <- case_when(da$Population < 10000000 ~ "Quá ít", da$Population >= 10000000 & da$Population <= 1000000000 ~ 'Trung bình', da$Population > 1000000000 ~ "Quá đông")

da$P.code3 <- cut(da$Population,4,labels = c('Nhóm A','Nhóm B','Nhóm C','Nhóm D'))
datatable(da)

1.3 Lập bảng tần số

1.3.1 Biểu đồ STEM-LEAF

Biểu đồ nhánh là của Tổng dân số các nước, được thể hiện như sau:

stem(data$Population)
## 
##   The decimal point is 9 digit(s) to the right of the |
## 
##   0 | 00000000000000000000000000000000000000000000000000000000000000000000+17217
##   0 | 55555555555555555555555555555555555555555555555555555666666666666666+226
##   1 | 00000000000000000000000000000000000000000000000000000001111111111111+165
##   1 | 55555555555556666666666666667777777777777778888888888888888999999999
##   2 | 00000000000001111111111111111222222222222222233333333333333444444444
##   2 | 5555555555555555666666666666777777777778888888889999999999
##   3 | 000000000000111111111222222222233333333334444444444
##   3 | 55555555666666777777778888888899999999
##   4 | 00000011111111222222223333333444444444
##   4 | 55555555666666777777777888889999
##   5 | 00000000111122222333334444
##   5 | 55556677778899
##   6 | 001112233344
##   6 | 556666789
##   7 | 012334
##   7 | 567889

1.3.2 Lập bảng tần số cho 1 biến

Để biết số lần xuất hiện của các quốc gia trong bộ dữ liệu gồm 5 quốc gia vừa phân tích ở trên, ta dùng câu lệnh table() và kết quả thu được là số lần xuất hiện trong bảng dữ liệu của nước Cambodia là 15 lần, China là 15 lần, Malaysia là 15 lần, Mexico là 15 lần và Việt Nam là 14 lần.

table(da$Country)
## 
## Cambodia    China Malaysia   Mexico  Vietnam 
##       15       15       15       15       14

1.3.3 Lập bảng tần số cho 2 biến

Để biết số lần xuất hiện tổng dân số của 5 quốc gia đó thuộc nhóm A,B,C và D trong bộ dữ liệu vừa phân tích ở trên, ta dùng câu lệnh table() và kết quả thu được là :

  • Tổng dân số của nước Cambodia thuộc nhóm A xuất hiện 15 lần và không có nhóm B,C và D;

  • Tổng dân số của nước China thuộc nhóm A không xuất hiện, Thuộc nhóm B xuất hiện 3 lần, thuộc nhóm C xuất hiện 4 lần và thuộc nhóm D xuất hiện 8 lần;

  • Tổng dân số của nước Malaysia thuộc nhóm A xuất hiện 15 lần và không có nhóm B,C và D;

  • Tổng dân số của nước Mexico thuộc nhóm A xuất hiện 15 lần và không có nhóm B,C và D;

  • Tổng dân số của nước Việt Nam thuộc nhóm A xuất hiện 14 lần và không có nhóm B,C và D.

table(da$P.code3,da$Country)
##         
##          Cambodia China Malaysia Mexico Vietnam
##   Nhóm A       15     0       15     15      14
##   Nhóm B        0     3        0      0       0
##   Nhóm C        0     4        0      0       0
##   Nhóm D        0     8        0      0       0

1.4 Phân tích dữ liệu

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

Tính trung bình và trung vị của tổng dân số của mỗi quốc gia theo nhóm quốc gia. Thực hiện các câu lệnh và thu được bảng dữ liệu sau:

a1 <- data %>% group_by(Country.name) %>% summarise(n = n(),mean_of_Population = mean(Population))
a2 <- data %>% group_by(Country.name) %>% summarise(med_of_Population = median(Population))
datatable(mutate(a1,a2))

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

Tính trung bình và trung vị của tổng dân số của mỗi quốc gia theo nhóm thời gian (Year). Thực hiện các câu lệnh và thu được bảng dữ liệu sau:

b1 <- data %>% group_by(Year) %>% summarise(n = n(),mean_of_Population = mean(Population))
b2 <- data %>% group_by(Year) %>% summarise(med_of_Population = median(Population))
datatable(mutate(b1,b2))

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

Tính trung bình và trung vị của tổng dân số ở độ tuổi từ 80-89 tuổi của mỗi quốc gia theo nhóm quốc gia. Thực hiện các câu lệnh và thu được bảng dữ liệu sau:

c1 <- data %>% group_by(Country.name) %>% summarize(n = n(),mean_of_Population.aged.80.to.89.years = mean(Population.aged.80.to.89.years))
c2 <- data %>% group_by(Country.name) %>% summarize(med_of_Population.aged.80.to.89.years = median(Population.aged.80.to.89.years))
datatable(mutate(c1,c2))

2 Nhiệm vụ 3.2

2.1 Giải thích bộ dữ liệu POPULATION

  • POPULATION là một bộ dữ liệu về một vài số liệu thống kế tổng dân số được cập nhật từ 203 quốc gia trong khoảng thời gian từ 1905-2023 và phần trăm tổng dân số của các quốc gia đó so với tống dân số thế giới tại năm mà số liệu được cập nhật.
  • Bộ dữ liệu gồm có 203 quan sát ứng với 203 quốc gia và 5 biến ứng với 5 cột là tên quốc gia(Country), tổng dân số(Population), Phần trăm tổng dân số so với thế giới(Pecent.of.world) và thời gian cập nhật số liệu(Date).
  • Đọc bộ dữ liệu bằng câu lệnh read.xlsx(file.choose(), sheetIndex =1, header =T) và gán vào Data để dễ gọi tên trong phần phân tích bên dưới.
library(xlsx)
Data <- read.xlsx(file.choose(), sheetIndex =1, header =T)
datatable(Data)

2.2 Mã hóa dữ liệu

  • Dùng “ifelse” để phân loại tổng dân số của các quốc gia theo phần trăm dân số so với thế giới, nếu phần trăm đó nhỏ hơn hoặc bằng 0.5 thì xếp loại “Thấp”, nếu trên 0.5 thì xếp loại “Cao”.

  • Dùng “ifelse” để phân nhóm 2 loại

  • Dùng “case_when” để mã hóa lại dữ liệu tổng dân số của các quốc gia theo phần trăm dân số so với thế giới, nếu phần trăm đó dưới 0.5 thì xếp loại “Thấp”, nếu nằm trong khoảng từ 0.5 đến 3.0 thì xếp loại “Trung bình”, trên 3.0 thì xếp loại “Quá đông”

  • Dùng “cut” để chia tổng dân số ra làm 6 nhóm và đặt tên là nhóm 1, nhóm 2, nhóm 3, nhóm 4, nhóm 5 và nhóm 6.

Ta sử dụng các câu lệnh trên và thu được bảng dữ liệu sau:

Data$NX <- ifelse(Data$Pecent.of.world <=0.5, "Thấp","Cao")
Data$NX1 <- ifelse(Data$Pecent.of.world >0.5,"Nhóm A","Nhóm B")
Data$NX2 <- case_when(Data$Pecent.of.world < 0.5 ~ " Quá ít", Data$Pecent.of.world >= 0.5 & Data$Pecent.of.world <= 3 ~ "Trung Bình", Data$Pecent.of.world >3 ~ "QUá đông")
Data$NX3 <- cut(Data$Population,6,labels = c("Nhóm 1","Nhóm 2","Nhóm 3","Nhóm 4","Nhóm 5","Nhóm 6"))
datatable(Data)

2.3 Lập bảng tần số

2.3.1 Biểu đồ STEM-LEAF

Biểu đồ nhánh lá cho tổng dân số của các quốc gia trong bảng dữ liệu. Thực hiện câu lệnh và thu được như sau:

stem(Data$Population)
## 
##   The decimal point is 8 digit(s) to the right of the |
## 
##    0 | 00000000000000000000000000000000000000000000000000000000000000000000+107
##    1 | 001112357
##    2 | 0248
##    3 | 4
##    4 | 
##    5 | 
##    6 | 
##    7 | 
##    8 | 
##    9 | 
##   10 | 
##   11 | 
##   12 | 
##   13 | 9
##   14 | 1

2.3.2 Bảng tần số cho 1 biến

Để biết số lần xuất hiện của các nhóm theo phần trăm dân số so với thế giới vừa phân tích được ở trên, ta dùng câu lệnh table() và kết quả thu được là số lần xuất hiện trong bảng của nhóm 1 là 198 lần, nhóm 2 xuất hiện 3 lần, nhóm 3, nhóm 4 và nhóm 5 thì không xuất hiện trong bảng và nhóm 6 thì xuất hiện 2 lần trong bảng.

table(Data$NX3)
## 
## Nhóm 1 Nhóm 2 Nhóm 3 Nhóm 4 Nhóm 5 Nhóm 6 
##    198      3      0      0      0      2

2.3.3 Bảng tần số cho 2 biến

Để biết số lần xuất hiện của nhóm A và nhóm B theo phần trăm dân số so với thế giới được phân tích ở trên, ta sử dụng câu lệnh table() và kết quả thu được như sau:

  • Nhóm A theo phần trăm dân số so với thế giới được xếp vào loại “Quá ít” là không, xếp loại “Quá đông” là 4 lần và xếp vào loại “Trung bình” là 28 lần;

  • Nhóm B theo phần trăm dân số so với thế giới được xếp vào loại “Quá ít” là 163 lần, xếp loại “Quá đông” là không và xếp vào loại “Trung bình” là 8 lần.

table(Data$NX1,Data$NX2)
##         
##           Quá ít QUá đông Trung Bình
##   Nhóm A       0        4         28
##   Nhóm B     163        0          8

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

Tính toán các đặc trưng đo lường của Pecent.of.world (Phần trăm dân số so với thế giới), (có 8 đặc trưng):

2.4.1 summarry:

summary(Data$Pecent.of.world)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0010  0.0200  0.1000  0.4769  0.3500 17.5000
  • Trong summary, thì ta biết được những dữ liệu như sau:

  • min = 0.0010: là phần trăm dân số so với thế giới thấp nhất là 0.0010;

  • max = 17.5000: là phần trăm dân số so với thế giới cao nhất là 17.5000;

  • mean = 0.4769: trung bình của phần trăm dân số so với thế giới là 0.4769;

  • median(trung vị) = 0.1000: sẽ có 50% phần trăm dân số so với thế giới dưới 0.1000 và 50% phần trăm dân số so với thế giới trên 0.1000;

  • 1st Qu = 0.0200: tứ phân vị thứ nhất, có 25% phần trăm dân số so với thế giới là 0.0200;

  • 3rd Qu = 0.3500: tứ phân vị thứ 3, có 75% phần trăm dân số so với thế giới dưới 0.3500 hay có 25% phần trăm dân số so với thế giới trên 0.3500.

2.4.2 sum: tính tổng

Và kết quả thu được là 96.815%. Do là ở đây chỉ lấy số liệu của 203 quốc gia trên thế giới để phân tích nên tổng phần trăm dân số so với thế giới ở dây sẽ không được 100%.

sum(Data$Pecent.of.world)
## [1] 96.815

2.4.3 mean: tính trung bình

Trung bình của phần trăm dân số so với thế giới của các nước là 0.4769212

mean(Data$Pecent.of.world,na.rm = T)
## [1] 0.4769212

2.4.4 length: đo độ dài

Cho biết độ dài của bộ dữ liệu. Thực hiện câu lệnh và biết được có 203 số liệu về phần trăm dân sô so với thế giới được cập nhật trong bảng dữ liệu.

length(Data$Pecent.of.world)
## [1] 203

2.4.5 var: phương sai

Cho biết trung bình của bình phương độ lệch của phần trăm dân số so với thế giới của các nước là 3.208354. Hay biết được sự chênh lệch giữa phần trăm dân số so với thế giới của các nước là 3.2008354.

var(Data$Pecent.of.world)
## [1] 3.208354

2.4.6 sd: độ lệch chuẩn

Độ lệch chuẩn đo tính biến động của giá trị mang tính thống kê. Nó cho thấy sự chênh lệch về giá trị của từng thời điểm đánh giá so với giá trị trung bình. Thực hiện câu lệnh và thu được độ lệch chuẩn là 0.1

sd(Data$Pecent.of.world)
## [1] 1.791188

2.4.7 median: trung vị

Trung vị: giá trị lớn nhất ở giữa trong chuỗi dữ liệu được gọi là giá trị trung bình. Trung vị của phần trăm dân số so với thế giới là 0.1

median(Data$Pecent.of.world)
## [1] 0.1

2.4.8 quantile: phân vị

Tính tứ phân vị của dãy số liệu, thực hiện câu lệnh và biết được:

  • Tứ phân vị thứ nhất (25%): có 25% độ lớn của Phần trăm dân số của các nước so với thế giới dưới 0.02 hay có 75% độ lớn của Phần trăm dân số của các nước so với thế giới trên 0.02;

  • Tứ phân vị thứ hai-trung vị (50%): có 50% độ lớn của Phần trăm dân số của các nước so với thế giới dưới 0.1 hay có 50% độ lớn của Phần trăm dân số của các nước so với thế giới trên 0.1;

  • Tứ phân vị thứ ba (75%): có 75% độ lớn của Phần trăm dân số của các nước so với thế giới dưới 0.35 hay có 25% độ lớn của Phần trăm dân số của các nước so với thế giới trên 0.35.

quantile(Data$Pecent.of.world, probs = c(.25,.5,.75))
##  25%  50%  75% 
## 0.02 0.10 0.35

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

2.5.1 Tính toán các đặc trưng đo lường theo nhóm phần trăm dân số so với thế giới (Pecent.of.world)

Tính trung bình và trung vị tổng dân số của các nước theo nhóm phần trăm dân số so với quốc gia. Thực hiện các câu lệnh và ta thu được bảng kết quả sau:

d1 <- Data %>% group_by(Pecent.of.world) %>% summarise(n = n(),mean_of_Population = mean(Population))
d2<- Data %>% group_by(Pecent.of.world) %>% summarise(med_of_Population = median(Population))
datatable(mutate(d1,d2))

2.5.2 Tính toán các đặc trưng đo lường theo nhóm thời gian (Date)

Tính trung bình và trung vị tổng dân số của các nước theo nhóm thời gian. Thực hiện các câu lệnh và ta thu được bảng kết quả sau:

e1 <- Data %>% group_by(Date) %>% summarise(n = n(),mean_of_Population = mean(Population))
e2<- Data %>% group_by(Date) %>% summarise(med_of_Population = median(Population))
datatable(mutate(e1,e2))
LS0tDQp0aXRsZTogIk5ISeG7hk0gVuG7pCAzIg0KYXV0aG9yOiAiTmd1eeG7hW4gVGjhu4sgSG/DoG5nIFnhur9uIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmxpYnJhcnkoImZsZXh0YWJsZSIpDQpsaWJyYXJ5KCJEVCIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KIyBOaGnhu4dtIHbhu6UgMy4xDQoNCiMjIEdp4bqjaSB0aMOtY2ggYuG7mSBk4buvIGxp4buHdSAiUG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeS5jc24iDQoNCi0gKioiUG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeS5jc24iKiogbMOgIGLhu5kgZOG7ryBsaeG7h3UgduG7gSB04buVbmcgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSB0csOqbiB0aOG6vyBnaeG7m2kgxJHGsOG7o2MgdMOtbmggdGhlbyBjw6FjIG7Eg20gdsOgIHRoZW8gxJHhu5kgdHXhu5VpIGtow6FjIG5oYXUuIELhu5kgZOG7ryBsaeG7h3UgZ+G7k20gY8OzIDE4Mjg4IHF1YW4gc8OhdCB2w6AgMjQgYmnhur9uLCB0cm9uZyDEkcOzIGfhu5NtIGPDsyAxIGJp4bq/biDEkeG7i25oIHTDrW5oIHbDoCAyMyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZy4gVMOqbiBj4bulIHRo4buDIGPhu6dhIGPDoWMgYmnhur9uIG5oxrAgc2F1Og0KQ+G7pSB0aOG7gywgbMOgIHThu5VuZyBkw6JuIHPhu5Eg4bufIMSR4buZIHR14buVaTogRMaw4bubaSAxIHR14buVaSwgZMaw4bubaSA1IHR14buVaSwgZMaw4bubaSAxNSB0deG7lWksIGTGsOG7m2kgMjUgdHXhu5VpLCAxNS02NCB0deG7lWksIHRyw6puIDE1IHR14buVaSwgdHLDqm4gMTggdHXhu5VpLCAxIHR14buVaSwgdOG7qyAxLTQgdHXhu5VpLCA1LTkgdHXhu5VpLCAxMC0xNCB0deG7lWksIDE1LTE5IHR14buVaSwgMjAtMjkgdHXhu5VpLCAzMC0zOSB0deG7lWksIDQwLTQ5IHR14buVaSwgNTAtNTkgdHXhu5VpLCA2MC02OSB0deG7lWksIDcwLTc5IHR14buVaSwgODAtODkgdHXhu5VpLCA5MC05OSB0deG7lWkgdsOgIHThu6sgMTAwIHR14buVaXRy4bufIGzDqm4uDQoNCi0gxJDhu41jIGLhu5kgZOG7ryBsaeG7h3UgYuG6sW5nIGPDonUgbOG7h25oICoqcmVhZC5jc3YoZmlsZS5jaG9vc2UoKSwgaGVhZGVyID1UKSoqIHbDoCBnw6FuIHbDoG8gZGF0YSDEkeG7gyBk4buFIGfhu41pIHTDqm4gdHJvbmcgcGjhuqduIHBow6JuIHTDrWNoIGLDqm4gZMaw4bubaS4NCg0KYGBge3J9DQpsaWJyYXJ5KGNzdikNCmRhdGEgPC0gcmVhZC5jc3YoZmlsZS5jaG9vc2UoKSwgaGVhZGVyID1UKQ0KZGF0YXRhYmxlKGRhdGEpDQpgYGANCg0KLSBM4bqleSByYSB04buVbmcgZMOibiBz4buRIGPhu6dhIDUgcXXhu5FjIGdpYSBsw6AgTWV4aWNvLCBNYWxheXNpYSwgQ2FtcHVjaGlhLCBWaeG7h3QgTmFtLCBUcnVuZyBRdeG7kWMgdsOgIGNo4buNbiByYSA1IG5ow7NtIHR14buVaSBsw6AgdOG7lW5nIGTDom4gc+G7kSB0cuG6uyBlbSAxIHR14buVaSwgdOG7qyAxIMSR4bq/biA0IHR14buVaSwgdOG7qyA1IMSR4bq/biA5IHR14buVaSwgdOG7qyAxMCDEkeG6v24gMTQgdHXhu5VpIHbDoCB04burIDE1IMSR4bq/biAxOSB0deG7lWkgY+G7p2EgNSBxdeG7kWMgZ2lhIG7DoHkgxJHhu4MgcGjDom4gdMOtY2guDQoNCg0KYGBge3J9DQpkIDwtIGRhdGEgJT4lIHNlbGVjdCgiQ291bnRyeS5uYW1lIiwiWWVhciIsIlBvcHVsYXRpb24iLCJQb3B1bGF0aW9uLmF0LmFnZS4xIiwiUG9wdWxhdGlvbi5hZ2VkLjEudG8uNC55ZWFycyIsIlBvcHVsYXRpb24uYWdlZC41LnRvLjkueWVhcnMiLCJQb3B1bGF0aW9uLmFnZWQuMTAudG8uMTQueWVhcnMiLCJQb3B1bGF0aW9uLmFnZWQuMTUudG8uMTkueWVhcnMiKQ0KbmFtZXMoZCkgPC0gYygiQ291bnRyeSIsIlllYXIiLCJQb3B1bGF0aW9uIiwiYWdlLjEiLCIxLTQiLCI1LTkiLCIxMC0xNCIsIjE1LTE5IikNCmRhIDwtIGRbZCRDb3VudHJ5PT1jKCJNZXhpY28iLCJNYWxheXNpYSIsIkNhbWJvZGlhIiwiVmlldG5hbSIsIkNoaW5hIiksXQ0KZGF0YXRhYmxlKGRhKQ0KYGBgDQojIyBNw6MgaMOzYSBk4buvIGxp4buHdQ0KDQotIETDuW5nICJyZWNvZGUiIMSR4buDIMSR4bq3dCBs4bqhaSB0w6puIGPhu6dhIDUgcXXhu5FjIGdpYSDEkcOjIGNo4buNbiB0aGVvIGPDoWMgbmjDs20gMSwyLDMsNCw1Lg0KDQotIETDuW5nICJpZmVsc2UiIMSR4buDIHBow6JuIGxv4bqhaSB04buVbmcgZMOibiBz4buRIGPhu6dhIDUgcXXhu5FjIGdpYSwgbuG6v3UgdOG7lW5nIGTDom4gc+G7kSBs4bubbiBoxqFuIGhv4bq3YyBi4bqxbmcgNTAwMDAwMDAgKG5nxrDhu51pKSB0aMOsIHjhur9wIGxv4bqhaSAiQ2FvIiwgbmjhu48gaMahbiA1MDAwMDAwMCAobmfGsOG7nWkpIHRow6wgeOG6v3AgbG/huqFpIHRo4bqlcC4NCg0KLSBEw7luZyAiaWZlbHNlIiDEkeG7gyBwaMOibiBsb+G6oWkgdOG7lW5nIGTDom4gc+G7kSB0cuG6uyBlbSDhu58gxJHhu5kgdHXhu5VpIGzDoCAxIHR14buVaSBj4bunYSA1IHF14buRYyBnaWEsIG7hur91IHThu5VuZyBkw6JuIHPhu5EgxJHDsyBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDEwMDAwMDAgKG5nxrDhu51pKSDEkeG6v24gMTAwMDAwMDAgKG5nxrDhu51pKSB0aMOsIHjhur9wIGxv4bqhaSAiQsOsbmggdGjGsOG7nW5nIiwgY8OybiBs4bqhaSB44bq/cCB2w6BvICJLaMO0bmcgYsOsbmggdGjGsOG7nW5nIi4NCg0KLSBEw7luZyAiY2FzZV93aGVuIiDEkeG7gyBtw6MgaMOzYSBs4bqhaSBk4buvIGxp4buHdSB04buVbmcgZMOibiBz4buRIMSRw6MgcGjDom4gbG/huqFpLCBO4bq/dSB04buVbmcgZMOibiBz4buRIG5o4buPIGjGoW4gMTAwMDAwMDAgKG5nxrDhu51pKSB0aMOsIMSR4bq3dCBsw6AgIlF1w6Egw610IiwgbuG6v3UgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAxMDAwMDAwMCAobmfGsOG7nWkpIMSR4bq/biAxMDAwMDAwMDAwIChuZ8aw4budaSkgdGjDrCDEkeG6t3QgbMOgICJUcnVuZyBiw6xuaCIsIHbDoCBs4bubbiBoxqFuIDEwMDAwMDAwMDAgKG5nxrDhu51pKSDEkeG6t3QgbMOgICJRdcOhIMSRw7RuZyIuDQoNCi0gRMO5bmcgImN1dCIgxJHhu4MgY2hpYSB04buVbmcgZMOibiBz4buRIHJhIGzDoG0gNCBuaMOzbSB2w6AgxJHhurd0IHTDqm4gbMOgIG5ow7NtIEEsIG5ow7NtIEIsIG5ow7NtIEMgdsOgIG5ow7NtIEQuDQoNClRo4buxYyBoaeG7h24gY8OhYyBjw6J1IGzhu4duaCB2w6AgdGEgdGh1IMSRxrDhu6NjIGLhuqNuZyBzYXU6DQoNCmBgYHtyfQ0KZGEkQy5jb2RlIDwtIHJlY29kZShkYSRDb3VudHJ5LCBNZXhpY28gPSAiTmjDs20gMSIsIE1hbGF5c2lhID0gIk5ow7NtIDIiLCBDYW1ib2RpYSA9ICJOaMOzbSAzIiwgVmlldG5hbSA9ICJOaMOzbSA0IiwgQ2hpbmEgPSJOaMOzbSA1IiApDQoNCmRhJFAuY29kZSA8LSBpZmVsc2UoZGEkUG9wdWxhdGlvbiA+PSA1MDAwMDAwMCwgIkNhbyIsIktow7RuZyBjYW8iKQ0KDQpkYSRQLmNvZGUxIDwtIGlmZWxzZShkYSRhZ2UuMSA+PSAxMDAwMDAwICYgZGEkYWdlLjEgPD0gMTAwMDAwMDAsICJCw6xuaCB0aMaw4budbmciLCJLaMO0bmcgQsOsbmggVGjGsOG7nW5nIikNCg0KZGEkUC5jb2RlMiA8LSBjYXNlX3doZW4oZGEkUG9wdWxhdGlvbiA8IDEwMDAwMDAwIH4gIlF1w6Egw610IiwgZGEkUG9wdWxhdGlvbiA+PSAxMDAwMDAwMCAmIGRhJFBvcHVsYXRpb24gPD0gMTAwMDAwMDAwMCB+ICdUcnVuZyBiw6xuaCcsIGRhJFBvcHVsYXRpb24gPiAxMDAwMDAwMDAwIH4gIlF1w6EgxJHDtG5nIikNCg0KZGEkUC5jb2RlMyA8LSBjdXQoZGEkUG9wdWxhdGlvbiw0LGxhYmVscyA9IGMoJ05ow7NtIEEnLCdOaMOzbSBCJywnTmjDs20gQycsJ05ow7NtIEQnKSkNCmRhdGF0YWJsZShkYSkNCmBgYA0KDQojIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kQ0KDQojIyMgQmnhu4N1IMSR4buTIFNURU0tTEVBRg0KDQpCaeG7g3UgxJHhu5MgbmjDoW5oIGzDoCBj4bunYSBU4buVbmcgZMOibiBz4buRIGPDoWMgbsaw4bubYywgxJHGsOG7o2MgdGjhu4MgaGnhu4duIG5oxrAgc2F1Og0KDQpgYGB7cn0NCnN0ZW0oZGF0YSRQb3B1bGF0aW9uKQ0KYGBgDQojIyMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2hvIDEgYmnhur9uDQoNCsSQ4buDIGJp4bq/dCBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgZ+G7k20gNSBxdeG7kWMgZ2lhIHbhu6thIHBow6JuIHTDrWNoIOG7nyB0csOqbiwgdGEgZMO5bmcgY8OidSBs4buHbmggKip0YWJsZSgpKiogdsOgIGvhur90IHF14bqjIHRodSDEkcaw4bujYyBsw6Agc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIHRyb25nIGLhuqNuZyBk4buvIGxp4buHdSBj4bunYSBuxrDhu5tjIENhbWJvZGlhIGzDoCAxNSBs4bqnbiwgQ2hpbmEgbMOgIDE1IGzhuqduLCBNYWxheXNpYSBsw6AgMTUgbOG6p24sIE1leGljbyBsw6AgMTUgbOG6p24gdsOgIFZp4buHdCBOYW0gbMOgIDE0IGzhuqduLg0KDQpgYGB7cn0NCnRhYmxlKGRhJENvdW50cnkpDQpgYGANCg0KIyMjIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGNobyAyIGJp4bq/bg0KDQrEkOG7gyBiaeG6v3Qgc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIHThu5VuZyBkw6JuIHPhu5EgY+G7p2EgNSBxdeG7kWMgZ2lhIMSRw7MgdGh14buZYyBuaMOzbSBBLEIsQyB2w6AgRCB0cm9uZyBi4buZIGThu68gbGnhu4d1IHbhu6thIHBow6JuIHTDrWNoIOG7nyB0csOqbiwgdGEgZMO5bmcgY8OidSBs4buHbmggKip0YWJsZSgpKiogdsOgIGvhur90IHF14bqjIHRodSDEkcaw4bujYyBsw6AgOg0KDQotIFThu5VuZyBkw6JuIHPhu5EgY+G7p2Egbsaw4bubYyBDYW1ib2RpYSB0aHXhu5ljIG5ow7NtIEEgeHXhuqV0IGhp4buHbiAxNSBs4bqnbiB2w6Aga2jDtG5nIGPDsyBuaMOzbSBCLEMgdsOgIEQ7IA0KDQotIFThu5VuZyBkw6JuIHPhu5EgY+G7p2Egbsaw4bubYyBDaGluYSB0aHXhu5ljIG5ow7NtIEEga2jDtG5nIHh14bqldCBoaeG7h24sIFRodeG7mWMgbmjDs20gQiB4deG6pXQgaGnhu4duIDMgbOG6p24sIHRodeG7mWMgbmjDs20gQyB4deG6pXQgaGnhu4duIDQgbOG6p24gdsOgICB0aHXhu5ljIG5ow7NtIEQgeHXhuqV0IGhp4buHbiA4IGzhuqduOyANCg0KLSBU4buVbmcgZMOibiBz4buRIGPhu6dhIG7GsOG7m2MgTWFsYXlzaWEgdGh14buZYyBuaMOzbSBBIHh14bqldCBoaeG7h24gMTUgbOG6p24gdsOgIGtow7RuZyBjw7MgbmjDs20gQixDIHbDoCBEOw0KDQotIFThu5VuZyBkw6JuIHPhu5EgY+G7p2Egbsaw4bubYyBNZXhpY28gdGh14buZYyBuaMOzbSBBIHh14bqldCBoaeG7h24gMTUgbOG6p24gdsOgIGtow7RuZyBjw7MgbmjDs20gQixDIHbDoCBEOw0KDQotIFThu5VuZyBkw6JuIHPhu5EgY+G7p2Egbsaw4bubYyBWaeG7h3QgTmFtIHRodeG7mWMgbmjDs20gQSB4deG6pXQgaGnhu4duIDE0IGzhuqduIHbDoCBraMO0bmcgY8OzIG5ow7NtIEIsQyB2w6AgRC4NCg0KYGBge3J9DQp0YWJsZShkYSRQLmNvZGUzLGRhJENvdW50cnkpDQpgYGANCg0KIyMgUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UNCg0KIyMjIFTDrW5oIHRvw6FuIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBxdeG7kWMgZ2lhDQoNClTDrW5oIHRydW5nIGLDrG5oIHbDoCB0cnVuZyB24buLIGPhu6dhIHThu5VuZyBkw6JuIHPhu5EgY+G7p2EgbeG7l2kgcXXhu5FjIGdpYSB0aGVvIG5ow7NtIHF14buRYyBnaWEuIFRo4buxYyBoaeG7h24gY8OhYyBjw6J1IGzhu4duaCB2w6AgdGh1IMSRxrDhu6NjIGLhuqNuZyBk4buvIGxp4buHdSBzYXU6DQoNCmBgYHtyfQ0KYTEgPC0gZGF0YSAlPiUgZ3JvdXBfYnkoQ291bnRyeS5uYW1lKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCksbWVhbl9vZl9Qb3B1bGF0aW9uID0gbWVhbihQb3B1bGF0aW9uKSkNCmEyIDwtIGRhdGEgJT4lIGdyb3VwX2J5KENvdW50cnkubmFtZSkgJT4lIHN1bW1hcmlzZShtZWRfb2ZfUG9wdWxhdGlvbiA9IG1lZGlhbihQb3B1bGF0aW9uKSkNCmRhdGF0YWJsZShtdXRhdGUoYTEsYTIpKQ0KDQpgYGANCiMjIyBUw61uaCB0b8OhbiBjw6FjIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gbsSDbQ0KDQpUw61uaCB0cnVuZyBiw6xuaCB2w6AgdHJ1bmcgduG7iyBj4bunYSB04buVbmcgZMOibiBz4buRIGPhu6dhIG3hu5dpIHF14buRYyBnaWEgdGhlbyBuaMOzbSB0aOG7nWkgZ2lhbiAoWWVhcikuIFRo4buxYyBoaeG7h24gY8OhYyBjw6J1IGzhu4duaCB2w6AgdGh1IMSRxrDhu6NjIGLhuqNuZyBk4buvIGxp4buHdSBzYXU6DQoNCmBgYHtyfQ0KYjEgPC0gZGF0YSAlPiUgZ3JvdXBfYnkoWWVhcikgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5fb2ZfUG9wdWxhdGlvbiA9IG1lYW4oUG9wdWxhdGlvbikpDQpiMiA8LSBkYXRhICU+JSBncm91cF9ieShZZWFyKSAlPiUgc3VtbWFyaXNlKG1lZF9vZl9Qb3B1bGF0aW9uID0gbWVkaWFuKFBvcHVsYXRpb24pKQ0KZGF0YXRhYmxlKG11dGF0ZShiMSxiMikpDQpgYGANCg0KDQojIyMgVMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyB0aGVvIHF14buRYyBnaWENCg0KVMOtbmggdHJ1bmcgYsOsbmggdsOgIHRydW5nIHbhu4sgY+G7p2EgdOG7lW5nIGTDom4gc+G7kSDhu58gxJHhu5kgdHXhu5VpIHThu6sgODAtODkgdHXhu5VpIGPhu6dhIG3hu5dpIHF14buRYyBnaWEgdGhlbyBuaMOzbSBxdeG7kWMgZ2lhLiBUaOG7sWMgaGnhu4duIGPDoWMgY8OidSBs4buHbmggdsOgIHRodSDEkcaw4bujYyBi4bqjbmcgZOG7ryBsaeG7h3Ugc2F1Og0KDQpgYGB7cn0NCmMxIDwtIGRhdGEgJT4lIGdyb3VwX2J5KENvdW50cnkubmFtZSkgJT4lIHN1bW1hcml6ZShuID0gbigpLG1lYW5fb2ZfUG9wdWxhdGlvbi5hZ2VkLjgwLnRvLjg5LnllYXJzID0gbWVhbihQb3B1bGF0aW9uLmFnZWQuODAudG8uODkueWVhcnMpKQ0KYzIgPC0gZGF0YSAlPiUgZ3JvdXBfYnkoQ291bnRyeS5uYW1lKSAlPiUgc3VtbWFyaXplKG1lZF9vZl9Qb3B1bGF0aW9uLmFnZWQuODAudG8uODkueWVhcnMgPSBtZWRpYW4oUG9wdWxhdGlvbi5hZ2VkLjgwLnRvLjg5LnllYXJzKSkNCmRhdGF0YWJsZShtdXRhdGUoYzEsYzIpKQ0KDQpgYGANCg0KIyBOaGnhu4dtIHbhu6UgMy4yDQoNCiMjIEdp4bqjaSB0aMOtY2ggYuG7mSBk4buvIGxp4buHdSBQT1BVTEFUSU9ODQoNCi0gKipQT1BVTEFUSU9OKiogbMOgIG3hu5l0IGLhu5kgZOG7ryBsaeG7h3UgduG7gSBt4buZdCB2w6BpIHPhu5EgbGnhu4d1IHRo4buRbmcga+G6vyB04buVbmcgZMOibiBz4buRIMSRxrDhu6NjIGPhuq1wIG5o4bqtdCB04burIDIwMyBxdeG7kWMgZ2lhIHRyb25nIGtob+G6o25nIHRo4budaSBnaWFuIHThu6sgMTkwNS0yMDIzIHbDoCBwaOG6p24gdHLEg20gdOG7lW5nIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgxJHDsyBzbyB24bubaSB04buRbmcgZMOibiBz4buRIHRo4bq/IGdp4bubaSB04bqhaSBuxINtIG3DoCBz4buRIGxp4buHdSDEkcaw4bujYyBj4bqtcCBuaOG6rXQuDQotIELhu5kgZOG7ryBsaeG7h3UgZ+G7k20gY8OzIDIwMyBxdWFuIHPDoXQg4bupbmcgduG7m2kgMjAzIHF14buRYyBnaWEgdsOgIDUgYmnhur9uIOG7qW5nIHbhu5tpIDUgY+G7mXQgbMOgIHTDqm4gcXXhu5FjIGdpYShDb3VudHJ5KSwgdOG7lW5nIGTDom4gc+G7kShQb3B1bGF0aW9uKSwgUGjhuqduIHRyxINtIHThu5VuZyBkw6JuIHPhu5Egc28gduG7m2kgdGjhur8gZ2nhu5tpKFBlY2VudC5vZi53b3JsZCkgdsOgIHRo4budaSBnaWFuIGPhuq1wIG5o4bqtdCBz4buRIGxp4buHdShEYXRlKS4NCi0gxJDhu41jIGLhu5kgZOG7ryBsaeG7h3UgYuG6sW5nIGPDonUgbOG7h25oICoqcmVhZC54bHN4KGZpbGUuY2hvb3NlKCksIHNoZWV0SW5kZXggPTEsIGhlYWRlciA9VCkqKiB2w6AgZ8OhbiB2w6BvIERhdGEgxJHhu4MgZOG7hSBn4buNaSB0w6puIHRyb25nIHBo4bqnbiBwaMOibiB0w61jaCBiw6puIGTGsOG7m2kuDQoNCmBgYHtyfQ0KbGlicmFyeSh4bHN4KQ0KRGF0YSA8LSByZWFkLnhsc3goZmlsZS5jaG9vc2UoKSwgc2hlZXRJbmRleCA9MSwgaGVhZGVyID1UKQ0KZGF0YXRhYmxlKERhdGEpDQpgYGANCg0KIyMgTcOjIGjDs2EgZOG7ryBsaeG7h3UNCg0KLSBEw7luZyAiaWZlbHNlIiDEkeG7gyBwaMOibiBsb+G6oWkgdOG7lW5nIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgdGhlbyBwaOG6p24gdHLEg20gZMOibiBz4buRIHNvIHbhu5tpIHRo4bq/IGdp4bubaSwgbuG6v3UgcGjhuqduIHRyxINtIMSRw7Mgbmjhu48gaMahbiBob+G6t2MgYuG6sW5nIDAuNSB0aMOsIHjhur9wIGxv4bqhaSAiVGjhuqVwIiwgbuG6v3UgdHLDqm4gMC41IHRow6wgeOG6v3AgbG/huqFpICJDYW8iLg0KDQotIETDuW5nICJpZmVsc2UiIMSR4buDIHBow6JuIG5ow7NtIDIgbG/huqFpIA0KDQotIETDuW5nICJjYXNlX3doZW4iIMSR4buDIG3DoyBow7NhIGzhuqFpIGThu68gbGnhu4d1IHThu5VuZyBkw6JuIHPhu5EgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRoZW8gcGjhuqduIHRyxINtIGTDom4gc+G7kSBzbyB24bubaSB0aOG6vyBnaeG7m2ksIG7hur91IHBo4bqnbiB0csSDbSDEkcOzIGTGsOG7m2kgMC41IHRow6wgeOG6v3AgbG/huqFpICJUaOG6pXAiLCBu4bq/dSBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDAuNSDEkeG6v24gMy4wIHRow6wgeOG6v3AgbG/huqFpICJUcnVuZyBiw6xuaCIsIHRyw6puIDMuMCB0aMOsIHjhur9wIGxv4bqhaSAiUXXDoSDEkcO0bmciDQoNCi0gRMO5bmcgImN1dCIgxJHhu4MgY2hpYSB04buVbmcgZMOibiBz4buRIHJhIGzDoG0gNiBuaMOzbSB2w6AgxJHhurd0IHTDqm4gbMOgIG5ow7NtIDEsIG5ow7NtIDIsIG5ow7NtIDMsIG5ow7NtIDQsIG5ow7NtIDUgdsOgIG5ow7NtIDYuDQoNClRhIHPhu60gZOG7pW5nIGPDoWMgY8OidSBs4buHbmggdHLDqm4gdsOgIHRodSDEkcaw4bujYyBi4bqjbmcgZOG7ryBsaeG7h3Ugc2F1Og0KDQpgYGB7cn0NCkRhdGEkTlggPC0gaWZlbHNlKERhdGEkUGVjZW50Lm9mLndvcmxkIDw9MC41LCAiVGjhuqVwIiwiQ2FvIikNCkRhdGEkTlgxIDwtIGlmZWxzZShEYXRhJFBlY2VudC5vZi53b3JsZCA+MC41LCJOaMOzbSBBIiwiTmjDs20gQiIpDQpEYXRhJE5YMiA8LSBjYXNlX3doZW4oRGF0YSRQZWNlbnQub2Yud29ybGQgPCAwLjUgfiAiIFF1w6Egw610IiwgRGF0YSRQZWNlbnQub2Yud29ybGQgPj0gMC41ICYgRGF0YSRQZWNlbnQub2Yud29ybGQgPD0gMyB+ICJUcnVuZyBCw6xuaCIsIERhdGEkUGVjZW50Lm9mLndvcmxkID4zIH4gIlFVw6EgxJHDtG5nIikNCkRhdGEkTlgzIDwtIGN1dChEYXRhJFBvcHVsYXRpb24sNixsYWJlbHMgPSBjKCJOaMOzbSAxIiwiTmjDs20gMiIsIk5ow7NtIDMiLCJOaMOzbSA0IiwiTmjDs20gNSIsIk5ow7NtIDYiKSkNCmRhdGF0YWJsZShEYXRhKQ0KYGBgDQoNCiMjIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRDQoNCiMjIyBCaeG7g3UgxJHhu5MgU1RFTS1MRUFGDQoNCkJp4buDdSDEkeG7kyBuaMOhbmggbMOhIGNobyB04buVbmcgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSB0cm9uZyBi4bqjbmcgZOG7ryBsaeG7h3UuIFRo4buxYyBoaeG7h24gY8OidSBs4buHbmggdsOgIHRodSDEkcaw4bujYyBuaMawIHNhdToNCg0KYGBge3J9DQpzdGVtKERhdGEkUG9wdWxhdGlvbikNCmBgYA0KDQoNCiMjIyBC4bqjbmcgdOG6p24gc+G7kSBjaG8gMSBiaeG6v24NCg0KxJDhu4MgYmnhur90IHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBjw6FjIG5ow7NtIHRoZW8gcGjhuqduIHRyxINtIGTDom4gc+G7kSBzbyB24bubaSB0aOG6vyBnaeG7m2kgduG7q2EgcGjDom4gdMOtY2ggxJHGsOG7o2Mg4bufIHRyw6puLCB0YSBkw7luZyBjw6J1IGzhu4duaCAqKnRhYmxlKCkqKiB2w6Aga+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIGzDoCBz4buRIGzhuqduIHh14bqldCBoaeG7h24gdHJvbmcgYuG6o25nIGPhu6dhIG5ow7NtIDEgbMOgIDE5OCBs4bqnbiwgbmjDs20gMiB4deG6pXQgaGnhu4duIDMgbOG6p24sIG5ow7NtIDMsIG5ow7NtIDQgdsOgIG5ow7NtIDUgdGjDrCBraMO0bmcgeHXhuqV0IGhp4buHbiB0cm9uZyBi4bqjbmcgdsOgIG5ow7NtIDYgdGjDrCB4deG6pXQgaGnhu4duIDIgbOG6p24gdHJvbmcgYuG6o25nLg0KDQpgYGB7cn0NCnRhYmxlKERhdGEkTlgzKQ0KYGBgDQoNCiMjIyBC4bqjbmcgdOG6p24gc+G7kSBjaG8gMiBiaeG6v24NCg0KxJDhu4MgYmnhur90IHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBuaMOzbSBBIHbDoCBuaMOzbSBCIHRoZW8gcGjhuqduIHRyxINtIGTDom4gc+G7kSBzbyB24bubaSB0aOG6vyBnaeG7m2kgxJHGsOG7o2MgcGjDom4gdMOtY2gg4bufIHRyw6puLCB0YSBz4butIGThu6VuZyBjw6J1IGzhu4duaCAqKnRhYmxlKCkqKiB2w6Aga+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIG5oxrAgc2F1Og0KDQotIE5ow7NtIEEgdGhlbyBwaOG6p24gdHLEg20gZMOibiBz4buRIHNvIHbhu5tpIHRo4bq/IGdp4bubaSDEkcaw4bujYyB44bq/cCB2w6BvIGxv4bqhaSAiUXXDoSDDrXQiIGzDoCBraMO0bmcsIHjhur9wIGxv4bqhaSAiUXXDoSDEkcO0bmciIGzDoCA0IGzhuqduIHbDoCB44bq/cCB2w6BvIGxv4bqhaSAiVHJ1bmcgYsOsbmgiIGzDoCAyOCBs4bqnbjsNCg0KLSBOaMOzbSBCIHRoZW8gcGjhuqduIHRyxINtIGTDom4gc+G7kSBzbyB24bubaSB0aOG6vyBnaeG7m2kgxJHGsOG7o2MgeOG6v3AgdsOgbyBsb+G6oWkgIlF1w6Egw610IiBsw6AgMTYzIGzhuqduLCB44bq/cCBsb+G6oWkgIlF1w6EgxJHDtG5nIiBsw6Aga2jDtG5nIHbDoCB44bq/cCB2w6BvIGxv4bqhaSAiVHJ1bmcgYsOsbmgiIGzDoCA4IGzhuqduLg0KDQpgYGB7cn0NCnRhYmxlKERhdGEkTlgxLERhdGEkTlgyKQ0KYGBgDQoNCiMjIFTDrW5oIHRvw6FuIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgDQoNClTDrW5oIHRvw6FuIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgY+G7p2EgUGVjZW50Lm9mLndvcmxkIChQaOG6p24gdHLEg20gZMOibiBz4buRIHNvIHbhu5tpIHRo4bq/IGdp4bubaSksIChjw7MgOCDEkeG6t2MgdHLGsG5nKTogIA0KDQojIyMgc3VtbWFycnk6DQoNCmBgYHtyfQ0Kc3VtbWFyeShEYXRhJFBlY2VudC5vZi53b3JsZCkNCmBgYA0KLSBUcm9uZyAqKnN1bW1hcnkqKiwgdGjDrCB0YSBiaeG6v3QgxJHGsOG7o2Mgbmjhu69uZyBk4buvIGxp4buHdSBuaMawIHNhdTogDQogIA0KKyBtaW4gPSAwLjAwMTA6IGzDoCBwaOG6p24gdHLEg20gZMOibiBz4buRIHNvIHbhu5tpIHRo4bq/IGdp4bubaSB0aOG6pXAgbmjhuqV0IGzDoCAwLjAwMTA7DQoNCisgbWF4ID0gMTcuNTAwMDogbMOgIHBo4bqnbiB0csSDbSBkw6JuIHPhu5Egc28gduG7m2kgdGjhur8gZ2nhu5tpIGNhbyBuaOG6pXQgbMOgIDE3LjUwMDA7DQoNCisgbWVhbiA9IDAuNDc2OTogdHJ1bmcgYsOsbmggY+G7p2EgcGjhuqduIHRyxINtIGTDom4gc+G7kSBzbyB24bubaSB0aOG6vyBnaeG7m2kgbMOgIDAuNDc2OTsNCg0KKyBtZWRpYW4odHJ1bmcgduG7iykgPSAwLjEwMDA6IHPhur0gY8OzIDUwJSBwaOG6p24gdHLEg20gZMOibiBz4buRIHNvIHbhu5tpIHRo4bq/IGdp4bubaSBkxrDhu5tpIDAuMTAwMCB2w6AgNTAlIHBo4bqnbiB0csSDbSBkw6JuIHPhu5Egc28gduG7m2kgdGjhur8gZ2nhu5tpIHRyw6puIDAuMTAwMDsNCg0KKyAxc3QgUXUgPSAwLjAyMDA6IHThu6kgcGjDom4gduG7iyB0aOG7qSBuaOG6pXQsIGPDsyAyNSUgcGjhuqduIHRyxINtIGTDom4gc+G7kSBzbyB24bubaSB0aOG6vyBnaeG7m2kgbMOgIDAuMDIwMDsNCg0KKyAzcmQgUXUgPSAwLjM1MDA6IHThu6kgcGjDom4gduG7iyB0aOG7qSAzLCBjw7MgNzUlIHBo4bqnbiB0csSDbSBkw6JuIHPhu5Egc28gduG7m2kgdGjhur8gZ2nhu5tpIGTGsOG7m2kgMC4zNTAwIGhheSBjw7MgMjUlIHBo4bqnbiB0csSDbSBkw6JuIHPhu5Egc28gduG7m2kgdGjhur8gZ2nhu5tpIHRyw6puIDAuMzUwMC4NCg0KIyMjIHN1bTogdMOtbmggdOG7lW5nDQoNClbDoCBr4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgbMOgIDk2LjgxNSUuIERvIGzDoCDhu58gxJHDonkgY2jhu4kgbOG6pXkgc+G7kSBsaeG7h3UgY+G7p2EgMjAzIHF14buRYyBnaWEgdHLDqm4gdGjhur8gZ2nhu5tpIMSR4buDIHBow6JuIHTDrWNoIG7Dqm4gdOG7lW5nIHBo4bqnbiB0csSDbSBkw6JuIHPhu5Egc28gduG7m2kgdGjhur8gZ2nhu5tpIOG7nyBkw6J5IHPhur0ga2jDtG5nIMSRxrDhu6NjIDEwMCUuDQoNCmBgYHtyfQ0Kc3VtKERhdGEkUGVjZW50Lm9mLndvcmxkKQ0KYGBgDQoNCiMjIyBtZWFuOiB0w61uaCB0cnVuZyBiw6xuaA0KDQpUcnVuZyBiw6xuaCBj4bunYSBwaOG6p24gdHLEg20gZMOibiBz4buRIHNvIHbhu5tpIHRo4bq/IGdp4bubaSBj4bunYSBjw6FjIG7GsOG7m2MgbMOgIDAuNDc2OTIxMg0KDQpgYGB7cn0NCm1lYW4oRGF0YSRQZWNlbnQub2Yud29ybGQsbmEucm0gPSBUKQ0KYGBgDQoNCiMjIyBsZW5ndGg6IMSRbyDEkeG7mSBkw6BpDQoNCkNobyBiaeG6v3QgxJHhu5kgZMOgaSBj4bunYSBi4buZIGThu68gbGnhu4d1LiBUaOG7sWMgaGnhu4duIGPDonUgbOG7h25oIHbDoCBiaeG6v3QgxJHGsOG7o2MgY8OzIDIwMyBz4buRIGxp4buHdSB24buBIHBo4bqnbiB0csSDbSBkw6JuIHPDtCBzbyB24bubaSB0aOG6vyBnaeG7m2kgxJHGsOG7o2MgY+G6rXAgbmjhuq10IHRyb25nIGLhuqNuZyBk4buvIGxp4buHdS4NCg0KYGBge3J9DQpsZW5ndGgoRGF0YSRQZWNlbnQub2Yud29ybGQpDQpgYGANCg0KIyMjIHZhcjogcGjGsMahbmcgc2FpDQoNCkNobyBiaeG6v3QgdHJ1bmcgYsOsbmggY+G7p2EgYsOsbmggcGjGsMahbmcgxJHhu5kgbOG7h2NoIGPhu6dhIHBo4bqnbiB0csSDbSBkw6JuIHPhu5Egc28gduG7m2kgdGjhur8gZ2nhu5tpIGPhu6dhIGPDoWMgbsaw4bubYyBsw6AgMy4yMDgzNTQuIEhheSBiaeG6v3QgxJHGsOG7o2Mgc+G7sSBjaMOqbmggbOG7h2NoIGdp4buvYSBwaOG6p24gdHLEg20gZMOibiBz4buRIHNvIHbhu5tpIHRo4bq/IGdp4bubaSBj4bunYSBjw6FjIG7GsOG7m2MgbMOgIDMuMjAwODM1NC4NCg0KYGBge3J9DQp2YXIoRGF0YSRQZWNlbnQub2Yud29ybGQpDQpgYGANCg0KIyMjIHNkOiDEkeG7mSBs4buHY2ggY2h14bqpbg0KDQrEkOG7mSBs4buHY2ggY2h14bqpbiDEkW8gdMOtbmggYmnhur9uIMSR4buZbmcgY+G7p2EgZ2nDoSB0cuG7iyBtYW5nIHTDrW5oIHRo4buRbmcga8OqLiBOw7MgY2hvIHRo4bqleSBz4buxIGNow6puaCBs4buHY2ggduG7gSBnacOhIHRy4buLIGPhu6dhIHThu6tuZyB0aOG7nWkgxJFp4buDbSDEkcOhbmggZ2nDoSBzbyB24bubaSBnacOhIHRy4buLIHRydW5nIGLDrG5oLiBUaOG7sWMgaGnhu4duIGPDonUgbOG7h25oIHbDoCB0aHUgxJHGsOG7o2MgxJHhu5kgbOG7h2NoIGNodeG6qW4gbMOgIDAuMQ0KDQpgYGB7cn0NCnNkKERhdGEkUGVjZW50Lm9mLndvcmxkKQ0KYGBgDQoNCiMjIyBtZWRpYW46IHRydW5nIHbhu4sNCg0KVHJ1bmcgduG7izogZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQg4bufIGdp4buvYSB0cm9uZyBjaHXhu5dpIGThu68gbGnhu4d1IMSRxrDhu6NjIGfhu41pIGzDoCBnacOhIHRy4buLIHRydW5nIGLDrG5oLiBUcnVuZyB24buLIGPhu6dhIHBo4bqnbiB0csSDbSBkw6JuIHPhu5Egc28gduG7m2kgdGjhur8gZ2nhu5tpIGzDoCAwLjENCg0KYGBge3J9DQptZWRpYW4oRGF0YSRQZWNlbnQub2Yud29ybGQpDQpgYGANCg0KIyMjIHF1YW50aWxlOiBwaMOibiB24buLDQoNClTDrW5oIHThu6kgcGjDom4gduG7iyBj4bunYSBkw6N5IHPhu5EgbGnhu4d1LCB0aOG7sWMgaGnhu4duIGPDonUgbOG7h25oIHbDoCBiaeG6v3QgxJHGsOG7o2M6DQoNCi0gVOG7qSBwaMOibiB24buLIHRo4bupIG5o4bqldCAoMjUlKTogY8OzIDI1JSDEkeG7mSBs4bubbiBj4bunYSBQaOG6p24gdHLEg20gZMOibiBz4buRIGPhu6dhIGPDoWMgbsaw4bubYyBzbyB24bubaSB0aOG6vyBnaeG7m2kgZMaw4bubaSAwLjAyIGhheSBjw7MgNzUlIMSR4buZIGzhu5tuIGPhu6dhIFBo4bqnbiB0csSDbSBkw6JuIHPhu5EgY+G7p2EgY8OhYyBuxrDhu5tjIHNvIHbhu5tpIHRo4bq/IGdp4bubaSB0csOqbiAwLjAyOw0KDQotIFThu6kgcGjDom4gduG7iyB0aOG7qSBoYWktdHJ1bmcgduG7iyAoNTAlKTogY8OzIDUwJSDEkeG7mSBs4bubbiBj4bunYSBQaOG6p24gdHLEg20gZMOibiBz4buRIGPhu6dhIGPDoWMgbsaw4bubYyBzbyB24bubaSB0aOG6vyBnaeG7m2kgZMaw4bubaSAwLjEgaGF5IGPDsyA1MCUgxJHhu5kgbOG7m24gY+G7p2EgUGjhuqduIHRyxINtIGTDom4gc+G7kSBj4bunYSBjw6FjIG7GsOG7m2Mgc28gduG7m2kgdGjhur8gZ2nhu5tpIHRyw6puIDAuMTsNCg0KLSBU4bupIHBow6JuIHbhu4sgdGjhu6kgYmEgKDc1JSk6IGPDsyA3NSUgxJHhu5kgbOG7m24gY+G7p2EgUGjhuqduIHRyxINtIGTDom4gc+G7kSBj4bunYSBjw6FjIG7GsOG7m2Mgc28gduG7m2kgdGjhur8gZ2nhu5tpIGTGsOG7m2kgMC4zNSBoYXkgY8OzIDI1JSDEkeG7mSBs4bubbiBj4bunYSBQaOG6p24gdHLEg20gZMOibiBz4buRIGPhu6dhIGPDoWMgbsaw4bubYyBzbyB24bubaSB0aOG6vyBnaeG7m2kgdHLDqm4gMC4zNS4NCg0KYGBge3J9DQpxdWFudGlsZShEYXRhJFBlY2VudC5vZi53b3JsZCwgcHJvYnMgPSBjKC4yNSwuNSwuNzUpKQ0KYGBgDQoNCiMjIFTDrW5oIHRvw6FuIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBuaMOzbQ0KDQojIyMgVMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyB0aGVvIG5ow7NtIHBo4bqnbiB0csSDbSBkw6JuIHPhu5Egc28gduG7m2kgdGjhur8gZ2nhu5tpIChQZWNlbnQub2Yud29ybGQpDQoNClTDrW5oIHRydW5nIGLDrG5oIHbDoCB0cnVuZyB24buLIHThu5VuZyBkw6JuIHPhu5EgY+G7p2EgY8OhYyBuxrDhu5tjIHRoZW8gbmjDs20gcGjhuqduIHRyxINtIGTDom4gc+G7kSBzbyB24bubaSBxdeG7kWMgZ2lhLiBUaOG7sWMgaGnhu4duIGPDoWMgY8OidSBs4buHbmggdsOgIHRhIHRodSDEkcaw4bujYyBi4bqjbmcga+G6v3QgcXXhuqMgc2F1Og0KDQpgYGB7cn0NCmQxIDwtIERhdGEgJT4lIGdyb3VwX2J5KFBlY2VudC5vZi53b3JsZCkgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5fb2ZfUG9wdWxhdGlvbiA9IG1lYW4oUG9wdWxhdGlvbikpDQpkMjwtIERhdGEgJT4lIGdyb3VwX2J5KFBlY2VudC5vZi53b3JsZCkgJT4lIHN1bW1hcmlzZShtZWRfb2ZfUG9wdWxhdGlvbiA9IG1lZGlhbihQb3B1bGF0aW9uKSkNCmRhdGF0YWJsZShtdXRhdGUoZDEsZDIpKQ0KYGBgDQoNCiMjIyBUw61uaCB0b8OhbiBjw6FjIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gbmjDs20gdGjhu51pIGdpYW4gKERhdGUpDQoNClTDrW5oIHRydW5nIGLDrG5oIHbDoCB0cnVuZyB24buLIHThu5VuZyBkw6JuIHPhu5EgY+G7p2EgY8OhYyBuxrDhu5tjIHRoZW8gbmjDs20gdGjhu51pIGdpYW4uIFRo4buxYyBoaeG7h24gY8OhYyBjw6J1IGzhu4duaCB2w6AgdGEgdGh1IMSRxrDhu6NjIGLhuqNuZyBr4bq/dCBxdeG6oyBzYXU6DQoNCmBgYHtyfQ0KZTEgPC0gRGF0YSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5fb2ZfUG9wdWxhdGlvbiA9IG1lYW4oUG9wdWxhdGlvbikpDQplMjwtIERhdGEgJT4lIGdyb3VwX2J5KERhdGUpICU+JSBzdW1tYXJpc2UobWVkX29mX1BvcHVsYXRpb24gPSBtZWRpYW4oUG9wdWxhdGlvbikpDQpkYXRhdGFibGUobXV0YXRlKGUxLGUyKSkNCmBgYA0KDQoNCg0K