I.GIỚI THIỆU BỘ DATASET : DÂN SỐ TRUNG BÌNH CỦA CÁC TỈNH VIỆT NAM TỪ NĂM 2016-2022

  • Bộ dữ liệu bao gồm 64 hàng và 9 cột
  • Bộ dữ liệu có 63 quan sát tương ứng với 63 tỉnh thành của Việt Nam và 1 quan sát là toàn quốc
  • Bộ dữ liệu có 9 biến tương ứng với 9 năm liên tiếp từ 2016-2022
  • Bộ dữ liệu có đơn vị tính là : người

1. Cài đặt và load gói từ file excel vào object

library(xlsx)
dat <- read.xlsx("C:/Users/ADMIN/Downloads/tongdansovn2016-2022.xlsx", sheetIndex = 1, header = T )
datatable(dat)

2. Kiểm tra số quan sát và số biến của dữ liệu

dim(dat)
## [1] 64  9

3. Đổi tên cho các biến của bộ dữ liệu

names(dat) <- c('M','Name','Y16','Y17','Y18','Y19','Y20','Y21','Y22')
datatable(dat)

II.PHÂN TÍCH BỘ DỮ LIỆU THÔNG QUA CÁC DẠNG BIỂU ĐỒ

II.1 Rút trích dữ liệu 10 tỉnh thành ngẫu nhiên của Việt Nam

dat1 <- dat%>%filter(Name == 'Hà Nội'| Name == 'Kon Tum'|Name =='Bình Định'|Name =='Gia Lai'|Name =='TP. Hồ Chí Minh'|Name =='Cà Mau'|Name =='Kiên Giang'|Name =='Long An'|Name =='Đắk Lắk'|Name =='Phú Yên'|Name =='Đồng Nai')%>% select(M,Name,'Y16','Y17','Y18','Y19','Y20','Y21','Y22')
datatable(dat1)

1. Biểu đồ thể hiện mật độ dân số của năm 2020

dat1 %>% ggplot(aes(x = Y20)) +
  geom_density(fill = 'lightblue')

Giải thích

  • dat1 %>% ggplot(aes(x = Y20)) xác định dữ liệu và ánh xạ giá trị của cột Y20 lên trục x của biểu đồ.

  • geom_density(fill = ‘lightblue’) được sử dụng để vẽ biểu đồ mật độ, trong đó các giá trị của cột Y20 sẽ được biểu diễn dưới dạng đường cong mật độ. Tham số fill = ‘lightblue’ được sử dụng để tô màu cho khu vực dưới đường cong mật độ bằng màu xanh nhạt.

2. Biểu đồ thể hiện dân số của các tỉnh năm 2016

dat1 %>% ggplot(aes(x = Y16)) +
  geom_histogram(binwidth = 500000, fill = 'lightblue', color = 'black')

Giải thích

  • dat1 %>% ggplot(aes(x = Y16)) xác định dữ liệu và ánh xạ giá trị của cột Y16 lên trục x của biểu đồ.

  • geom_histogram(binwidth = 500000, fill = ‘lightblue’, color = ‘black’) được sử dụng để vẽ biểu đồ histogram. Tham số binwidth xác định kích thước của các khoảng (bin) trong biểu đồ histogram, trong đoạn mã này là 500,000. Tham số fill được sử dụng để tô màu cho các thanh histogram bằng màu xanh nhạt, và tham số color được sử dụng để đặt màu viền của các thanh histogram thành màu đen.

3. Biểu đồ thể hiện các panel riêng biệt về dân số của 10 tỉnh thành năm 2020

dat1 %>% ggplot(aes(x = Y20)) +
  geom_histogram(binwidth = 500000, fill = 'lightblue', color = 'black') +
  facet_wrap(~Name)

Giải thích

  • dat1 %>% ggplot(aes(x = Y20)) xác định dữ liệu và ánh xạ giá trị của cột Y20 lên trục x của biểu đồ.

  • geom_histogram(binwidth = 500000, fill = ‘lightblue’, color = ‘black’) được sử dụng để vẽ biểu đồ histogram với các tham số như sau: binwidth xác định kích thước của các khoảng (bin) trong biểu đồ histogram là 500,000; fill được sử dụng để tô màu cho các thanh histogram bằng màu xanh nhạt; color được sử dụng để đặt màu viền của các thanh histogram thành màu đen.

  • facet_wrap(~Name) được sử dụng để tạo các panel riêng biệt cho mỗi giá trị của cột Name. Điều này cho phép chúng ta nhìn vào phân phối của cột Y20 dựa trên các nhóm được xác định bởi cột Name.

4.Biểu đồ thể hiện dân số của các tỉnh thành VN trong năm 2022

dat1 %>% ggplot(aes(x = Name, y = Y22)) +
  geom_bar(stat = "identity", fill = "lightblue") +
  labs(x = "Tên tỉnh", y = "Dân số") +
  ggtitle("Biểu đồ dân số các tỉnh thành Việt Nam") +
  theme_minimal()

Giải thích

  • dat1 %>% ggplot(aes(x = Name, y = Y22)) xác định dữ liệu và ánh xạ giá trị của cột Name lên trục x và giá trị của cột Y22 lên trục y của biểu đồ.

  • geom_bar(stat = “identity”, fill = “lightblue”) được sử dụng để vẽ biểu đồ bar chart với tham số stat được đặt là “identity” để sử dụng giá trị của cột Y22 trực tiếp, fill được sử dụng để tô màu cho các cột bằng màu xanh nhạt.

  • labs(x = “Tên tỉnh”, y = “Dân số”) được sử dụng để đặt nhãn cho trục x và trục y của biểu đồ.

  • ggtitle(“Biểu đồ dân số các tỉnh thành Việt Nam”) được sử dụng để đặt tiêu đề cho biểu đồ.

  • theme_minimal() được sử dụng để đặt giao diện đơn giản cho biểu đồ.

5. Biểu đồ thể hiện dân số các tỉnh thành Việt Nam năm 2018

dat1 %>% ggplot(aes(x = "", y = Y18, fill = Name)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar(theta = "y") +
  labs(fill = "Tên tỉnh", x = NULL, y = NULL) +
  ggtitle("Biểu đồ dân số các tỉnh thành Việt Nam trong năm 2018") +
  theme_minimal() +
  theme(legend.position = "right")

Giải thích

  • dat1 %>% ggplot(aes(x = ““, y = Y18, fill = Name)) xác định dữ liệu và ánh xạ giá trị của cột Y18 lên trục y và giá trị của cột Name lên màu sắc của các phần của biểu đồ.

  • geom_bar(width = 1, stat = “identity”) được sử dụng để vẽ biểu đồ pie chart với tham số width được đặt là 1 để có hình dạng đầy đủ của biểu đồ pie, và stat được đặt là “identity” để sử dụng giá trị của cột Y18 trực tiếp.

  • coord_polar(theta = “y”) được sử dụng để chuyển biểu đồ sang kiểu polar (hình tròn).

  • labs(fill = “Tên tỉnh”, x = NULL, y = NULL) được sử dụng để đặt nhãn cho chú thích (legend), và để xóa nhãn trục x và trục y của biểu đồ.

  • ggtitle(“Biểu đồ dân số các tỉnh thành Việt Nam trong năm 2018”) được sử dụng để đặt tiêu đề cho biểu đồ.

  • theme_minimal() được sử dụng để đặt giao diện đơn giản cho biểu đồ và theme(legend.position = “right”) được sử dụng để di chuyển chú thích (legend) sang vị trí bên phải của biểu đồ.

6. Biểu đồ thể hiện dân số các tỉnh thành của VN trong năm 2020

dat1 %>% ggplot(aes(x = Name, y = Y18, fill = factor(Y20))) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(x = "Tên tỉnh", y = "Dân số", fill = "Dân số") +
  ggtitle("Biểu đồ dân số các tỉnh thành Việt Nam trong năm 2020") +
  theme_minimal() +
  theme(legend.position = "right")

Giải thích

  • ggplot(aes(x = Name, y = Y18, fill = factor(Y20))): Đây là hàm ggplot() để tạo một đối tượng biểu đồ. Hàm này nhận vào một đối số chính là hàm aes() (aesthetic), trong đó x = Name chỉ định cột Name trong dat1 sẽ được sử dụng làm trục x của biểu đồ, y = Y18 chỉ định cột Y18 sẽ được sử dụng làm trục y của biểu đồ, và fill = factor(Y20) chỉ định cột Y20 sẽ được sử dụng để làm màu sắc cho các thanh bar.

  • geom_bar(stat = “identity”, position = “dodge”): Đây là hàm geom_bar() để vẽ biểu đồ bar chart. Tham số stat = “identity” chỉ định rằng chiều cao của các thanh bar sẽ dựa trên giá trị thực của cột Y18 trong dat1. Tham số position = “dodge” chỉ định rằng các thanh bar sẽ được tách rời nhau.

  • labs(x = “Tên tỉnh”, y = “Dân số”, fill = “Dân số”): Đây là hàm labs() để đặt nhãn cho trục x, trục y và chú thích (legend) của biểu đồ. Trong đoạn mã trên, nhãn của trục x được đặt là “Tên tỉnh”, nhãn của trục y được đặt là “Dân số”, và nhãn của chú thích được đặt là “Dân số”.

  • ggtitle(“Biểu đồ dân số các tỉnh thành Việt Nam trong năm 2020”): Đây là hàm ggtitle() để đặt tiêu đề cho biểu đồ. Trong đoạn mã trên, tiêu đề của biểu đồ được đặt là “Biểu đồ dân số các tỉnh thành Việt Nam trong năm 2020”.

  • theme_minimal(): Đây là hàm theme_minimal() để thiết lập giao diện của biểu đồ theo phong cách tối giản.

  • theme(legend.position = “right”): Đây là hàm theme() để tùy chỉnh giao diện của biểu đồ. Trong đoạn mã trên, tham số legend.position = “right” chỉ định rằng chú thích (legend) sẽ được đặt ở bên phải của biểu đồ.

7. Biểu đồ thể hiện đường mật độ dân số các tỉnh VN trong năm 2020

qplot(Y20, data = dat1, geom = "density")

Giải thích

  • Y20: Đây là đối số đầu tiên và chỉ định biến/cột trong tập dữ liệu dat1 sẽ được sử dụng để tạo biểu đồ mật độ.
  • data = dat1: Đây là đối số thứ hai và chỉ định tập dữ liệu dat1 mà biến/cột sẽ được lấy từ.
  • geom = “density”: Đây là đối số thứ ba và chỉ định rằng biểu đồ sẽ là một biểu đồ mật độ.

II.2 Rút trích dữ liệu các tỉnh ở vùng Bắc Trung Bộ Việt Nam

dat2 <- dat%>%filter(Name == 'Thanh Hóa'| Name == 'Nghệ An'|Name =='Hà Tĩnh'|Name =='Quảng Bình'|Name =='Quảng Trị'|Name =='Thừa Thiên-Huế')%>% select(M,Name,'Y16','Y17','Y18','Y19','Y20','Y21','Y22')
datatable(dat2)

1. Biểu đồ thể hiện mật độ dân số thuộc BTB của VN năm 2016

dat2 %>% ggplot(aes(x = Y16)) +
  geom_density(fill = 'orange')

Giải thích

  • dat2 %>% ggplot(aes(x = Y16)) xác định dữ liệu và ánh xạ giá trị của cột Y16 lên trục x của biểu đồ.

  • geom_density(fill = ‘orange’) được sử dụng để vẽ biểu đồ mật độ, trong đó các giá trị của cột Y20 sẽ được biểu diễn dưới dạng đường cong mật độ. Tham số fill = ‘orange’ được sử dụng để tô màu cho khu vực dưới đường cong mật độ bằng màu cam.

2. Biểu đồ thể hiện dân số của các tỉnh thuộc BTB của VN năm 2018

dat2 %>% ggplot(aes(x = Y18)) +
  geom_histogram(binwidth = 500000, fill = 'lightblue', color = 'black')

Giải thích

  • dat2 %>% ggplot(aes(x = Y18)) xác định dữ liệu và ánh xạ giá trị của cột Y18 lên trục x của biểu đồ.

  • geom_histogram(binwidth = 500000, fill = ‘lightblue’, color = ‘black’) được sử dụng để vẽ biểu đồ histogram. Tham số binwidth xác định kích thước của các khoảng (bin) trong biểu đồ histogram, trong đoạn mã này là 500,000. Tham số fill được sử dụng để tô màu cho các thanh histogram bằng màu xanh nhạt, và tham số color được sử dụng để đặt màu viền của các thanh histogram thành màu đen. ### 3. Biểu đồ thể hiện các panel riêng biệt về dân số của các tỉnh thành thuộc BTB của VN năm 2022

dat2 %>% ggplot(aes(x = Y22)) +
  geom_histogram(binwidth = 500000, fill = 'lightgreen', color = 'black') +
  facet_wrap(~Name)

Giải thích

  • dat2 %>% ggplot(aes(x = Y22)) xác định dữ liệu và ánh xạ giá trị của cột Y22 lên trục x của biểu đồ.

  • geom_histogram(binwidth = 500000, fill = ‘lightgreen’, color = ‘black’) được sử dụng để vẽ biểu đồ histogram với các tham số như sau: binwidth xác định kích thước của các khoảng (bin) trong biểu đồ histogram là 500,000; fill được sử dụng để tô màu cho các thanh histogram bằng màu xanh nhạt; color được sử dụng để đặt màu viền của các thanh histogram thành màu đen.

  • facet_wrap(~Name) được sử dụng để tạo các panel riêng biệt cho mỗi giá trị của cột Name. Điều này cho phép chúng ta nhìn vào phân phối của cột Y20 dựa trên các nhóm được xác định bởi cột Name. ### 4.Biểu đồ thể hiện dân số của các tỉnh thành thuộc BTB của VN trong năm 2020

dat2 %>% ggplot(aes(x = Name, y = Y20)) +
  geom_bar(stat = "identity", fill = "red") +
  labs(x = "Tên tỉnh", y = "Dân số") +
  ggtitle("Biểu đồ dân số các tỉnh thành Việt Nam") +
  theme_minimal()

Giải thích

  • dat2 %>% ggplot(aes(x = Name, y = Y20)) xác định dữ liệu và ánh xạ giá trị của cột Name lên trục x và giá trị của cột Y20 lên trục y của biểu đồ.

  • geom_bar(stat = “identity”, fill = “red”) được sử dụng để vẽ biểu đồ bar chart với tham số stat được đặt là “identity” để sử dụng giá trị của cột Y20 trực tiếp, fill được sử dụng để tô màu cho các cột bằng màu đỏ.

  • labs(x = “Tên tỉnh”, y = “Dân số”) được sử dụng để đặt nhãn cho trục x và trục y của biểu đồ.

  • ggtitle(“Biểu đồ dân số các tỉnh thành Việt Nam”) được sử dụng để đặt tiêu đề cho biểu đồ.

  • theme_minimal() được sử dụng để đặt giao diện đơn giản cho biểu đồ.

5. Biểu đồ thể hiện dân số các tỉnh thuộc BTB Việt Nam năm 2018

dat2 %>% ggplot(aes(x = "", y = Y18, fill = Name)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar(theta = "y") +
  labs(fill = "Tên tỉnh", x = NULL, y = NULL) +
  ggtitle("Biểu đồ dân số các tỉnh thành Việt Nam trong năm 2018") +
  theme_minimal() +
  theme(legend.position = "right")

Giải thích

  • dat2 %>% ggplot(aes(x = ““, y = Y18, fill = Name)) xác định dữ liệu và ánh xạ giá trị của cột Y18 lên trục y và giá trị của cột Name lên màu sắc của các phần của biểu đồ.

  • geom_bar(width = 1, stat = “identity”) được sử dụng để vẽ biểu đồ pie chart với tham số width được đặt là 1 để có hình dạng đầy đủ của biểu đồ pie, và stat được đặt là “identity” để sử dụng giá trị của cột Y18 trực tiếp.

  • coord_polar(theta = “y”) được sử dụng để chuyển biểu đồ sang kiểu polar (hình tròn).

  • labs(fill = “Tên tỉnh”, x = NULL, y = NULL) được sử dụng để đặt nhãn cho chú thích (legend), và để xóa nhãn trục x và trục y của biểu đồ.

  • ggtitle(“Biểu đồ dân số các tỉnh thành Việt Nam trong năm 2018”) được sử dụng để đặt tiêu đề cho biểu đồ.

  • theme_minimal() được sử dụng để đặt giao diện đơn giản cho biểu đồ và theme(legend.position = “right”) được sử dụng để di chuyển chú thích (legend) sang vị trí bên phải của biểu đồ.

6. Biểu đồ thể hiện dân số các tỉnh thành thuộc BTB của VN trong năm 2020

dat2 %>% ggplot(aes(x = Name, y = Y18, fill = factor(Y20))) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(x = "Tên tỉnh", y = "Dân số", fill = "Dân số") +
  ggtitle("Biểu đồ dân số các tỉnh thành Việt Nam trong năm 2020") +
  theme_minimal() +
  theme(legend.position = "right")

Giải thích

  • ggplot(aes(x = Name, y = Y18, fill = factor(Y20))): Đây là hàm ggplot() để tạo một đối tượng biểu đồ. Hàm này nhận vào một đối số chính là hàm aes() (aesthetic), trong đó x = Name chỉ định cột Name trong dat2 sẽ được sử dụng làm trục x của biểu đồ, y = Y18 chỉ định cột Y18 sẽ được sử dụng làm trục y của biểu đồ, và fill = factor(Y20) chỉ định cột Y20 sẽ được sử dụng để làm màu sắc cho các thanh bar.

  • geom_bar(stat = “identity”, position = “dodge”): Đây là hàm geom_bar() để vẽ biểu đồ bar chart. Tham số stat = “identity” chỉ định rằng chiều cao của các thanh bar sẽ dựa trên giá trị thực của cột Y18 trong dat1. Tham số position = “dodge” chỉ định rằng các thanh bar sẽ được tách rời nhau.

  • labs(x = “Tên tỉnh”, y = “Dân số”, fill = “Dân số”): Đây là hàm labs() để đặt nhãn cho trục x, trục y và chú thích (legend) của biểu đồ. Trong đoạn mã trên, nhãn của trục x được đặt là “Tên tỉnh”, nhãn của trục y được đặt là “Dân số”, và nhãn của chú thích được đặt là “Dân số”.

  • ggtitle(“Biểu đồ dân số các tỉnh thành Việt Nam trong năm 2020”): Đây là hàm ggtitle() để đặt tiêu đề cho biểu đồ. Trong đoạn mã trên, tiêu đề của biểu đồ được đặt là “Biểu đồ dân số các tỉnh thành Việt Nam trong năm 2020”.

  • theme_minimal(): Đây là hàm theme_minimal() để thiết lập giao diện của biểu đồ theo phong cách tối giản.

  • theme(legend.position = “right”): Đây là hàm theme() để tùy chỉnh giao diện của biểu đồ. Trong đoạn mã trên, tham số legend.position = “right” chỉ định rằng chú thích (legend) sẽ được đặt ở bên phải của biểu đồ.

7. Biểu đồ thể hiện đường mật độ dân số các tỉnh VN trong năm 2020

qplot(Y20, data = dat2, geom = "density")

Giải thích

  • Y20: Đây là đối số đầu tiên và chỉ định biến/cột trong tập dữ liệu dat1 sẽ được sử dụng để tạo biểu đồ mật độ.
  • data = dat1: Đây là đối số thứ hai và chỉ định tập dữ liệu dat1 mà biến/cột sẽ được lấy từ.
  • geom = “density”: Đây là đối số thứ ba và chỉ định rằng biểu đồ sẽ là một biểu đồ mật độ.

8.Biểu đồ thể hiện các điểm của dân số vùng BTB thuộc VN năm 2020

dat2 %>% ggplot(aes(x = Name, y = Y18, color = Y20)) +
  geom_point()

Giải thích

  • geom_point() là lớp hình học trong ggplot2 để vẽ các điểm trên biểu đồ

9.Biểu đồ thể hiện các điểm của dân số vùng BTB thuộc VN năm 2022

dat2 %>% ggplot(aes(x = Name, y = Y22, size = Name)) +
  geom_point()

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiVOG6oSBDw7RuZyDEkOG6oXQiDQpkYXRlOiAiMjAyNC0wMy0wOCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRoZW1lOiAiZGVmYXVsdCINCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KDQpgYGANCiMgKipJLkdJ4buaSSBUSEnhu4ZVIELhu5ggREFUQVNFVCA6IETDgk4gU+G7kCBUUlVORyBCw4xOSCBD4bumQSBDw4FDIFThu4hOSCBWSeG7hlQgTkFNIFThu6ogTsSCTSAyMDE2LTIwMjIqKg0KDQotIELhu5kgZOG7ryBsaeG7h3UgYmFvIGfhu5NtIDY0IGjDoG5nIHbDoCA5IGPhu5l0IA0KLSBC4buZIGThu68gbGnhu4d1IGPDsyA2MyBxdWFuIHPDoXQgdMawxqFuZyDhu6luZyB24bubaSA2MyB04buJbmggdGjDoG5oIGPhu6dhIFZp4buHdCBOYW0gdsOgIDEgcXVhbiBzw6F0IGzDoCB0b8OgbiBxdeG7kWMgICANCi0gQuG7mSBk4buvIGxp4buHdSBjw7MgOSBiaeG6v24gdMawxqFuZyDhu6luZyB24bubaSA5IG7Eg20gbGnDqm4gdGnhur9wIHThu6sgMjAxNi0yMDIyDQotIELhu5kgZOG7ryBsaeG7h3UgY8OzIMSRxqFuIHbhu4sgdMOtbmggbMOgIDogbmfGsOG7nWkgDQoNCiMjIDEuIEPDoGkgxJHhurd0IHbDoCBsb2FkIGfDs2kgdOG7qyBmaWxlIGV4Y2VsIHbDoG8gb2JqZWN0IA0KDQpgYGB7cn0NCmxpYnJhcnkoeGxzeCkNCmRhdCA8LSByZWFkLnhsc3goIkM6L1VzZXJzL0FETUlOL0Rvd25sb2Fkcy90b25nZGFuc292bjIwMTYtMjAyMi54bHN4Iiwgc2hlZXRJbmRleCA9IDEsIGhlYWRlciA9IFQgKQ0KZGF0YXRhYmxlKGRhdCkNCmBgYA0KDQojIyAyLiBLaeG7g20gdHJhIHPhu5EgcXVhbiBzw6F0IHbDoCBz4buRIGJp4bq/biBj4bunYSBk4buvIGxp4buHdSANCmBgYHtyfQ0KZGltKGRhdCkNCmBgYA0KIyMgMy4gxJDhu5VpIHTDqm4gY2hvIGPDoWMgYmnhur9uIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UgDQpgYGB7cn0NCm5hbWVzKGRhdCkgPC0gYygnTScsJ05hbWUnLCdZMTYnLCdZMTcnLCdZMTgnLCdZMTknLCdZMjAnLCdZMjEnLCdZMjInKQ0KZGF0YXRhYmxlKGRhdCkNCmBgYA0KDQoNCg0KIyAqKklJLlBIw4JOIFTDjUNIIELhu5ggROG7riBMSeG7hlUgVEjDlE5HIFFVQSBDw4FDIEThuqBORyBCSeG7glUgxJDhu5IqKg0KDQojIyBJSS4xIFLDunQgdHLDrWNoIGThu68gbGnhu4d1IDEwIHThu4luaCB0aMOgbmggbmfhuqt1IG5oacOqbiBj4bunYSBWaeG7h3QgTmFtIA0KDQpgYGB7cn0NCmRhdDEgPC0gZGF0JT4lZmlsdGVyKE5hbWUgPT0gJ0jDoCBO4buZaSd8IE5hbWUgPT0gJ0tvbiBUdW0nfE5hbWUgPT0nQsOsbmggxJDhu4tuaCd8TmFtZSA9PSdHaWEgTGFpJ3xOYW1lID09J1RQLiBI4buTIENow60gTWluaCd8TmFtZSA9PSdDw6AgTWF1J3xOYW1lID09J0tpw6puIEdpYW5nJ3xOYW1lID09J0xvbmcgQW4nfE5hbWUgPT0nxJDhuq9rIEzhuq9rJ3xOYW1lID09J1Bow7ogWcOqbid8TmFtZSA9PSfEkOG7k25nIE5haScpJT4lIHNlbGVjdChNLE5hbWUsJ1kxNicsJ1kxNycsJ1kxOCcsJ1kxOScsJ1kyMCcsJ1kyMScsJ1kyMicpDQpkYXRhdGFibGUoZGF0MSkNCmBgYA0KDQoNCiMjIyAxLiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG3huq10IMSR4buZIGTDom4gc+G7kSBj4bunYSBuxINtIDIwMjAgDQpgYGB7cn0NCmRhdDEgJT4lIGdncGxvdChhZXMoeCA9IFkyMCkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAnbGlnaHRibHVlJykNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2gqKiANCg0KLSBkYXQxICU+JSBnZ3Bsb3QoYWVzKHggPSBZMjApKSB4w6FjIMSR4buLbmggZOG7ryBsaeG7h3UgdsOgIMOhbmggeOG6oSBnacOhIHRy4buLIGPhu6dhIGPhu5l0IFkyMCBsw6puIHRy4bulYyB4IGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KLSBnZW9tX2RlbnNpdHkoZmlsbCA9ICdsaWdodGJsdWUnKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB24bq9IGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSwgdHJvbmcgxJHDsyBjw6FjIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgWTIwIHPhur0gxJHGsOG7o2MgYmnhu4N1IGRp4buFbiBkxrDhu5tpIGThuqFuZyDEkcaw4budbmcgY29uZyBt4bqtdCDEkeG7mS4gVGhhbSBz4buRIGZpbGwgPSAnbGlnaHRibHVlJyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0w7QgbcOgdSBjaG8ga2h1IHbhu7FjIGTGsOG7m2kgxJHGsOG7nW5nIGNvbmcgbeG6rXQgxJHhu5kgYuG6sW5nIG3DoHUgeGFuaCBuaOG6oXQuDQoNCg0KIyMjIDIuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gZMOibiBz4buRIGPhu6dhIGPDoWMgdOG7iW5oIG7Eg20gMjAxNg0KYGBge3J9DQpkYXQxICU+JSBnZ3Bsb3QoYWVzKHggPSBZMTYpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMDAwLCBmaWxsID0gJ2xpZ2h0Ymx1ZScsIGNvbG9yID0gJ2JsYWNrJykNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2gqKg0KDQotIGRhdDEgJT4lIGdncGxvdChhZXMoeCA9IFkxNikpIHjDoWMgxJHhu4tuaCBk4buvIGxp4buHdSB2w6Agw6FuaCB44bqhIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgWTE2IGzDqm4gdHLhu6VjIHggY+G7p2EgYmnhu4N1IMSR4buTLg0KDQotIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMDAwLCBmaWxsID0gJ2xpZ2h0Ymx1ZScsIGNvbG9yID0gJ2JsYWNrJykgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgduG6vSBiaeG7g3UgxJHhu5MgaGlzdG9ncmFtLiBUaGFtIHPhu5EgYmlud2lkdGggeMOhYyDEkeG7i25oIGvDrWNoIHRoxrDhu5tjIGPhu6dhIGPDoWMga2hv4bqjbmcgKGJpbikgdHJvbmcgYmnhu4N1IMSR4buTIGhpc3RvZ3JhbSwgdHJvbmcgxJFv4bqhbiBtw6MgbsOgeSBsw6AgNTAwLDAwMC4gVGhhbSBz4buRIGZpbGwgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdMO0IG3DoHUgY2hvIGPDoWMgdGhhbmggaGlzdG9ncmFtIGLhurFuZyBtw6B1IHhhbmggbmjhuqF0LCB2w6AgdGhhbSBz4buRIGNvbG9yIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSR4bq3dCBtw6B1IHZp4buBbiBj4bunYSBjw6FjIHRoYW5oIGhpc3RvZ3JhbSB0aMOgbmggbcOgdSDEkWVuLg0KDQojIyMgMy4gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBjw6FjIHBhbmVsIHJpw6puZyBiaeG7h3QgduG7gSBkw6JuIHPhu5EgY+G7p2EgMTAgdOG7iW5oIHRow6BuaCBuxINtIDIwMjAgDQpgYGB7cn0NCmRhdDEgJT4lIGdncGxvdChhZXMoeCA9IFkyMCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAwMDAsIGZpbGwgPSAnbGlnaHRibHVlJywgY29sb3IgPSAnYmxhY2snKSArDQogIGZhY2V0X3dyYXAofk5hbWUpDQpgYGANCg0KKipHaeG6o2kgdGjDrWNoKioNCg0KLSBkYXQxICU+JSBnZ3Bsb3QoYWVzKHggPSBZMjApKSB4w6FjIMSR4buLbmggZOG7ryBsaeG7h3UgdsOgIMOhbmggeOG6oSBnacOhIHRy4buLIGPhu6dhIGPhu5l0IFkyMCBsw6puIHRy4bulYyB4IGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KLSBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwMDAwMCwgZmlsbCA9ICdsaWdodGJsdWUnLCBjb2xvciA9ICdibGFjaycpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gYmnhu4N1IMSR4buTIGhpc3RvZ3JhbSB24bubaSBjw6FjIHRoYW0gc+G7kSBuaMawIHNhdTogYmlud2lkdGggeMOhYyDEkeG7i25oIGvDrWNoIHRoxrDhu5tjIGPhu6dhIGPDoWMga2hv4bqjbmcgKGJpbikgdHJvbmcgYmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBsw6AgNTAwLDAwMDsgZmlsbCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0w7QgbcOgdSBjaG8gY8OhYyB0aGFuaCBoaXN0b2dyYW0gYuG6sW5nIG3DoHUgeGFuaCBuaOG6oXQ7IGNvbG9yIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSR4bq3dCBtw6B1IHZp4buBbiBj4bunYSBjw6FjIHRoYW5oIGhpc3RvZ3JhbSB0aMOgbmggbcOgdSDEkWVuLg0KDQotIGZhY2V0X3dyYXAofk5hbWUpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGPDoWMgcGFuZWwgcmnDqm5nIGJp4buHdCBjaG8gbeG7l2kgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBOYW1lLiDEkGnhu4F1IG7DoHkgY2hvIHBow6lwIGNow7puZyB0YSBuaMOsbiB2w6BvIHBow6JuIHBo4buRaSBj4bunYSBj4buZdCBZMjAgZOG7sWEgdHLDqm4gY8OhYyBuaMOzbSDEkcaw4bujYyB4w6FjIMSR4buLbmggYuG7n2kgY+G7mXQgTmFtZS4NCg0KIyMjIDQuQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBkw6JuIHPhu5EgY+G7p2EgY8OhYyB04buJbmggdGjDoG5oIFZOIHRyb25nIG7Eg20gMjAyMg0KYGBge3J9DQpkYXQxICU+JSBnZ3Bsb3QoYWVzKHggPSBOYW1lLCB5ID0gWTIyKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJsaWdodGJsdWUiKSArDQogIGxhYnMoeCA9ICJUw6puIHThu4luaCIsIHkgPSAiRMOibiBz4buRIikgKw0KICBnZ3RpdGxlKCJCaeG7g3UgxJHhu5MgZMOibiBz4buRIGPDoWMgdOG7iW5oIHRow6BuaCBWaeG7h3QgTmFtIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2gqKg0KDQotIGRhdDEgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBZMjIpKSB4w6FjIMSR4buLbmggZOG7ryBsaeG7h3UgdsOgIMOhbmggeOG6oSBnacOhIHRy4buLIGPhu6dhIGPhu5l0IE5hbWUgbMOqbiB0cuG7pWMgeCB2w6AgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBZMjIgbMOqbiB0cuG7pWMgeSBj4bunYSBiaeG7g3UgxJHhu5MuDQoNCi0gZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAibGlnaHRibHVlIikgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgduG6vSBiaeG7g3UgxJHhu5MgYmFyIGNoYXJ0IHbhu5tpIHRoYW0gc+G7kSBzdGF0IMSRxrDhu6NjIMSR4bq3dCBsw6AgImlkZW50aXR5IiDEkeG7gyBz4butIGThu6VuZyBnacOhIHRy4buLIGPhu6dhIGPhu5l0IFkyMiB0cuG7sWMgdGnhur9wLCBmaWxsIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIGPhu5l0IGLhurFuZyBtw6B1IHhhbmggbmjhuqF0Lg0KDQotIGxhYnMoeCA9ICJUw6puIHThu4luaCIsIHkgPSAiRMOibiBz4buRIikgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkgY+G7p2EgYmnhu4N1IMSR4buTLg0KDQotIGdndGl0bGUoIkJp4buDdSDEkeG7kyBkw6JuIHPhu5EgY8OhYyB04buJbmggdGjDoG5oIFZp4buHdCBOYW0iKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCg0KLSB0aGVtZV9taW5pbWFsKCkgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IGdpYW8gZGnhu4duIMSRxqFuIGdp4bqjbiBjaG8gYmnhu4N1IMSR4buTLg0KDQojIyMgNS4gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBkw6JuIHPhu5EgY8OhYyB04buJbmggdGjDoG5oIFZp4buHdCBOYW0gbsSDbSAyMDE4DQoNCmBgYHtyfQ0KZGF0MSAlPiUgZ2dwbG90KGFlcyh4ID0gIiIsIHkgPSBZMTgsIGZpbGwgPSBOYW1lKSkgKw0KICBnZW9tX2Jhcih3aWR0aCA9IDEsIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArDQogIGxhYnMoZmlsbCA9ICJUw6puIHThu4luaCIsIHggPSBOVUxMLCB5ID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJCaeG7g3UgxJHhu5MgZMOibiBz4buRIGPDoWMgdOG7iW5oIHRow6BuaCBWaeG7h3QgTmFtIHRyb25nIG7Eg20gMjAxOCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikNCg0KYGBgDQoNCioqR2nhuqNpIHRow61jaCoqDQoNCi0gZGF0MSAlPiUgZ2dwbG90KGFlcyh4ID0gIiIsIHkgPSBZMTgsIGZpbGwgPSBOYW1lKSkgeMOhYyDEkeG7i25oIGThu68gbGnhu4d1IHbDoCDDoW5oIHjhuqEgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBZMTggbMOqbiB0cuG7pWMgeSB2w6AgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBOYW1lIGzDqm4gbcOgdSBz4bqvYyBj4bunYSBjw6FjIHBo4bqnbiBj4bunYSBiaeG7g3UgxJHhu5MuDQoNCi0gZ2VvbV9iYXIod2lkdGggPSAxLCBzdGF0ID0gImlkZW50aXR5IikgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgduG6vSBiaeG7g3UgxJHhu5MgcGllIGNoYXJ0IHbhu5tpIHRoYW0gc+G7kSB3aWR0aCDEkcaw4bujYyDEkeG6t3QgbMOgIDEgxJHhu4MgY8OzIGjDrG5oIGThuqFuZyDEkeG6p3kgxJHhu6cgY+G7p2EgYmnhu4N1IMSR4buTIHBpZSwgdsOgIHN0YXQgxJHGsOG7o2MgxJHhurd0IGzDoCAiaWRlbnRpdHkiIMSR4buDIHPhu60gZOG7pW5nIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgWTE4IHRy4buxYyB0aeG6v3AuDQoNCi0gY29vcmRfcG9sYXIodGhldGEgPSAieSIpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGNodXnhu4NuIGJp4buDdSDEkeG7kyBzYW5nIGtp4buDdSBwb2xhciAoaMOsbmggdHLDsm4pLg0KDQotIGxhYnMoZmlsbCA9ICJUw6puIHThu4luaCIsIHggPSBOVUxMLCB5ID0gTlVMTCkgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IG5ow6NuIGNobyBjaMO6IHRow61jaCAobGVnZW5kKSwgdsOgIMSR4buDIHjDs2EgbmjDo24gdHLhu6VjIHggdsOgIHRy4bulYyB5IGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KLSBnZ3RpdGxlKCJCaeG7g3UgxJHhu5MgZMOibiBz4buRIGPDoWMgdOG7iW5oIHRow6BuaCBWaeG7h3QgTmFtIHRyb25nIG7Eg20gMjAxOCIpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSR4bq3dCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KDQotIHRoZW1lX21pbmltYWwoKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgZ2lhbyBkaeG7h24gxJHGoW4gZ2nhuqNuIGNobyBiaeG7g3UgxJHhu5MgdsOgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGRpIGNodXnhu4NuIGNow7ogdGjDrWNoIChsZWdlbmQpIHNhbmcgduG7iyB0csOtIGLDqm4gcGjhuqNpIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KDQojIyMgNi4gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBkw6JuIHPhu5EgY8OhYyB04buJbmggdGjDoG5oIGPhu6dhIFZOIHRyb25nIG7Eg20gMjAyMA0KDQpgYGB7cn0NCmRhdDEgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBZMTgsIGZpbGwgPSBmYWN0b3IoWTIwKSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHggPSAiVMOqbiB04buJbmgiLCB5ID0gIkTDom4gc+G7kSIsIGZpbGwgPSAiRMOibiBz4buRIikgKw0KICBnZ3RpdGxlKCJCaeG7g3UgxJHhu5MgZMOibiBz4buRIGPDoWMgdOG7iW5oIHRow6BuaCBWaeG7h3QgTmFtIHRyb25nIG7Eg20gMjAyMCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2gqKg0KDQotIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBZMTgsIGZpbGwgPSBmYWN0b3IoWTIwKSkpOiDEkMOieSBsw6AgaMOgbSBnZ3Bsb3QoKSDEkeG7gyB04bqhbyBt4buZdCDEkeG7kWkgdMaw4bujbmcgYmnhu4N1IMSR4buTLiBIw6BtIG7DoHkgbmjhuq1uIHbDoG8gbeG7mXQgxJHhu5FpIHPhu5EgY2jDrW5oIGzDoCBow6BtIGFlcygpIChhZXN0aGV0aWMpLCB0cm9uZyDEkcOzIHggPSBOYW1lIGNo4buJIMSR4buLbmggY+G7mXQgTmFtZSB0cm9uZyBkYXQxIHPhur0gxJHGsOG7o2Mgc+G7rSBk4bulbmcgbMOgbSB0cuG7pWMgeCBj4bunYSBiaeG7g3UgxJHhu5MsIHkgPSBZMTggY2jhu4kgxJHhu4tuaCBj4buZdCBZMTggc+G6vSDEkcaw4bujYyBz4butIGThu6VuZyBsw6BtIHRy4bulYyB5IGPhu6dhIGJp4buDdSDEkeG7kywgdsOgIGZpbGwgPSBmYWN0b3IoWTIwKSBjaOG7iSDEkeG7i25oIGPhu5l0IFkyMCBz4bq9IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGzDoG0gbcOgdSBz4bqvYyBjaG8gY8OhYyB0aGFuaCBiYXIuDQoNCi0gZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIik6IMSQw6J5IGzDoCBow6BtIGdlb21fYmFyKCkgxJHhu4MgduG6vSBiaeG7g3UgxJHhu5MgYmFyIGNoYXJ0LiBUaGFtIHPhu5Egc3RhdCA9ICJpZGVudGl0eSIgY2jhu4kgxJHhu4tuaCBy4bqxbmcgY2hp4buBdSBjYW8gY+G7p2EgY8OhYyB0aGFuaCBiYXIgc+G6vSBk4buxYSB0csOqbiBnacOhIHRy4buLIHRo4buxYyBj4bunYSBj4buZdCBZMTggdHJvbmcgZGF0MS4gVGhhbSBz4buRIHBvc2l0aW9uID0gImRvZGdlIiBjaOG7iSDEkeG7i25oIHLhurFuZyBjw6FjIHRoYW5oIGJhciBz4bq9IMSRxrDhu6NjIHTDoWNoIHLhu51pIG5oYXUuDQoNCi0gbGFicyh4ID0gIlTDqm4gdOG7iW5oIiwgeSA9ICJEw6JuIHPhu5EiLCBmaWxsID0gIkTDom4gc+G7kSIpOiDEkMOieSBsw6AgaMOgbSBsYWJzKCkgxJHhu4MgxJHhurd0IG5ow6NuIGNobyB0cuG7pWMgeCwgdHLhu6VjIHkgdsOgIGNow7ogdGjDrWNoIChsZWdlbmQpIGPhu6dhIGJp4buDdSDEkeG7ky4gVHJvbmcgxJFv4bqhbiBtw6MgdHLDqm4sIG5ow6NuIGPhu6dhIHRy4bulYyB4IMSRxrDhu6NjIMSR4bq3dCBsw6AgIlTDqm4gdOG7iW5oIiwgbmjDo24gY+G7p2EgdHLhu6VjIHkgxJHGsOG7o2MgxJHhurd0IGzDoCAiRMOibiBz4buRIiwgdsOgIG5ow6NuIGPhu6dhIGNow7ogdGjDrWNoIMSRxrDhu6NjIMSR4bq3dCBsw6AgIkTDom4gc+G7kSIuDQoNCi0gZ2d0aXRsZSgiQmnhu4N1IMSR4buTIGTDom4gc+G7kSBjw6FjIHThu4luaCB0aMOgbmggVmnhu4d0IE5hbSB0cm9uZyBuxINtIDIwMjAiKTogxJDDonkgbMOgIGjDoG0gZ2d0aXRsZSgpIMSR4buDIMSR4bq3dCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLiBUcm9uZyDEkW/huqFuIG3DoyB0csOqbiwgdGnDqnUgxJHhu4EgY+G7p2EgYmnhu4N1IMSR4buTIMSRxrDhu6NjIMSR4bq3dCBsw6AgIkJp4buDdSDEkeG7kyBkw6JuIHPhu5EgY8OhYyB04buJbmggdGjDoG5oIFZp4buHdCBOYW0gdHJvbmcgbsSDbSAyMDIwIi4NCg0KLSB0aGVtZV9taW5pbWFsKCk6IMSQw6J5IGzDoCBow6BtIHRoZW1lX21pbmltYWwoKSDEkeG7gyB0aGnhur90IGzhuq1wIGdpYW8gZGnhu4duIGPhu6dhIGJp4buDdSDEkeG7kyB0aGVvIHBob25nIGPDoWNoIHThu5FpIGdp4bqjbi4NCg0KLSB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKTogxJDDonkgbMOgIGjDoG0gdGhlbWUoKSDEkeG7gyB0w7l5IGNo4buJbmggZ2lhbyBkaeG7h24gY+G7p2EgYmnhu4N1IMSR4buTLiBUcm9uZyDEkW/huqFuIG3DoyB0csOqbiwgdGhhbSBz4buRIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIgY2jhu4kgxJHhu4tuaCBy4bqxbmcgY2jDuiB0aMOtY2ggKGxlZ2VuZCkgc+G6vSDEkcaw4bujYyDEkeG6t3Qg4bufIGLDqm4gcGjhuqNpIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KIyMjIDcuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gxJHGsOG7nW5nIG3huq10IMSR4buZIGTDom4gc+G7kSBjw6FjIHThu4luaCBWTiB0cm9uZyBuxINtIDIwMjANCg0KYGBge3J9DQpxcGxvdChZMjAsIGRhdGEgPSBkYXQxLCBnZW9tID0gImRlbnNpdHkiKQ0KYGBgDQoNCioqR2nhuqNpIHRow61jaCoqDQoNCi0gWTIwOiDEkMOieSBsw6AgxJHhu5FpIHPhu5EgxJHhuqd1IHRpw6puIHbDoCBjaOG7iSDEkeG7i25oIGJp4bq/bi9j4buZdCB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBkYXQxIHPhur0gxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIG3huq10IMSR4buZLg0KLSBkYXRhID0gZGF0MTogxJDDonkgbMOgIMSR4buRaSBz4buRIHRo4bupIGhhaSB2w6AgY2jhu4kgxJHhu4tuaCB04bqtcCBk4buvIGxp4buHdSBkYXQxIG3DoCBiaeG6v24vY+G7mXQgc+G6vSDEkcaw4bujYyBs4bqleSB04burLg0KLSBnZW9tID0gImRlbnNpdHkiOiDEkMOieSBsw6AgxJHhu5FpIHPhu5EgdGjhu6kgYmEgdsOgIGNo4buJIMSR4buLbmggcuG6sW5nIGJp4buDdSDEkeG7kyBz4bq9IGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kuDQoNCiMjIElJLjIgUsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgY8OhYyB04buJbmgg4bufIHbDuW5nIELhuq9jIFRydW5nIELhu5kgVmnhu4d0IE5hbSAgDQpgYGB7cn0NCmRhdDIgPC0gZGF0JT4lZmlsdGVyKE5hbWUgPT0gJ1RoYW5oIEjDs2EnfCBOYW1lID09ICdOZ2jhu4cgQW4nfE5hbWUgPT0nSMOgIFTEqW5oJ3xOYW1lID09J1F14bqjbmcgQsOsbmgnfE5hbWUgPT0nUXXhuqNuZyBUcuG7iyd8TmFtZSA9PSdUaOG7q2EgVGhpw6puLUh14bq/JyklPiUgc2VsZWN0KE0sTmFtZSwnWTE2JywnWTE3JywnWTE4JywnWTE5JywnWTIwJywnWTIxJywnWTIyJykNCmRhdGF0YWJsZShkYXQyKQ0KYGBgDQoNCiMjIyAxLiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG3huq10IMSR4buZIGTDom4gc+G7kSB0aHXhu5ljIEJUQiBj4bunYSBWTiBuxINtIDIwMTYNCmBgYHtyfQ0KZGF0MiAlPiUgZ2dwbG90KGFlcyh4ID0gWTE2KSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdvcmFuZ2UnKQ0KYGBgDQoNCioqR2nhuqNpIHRow61jaCoqIA0KDQotIGRhdDIgJT4lIGdncGxvdChhZXMoeCA9IFkxNikpIHjDoWMgxJHhu4tuaCBk4buvIGxp4buHdSB2w6Agw6FuaCB44bqhIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgWTE2IGzDqm4gdHLhu6VjIHggY+G7p2EgYmnhu4N1IMSR4buTLg0KDQotIGdlb21fZGVuc2l0eShmaWxsID0gJ29yYW5nZScpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gYmnhu4N1IMSR4buTIG3huq10IMSR4buZLCB0cm9uZyDEkcOzIGPDoWMgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBZMjAgc+G6vSDEkcaw4bujYyBiaeG7g3UgZGnhu4VuIGTGsOG7m2kgZOG6oW5nIMSRxrDhu51uZyBjb25nIG3huq10IMSR4buZLiBUaGFtIHPhu5EgZmlsbCA9ICdvcmFuZ2UnIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHTDtCBtw6B1IGNobyBraHUgduG7sWMgZMaw4bubaSDEkcaw4budbmcgY29uZyBt4bqtdCDEkeG7mSBi4bqxbmcgbcOgdSBjYW0uDQoNCiMjIyAyLiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGTDom4gc+G7kSBj4bunYSBjw6FjIHThu4luaCB0aHXhu5ljIEJUQiBj4bunYSBWTiBuxINtIDIwMTgNCmBgYHtyfQ0KZGF0MiAlPiUgZ2dwbG90KGFlcyh4ID0gWTE4KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwMDAwMCwgZmlsbCA9ICdsaWdodGJsdWUnLCBjb2xvciA9ICdibGFjaycpDQpgYGANCg0KKipHaeG6o2kgdGjDrWNoKioNCg0KLSBkYXQyICU+JSBnZ3Bsb3QoYWVzKHggPSBZMTgpKSB4w6FjIMSR4buLbmggZOG7ryBsaeG7h3UgdsOgIMOhbmggeOG6oSBnacOhIHRy4buLIGPhu6dhIGPhu5l0IFkxOCBsw6puIHRy4bulYyB4IGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KLSBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwMDAwMCwgZmlsbCA9ICdsaWdodGJsdWUnLCBjb2xvciA9ICdibGFjaycpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gYmnhu4N1IMSR4buTIGhpc3RvZ3JhbS4gVGhhbSBz4buRIGJpbndpZHRoIHjDoWMgxJHhu4tuaCBrw61jaCB0aMaw4bubYyBj4bunYSBjw6FjIGtob+G6o25nIChiaW4pIHRyb25nIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0sIHRyb25nIMSRb+G6oW4gbcOjIG7DoHkgbMOgIDUwMCwwMDAuIFRoYW0gc+G7kSBmaWxsIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIHRoYW5oIGhpc3RvZ3JhbSBi4bqxbmcgbcOgdSB4YW5oIG5o4bqhdCwgdsOgIHRoYW0gc+G7kSBjb2xvciDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgbcOgdSB2aeG7gW4gY+G7p2EgY8OhYyB0aGFuaCBoaXN0b2dyYW0gdGjDoG5oIG3DoHUgxJFlbi4NCiMjIyAzLiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGPDoWMgcGFuZWwgcmnDqm5nIGJp4buHdCB24buBIGTDom4gc+G7kSBj4bunYSBjw6FjIHThu4luaCB0aMOgbmggdGh14buZYyBCVEIgY+G7p2EgVk4gbsSDbSAyMDIyDQpgYGB7cn0NCmRhdDIgJT4lIGdncGxvdChhZXMoeCA9IFkyMikpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAwMDAsIGZpbGwgPSAnbGlnaHRncmVlbicsIGNvbG9yID0gJ2JsYWNrJykgKw0KICBmYWNldF93cmFwKH5OYW1lKQ0KYGBgDQoNCioqR2nhuqNpIHRow61jaCoqDQoNCi0gZGF0MiAlPiUgZ2dwbG90KGFlcyh4ID0gWTIyKSkgeMOhYyDEkeG7i25oIGThu68gbGnhu4d1IHbDoCDDoW5oIHjhuqEgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBZMjIgbMOqbiB0cuG7pWMgeCBj4bunYSBiaeG7g3UgxJHhu5MuDQoNCi0gZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAwMDAsIGZpbGwgPSAnbGlnaHRncmVlbicsIGNvbG9yID0gJ2JsYWNrJykgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgduG6vSBiaeG7g3UgxJHhu5MgaGlzdG9ncmFtIHbhu5tpIGPDoWMgdGhhbSBz4buRIG5oxrAgc2F1OiBiaW53aWR0aCB4w6FjIMSR4buLbmgga8OtY2ggdGjGsOG7m2MgY+G7p2EgY8OhYyBraG/huqNuZyAoYmluKSB0cm9uZyBiaeG7g3UgxJHhu5MgaGlzdG9ncmFtIGzDoCA1MDAsMDAwOyBmaWxsIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIHRoYW5oIGhpc3RvZ3JhbSBi4bqxbmcgbcOgdSB4YW5oIG5o4bqhdDsgY29sb3IgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IG3DoHUgdmnhu4FuIGPhu6dhIGPDoWMgdGhhbmggaGlzdG9ncmFtIHRow6BuaCBtw6B1IMSRZW4uDQoNCi0gZmFjZXRfd3JhcCh+TmFtZSkgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gY8OhYyBwYW5lbCByacOqbmcgYmnhu4d0IGNobyBt4buXaSBnacOhIHRy4buLIGPhu6dhIGPhu5l0IE5hbWUuIMSQaeG7gXUgbsOgeSBjaG8gcGjDqXAgY2jDum5nIHRhIG5ow6xuIHbDoG8gcGjDom4gcGjhu5FpIGPhu6dhIGPhu5l0IFkyMCBk4buxYSB0csOqbiBjw6FjIG5ow7NtIMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBi4bufaSBj4buZdCBOYW1lLg0KIyMjIDQuQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBkw6JuIHPhu5EgY+G7p2EgY8OhYyB04buJbmggdGjDoG5oIHRodeG7mWMgQlRCIGPhu6dhIFZOIHRyb25nIG7Eg20gMjAyMA0KYGBge3J9DQpkYXQyICU+JSBnZ3Bsb3QoYWVzKHggPSBOYW1lLCB5ID0gWTIwKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJyZWQiKSArDQogIGxhYnMoeCA9ICJUw6puIHThu4luaCIsIHkgPSAiRMOibiBz4buRIikgKw0KICBnZ3RpdGxlKCJCaeG7g3UgxJHhu5MgZMOibiBz4buRIGPDoWMgdOG7iW5oIHRow6BuaCBWaeG7h3QgTmFtIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2gqKg0KDQotIGRhdDIgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBZMjApKSB4w6FjIMSR4buLbmggZOG7ryBsaeG7h3UgdsOgIMOhbmggeOG6oSBnacOhIHRy4buLIGPhu6dhIGPhu5l0IE5hbWUgbMOqbiB0cuG7pWMgeCB2w6AgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBZMjAgbMOqbiB0cuG7pWMgeSBj4bunYSBiaeG7g3UgxJHhu5MuDQoNCi0gZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAicmVkIikgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgduG6vSBiaeG7g3UgxJHhu5MgYmFyIGNoYXJ0IHbhu5tpIHRoYW0gc+G7kSBzdGF0IMSRxrDhu6NjIMSR4bq3dCBsw6AgImlkZW50aXR5IiDEkeG7gyBz4butIGThu6VuZyBnacOhIHRy4buLIGPhu6dhIGPhu5l0IFkyMCB0cuG7sWMgdGnhur9wLCBmaWxsIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIGPhu5l0IGLhurFuZyBtw6B1IMSR4buPLg0KDQotIGxhYnMoeCA9ICJUw6puIHThu4luaCIsIHkgPSAiRMOibiBz4buRIikgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkgY+G7p2EgYmnhu4N1IMSR4buTLg0KDQotIGdndGl0bGUoIkJp4buDdSDEkeG7kyBkw6JuIHPhu5EgY8OhYyB04buJbmggdGjDoG5oIFZp4buHdCBOYW0iKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCg0KLSB0aGVtZV9taW5pbWFsKCkgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IGdpYW8gZGnhu4duIMSRxqFuIGdp4bqjbiBjaG8gYmnhu4N1IMSR4buTLg0KDQojIyMgNS4gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBkw6JuIHPhu5EgY8OhYyB04buJbmggdGh14buZYyBCVEIgVmnhu4d0IE5hbSBuxINtIDIwMTgNCmBgYHtyfQ0KZGF0MiAlPiUgZ2dwbG90KGFlcyh4ID0gIiIsIHkgPSBZMTgsIGZpbGwgPSBOYW1lKSkgKw0KICBnZW9tX2Jhcih3aWR0aCA9IDEsIHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArDQogIGxhYnMoZmlsbCA9ICJUw6puIHThu4luaCIsIHggPSBOVUxMLCB5ID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJCaeG7g3UgxJHhu5MgZMOibiBz4buRIGPDoWMgdOG7iW5oIHRow6BuaCBWaeG7h3QgTmFtIHRyb25nIG7Eg20gMjAxOCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2gqKg0KDQotIGRhdDIgJT4lIGdncGxvdChhZXMoeCA9ICIiLCB5ID0gWTE4LCBmaWxsID0gTmFtZSkpIHjDoWMgxJHhu4tuaCBk4buvIGxp4buHdSB2w6Agw6FuaCB44bqhIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgWTE4IGzDqm4gdHLhu6VjIHkgdsOgIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgTmFtZSBsw6puIG3DoHUgc+G6r2MgY+G7p2EgY8OhYyBwaOG6p24gY+G7p2EgYmnhu4N1IMSR4buTLg0KDQotIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gYmnhu4N1IMSR4buTIHBpZSBjaGFydCB24bubaSB0aGFtIHPhu5Egd2lkdGggxJHGsOG7o2MgxJHhurd0IGzDoCAxIMSR4buDIGPDsyBow6xuaCBk4bqhbmcgxJHhuqd5IMSR4bunIGPhu6dhIGJp4buDdSDEkeG7kyBwaWUsIHbDoCBzdGF0IMSRxrDhu6NjIMSR4bq3dCBsw6AgImlkZW50aXR5IiDEkeG7gyBz4butIGThu6VuZyBnacOhIHRy4buLIGPhu6dhIGPhu5l0IFkxOCB0cuG7sWMgdGnhur9wLg0KDQotIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBjaHV54buDbiBiaeG7g3UgxJHhu5Mgc2FuZyBraeG7g3UgcG9sYXIgKGjDrG5oIHRyw7JuKS4NCg0KLSBsYWJzKGZpbGwgPSAiVMOqbiB04buJbmgiLCB4ID0gTlVMTCwgeSA9IE5VTEwpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSR4bq3dCBuaMOjbiBjaG8gY2jDuiB0aMOtY2ggKGxlZ2VuZCksIHbDoCDEkeG7gyB4w7NhIG5ow6NuIHRy4bulYyB4IHbDoCB0cuG7pWMgeSBj4bunYSBiaeG7g3UgxJHhu5MuDQoNCi0gZ2d0aXRsZSgiQmnhu4N1IMSR4buTIGTDom4gc+G7kSBjw6FjIHThu4luaCB0aMOgbmggVmnhu4d0IE5hbSB0cm9uZyBuxINtIDIwMTgiKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCg0KLSB0aGVtZV9taW5pbWFsKCkgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IGdpYW8gZGnhu4duIMSRxqFuIGdp4bqjbiBjaG8gYmnhu4N1IMSR4buTIHbDoCB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBkaSBjaHV54buDbiBjaMO6IHRow61jaCAobGVnZW5kKSBzYW5nIHbhu4sgdHLDrSBiw6puIHBo4bqjaSBj4bunYSBiaeG7g3UgxJHhu5MuDQoNCiMjIyA2LiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGTDom4gc+G7kSBjw6FjIHThu4luaCB0aMOgbmggdGh14buZYyBCVEIgY+G7p2EgVk4gdHJvbmcgbsSDbSAyMDIwDQpgYGB7cn0NCmRhdDIgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBZMTgsIGZpbGwgPSBmYWN0b3IoWTIwKSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHggPSAiVMOqbiB04buJbmgiLCB5ID0gIkTDom4gc+G7kSIsIGZpbGwgPSAiRMOibiBz4buRIikgKw0KICBnZ3RpdGxlKCJCaeG7g3UgxJHhu5MgZMOibiBz4buRIGPDoWMgdOG7iW5oIHRow6BuaCBWaeG7h3QgTmFtIHRyb25nIG7Eg20gMjAyMCIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2gqKg0KDQotIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBZMTgsIGZpbGwgPSBmYWN0b3IoWTIwKSkpOiDEkMOieSBsw6AgaMOgbSBnZ3Bsb3QoKSDEkeG7gyB04bqhbyBt4buZdCDEkeG7kWkgdMaw4bujbmcgYmnhu4N1IMSR4buTLiBIw6BtIG7DoHkgbmjhuq1uIHbDoG8gbeG7mXQgxJHhu5FpIHPhu5EgY2jDrW5oIGzDoCBow6BtIGFlcygpIChhZXN0aGV0aWMpLCB0cm9uZyDEkcOzIHggPSBOYW1lIGNo4buJIMSR4buLbmggY+G7mXQgTmFtZSB0cm9uZyBkYXQyIHPhur0gxJHGsOG7o2Mgc+G7rSBk4bulbmcgbMOgbSB0cuG7pWMgeCBj4bunYSBiaeG7g3UgxJHhu5MsIHkgPSBZMTggY2jhu4kgxJHhu4tuaCBj4buZdCBZMTggc+G6vSDEkcaw4bujYyBz4butIGThu6VuZyBsw6BtIHRy4bulYyB5IGPhu6dhIGJp4buDdSDEkeG7kywgdsOgIGZpbGwgPSBmYWN0b3IoWTIwKSBjaOG7iSDEkeG7i25oIGPhu5l0IFkyMCBz4bq9IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGzDoG0gbcOgdSBz4bqvYyBjaG8gY8OhYyB0aGFuaCBiYXIuDQoNCi0gZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIik6IMSQw6J5IGzDoCBow6BtIGdlb21fYmFyKCkgxJHhu4MgduG6vSBiaeG7g3UgxJHhu5MgYmFyIGNoYXJ0LiBUaGFtIHPhu5Egc3RhdCA9ICJpZGVudGl0eSIgY2jhu4kgxJHhu4tuaCBy4bqxbmcgY2hp4buBdSBjYW8gY+G7p2EgY8OhYyB0aGFuaCBiYXIgc+G6vSBk4buxYSB0csOqbiBnacOhIHRy4buLIHRo4buxYyBj4bunYSBj4buZdCBZMTggdHJvbmcgZGF0MS4gVGhhbSBz4buRIHBvc2l0aW9uID0gImRvZGdlIiBjaOG7iSDEkeG7i25oIHLhurFuZyBjw6FjIHRoYW5oIGJhciBz4bq9IMSRxrDhu6NjIHTDoWNoIHLhu51pIG5oYXUuDQoNCi0gbGFicyh4ID0gIlTDqm4gdOG7iW5oIiwgeSA9ICJEw6JuIHPhu5EiLCBmaWxsID0gIkTDom4gc+G7kSIpOiDEkMOieSBsw6AgaMOgbSBsYWJzKCkgxJHhu4MgxJHhurd0IG5ow6NuIGNobyB0cuG7pWMgeCwgdHLhu6VjIHkgdsOgIGNow7ogdGjDrWNoIChsZWdlbmQpIGPhu6dhIGJp4buDdSDEkeG7ky4gVHJvbmcgxJFv4bqhbiBtw6MgdHLDqm4sIG5ow6NuIGPhu6dhIHRy4bulYyB4IMSRxrDhu6NjIMSR4bq3dCBsw6AgIlTDqm4gdOG7iW5oIiwgbmjDo24gY+G7p2EgdHLhu6VjIHkgxJHGsOG7o2MgxJHhurd0IGzDoCAiRMOibiBz4buRIiwgdsOgIG5ow6NuIGPhu6dhIGNow7ogdGjDrWNoIMSRxrDhu6NjIMSR4bq3dCBsw6AgIkTDom4gc+G7kSIuDQoNCi0gZ2d0aXRsZSgiQmnhu4N1IMSR4buTIGTDom4gc+G7kSBjw6FjIHThu4luaCB0aMOgbmggVmnhu4d0IE5hbSB0cm9uZyBuxINtIDIwMjAiKTogxJDDonkgbMOgIGjDoG0gZ2d0aXRsZSgpIMSR4buDIMSR4bq3dCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLiBUcm9uZyDEkW/huqFuIG3DoyB0csOqbiwgdGnDqnUgxJHhu4EgY+G7p2EgYmnhu4N1IMSR4buTIMSRxrDhu6NjIMSR4bq3dCBsw6AgIkJp4buDdSDEkeG7kyBkw6JuIHPhu5EgY8OhYyB04buJbmggdGjDoG5oIFZp4buHdCBOYW0gdHJvbmcgbsSDbSAyMDIwIi4NCg0KLSB0aGVtZV9taW5pbWFsKCk6IMSQw6J5IGzDoCBow6BtIHRoZW1lX21pbmltYWwoKSDEkeG7gyB0aGnhur90IGzhuq1wIGdpYW8gZGnhu4duIGPhu6dhIGJp4buDdSDEkeG7kyB0aGVvIHBob25nIGPDoWNoIHThu5FpIGdp4bqjbi4NCg0KLSB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKTogxJDDonkgbMOgIGjDoG0gdGhlbWUoKSDEkeG7gyB0w7l5IGNo4buJbmggZ2lhbyBkaeG7h24gY+G7p2EgYmnhu4N1IMSR4buTLiBUcm9uZyDEkW/huqFuIG3DoyB0csOqbiwgdGhhbSBz4buRIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIgY2jhu4kgxJHhu4tuaCBy4bqxbmcgY2jDuiB0aMOtY2ggKGxlZ2VuZCkgc+G6vSDEkcaw4bujYyDEkeG6t3Qg4bufIGLDqm4gcGjhuqNpIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KIyMjIDcuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gxJHGsOG7nW5nIG3huq10IMSR4buZIGTDom4gc+G7kSBjw6FjIHThu4luaCBWTiB0cm9uZyBuxINtIDIwMjANCmBgYHtyfQ0KcXBsb3QoWTIwLCBkYXRhID0gZGF0MiwgZ2VvbSA9ICJkZW5zaXR5IikNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2gqKg0KDQotIFkyMDogxJDDonkgbMOgIMSR4buRaSBz4buRIMSR4bqndSB0acOqbiB2w6AgY2jhu4kgxJHhu4tuaCBiaeG6v24vY+G7mXQgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgZGF0MSBz4bq9IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mS4NCi0gZGF0YSA9IGRhdDE6IMSQw6J5IGzDoCDEkeG7kWkgc+G7kSB0aOG7qSBoYWkgdsOgIGNo4buJIMSR4buLbmggdOG6rXAgZOG7ryBsaeG7h3UgZGF0MSBtw6AgYmnhur9uL2Phu5l0IHPhur0gxJHGsOG7o2MgbOG6pXkgdOG7qy4NCi0gZ2VvbSA9ICJkZW5zaXR5IjogxJDDonkgbMOgIMSR4buRaSBz4buRIHRo4bupIGJhIHbDoCBjaOG7iSDEkeG7i25oIHLhurFuZyBiaeG7g3UgxJHhu5Mgc+G6vSBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIG3huq10IMSR4buZLg0KDQojIyMgOC5CaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGPDoWMgxJFp4buDbSBj4bunYSBkw6JuIHPhu5EgdsO5bmcgQlRCIHRodeG7mWMgVk4gbsSDbSAyMDIwIA0KYGBge3J9DQpkYXQyICU+JSBnZ3Bsb3QoYWVzKHggPSBOYW1lLCB5ID0gWTE4LCBjb2xvciA9IFkyMCkpICsNCiAgZ2VvbV9wb2ludCgpDQpgYGANCg0KKipHaeG6o2kgdGjDrWNoKioNCg0KLSBnZW9tX3BvaW50KCkgbMOgIGzhu5twIGjDrG5oIGjhu41jIHRyb25nIGdncGxvdDIgxJHhu4MgduG6vSBjw6FjIMSRaeG7g20gdHLDqm4gYmnhu4N1IMSR4buTDQoNCiMjIyA5LkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gY8OhYyDEkWnhu4NtIGPhu6dhIGTDom4gc+G7kSB2w7luZyBCVEIgdGh14buZYyBWTiBuxINtIDIwMjINCmBgYHtyfQ0KZGF0MiAlPiUgZ2dwbG90KGFlcyh4ID0gTmFtZSwgeSA9IFkyMiwgc2l6ZSA9IE5hbWUpKSArDQogIGdlb21fcG9pbnQoKQ0KYGBgDQoNCg0K