Tiến hành phân
tích bộ dữ liệu:insurance
Biểu đồ phân bố tuổi
tác:
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
ggplot(a) +
geom_bar(aes(x = age, fill = sex)) +
labs(title = "Phân bố tuổi tác", x = "Tuổi", y = "Số lượng", fill = "Giới tính") +
scale_fill_brewer(palette = "Set1") +
theme(legend.position = "bottom")

- Giải thích ý nghĩa câu lệnh:
ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ
trong biến a.
geom_bar(aes(x = age, fill = sex)): Thêm layer biểu đồ dạng thanh
vào ggplot object.
- aes(x = age, fill = sex): Xác định các biến được sử dụng để tạo biểu
đồ:
- x = age: Trục hoành biểu thị “Tuổi”.
- fill = sex: Màu sắc thanh biểu đồ thể hiện “Giới tính”.
labs(title = “Phân bố tuổi tác”, x = “Tuổi”, y = “Số lượng”, fill
= “Giới tính”): Thêm tiêu đề và chú thích cho các trục và phần tô
màu.
- title = “Phân bố tuổi tác”: Tiêu đề cho biểu đồ.
- x = “Tuổi”: Chú thích cho trục hoành.
- y = “Số lượng”: Chú thích cho trục tung.
- fill = “Giới tính”: Chú thích cho phần tô màu.
scale_fill_brewer(palette = “Set1”): Chọn bảng màu “Set1” từ bộ
màu Brewer để tô màu cho các thanh biểu đồ.
theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống
dưới cùng của biểu đồ.
Biểu đồ phân bố giới
tính:
a %>% group_by(sex) %>% summarise(k = n()) %>%
ggplot(aes(sex,k)) +
geom_col(fill='brown') +
geom_text(aes(label = k),vjust = 2, color = 'white') +
labs(title = "Phân bố giới tính", x = "Giới tính", y = "Số lượng")

- Giải thích ý nghĩa câu lệnh:
a %>% group_by(sex): Nhóm dữ liệu trong biến a theo biến
sex.
%>% summarise(k = n()): Tính tổng số lượng bản ghi trong mỗi
nhóm giới tính và lưu trữ kết quả trong biến k.
ggplot(aes(sex,k)): Khởi tạo một ggplot object từ dữ liệu được
lưu trữ trong biến k với các biến sex và k được sử dụng để tạo biểu
đồ.
geom_col(fill=‘brown’): Thêm layer biểu đồ dạng cột vào ggplot
object với màu nâu.
geom_text(aes(label = k),vjust = 2, color = ‘white’): Thêm layer
văn bản hiển thị giá trị k bên trên mỗi cột với màu trắng và vị trí được
điều chỉnh lên cao một chút.
labs(title = “Phân bố giới tính”, x = “Giới tính”, y = “Số
lượng”): Thêm tiêu đề và chú thích cho các trục.
Biểu đồ mật độ phân
bố BMI:
ggplot(a) +
geom_density(aes(x = bmi), fill= 'navy') +
labs(title = "Phân bố BMI", x = "BMI", y = "Mật độ")

- Giải thích ý nghĩa câu lệnh:
ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ
trong biến a.
geom_density(aes(x = bmi), fill= ‘navy’): Thêm layer biểu đồ mật
độ vào ggplot object.
- aes(x = bmi): Xác định biến bmi được sử dụng để tạo biểu đồ mật
độ.
- fill= ‘navy’:: Tô màu cho biểu đồ mật độ bằng màu xanh navy.
labs(title = “Phân bố BMI”, x = “BMI”, y = “Mật độ”): Thêm tiêu
đề và chú thích cho các trục.
- title = “Phân bố BMI”: Tiêu đề cho biểu đồ.
- x = “BMI”: Chú thích cho trục hoành.
- y = “Mật độ”: Chú thích cho trục tung.
Biểu đồ boxplot cho
chi phí y tế theo giới tính:
ggplot(a) +
geom_boxplot(aes(x = sex, y = charges)) +
labs(title = "Chi phí y tế theo giới tính", x = "Giới tính", y = "Chi phí y tế (USD)")

##Biểu đồ phân bố khu vực:
a %>% group_by(region) %>% summarise(k = n()) %>%
ggplot(aes(region,k)) +
geom_col(fill='skyblue') +
geom_text(aes(label = k),vjust = 2, color = 'white') +
labs(title = "Phân bố khu vực", x = 'Khu vực', y = 'Số lượng')

Biểu đồ mật độ tuổi
tác:
ggplot(a) +
geom_density(aes(x = age), fill= 'pink') +
labs(title = "Phân bố mật độ tuổi tác", x = "Tuổi", y = "Mật độ")

Biểu đồ mật độ chi
phí y tế theo giới tính:
ggplot(a) +
geom_density(aes(x = charges, fill = sex)) +
labs(title = "Phân bố chi phí y tế theo giới tính", x = "Chi phí y tế (USD)", y = "Mật độ", fill = "Giới tính") +
scale_fill_brewer(palette = "Set3") +
theme(legend.position = "bottom")

- Giải thích ý nghĩa câu lệnh:
ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ
trong biến a.
geom_density(aes(x = charges, fill = sex)): Thêm layer biểu đồ
mật độ vào ggplot object.
- aes(x = charges, fill = sex): Xác định biến charges và sex được sử
dụng để tạo biểu đồ mật độ.
- x = charges: Trục hoành thể hiện “Chi phí y tế (USD)”.
- fill = sex: Màu sắc biểu đồ mật độ thể hiện “Giới tính”.
labs(title = “Phân bố chi phí y tế theo giới tính”, x = “Chi phí
y tế (USD)”, y = “Mật độ”, fill = “Giới tính”): Thêm tiêu đề, chú thích
cho các trục và phần tô màu.
- title = “Phân bố chi phí y tế theo giới tính”: Tiêu đề cho biểu
đồ.
- x = “Chi phí y tế (USD)”: Chú thích cho trục hoành.
- y = “Mật độ”: Chú thích cho trục tung.
- fill = “Giới tính”: Chú thích cho phần tô màu.
scale_fill_brewer(palette = “Set3”): Chọn bảng màu “Set3” từ bộ
màu Brewer để tô màu cho các khu vực mật độ theo giới tính.
theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống
dưới cùng của biểu đồ.
Biểu đồ mật độ chi
phí y tế theo khu vực:
ggplot(a) +
geom_density(aes(x = charges, fill = region)) +
labs(title = "Phân bố chi phí y tế theo khu vực", x = "Chi phí y tế (USD)", y = "Mật độ", fill = "Khu vực") +
scale_fill_brewer(palette = "Set3") +
theme(legend.position = "bottom")

- Giải thích ý nghĩa câu lệnh:
ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ
trong biến a.
geom_density(aes(x = charges, fill = region)): Thêm layer biểu đồ
mật độ vào ggplot object.
aes(x = charges, fill = region): Xác định biến charges và region được
sử dụng để tạo biểu đồ mật độ. x = charges: Trục hoành thể hiện “Chi phí
y tế (USD)”. fill = region: Màu sắc biểu đồ mật độ thể hiện “Khu vực”. -
labs(title = “Phân bố chi phí y tế theo khu vực”, x = “Chi phí y tế
(USD)”, y = “Mật độ”, fill = “Khu vực”): Thêm tiêu đề, chú thích cho các
trục và phần tô màu.
title = “Phân bố chi phí y tế theo khu vực”: Tiêu đề cho biểu đồ. x =
“Chi phí y tế (USD)”: Chú thích cho trục hoành. y = “Mật độ”: Chú thích
cho trục tung. fill = “Khu vực”: Chú thích cho phần tô màu. -
scale_fill_brewer(palette = “Set3”): Chọn bảng màu “Set3” từ bộ màu
Brewer để tô màu cho các khu vực mật độ theo khu vực.
- theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống
dưới cùng của biểu đồ.
Biểu đồ histogram BMI
theo giới tính:
ggplot(a) +
geom_histogram(aes(x = bmi, fill = sex)) +
labs(title = "Phân bố BMI theo giới tính", x = "BMI", y = "Số lượng", fill = "Giới tính") +
scale_fill_brewer(palette = "Set2") +
theme(legend.position = "bottom")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Biểu đồ histogram chi
phí y tế theo tình trạng hút thuốc:
ggplot(a) +
geom_histogram(aes(x = charges, fill = smoker)) +
labs(title = "Phân bố chi phí y tế theo tình trạng hút thuốc", x = "Chi phí y tế (USD)", y = "Số lượng", fill = "Hút thuốc") +
scale_fill_brewer(palette = "Set2") +
theme(legend.position = "bottom")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Biểu đồ histogram
chi phí y tế theo trẻ em:
ggplot(a) +
geom_histogram(aes(x = charges, fill = factor(children))) +
labs(title = "Phân bố chi phí y tế theo trẻ em", x = "Chi phí y tế (USD)", y = "Số lượng", fill = "Trẻ em") +
scale_fill_brewer(palette = "Set2") +
theme(legend.position = "bottom")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

- Giải thích ý nghĩa câu lệnh:
ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ
trong biến a.
geom_histogram(aes(x = charges, fill = factor(children))): Thêm
layer biểu đồ histogram vào ggplot object.
- aes(x = charges, fill = factor(children)): Xác định biến charges và
children được sử dụng để tạo biểu đồ histogram.
- x = charges: Trục hoành thể hiện “Chi phí y tế (USD)”.
- fill = factor(children): Màu sắc của các cột histogram thể hiện “Số
con” (Có con, Không con).
- factor(children): Chuyển đổi biến children thành dạng factor để sử
dụng trong biểu đồ. Biến factor giúp phân biệt các nhóm riêng biệt (Có
con/Không con) thay vì chỉ là giá trị số.
labs(title = “Phân bố chi phí y tế theo trẻ em”, x = “Chi phí y
tế (USD)”, y = “Số lượng”, fill = “Trẻ em”): Thêm tiêu đề, chú thích cho
các trục và phần tô màu.
- title = “Phân bố chi phí y tế theo trẻ em”: Tiêu đề cho biểu
đồ.
- x = “Chi phí y tế (USD)”: Chú thích cho trục hoành.
- y = “Số lượng”: Chú thích cho trục tung.
- fill = “Trẻ em”: Chú thích cho phần tô màu (thực tế là thể hiện “Số
con”).
scale_fill_brewer(palette = “Set2”): Chọn bảng màu “Set2” từ bộ
màu Brewer để tô màu cho các cột histogram theo nhóm có con/không
con.
theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống
dưới cùng của biểu đồ.
Biểu đồ histogram
chi phí y tế theo tuổi tác:
ggplot(a) +
geom_histogram(aes(x = charges, fill = factor(age))) +
labs(title = "Phân bố chi phí y tế theo tuổi tác", x = "Chi phí y tế (USD)", y = "Số lượng", fill = "Tuổi") +
scale_fill_brewer(palette = "Set1") +
theme(legend.position = "bottom")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning in RColorBrewer::brewer.pal(n, pal): n too large, allowed maximum for palette Set1 is 9
## Returning the palette you asked for with that many colors

- Giải thích ý nghĩa câu lệnh:
ggplot(a): Khởi tạo một ggplot object từ dữ liệu được lưu trữ
trong biến a.
geom_histogram(aes(x = charges, fill = factor(age))): Thêm layer
biểu đồ histogram vào ggplot object.
- aes(x = charges, fill = factor(age)): Xác định biến charges và age
được sử dụng để tạo biểu đồ histogram.
- x = charges: Trục hoành thể hiện “Chi phí y tế (USD)”.
- fill = factor(age): Màu sắc của các cột histogram thể hiện
“Tuổi”.
- factor(age): Chuyển đổi biến age thành dạng factor để sử dụng trong
biểu đồ. Biến factor giúp phân biệt các nhóm tuổi riêng biệt thay vì chỉ
là giá trị số.
labs(title = “Phân bố chi phí y tế theo tuổi tác”, x = “Chi phí y
tế (USD)”, y = “Số lượng”, fill = “Tuổi”): Thêm tiêu đề, chú thích cho
các trục và phần tô màu.
- title = “Phân bố chi phí y tế theo tuổi tác”: Tiêu đề cho biểu
đồ.
- x = “Chi phí y tế (USD)”: Chú thích cho trục hoành.
- y = “Số lượng”: Chú thích cho trục tung.
- fill = “Tuổi”: Chú thích cho phần tô màu.
scale_fill_brewer(palette = “Set1”): Chọn bảng màu “Set1” từ bộ
màu Brewer để tô màu cho các cột histogram theo nhóm tuổi.
theme(legend.position = “bottom”): Di chuyển vị trí legenda xuống
dưới cùng của biểu đồ.
Biểu đồ xu hướng chi
phí y tế theo tuổi tác:
a %>%
ggplot(aes(x = age, y = charges)) +
geom_line() +
labs(title = "Xu hướng chi phí y tế theo tuổi tác", x = "Tuổi", y = "Chi phí y tế (USD)")

- Giải thích ý nghĩa câu lệnh:
a %>%: Chọn dữ liệu từ biến a để sử dụng trong
ggplot.
ggplot(aes(x = age, y = charges)): Khởi tạo một ggplot object với
dữ liệu được chọn từ a.
- aes(x = age, y = charges): Xác định biến age và charges được sử dụng
để tạo biểu đồ.
- x = age: Trục hoành thể hiện “Tuổi”.
- y = charges: Trục tung thể hiện “Chi phí y tế (USD)”.
geom_line(): Thêm layer biểu đồ đường vào ggplot object.
labs(title = “Xu hướng chi phí y tế theo tuổi tác”, x = “Tuổi”, y
= “Chi phí y tế (USD)”): Thêm tiêu đề và chú thích cho các trục.
- title = “Xu hướng chi phí y tế theo tuổi tác”: Tiêu đề cho biểu
đồ.
- x = “Tuổi”: Chú thích cho trục hoành.
- y = “Chi phí y tế (USD)”: Chú thích cho trục tung.
Biểu đồ so sánh chi
phí y tế theo giới tính:
a %>%
ggplot(aes(x = age, y = charges, color = sex)) +
geom_line() +
labs(title = "So sánh chi phí y tế theo giới tính", x = "Tuổi", y = "Chi phí y tế (USD)", color = "Giới tính")

- Giải thích ý nghĩa câu lệnh:
a %>%: Chọn dữ liệu từ biến a để sử dụng trong
ggplot.
ggplot(aes(x = age, y = charges, color = sex)): Khởi tạo một
ggplot object với dữ liệu được chọn từ a.
- aes(x = age, y = charges, color = sex): Xác định biến age, charges
và sex được sử dụng để tạo biểu đồ.
- x = age: Trục hoành thể hiện “Tuổi”.
- y = charges: Trục tung thể hiện “Chi phí y tế (USD)”.
- color = sex: Màu sắc của các đường biểu thị “Giới tính”.
geom_line(): Thêm layer biểu đồ đường vào ggplot object.
labs(title = “So sánh chi phí y tế theo giới tính”, x = “Tuổi”, y
= “Chi phí y tế (USD)”, color = “Giới tính”): Thêm tiêu đề và chú thích
cho các trục và phần tô màu.
- title = “So sánh chi phí y tế theo giới tính”: Tiêu đề cho biểu
đồ.
- x = “Tuổi”: Chú thích cho trục hoành.
- y = “Chi phí y tế (USD)”: Chú thích cho trục tung.
- color = “Giới tính”: Chú thích cho phần tô màu (thực tế là thể hiện
“Giới tính”).
Biểu đồ so sánh chi
phí y tế theo khu vực:
a %>%
ggplot(aes(x = age, y = charges, color = region)) +
geom_line() +
labs(title = "So sánh chi phí y tế theo khu vực", x = "Tuổi", y = "Chi phí y tế (USD)", color = "Khu vực")

- Giải thích ý nghĩa câu lệnh:
a %>%: Chọn dữ liệu từ biến a để sử dụng trong
ggplot.
ggplot(aes(x = age, y = charges, color = region)): Khởi tạo một
ggplot object với dữ liệu được chọn từ a.
- aes(x = age, y = charges, color = region): Xác định biến age,
charges và region được sử dụng để tạo biểu đồ.
- x = age: Trục hoành thể hiện “Tuổi”.
- y = charges: Trục tung thể hiện “Chi phí y tế (USD)”.
- color = region: Màu sắc của các đường biểu thị “Khu vực”.
geom_line(): Thêm layer biểu đồ đường vào ggplot object.
labs(title = “So sánh chi phí y tế theo khu vực”, x = “Tuổi”, y =
“Chi phí y tế (USD)”, color = “Khu vực”): Thêm tiêu đề và chú thích cho
các trục và phần tô màu.
- title = “So sánh chi phí y tế theo khu vực”: Tiêu đề cho biểu
đồ.
- x = “Tuổi”: Chú thích cho trục hoành.
- y = “Chi phí y tế (USD)”: Chú thích cho trục tung. color = “Khu
vực”: Chú thích cho phần tô màu (thực tế là thể hiện “Khu vực”).
Biểu đồ ảnh hưởng
của BMI đến chi phí y tế:
a %>%
ggplot(aes(x = bmi, y = charges)) +
geom_point() +
geom_smooth(method = "lm") +
labs(title = "Ảnh hưởng của BMI đến chi phí y tế", x = "BMI", y = "Chi phí y tế (USD)")
## `geom_smooth()` using formula = 'y ~ x'

- Giải thích ý nghĩa câu lệnh:
a %>%: Chọn dữ liệu từ biến a để sử dụng trong
ggplot.
ggplot(aes(x = bmi, y = charges)): Khởi tạo một ggplot object với
dữ liệu được chọn từ a.
- aes(x = bmi, y = charges): Xác định biến bmi và charges được sử dụng
để tạo biểu đồ.
- x = bmi: Trục hoành thể hiện “Chỉ số khối cơ thể (BMI)”.
- y = charges: Trục tung thể hiện “Chi phí y tế (USD)”.
geom_point(): Thêm layer biểu đồ điểm vào ggplot object. Biểu đồ
điểm hiển thị mối liên hệ giữa từng điểm dữ liệu (BMI, chi phí y
tế)
geom_smooth(method = “lm”): Thêm layer đường hồi quy tuyến tính
vào ggplot object. Đường hồi quy giúp mô tả mối liên hệ tổng thể giữa
BMI và chi phí y tế.
- method = “lm”: Sử dụng phương pháp hồi quy tuyến tính.
labs(title = “Ảnh hưởng của BMI đến chi phí y tế”, x = “BMI”, y =
“Chi phí y tế (USD)”): Thêm tiêu đề và chú thích cho các trục.
- title = “Ảnh hưởng của BMI đến chi phí y tế”: Tiêu đề cho biểu
đồ.
- x = “BMI”: Chú thích cho trục hoành.
- y = “Chi phí y tế (USD)”: Chú thích cho trục tung.
Biểu đồ Density Plot
giữa Age và Charges (phân loại theo Smoker):
ggplot(a, aes(x = age, fill = smoker)) +
geom_density(alpha = 0.7) +
labs(title = "Density Plot of Age (colored by Smoker)", x = "Age", y = "Density") +
scale_fill_manual(values = c("yes" = "brown", "no" = "lightyellow"))

- Giải thích ý nghĩa câu lệnh:
ggplot(a, aes(x = age, fill = smoker)): Khởi tạo một ggplot
object từ dữ liệu được lưu trữ trong biến a.
- aes(x = age, fill = smoker): Xác định biến age và smoker được sử
dụng để tạo biểu đồ mật độ.
- x = age: Trục hoành thể hiện “Age” (giữ nguyên tên tiếng Anh).
- fill = smoker: Màu sắc của biểu đồ mật độ thể hiện “Smoker” (giữ
nguyên tên tiếng Anh).
geom_density(alpha = 0.7): Thêm layer biểu đồ mật độ vào ggplot
object.
- alpha = 0.7: Thiết lập độ mờ của biểu đồ mật độ thành 0.7 (70%
opacity).
labs(title = “Density Plot of Age (colored by Smoker)”, x =
“Age”, y = “Density”): Thêm tiêu đề, chú thích cho các trục và phần tô
màu (giữ nguyên tên tiếng Anh).
- title = “Density Plot of Age (colored by Smoker)”: Tiêu đề cho biểu
đồ (diễn đạt bằng tiếng Anh).
- x = “Age”: Chú thích cho trục hoành (giữ nguyên tên tiếng Anh).
- y = “Density”: Chú thích cho trục tung (giữ nguyên tên tiếng
Anh).
scale_fill_manual(values = c(“yes” = “brown”, “no” =
“lightyellow”)): Chọn cách tô màu thủ công cho biểu đồ mật độ.
- values = c(“yes” = “brown”, “no” = “lightyellow”): Xác định giá trị
của biến smoker và màu sắc tương ứng.
- “yes” được tô màu nâu (“brown”).
- “no” được tô màu vàng nhạt (“lightyellow”).
Biểu Đồ Scatter Plot
cho tương quan giữa BMI và Region:
ggplot(a, aes(x = bmi, y = as.factor(region), color = bmi)) +
geom_point() +
labs(title = "Scatter Plot of BMI by Region", x = "BMI", y = "Region") +
scale_color_viridis_c() +
theme(axis.text.y = element_text(angle = 0, hjust = 1))

- Giải thích ý nghĩa câu lệnh:
ggplot(a, aes(x = bmi, y = as.factor(region), color = bmi)): Khởi
tạo một ggplot object từ dữ liệu được lưu trữ trong biến a.
- aes(x = bmi, y = as.factor(region), color = bmi): Xác định các biến
được sử dụng để tạo biểu đồ.
- x = bmi: Trục hoành thể hiện “BMI”.
- y = as.factor(region): Trục tung thể hiện “Region” được chuyển đổi
thành dạng factor. Chuyển đổi này giúp phân biệt các vùng miền riêng
biệt thay vì chỉ là giá trị văn bản.
- color = bmi: Màu sắc của các điểm dữ liệu được xác định bởi giá trị
của biến “bmi”.
geom_point(): Thêm layer biểu đồ điểm vào ggplot object. Biểu đồ
điểm hiển thị mối liên hệ giữa từng điểm dữ liệu (BMI, vùng
miền).
labs(title = “Scatter Plot of BMI by Region”, x = “BMI”, y =
“Region”): Thêm tiêu đề và chú thích cho các trục.
- title = “Scatter Plot of BMI by Region”: Tiêu đề cho biểu đồ (diễn
đạt bằng tiếng Anh).
- x = “BMI”: Chú thích cho trục hoành.
- y = “Region”: Chú thích cho trục tung.
scale_color_viridis_c(): Chọn bảng màu “viridis” để tô màu cho
các điểm dữ liệu. Bảng màu viridis chuyển màu từ xanh lá cây sang vàng
rồi đến đỏ theo giá trị của biến bmi.
theme(axis.text.y = element_text(angle = 0, hjust = 1)): Tùy
chỉnh hiển thị nhãn cho trục tung.
- axis.text.y = element_text(angle = 0, hjust = 1): Xoay nhãn của trục
tung 0 độ (giữ thẳng đứng) và canh chỉnh sang phải.
Biểu đồ Bar Plot
giữa Sex và Number of Children:
ggplot(a, aes(x = sex, fill = as.factor(children))) +
geom_bar() +
labs(title = "Bar Plot of Number of Children by Sex", x = "Sex", y = "Count") +
scale_fill_brewer(palette = "Set3")

- Giải thích ý nghĩa câu lệnh:
ggplot(a, aes(x = sex, fill = as.factor(children))): Khởi tạo một
ggplot object từ dữ liệu được lưu trữ trong biến a.
- aes(x = sex, fill = as.factor(children)): Xác định các biến được sử
dụng để tạo biểu đồ thanh.
- x = sex: Trục hoành thể hiện “Sex” (giữ nguyên tên tiếng Anh).
- fill = as.factor(children): Màu sắc của các cột bar thể hiện “Số
con” (Children) được chuyển đổi thành dạng factor. Chuyển đổi này giúp
phân biệt nhóm có con/không con riêng biệt thay vì chỉ là giá trị
số.
geom_bar(): Thêm layer biểu đồ thanh vào ggplot object. Biểu đồ
thanh giúp hiển thị số lượng theo từng nhóm (nam/nữ) trên trục
hoành.
labs(title = “Bar Plot of Number of Children by Sex”, x = “Sex”,
y = “Count”): Thêm tiêu đề và chú thích cho các trục.
- title = “Bar Plot of Number of Children by Sex”: Tiêu đề cho biểu đồ
(diễn đạt bằng tiếng Anh).
- x = “Sex”: Chú thích cho trục hoành (giữ nguyên tên tiếng Anh).
- y = “Count”: Chú thích cho trục tung, mặc dù tên chính xác hơn có
thể là “Number of Children” (Số con).
scale_fill_brewer(palette = “Set3”): Chọn bảng màu “Set3” từ bộ
màu Brewer để tô màu cho các cột bar theo nhóm có con/không
con.
Biểu đồ bar plot
giữa giới tính và khu vực
ggplot(a, aes(x = sex, fill = region)) +
geom_bar(position = "dodge", stat = "count") +
geom_text(aes(label = stat(count)), stat = "count", position = position_dodge(width = 0.9))
## Warning: `stat(count)` was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

labs(title = "Bar Plot of Sex vs region",
x = "Sex",
y = "Count")
## $x
## [1] "Sex"
##
## $y
## [1] "Count"
##
## $title
## [1] "Bar Plot of Sex vs region"
##
## attr(,"class")
## [1] "labels"
- Giải thích ý nghĩa câu lệnh:
ggplot(a, aes(x = sex, fill = region)): Khởi tạo một ggplot
object từ dữ liệu được lưu trữ trong biến a.
- aes(x = sex, fill = region): Xác định các biến được sử dụng để tạo
biểu đồ thanh.
- x = sex: Trục hoành thể hiện “Sex” (giữ nguyên tên tiếng Anh). fill
= region: Màu sắc của các cột bar thể hiện “Vùng miền” (region).
geom_bar(position = “dodge”, stat = “count”): Thêm layer biểu đồ
thanh xếp chồng (dodge) vào ggplot object.
- position = “dodge”: Xếp chồng các cột bar theo nhóm giới tính
(nam/nữ) trên trục hoành để tránh chồng chéo lên nhau.
- stat = “count”: Sử dụng thống kê “count” để tính tổng số người cho
mỗi nhóm (giới tính + vùng miền).
geom_text(aes(label = stat(count)), stat = “count”, position =
position_dodge(width = 0.9)): Thêm layer text để hiển thị giá trị (số
lượng) trên mỗi cột bar.
- aes(label = stat(count)): Lấy giá trị trả về của thống kê “count”
(số lượng) để hiển thị trên mỗi cột bar.
- stat = “count”: Sử dụng thống kê “count” để tính toán giá trị hiển
thị (giống với geom_bar).
- position = position_dodge(width = 0.9): Vị trí đặt text cũng xếp
chồng theo nhóm giống với geom_bar, độ rộng text bằng 90% chiều rộng của
cột bar (để tránh text bị che khuất).
labs(title = “Bar Plot of Sex vs region”, x = “Sex”, y =
“Count”): Thêm tiêu đề và chú thích cho các trục.
- title = “Bar Plot of Sex vs region”: Tiêu đề cho biểu đồ (diễn đạt
bằng tiếng Anh).
- x = “Sex”: Chú thích cho trục hoành (giữ nguyên tên tiếng Anh).
- y = “Count”: Chú thích cho trục tung.
Biểu đồ cột hiển thị
số lượng người hút thuốc và không hút thuốc theo giới tính
ggplot(a, aes(x = sex, fill = smoker)) +
geom_bar(position = "dodge", stat = "count") +
geom_text(aes(label = stat(count)), stat = "count", position = position_dodge(width = 0.9))

labs(title = " Biểu đồ cột hiển thị số lượng người hút thuốc và không hút thuốc theo giới tính", y = "Count") +
scale_fill_manual(values = c("yes" = "skyblue", "no" = "pink"))
## NULL
- Giải thích ý nghĩa câu lệnh:
ggplot(a, aes(x = sex, fill = smoker))
- ggplot(a): Khởi tạo một biểu đồ ggplot dựa trên dữ liệu trong
dataframe a.
- aes(x = sex, fill = smoker):
- aes: Ánh xạ các biến trong dataframe vào các thuộc tính của biểu
đồ.
- x = sex: Gán biến sex (giới tính) cho trục x của biểu đồ.
- fill = smoker: Gán biến smoker (hút thuốc) cho màu sắc của các thanh
trong biểu đồ.
geom_bar(position = “dodge”, stat = “count”)
- geom_bar: Thêm hình dạng thanh vào biểu đồ.
- position = “dodge”: Xếp các thanh cạnh nhau theo nhóm (giới tính)
với khoảng cách nhất định.
- stat = “count”: Tính toán số lượng người cho mỗi nhóm (giới tính) và
hiển thị trên thanh.
geom_text(aes(label = stat(count)), stat = “count”, position =
position_dodge(width = 0.9))
- geom_text: Thêm chú thích số lượng vào mỗi thanh.
- aes(label = stat(count)): Gán giá trị số lượng (tính toán bởi -
stat(count)) cho nội dung chú thích. position = position_dodge(width =
0.9): Vị trí chú thích được căn chỉnh với vị trí của thanh và có độ rộng
0.9.
labs(title = “Biểu đồ cột hiển thị số lượng người hút thuốc và
không hút thuốc theo giới tính”, y = “Count”)
- labs: Thêm tiêu đề và chú thích cho các trục.
- title = “Biểu đồ cột hiển thị số lượng người hút thuốc và không hút
thuốc theo giới tính”: Tiêu đề cho biểu đồ.
- y = “Count”: Chú thích cho trục y.
scale_fill_manual(values = c(“yes” = “skyblue”, “no” =
“pink”))
- scale_fill_manual: Chọn màu sắc cho các nhóm (giới tính).
- values = c(“yes” = “skyblue”, “no” = “pink”): Gán màu xanh da trời
cho nhóm “yes” (hút thuốc) và màu hồng cho nhóm “no” (không hút
thuốc).
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiSG9hbmcgUXV5ZW4iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgZGZfcHJpbnQ6IGthYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogJzInDQogIHBkZl9kb2N1bWVudDoNCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChjbGFzcy5zb3VyY2U9Im51bWJlckxpbmVzIGxpbmVBbmNob3JzIikNCmBgYA0KIyAqKlThu5VuZyBxdWFuIHbhu4EgYuG7mSBk4buvIGxp4buHdTppbnN1cmFuY2UqKg0KICAtIELhu5kgZOG7ryBsaeG7h3UgYuG6o28gaGnhu4NtIMSRxrDhu6NjIGzhuqV5IHThu6sgY3Xhu5FuIHPDoWNoICJIYW5kcy1PbiBNYWNoaW5lIExlYXJuaW5nIHdpdGggU2Npa2l0LUxlYXJuLCBLZXJhcyAmIFRlbnNvckZsb3ciIGPhu6dhIEF1csOpbGllbiBHw6lyb24uIEThu68gbGnhu4d1IGJhbyBn4buTbSB0aMO0bmcgdGluIHbhu4EgY8OhYyBjw6EgbmjDom4gxJHGsOG7o2MgYuG6o28gaGnhu4NtIHbDoCBjaGkgcGjDrSB5IHThur8gY+G7p2EgaOG7jS4gDQogIA0KYGBge3J9DQpsaWJyYXJ5KGNzdikNCmEgPC0gcmVhZC5jc3YoJ0M6L1VzZXJzL0FTVVMvRG93bmxvYWRzL2luc3VyYW5jZS5jc3YnLCBoZWFkZXI9IFQpDQoNCmBgYA0KDQogIC0gw50gbmdoxKlhIGPhu6dhIGPDoWMgY+G7mXQgdMOqbiBiaeG6v24gdHJvbmcgYuG7mSBk4buvIGxp4buHdToNCmBgYHtyfQ0KbmFtZXMoYSkNCmBgYA0KICAgIC0gYWdlOiBUdeG7lWkgY+G7p2EgbmfGsOG7nWkgdGjhu6UgaMaw4bufbmcgY2jDrW5oDQogICAgLSBzZXg6IEdp4bubaSB0w61uaCBj4bunYSBuZ8aw4budaSDEkcaw4bujYyBi4bqjbyBoaeG7g20gKG7hu68sIG5hbSkNCiAgICAtIGJtaTogQ2jhu4kgc+G7kSBraOG7kWkgY8ahIHRo4buDIChCTUkpDQogICAgLSBjaGlsZHJlbjogU+G7kSBjb24gxJHGsOG7o2MgYuG6o28gaGnhu4NtIC8gU+G7kSBuZ8aw4budaSBwaOG7pSB0aHXhu5ljDQogICAgLSBzbW9rZXI6IE5nxrDhu51pIGjDunQgdGh14buRYyAoQ8OzLCBLaMO0bmcpDQogICAgLSByZWdpb246IFbDuW5nIG7GoWkgbmfGsOG7nWkgxJHGsOG7o2MgYuG6o28gaGnhu4NtIHNpbmggc+G7kW5nICggxJDDtG5nIELhuq9jLCBUw6J5IELhuq9jLCBUcnVuZyBUw6J5LCBOYW0pDQogICAgLSBjaGFyZ2VzOiBDaGkgcGjDrSB5IHThur8NCg0KIyAqKlRp4bq/biBow6BuaCBwaMOibiB0w61jaCBi4buZIGThu68gbGnhu4d1Omluc3VyYW5jZSoqDQoNCiMjIEJp4buDdSDEkeG7kyBwaMOibiBi4buRIHR14buVaSB0w6FjOg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KZ2dwbG90KGEpICsNCiAgZ2VvbV9iYXIoYWVzKHggPSBhZ2UsIGZpbGwgPSBzZXgpKSArDQogIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSB0deG7lWkgdMOhYyIsIHggPSAiVHXhu5VpIiwgeSA9ICJT4buRIGzGsOG7o25nIiwgZmlsbCA9ICJHaeG7m2kgdMOtbmgiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpgYGANCg0KLSAqR2nhuqNpIHRow61jaCDDvSBuZ2jEqWEgY8OidSBs4buHbmg6Kg0KICAtIGdncGxvdChhKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBhLg0KDQogIC0gZ2VvbV9iYXIoYWVzKHggPSBhZ2UsIGZpbGwgPSBzZXgpKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIGThuqFuZyB0aGFuaCB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFlcyh4ID0gYWdlLCBmaWxsID0gc2V4KTogWMOhYyDEkeG7i25oIGPDoWMgYmnhur9uIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kzoNCiAgICAtIHggPSBhZ2U6IFRy4bulYyBob8OgbmggYmnhu4N1IHRo4buLICJUdeG7lWkiLg0KICAgIC0gZmlsbCA9IHNleDogTcOgdSBz4bqvYyB0aGFuaCBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duICJHaeG7m2kgdMOtbmgiLg0KICAtIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSB0deG7lWkgdMOhYyIsIHggPSAiVHXhu5VpIiwgeSA9ICJT4buRIGzGsOG7o25nIiwgZmlsbCA9ICJHaeG7m2kgdMOtbmgiKTogVGjDqm0gdGnDqnUgxJHhu4EgdsOgIGNow7ogdGjDrWNoIGNobyBjw6FjIHRy4bulYyB2w6AgcGjhuqduIHTDtCBtw6B1Lg0KDQogICAgLSB0aXRsZSA9ICJQaMOibiBi4buRIHR14buVaSB0w6FjIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSAiVHXhu5VpIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyBob8OgbmguDQogICAgLSB5ID0gIlPhu5EgbMaw4bujbmciOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQogICAgLSBmaWxsID0gIkdp4bubaSB0w61uaCI6IENow7ogdGjDrWNoIGNobyBwaOG6p24gdMO0IG3DoHUuDQogIC0gc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIik6IENo4buNbiBi4bqjbmcgbcOgdSAiU2V0MSIgdOG7qyBi4buZIG3DoHUgQnJld2VyIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIHRoYW5oIGJp4buDdSDEkeG7ky4NCg0KICAtIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKTogRGkgY2h1eeG7g24gduG7iyB0csOtIGxlZ2VuZGEgeHXhu5FuZyBkxrDhu5tpIGPDuW5nIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KIyMgQmnhu4N1IMSR4buTIHBow6JuIGLhu5EgZ2nhu5tpIHTDrW5oOg0KYGBge3J9DQphICU+JSBncm91cF9ieShzZXgpICU+JSBzdW1tYXJpc2UoayA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoc2V4LGspKSArDQogICAgZ2VvbV9jb2woZmlsbD0nYnJvd24nKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGspLHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSArDQogICAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGdp4bubaSB0w61uaCIsIHggPSAiR2nhu5tpIHTDrW5oIiwgeSA9ICJT4buRIGzGsOG7o25nIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogICAgLSBhICU+JSBncm91cF9ieShzZXgpOiBOaMOzbSBk4buvIGxp4buHdSB0cm9uZyBiaeG6v24gYSB0aGVvIGJp4bq/biBzZXguDQoNCiAgICAtICU+JSBzdW1tYXJpc2UoayA9IG4oKSk6IFTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nIGLhuqNuIGdoaSB0cm9uZyBt4buXaSBuaMOzbSBnaeG7m2kgdMOtbmggdsOgIGzGsHUgdHLhu68ga+G6v3QgcXXhuqMgdHJvbmcgYmnhur9uIGsuDQoNCiAgICAtIGdncGxvdChhZXMoc2V4LGspKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBrIHbhu5tpIGPDoWMgYmnhur9uIHNleCB2w6AgayDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MuDQoNCiAgICAtIGdlb21fY29sKGZpbGw9J2Jyb3duJyk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBk4bqhbmcgY+G7mXQgdsOgbyBnZ3Bsb3Qgb2JqZWN0IHbhu5tpIG3DoHUgbsOidS4NCg0KICAgIC0gZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGspLHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKTogVGjDqm0gbGF5ZXIgdsSDbiBi4bqjbiBoaeG7g24gdGjhu4sgZ2nDoSB0cuG7iyBrIGLDqm4gdHLDqm4gbeG7l2kgY+G7mXQgduG7m2kgbcOgdSB0cuG6r25nIHbDoCB24buLIHRyw60gxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIGzDqm4gY2FvIG3hu5l0IGNow7p0Lg0KDQogICAgLSBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgZ2nhu5tpIHTDrW5oIiwgeCA9ICJHaeG7m2kgdMOtbmgiLCB5ID0gIlPhu5EgbMaw4bujbmciKTogVGjDqm0gdGnDqnUgxJHhu4EgdsOgIGNow7ogdGjDrWNoIGNobyBjw6FjIHRy4bulYy4NCg0KIyMgQmnhu4N1IMSR4buTIG3huq10IMSR4buZIHBow6JuIGLhu5EgQk1JOg0KYGBge3J9DQpnZ3Bsb3QoYSkgKw0KICBnZW9tX2RlbnNpdHkoYWVzKHggPSBibWkpLCBmaWxsPSAnbmF2eScpICsNCiAgDQogIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSBCTUkiLCB4ID0gIkJNSSIsIHkgPSAiTeG6rXQgxJHhu5kiKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOiogDQogIC0gZ2dwbG90KGEpOiBLaOG7n2kgdOG6oW8gbeG7mXQgZ2dwbG90IG9iamVjdCB04burIGThu68gbGnhu4d1IMSRxrDhu6NjIGzGsHUgdHLhu68gdHJvbmcgYmnhur9uIGEuDQoNCiAgLSBnZW9tX2RlbnNpdHkoYWVzKHggPSBibWkpLCBmaWxsPSAnbmF2eScpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KDQogICAgLSBhZXMoeCA9IGJtaSk6IFjDoWMgxJHhu4tuaCBiaeG6v24gYm1pIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mS4NCiAgICAtIGZpbGw9ICduYXZ5Jzo6IFTDtCBtw6B1IGNobyBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgYuG6sW5nIG3DoHUgeGFuaCBuYXZ5Lg0KICAtIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSBCTUkiLCB4ID0gIkJNSSIsIHkgPSAiTeG6rXQgxJHhu5kiKTogVGjDqm0gdGnDqnUgxJHhu4EgdsOgIGNow7ogdGjDrWNoIGNobyBjw6FjIHRy4bulYy4NCg0KICAgIC0gdGl0bGUgPSAiUGjDom4gYuG7kSBCTUkiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9ICJCTUkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiTeG6rXQgxJHhu5kiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQoNCg0KIyMgQmnhu4N1IMSR4buTIGJveHBsb3QgIGNobyBjaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmg6DQpgYGB7cn0NCmdncGxvdChhKSArDQogIGdlb21fYm94cGxvdChhZXMoeCA9IHNleCwgeSA9IGNoYXJnZXMpKSArDQogIGxhYnModGl0bGUgPSAiQ2hpIHBow60geSB04bq/IHRoZW8gZ2nhu5tpIHTDrW5oIiwgeCA9ICJHaeG7m2kgdMOtbmgiLCB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIpDQoNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQoNCiAgLSBnZ3Bsb3QoYSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAtIGdlb21fYm94cGxvdChhZXMoeCA9IHNleCwgeSA9IGNoYXJnZXMpKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIGjhu5lwIHbDoG8gZ2dwbG90IG9iamVjdC4NCg0KICAgIC0gYWVzKHggPSBzZXgsIHkgPSBjaGFyZ2VzKTogWMOhYyDEkeG7i25oIGJp4bq/biBzZXggdsOgIGNoYXJnZXMgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIGjhu5lwLg0KICAgIC0geCA9IHNleDogVHLhu6VjIGhvw6BuaCB0aOG7gyBoaeG7h24gIkdp4bubaSB0w61uaCIuDQogICAgLSB5ID0gY2hhcmdlczogVHLhu6VjIHR1bmcgdGjhu4MgaGnhu4duICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLg0KICAtIGxhYnModGl0bGUgPSAiQ2hpIHBow60geSB04bq/IHRoZW8gZ2nhu5tpIHTDrW5oIiwgeCA9ICJHaeG7m2kgdMOtbmgiLCB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIpOiBUaMOqbSB0acOqdSDEkeG7gSB2w6AgY2jDuiB0aMOtY2ggY2hvIGPDoWMgdHLhu6VjLg0KDQogICAgLSB0aXRsZSA9ICJDaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmgiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9ICJHaeG7m2kgdMOtbmgiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB0dW5nLg0KDQojI0Jp4buDdSDEkeG7kyBwaMOibiBi4buRIGtodSB24buxYzoNCg0KYGBge3J9DQphICU+JSBncm91cF9ieShyZWdpb24pICU+JSBzdW1tYXJpc2UoayA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMocmVnaW9uLGspKSArDQogICAgZ2VvbV9jb2woZmlsbD0nc2t5Ymx1ZScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gayksdmp1c3QgPSAyLCBjb2xvciA9ICd3aGl0ZScpICsNCiAgICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5Ega2h1IHbhu7FjIiwgeCA9ICdLaHUgduG7sWMnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCg0KICAtIGEgJT4lIGdyb3VwX2J5KHJlZ2lvbik6IE5ow7NtIGThu68gbGnhu4d1IHRyb25nIGJp4bq/biBhIHRoZW8gYmnhur9uIHJlZ2lvbi4NCg0KICAtICU+JSBzdW1tYXJpc2UoayA9IG4oKSk6IFTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nIGLhuqNuIGdoaSB0cm9uZyBt4buXaSBuaMOzbSBraHUgduG7sWMgdsOgIGzGsHUgdHLhu68ga+G6v3QgcXXhuqMgdHJvbmcgYmnhur9uIGsuDQoNCiAgLSBnZ3Bsb3QoYWVzKHJlZ2lvbixrKSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gayB24bubaSBjw6FjIGJp4bq/biByZWdpb24gdsOgIGsgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTLg0KDQogIC0gZ2VvbV9jb2woZmlsbD0nc2t5Ymx1ZScpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgZOG6oW5nIGPhu5l0IHbDoG8gZ2dwbG90IG9iamVjdCB24bubaSBtw6B1IHhhbmggZGEgdHLhu51pLg0KDQogIC0gZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGspLHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKTogVGjDqm0gbGF5ZXIgdsSDbiBi4bqjbiBoaeG7g24gdGjhu4sgZ2nDoSB0cuG7iyBrIGLDqm4gdHLDqm4gbeG7l2kgY+G7mXQgduG7m2kgbcOgdSB0cuG6r25nIHbDoCB24buLIHRyw60gxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIGzDqm4gY2FvIG3hu5l0IGNow7p0Lg0KDQogIC0gbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGtodSB24buxYyIsIHggPSAnS2h1IHbhu7FjJywgeSA9ICdT4buRIGzGsOG7o25nJyk6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiMjIEJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB0deG7lWkgdMOhYzoNCg0KYGBge3J9DQpnZ3Bsb3QoYSkgKw0KICBnZW9tX2RlbnNpdHkoYWVzKHggPSBhZ2UpLCBmaWxsPSAncGluaycpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIG3huq10IMSR4buZIHR14buVaSB0w6FjIiwgeCA9ICJUdeG7lWkiLCB5ID0gIk3huq10IMSR4buZIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQoNCiAgLSBnZ3Bsb3QoYSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAtIGdlb21fZGVuc2l0eShhZXMoeCA9IGFnZSksIGZpbGw9ICdwaW5rJyk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFlcyh4ID0gYWdlKTogWMOhYyDEkeG7i25oIGJp4bq/biBhZ2UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIG3huq10IMSR4buZLg0KICAgIC0gZmlsbD0gJ3BpbmsnOjogVMO0IG3DoHUgY2hvIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSBi4bqxbmcgbcOgdSBo4buTbmcuDQogIC0gbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIG3huq10IMSR4buZIHR14buVaSB0w6FjIiwgeCA9ICJUdeG7lWkiLCB5ID0gIk3huq10IMSR4buZIik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiAgICAtIHRpdGxlID0gIlBow6JuIGLhu5EgbeG6rXQgxJHhu5kgdHXhu5VpIHTDoWMiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9ICJUdeG7lWkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiTeG6rXQgxJHhu5kiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQoNCiMjIEJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSBjaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmg6DQpgYGB7cn0NCmdncGxvdChhKSArDQogIGdlb21fZGVuc2l0eShhZXMoeCA9IGNoYXJnZXMsIGZpbGwgPSBzZXgpKSArDQogIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSBjaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmgiLCB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIsIHkgPSAiTeG6rXQgxJHhu5kiLCBmaWxsID0gIkdp4bubaSB0w61uaCIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gZ2dwbG90KGEpOiBLaOG7n2kgdOG6oW8gbeG7mXQgZ2dwbG90IG9iamVjdCB04burIGThu68gbGnhu4d1IMSRxrDhu6NjIGzGsHUgdHLhu68gdHJvbmcgYmnhur9uIGEuDQoNCiAgLSBnZW9tX2RlbnNpdHkoYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gc2V4KSk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFlcyh4ID0gY2hhcmdlcywgZmlsbCA9IHNleCk6IFjDoWMgxJHhu4tuaCBiaeG6v24gY2hhcmdlcyB2w6Agc2V4IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mS4NCiAgICAtIHggPSBjaGFyZ2VzOiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiQ2hpIHBow60geSB04bq/IChVU0QpIi4NCiAgICAtIGZpbGwgPSBzZXg6IE3DoHUgc+G6r2MgYmnhu4N1IMSR4buTIG3huq10IMSR4buZIHRo4buDIGhp4buHbiAiR2nhu5tpIHTDrW5oIi4NCiAgLSBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgY2hpIHBow60geSB04bq/IHRoZW8gZ2nhu5tpIHTDrW5oIiwgeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCB5ID0gIk3huq10IMSR4buZIiwgZmlsbCA9ICJHaeG7m2kgdMOtbmgiKTogVGjDqm0gdGnDqnUgxJHhu4EsIGNow7ogdGjDrWNoIGNobyBjw6FjIHRy4bulYyB2w6AgcGjhuqduIHTDtCBtw6B1Lg0KDQogICAgLSB0aXRsZSA9ICJQaMOibiBi4buRIGNoaSBwaMOtIHkgdOG6vyB0aGVvIGdp4bubaSB0w61uaCI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQogICAgLSB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgaG/DoG5oLg0KICAgIC0geSA9ICJN4bqtdCDEkeG7mSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZy4NCiAgICAtIGZpbGwgPSAiR2nhu5tpIHTDrW5oIjogQ2jDuiB0aMOtY2ggY2hvIHBo4bqnbiB0w7QgbcOgdS4NCiAgLSBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKTogQ2jhu41uIGLhuqNuZyBtw6B1ICJTZXQzIiB04burIGLhu5kgbcOgdSBCcmV3ZXIgxJHhu4MgdMO0IG3DoHUgY2hvIGPDoWMga2h1IHbhu7FjIG3huq10IMSR4buZIHRoZW8gZ2nhu5tpIHTDrW5oLg0KDQogIC0gdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpOiBEaSBjaHV54buDbiB24buLIHRyw60gbGVnZW5kYSB4deG7kW5nIGTGsOG7m2kgY8O5bmcgY+G7p2EgYmnhu4N1IMSR4buTLg0KDQojIyBCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgY2hpIHBow60geSB04bq/IHRoZW8ga2h1IHbhu7FjOg0KYGBge3J9DQpnZ3Bsb3QoYSkgKw0KICBnZW9tX2RlbnNpdHkoYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gcmVnaW9uKSkgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgY2hpIHBow60geSB04bq/IHRoZW8ga2h1IHbhu7FjIiwgeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCB5ID0gIk3huq10IMSR4buZIiwgZmlsbCA9ICJLaHUgduG7sWMiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpgYGANCg0KLSAqR2nhuqNpIHRow61jaCDDvSBuZ2jEqWEgY8OidSBs4buHbmg6Kg0KICAtIGdncGxvdChhKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBhLg0KDQogIC0gZ2VvbV9kZW5zaXR5KGFlcyh4ID0gY2hhcmdlcywgZmlsbCA9IHJlZ2lvbikpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KDQphZXMoeCA9IGNoYXJnZXMsIGZpbGwgPSByZWdpb24pOiBYw6FjIMSR4buLbmggYmnhur9uIGNoYXJnZXMgdsOgIHJlZ2lvbiDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kuDQp4ID0gY2hhcmdlczogVHLhu6VjIGhvw6BuaCB0aOG7gyBoaeG7h24gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIuDQpmaWxsID0gcmVnaW9uOiBNw6B1IHPhuq9jIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB0aOG7gyBoaeG7h24gIktodSB24buxYyIuDQogIC0gbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGNoaSBwaMOtIHkgdOG6vyB0aGVvIGtodSB24buxYyIsIHggPSAiQ2hpIHBow60geSB04bq/IChVU0QpIiwgeSA9ICJN4bqtdCDEkeG7mSIsIGZpbGwgPSAiS2h1IHbhu7FjIik6IFRow6ptIHRpw6p1IMSR4buBLCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMgdsOgIHBo4bqnbiB0w7QgbcOgdS4NCg0KdGl0bGUgPSAiUGjDom4gYuG7kSBjaGkgcGjDrSB5IHThur8gdGhlbyBraHUgduG7sWMiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCnkgPSAiTeG6rXQgxJHhu5kiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQpmaWxsID0gIktodSB24buxYyI6IENow7ogdGjDrWNoIGNobyBwaOG6p24gdMO0IG3DoHUuDQogIC0gc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIik6IENo4buNbiBi4bqjbmcgbcOgdSAiU2V0MyIgdOG7qyBi4buZIG3DoHUgQnJld2VyIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIGtodSB24buxYyBt4bqtdCDEkeG7mSB0aGVvIGtodSB24buxYy4NCg0KICAtIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKTogRGkgY2h1eeG7g24gduG7iyB0csOtIGxlZ2VuZGEgeHXhu5FuZyBkxrDhu5tpIGPDuW5nIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KIyMgQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBCTUkgdGhlbyBnaeG7m2kgdMOtbmg6DQpgYGB7cn0NCmdncGxvdChhKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gYm1pLCBmaWxsID0gc2V4KSkgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgQk1JIHRoZW8gZ2nhu5tpIHTDrW5oIiwgeCA9ICJCTUkiLCB5ID0gIlPhu5EgbMaw4bujbmciLCBmaWxsID0gIkdp4bubaSB0w61uaCIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQoNCiAgLSBnZ3Bsb3QoYSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAtIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gYm1pLCBmaWxsID0gc2V4KSk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0gdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KDQogICAgLSBhZXMoeCA9IGJtaSwgZmlsbCA9IHNleCk6IFjDoWMgxJHhu4tuaCBiaeG6v24gYm1pIHbDoCBzZXggxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIGhpc3RvZ3JhbS4NCiAgICAtIHggPSBibWk6IFRy4bulYyBob8OgbmggdGjhu4MgaGnhu4duICJDaOG7iSBz4buRIEJNSSIuDQogICAgLSBmaWxsID0gc2V4OiBNw6B1IHPhuq9jIGPhu6dhIGPDoWMgY+G7mXQgaGlzdG9ncmFtIHRo4buDIGhp4buHbiAiR2nhu5tpIHTDrW5oIi4NCiAgLSBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgQk1JIHRoZW8gZ2nhu5tpIHTDrW5oIiwgeCA9ICJCTUkiLCB5ID0gIlPhu5EgbMaw4bujbmciLCAgICAgLSBmaWxsID0gIkdp4bubaSB0w61uaCIpOiBUaMOqbSB0acOqdSDEkeG7gSwgY2jDuiB0aMOtY2ggY2hvIGPDoWMgdHLhu6VjIHbDoCBwaOG6p24gdMO0IG3DoHUuDQoNCiAgICAtIHRpdGxlID0gIlBow6JuIGLhu5EgQk1JIHRoZW8gZ2nhu5tpIHTDrW5oIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSAiQk1JIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyBob8OgbmguDQogICAgLSB5ID0gIlPhu5EgbMaw4bujbmciOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQogICAgLSBmaWxsID0gIkdp4bubaSB0w61uaCI6IENow7ogdGjDrWNoIGNobyBwaOG6p24gdMO0IG3DoHUuDQogIC0gc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIik6IENo4buNbiBi4bqjbmcgbcOgdSAiU2V0MiIgdOG7qyBi4buZIG3DoHUgQnJld2VyIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIGPhu5l0IGhpc3RvZ3JhbSB0aGVvIGdp4bubaSB0w61uaC4NCg0KICAtIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKTogRGkgY2h1eeG7g24gduG7iyB0csOtIGxlZ2VuZGEgeHXhu5FuZyBkxrDhu5tpIGPDuW5nIGPhu6dhIGJp4buDdSDEkeG7ky4gDQogIA0KIyMgQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBjaGkgcGjDrSB5IHThur8gdGhlbyB0w6xuaCB0cuG6oW5nIGjDunQgdGh14buRYzoNCmBgYHtyfQ0KZ2dwbG90KGEpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gc21va2VyKSkgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgY2hpIHBow60geSB04bq/IHRoZW8gdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMiLCB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIsIGZpbGwgPSAiSMO6dCB0aHXhu5FjIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCg0KICAtIGdncGxvdChhKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBhLg0KDQogIC0gZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gc21va2VyKSk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0gdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KDQogICAgLSBhZXMoeCA9IGNoYXJnZXMsIGZpbGwgPSBzbW9rZXIpOiBYw6FjIMSR4buLbmggYmnhur9uIGNoYXJnZXMgdsOgIHNtb2tlciDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgaGlzdG9ncmFtLg0KICAgIC0geCA9IGNoYXJnZXM6IFRy4bulYyBob8OgbmggdGjhu4MgaGnhu4duICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLg0KICAgIC0gZmlsbCA9IHNtb2tlcjogTcOgdSBz4bqvYyBj4bunYSBjw6FjIGPhu5l0IGhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gIlTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIiAoSMO6dCB0aHXhu5FjLCBLaMO0bmcgaMO6dCB0aHXhu5FjKS4NCiAgLSBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgY2hpIHBow60geSB04bq/IHRoZW8gdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMiLCB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIsIGZpbGwgPSAiSMO6dCB0aHXhu5FjIik6IFRow6ptIHRpw6p1IMSR4buBLCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMgdsOgIHBo4bqnbiB0w7QgbcOgdS4NCg0KICAgIC0gdGl0bGUgPSAiUGjDom4gYuG7kSBjaGkgcGjDrSB5IHThur8gdGhlbyB0w6xuaCB0cuG6oW5nIGjDunQgdGh14buRYyI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQogICAgLSB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgaG/DoG5oLg0KICAgIC0geSA9ICJT4buRIGzGsOG7o25nIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB0dW5nLg0KICAgIC0gZmlsbCA9ICJIw7p0IHRodeG7kWMiOiBDaMO6IHRow61jaCBjaG8gcGjhuqduIHTDtCBtw6B1Lg0KICAtIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpOiBDaOG7jW4gYuG6o25nIG3DoHUgIlNldDIiIHThu6sgYuG7mSBtw6B1IEJyZXdlciDEkeG7gyB0w7QgbcOgdSBjaG8gY8OhYyBj4buZdCBoaXN0b2dyYW0gdGhlbyB0w6xuaCB0cuG6oW5nIGjDunQgdGh14buRYy4NCg0KICAtIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKTogRGkgY2h1eeG7g24gduG7iyB0csOtIGxlZ2VuZGEgeHXhu5FuZyBkxrDhu5tpIGPDuW5nIGPhu6dhIGJp4buDdSDEkeG7ky4gDQogIA0KIyMgQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBjaGkgcGjDrSB5IHThur8gdGhlbyB0cuG6uyBlbToNCmBgYHtyfQ0KZ2dwbG90KGEpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gZmFjdG9yKGNoaWxkcmVuKSkpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGNoaSBwaMOtIHkgdOG6vyB0aGVvIHRy4bq7IGVtIiwgeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCB5ID0gIlPhu5EgbMaw4bujbmciLCBmaWxsID0gIlRy4bq7IGVtIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCiAgLSBnZ3Bsb3QoYSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAtIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gY2hhcmdlcywgZmlsbCA9IGZhY3RvcihjaGlsZHJlbikpKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIGhpc3RvZ3JhbSB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFlcyh4ID0gY2hhcmdlcywgZmlsbCA9IGZhY3RvcihjaGlsZHJlbikpOiBYw6FjIMSR4buLbmggYmnhur9uIGNoYXJnZXMgdsOgIGNoaWxkcmVuIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0uDQogICAgLSB4ID0gY2hhcmdlczogVHLhu6VjIGhvw6BuaCB0aOG7gyBoaeG7h24gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIuDQogICAgLSBmaWxsID0gZmFjdG9yKGNoaWxkcmVuKTogTcOgdSBz4bqvYyBj4bunYSBjw6FjIGPhu5l0IGhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gIlPhu5EgY29uIiAoQ8OzIGNvbiwgS2jDtG5nIGNvbikuDQogICAgLSBmYWN0b3IoY2hpbGRyZW4pOiBDaHV54buDbiDEkeG7lWkgYmnhur9uIGNoaWxkcmVuIHRow6BuaCBk4bqhbmcgZmFjdG9yIMSR4buDIHPhu60gZOG7pW5nIHRyb25nIGJp4buDdSDEkeG7ky4gQmnhur9uIGZhY3RvciBnacO6cCBwaMOibiBiaeG7h3QgY8OhYyBuaMOzbSByacOqbmcgYmnhu4d0IChDw7MgY29uL0tow7RuZyBjb24pIHRoYXkgdsOsIGNo4buJIGzDoCBnacOhIHRy4buLIHPhu5EuDQogIC0gbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGNoaSBwaMOtIHkgdOG6vyB0aGVvIHRy4bq7IGVtIiwgeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCB5ID0gIlPhu5EgbMaw4bujbmciLCBmaWxsID0gIlRy4bq7IGVtIik6IFRow6ptIHRpw6p1IMSR4buBLCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMgdsOgIHBo4bqnbiB0w7QgbcOgdS4NCg0KICAgIC0gdGl0bGUgPSAiUGjDom4gYuG7kSBjaGkgcGjDrSB5IHThur8gdGhlbyB0cuG6uyBlbSI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQogICAgLSB4ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgaG/DoG5oLg0KICAgIC0geSA9ICJT4buRIGzGsOG7o25nIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB0dW5nLg0KICAgIC0gZmlsbCA9ICJUcuG6uyBlbSI6IENow7ogdGjDrWNoIGNobyBwaOG6p24gdMO0IG3DoHUgKHRo4buxYyB04bq/IGzDoCB0aOG7gyBoaeG7h24gIlPhu5EgY29uIikuDQogIC0gc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIik6IENo4buNbiBi4bqjbmcgbcOgdSAiU2V0MiIgdOG7qyBi4buZIG3DoHUgQnJld2VyIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIGPhu5l0IGhpc3RvZ3JhbSB0aGVvIG5ow7NtIGPDsyBjb24va2jDtG5nIGNvbi4NCg0KICAtIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKTogRGkgY2h1eeG7g24gduG7iyB0csOtIGxlZ2VuZGEgeHXhu5FuZyBkxrDhu5tpIGPDuW5nIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KIyMgQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBjaGkgcGjDrSB5IHThur8gdGhlbyB0deG7lWkgdMOhYzoNCmBgYHtyfQ0KZ2dwbG90KGEpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gZmFjdG9yKGFnZSkpKSArDQogIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSBjaGkgcGjDrSB5IHThur8gdGhlbyB0deG7lWkgdMOhYyIsIHggPSAiQ2hpIHBow60geSB04bq/IChVU0QpIiwgeSA9ICJT4buRIGzGsOG7o25nIiwgZmlsbCA9ICJUdeG7lWkiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpgYGANCg0KLSAqR2nhuqNpIHRow61jaCDDvSBuZ2jEqWEgY8OidSBs4buHbmg6Kg0KICAtIGdncGxvdChhKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBhLg0KDQogIC0gZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gZmFjdG9yKGFnZSkpKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIGhpc3RvZ3JhbSB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFlcyh4ID0gY2hhcmdlcywgZmlsbCA9IGZhY3RvcihhZ2UpKTogWMOhYyDEkeG7i25oIGJp4bq/biBjaGFyZ2VzIHbDoCBhZ2UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIGhpc3RvZ3JhbS4NCiAgICAtIHggPSBjaGFyZ2VzOiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiQ2hpIHBow60geSB04bq/IChVU0QpIi4NCiAgICAtIGZpbGwgPSBmYWN0b3IoYWdlKTogTcOgdSBz4bqvYyBj4bunYSBjw6FjIGPhu5l0IGhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gIlR14buVaSIuDQogICAgLSBmYWN0b3IoYWdlKTogQ2h1eeG7g24gxJHhu5VpIGJp4bq/biBhZ2UgdGjDoG5oIGThuqFuZyBmYWN0b3IgxJHhu4Mgc+G7rSBk4bulbmcgdHJvbmcgYmnhu4N1IMSR4buTLiBCaeG6v24gZmFjdG9yIGdpw7pwIHBow6JuIGJp4buHdCBjw6FjIG5ow7NtIHR14buVaSByacOqbmcgYmnhu4d0IHRoYXkgdsOsIGNo4buJIGzDoCBnacOhIHRy4buLIHPhu5EuDQogIC0gbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGNoaSBwaMOtIHkgdOG6vyB0aGVvIHR14buVaSB0w6FjIiwgeCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCB5ID0gIlPhu5EgbMaw4bujbmciLCBmaWxsID0gIlR14buVaSIpOiBUaMOqbSB0acOqdSDEkeG7gSwgY2jDuiB0aMOtY2ggY2hvIGPDoWMgdHLhu6VjIHbDoCBwaOG6p24gdMO0IG3DoHUuDQoNCiAgICAtIHRpdGxlID0gIlBow6JuIGLhu5EgY2hpIHBow60geSB04bq/IHRoZW8gdHXhu5VpIHTDoWMiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiU+G7kSBsxrDhu6NuZyI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZy4NCiAgICAtIGZpbGwgPSAiVHXhu5VpIjogQ2jDuiB0aMOtY2ggY2hvIHBo4bqnbiB0w7QgbcOgdS4NCiAgLSBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDEiKTogQ2jhu41uIGLhuqNuZyBtw6B1ICJTZXQxIiB04burIGLhu5kgbcOgdSBCcmV3ZXIgxJHhu4MgdMO0IG3DoHUgY2hvIGPDoWMgY+G7mXQgaGlzdG9ncmFtIHRoZW8gbmjDs20gdHXhu5VpLg0KDQogIC0gdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpOiBEaSBjaHV54buDbiB24buLIHRyw60gbGVnZW5kYSB4deG7kW5nIGTGsOG7m2kgY8O5bmcgY+G7p2EgYmnhu4N1IMSR4buTLg0KDQoNCg0KIyMgQmnhu4N1IMSR4buTIHh1IGjGsOG7m25nIGNoaSBwaMOtIHkgdOG6vyB0aGVvIHR14buVaSB0w6FjOg0KYGBge3J9DQphICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhZ2UsIHkgPSBjaGFyZ2VzKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiWHUgaMaw4bubbmcgY2hpIHBow60geSB04bq/IHRoZW8gdHXhu5VpIHTDoWMiLCB4ID0gIlR14buVaSIsIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gYSAlPiU6IENo4buNbiBk4buvIGxp4buHdSB04burIGJp4bq/biBhIMSR4buDIHPhu60gZOG7pW5nIHRyb25nIGdncGxvdC4NCg0KICAtIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IGNoYXJnZXMpKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgduG7m2kgZOG7ryBsaeG7h3UgxJHGsOG7o2MgY2jhu41uIHThu6sgYS4NCg0KICAgIC0gYWVzKHggPSBhZ2UsIHkgPSBjaGFyZ2VzKTogWMOhYyDEkeG7i25oIGJp4bq/biBhZ2UgdsOgIGNoYXJnZXMgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9IGFnZTogVHLhu6VjIGhvw6BuaCB0aOG7gyBoaeG7h24gIlR14buVaSIuDQogICAgLSB5ID0gY2hhcmdlczogVHLhu6VjIHR1bmcgdGjhu4MgaGnhu4duICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLg0KICAtIGdlb21fbGluZSgpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgxJHGsOG7nW5nIHbDoG8gZ2dwbG90IG9iamVjdC4NCg0KICAtIGxhYnModGl0bGUgPSAiWHUgaMaw4bubbmcgY2hpIHBow60geSB04bq/IHRoZW8gdHXhu5VpIHTDoWMiLCB4ID0gIlR14buVaSIsIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiAgICAtIHRpdGxlID0gIlh1IGjGsOG7m25nIGNoaSBwaMOtIHkgdOG6vyB0aGVvIHR14buVaSB0w6FjIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSAiVHXhu5VpIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyBob8OgbmguDQogICAgLSB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZy4NCg0KIyMgQmnhu4N1IMSR4buTIHNvIHPDoW5oIGNoaSBwaMOtIHkgdOG6vyB0aGVvIGdp4bubaSB0w61uaDoNCmBgYHtyfQ0KYSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gY2hhcmdlcywgY29sb3IgPSBzZXgpKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJTbyBzw6FuaCBjaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmgiLCB4ID0gIlR14buVaSIsIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIiwgY29sb3IgPSAiR2nhu5tpIHTDrW5oIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gYSAlPiU6IENo4buNbiBk4buvIGxp4buHdSB04burIGJp4bq/biBhIMSR4buDIHPhu60gZOG7pW5nIHRyb25nIGdncGxvdC4NCg0KICAtIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IGNoYXJnZXMsIGNvbG9yID0gc2V4KSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHbhu5tpIGThu68gbGnhu4d1IMSRxrDhu6NjIGNo4buNbiB04burIGEuDQoNCiAgICAtIGFlcyh4ID0gYWdlLCB5ID0gY2hhcmdlcywgY29sb3IgPSBzZXgpOiBYw6FjIMSR4buLbmggYmnhur9uIGFnZSwgY2hhcmdlcyB2w6Agc2V4IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSBhZ2U6IFRy4bulYyBob8OgbmggdGjhu4MgaGnhu4duICJUdeG7lWkiLg0KICAgIC0geSA9IGNoYXJnZXM6IFRy4bulYyB0dW5nIHRo4buDIGhp4buHbiAiQ2hpIHBow60geSB04bq/IChVU0QpIi4NCiAgICAtIGNvbG9yID0gc2V4OiBNw6B1IHPhuq9jIGPhu6dhIGPDoWMgxJHGsOG7nW5nIGJp4buDdSB0aOG7iyAiR2nhu5tpIHTDrW5oIi4NCiAgLSBnZW9tX2xpbmUoKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIMSRxrDhu51uZyB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgLSBsYWJzKHRpdGxlID0gIlNvIHPDoW5oIGNoaSBwaMOtIHkgdOG6vyB0aGVvIGdp4bubaSB0w61uaCIsIHggPSAiVHXhu5VpIiwgeSA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiLCBjb2xvciA9ICJHaeG7m2kgdMOtbmgiKTogVGjDqm0gdGnDqnUgxJHhu4EgdsOgIGNow7ogdGjDrWNoIGNobyBjw6FjIHRy4bulYyB2w6AgcGjhuqduIHTDtCBtw6B1Lg0KDQogICAgLSB0aXRsZSA9ICJTbyBzw6FuaCBjaGkgcGjDrSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmgiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9ICJUdeG7lWkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB0dW5nLg0KICAgIC0gY29sb3IgPSAiR2nhu5tpIHTDrW5oIjogQ2jDuiB0aMOtY2ggY2hvIHBo4bqnbiB0w7QgbcOgdSAodGjhu7FjIHThur8gbMOgIHRo4buDIGhp4buHbiAiR2nhu5tpIHTDrW5oIikuDQoNCiMjIEJp4buDdSDEkeG7kyBzbyBzw6FuaCBjaGkgcGjDrSB5IHThur8gdGhlbyBraHUgduG7sWM6DQpgYGB7cn0NCmEgJT4lDQogIGdncGxvdChhZXMoeCA9IGFnZSwgeSA9IGNoYXJnZXMsIGNvbG9yID0gcmVnaW9uKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiU28gc8OhbmggY2hpIHBow60geSB04bq/IHRoZW8ga2h1IHbhu7FjIiwgeCA9ICJUdeG7lWkiLCB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIsIGNvbG9yID0gIktodSB24buxYyIpDQpgYGANCg0KLSAqR2nhuqNpIHRow61jaCDDvSBuZ2jEqWEgY8OidSBs4buHbmg6Kg0KICAtIGEgJT4lOiBDaOG7jW4gZOG7ryBsaeG7h3UgdOG7qyBiaeG6v24gYSDEkeG7gyBz4butIGThu6VuZyB0cm9uZyBnZ3Bsb3QuDQoNCiAgLSBnZ3Bsb3QoYWVzKHggPSBhZ2UsIHkgPSBjaGFyZ2VzLCBjb2xvciA9IHJlZ2lvbikpOiBLaOG7n2kgdOG6oW8gbeG7mXQgZ2dwbG90IG9iamVjdCB24bubaSBk4buvIGxp4buHdSDEkcaw4bujYyBjaOG7jW4gdOG7qyBhLg0KDQogICAgLSBhZXMoeCA9IGFnZSwgeSA9IGNoYXJnZXMsIGNvbG9yID0gcmVnaW9uKTogWMOhYyDEkeG7i25oIGJp4bq/biBhZ2UsIGNoYXJnZXMgdsOgIHJlZ2lvbiDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MuDQogICAgLSB4ID0gYWdlOiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiVHXhu5VpIi4NCiAgICAtIHkgPSBjaGFyZ2VzOiBUcuG7pWMgdHVuZyB0aOG7gyBoaeG7h24gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIuDQogICAgLSBjb2xvciA9IHJlZ2lvbjogTcOgdSBz4bqvYyBj4bunYSBjw6FjIMSRxrDhu51uZyBiaeG7g3UgdGjhu4sgIktodSB24buxYyIuDQogIC0gZ2VvbV9saW5lKCk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyDEkcaw4budbmcgdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KDQogIC0gbGFicyh0aXRsZSA9ICJTbyBzw6FuaCBjaGkgcGjDrSB5IHThur8gdGhlbyBraHUgduG7sWMiLCB4ID0gIlR14buVaSIsIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIiwgY29sb3IgPSAiS2h1IHbhu7FjIik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMgdsOgIHBo4bqnbiB0w7QgbcOgdS4NCg0KICAgIC0gdGl0bGUgPSAiU28gc8OhbmggY2hpIHBow60geSB04bq/IHRoZW8ga2h1IHbhu7FjIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSAiVHXhu5VpIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyBob8OgbmguDQogICAgLSB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZy4NCmNvbG9yID0gIktodSB24buxYyI6IENow7ogdGjDrWNoIGNobyBwaOG6p24gdMO0IG3DoHUgKHRo4buxYyB04bq/IGzDoCB0aOG7gyBoaeG7h24gIktodSB24buxYyIpLg0KDQojIyBCaeG7g3UgxJHhu5Mg4bqjbmggaMaw4bufbmcgY+G7p2EgQk1JIMSR4bq/biBjaGkgcGjDrSB5IHThur86DQpgYGB7cn0NCmEgJT4lDQogIGdncGxvdChhZXMoeCA9IGJtaSwgeSA9IGNoYXJnZXMpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsNCiAgbGFicyh0aXRsZSA9ICLhuqJuaCBoxrDhu59uZyBj4bunYSBCTUkgxJHhur9uIGNoaSBwaMOtIHkgdOG6vyIsIHggPSAiQk1JIiwgeSA9ICJDaGkgcGjDrSB5IHThur8gKFVTRCkiKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCiAgLSBhICU+JTogQ2jhu41uIGThu68gbGnhu4d1IHThu6sgYmnhur9uIGEgxJHhu4Mgc+G7rSBk4bulbmcgdHJvbmcgZ2dwbG90Lg0KDQogIC0gZ2dwbG90KGFlcyh4ID0gYm1pLCB5ID0gY2hhcmdlcykpOiBLaOG7n2kgdOG6oW8gbeG7mXQgZ2dwbG90IG9iamVjdCB24bubaSBk4buvIGxp4buHdSDEkcaw4bujYyBjaOG7jW4gdOG7qyBhLg0KDQogICAgLSBhZXMoeCA9IGJtaSwgeSA9IGNoYXJnZXMpOiBYw6FjIMSR4buLbmggYmnhur9uIGJtaSB2w6AgY2hhcmdlcyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MuDQogICAgLSB4ID0gYm1pOiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiQ2jhu4kgc+G7kSBraOG7kWkgY8ahIHRo4buDIChCTUkpIi4NCiAgICAtIHkgPSBjaGFyZ2VzOiBUcuG7pWMgdHVuZyB0aOG7gyBoaeG7h24gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSIuDQogIC0gZ2VvbV9wb2ludCgpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgxJFp4buDbSB2w6BvIGdncGxvdCBvYmplY3QuIEJp4buDdSDEkeG7kyDEkWnhu4NtIGhp4buDbiB0aOG7iyBt4buRaSBsacOqbiBo4buHIGdp4buvYSB04burbmcgxJFp4buDbSBk4buvIGxp4buHdSAoQk1JLCBjaGkgcGjDrSB5IHThur8pDQoNCiAgLSBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKTogVGjDqm0gbGF5ZXIgxJHGsOG7nW5nIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHbDoG8gZ2dwbG90IG9iamVjdC4gxJDGsOG7nW5nIGjhu5NpIHF1eSBnacO6cCBtw7QgdOG6oyBt4buRaSBsacOqbiBo4buHIHThu5VuZyB0aOG7gyBnaeG7r2EgQk1JIHbDoCBjaGkgcGjDrSB5IHThur8uDQoNCiAgICAtIG1ldGhvZCA9ICJsbSI6IFPhu60gZOG7pW5nIHBoxrDGoW5nIHBow6FwIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oLg0KICAtIGxhYnModGl0bGUgPSAi4bqibmggaMaw4bufbmcgY+G7p2EgQk1JIMSR4bq/biBjaGkgcGjDrSB5IHThur8iLCB4ID0gIkJNSSIsIHkgPSAiQ2hpIHBow60geSB04bq/IChVU0QpIik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiAgICAtIHRpdGxlID0gIuG6om5oIGjGsOG7n25nIGPhu6dhIEJNSSDEkeG6v24gY2hpIHBow60geSB04bq/IjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSAiQk1JIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyBob8OgbmguDQogICAgLSB5ID0gIkNoaSBwaMOtIHkgdOG6vyAoVVNEKSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZy4NCiAgICANCiMjIEJp4buDdSDEkeG7kyBEZW5zaXR5IFBsb3QgZ2nhu69hIEFnZSB2w6AgQ2hhcmdlcyAocGjDom4gbG/huqFpIHRoZW8gU21va2VyKToNCmBgYHtyfQ0KZ2dwbG90KGEsIGFlcyh4ID0gYWdlLCBmaWxsID0gc21va2VyKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjcpICsNCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IFBsb3Qgb2YgQWdlIChjb2xvcmVkIGJ5IFNtb2tlcikiLCB4ID0gIkFnZSIsIHkgPSAiRGVuc2l0eSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygieWVzIiA9ICJicm93biIsICJubyIgPSAibGlnaHR5ZWxsb3ciKSkNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gZ2dwbG90KGEsIGFlcyh4ID0gYWdlLCBmaWxsID0gc21va2VyKSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAgIC0gYWVzKHggPSBhZ2UsIGZpbGwgPSBzbW9rZXIpOiBYw6FjIMSR4buLbmggYmnhur9uIGFnZSB2w6Agc21va2VyIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mS4NCiAgICAtIHggPSBhZ2U6IFRy4bulYyBob8OgbmggdGjhu4MgaGnhu4duICJBZ2UiIChnaeG7ryBuZ3V5w6puIHTDqm4gdGnhur9uZyBBbmgpLg0KICAgIC0gZmlsbCA9IHNtb2tlcjogTcOgdSBz4bqvYyBj4bunYSBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgdGjhu4MgaGnhu4duICJTbW9rZXIiIChnaeG7ryBuZ3V5w6puIHTDqm4gdGnhur9uZyBBbmgpLg0KICAtIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNyk6IFRow6ptIGxheWVyIGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB2w6BvIGdncGxvdCBvYmplY3QuDQoNCiAgICAtIGFscGhhID0gMC43OiBUaGnhur90IGzhuq1wIMSR4buZIG3hu50gY+G7p2EgYmnhu4N1IMSR4buTIG3huq10IMSR4buZIHRow6BuaCAwLjcgKDcwJSBvcGFjaXR5KS4NCiAgLSBsYWJzKHRpdGxlID0gIkRlbnNpdHkgUGxvdCBvZiBBZ2UgKGNvbG9yZWQgYnkgU21va2VyKSIsIHggPSAiQWdlIiwgeSA9ICJEZW5zaXR5Iik6IFRow6ptIHRpw6p1IMSR4buBLCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMgdsOgIHBo4bqnbiB0w7QgbcOgdSAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCg0KICAgIC0gdGl0bGUgPSAiRGVuc2l0eSBQbG90IG9mIEFnZSAoY29sb3JlZCBieSBTbW9rZXIpIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoZGnhu4VuIMSR4bqhdCBi4bqxbmcgdGnhur9uZyBBbmgpLg0KICAgIC0geCA9ICJBZ2UiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaCAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCiAgICAtIHkgPSAiRGVuc2l0eSI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZyAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCiAgLSBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJ5ZXMiID0gImJyb3duIiwgIm5vIiA9ICJsaWdodHllbGxvdyIpKTogQ2jhu41uIGPDoWNoIHTDtCBtw6B1IHRo4bunIGPDtG5nIGNobyBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kuDQoNCiAgICAtIHZhbHVlcyA9IGMoInllcyIgPSAiYnJvd24iLCAibm8iID0gImxpZ2h0eWVsbG93Iik6IFjDoWMgxJHhu4tuaCBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBzbW9rZXIgdsOgIG3DoHUgc+G6r2MgdMawxqFuZyDhu6luZy4NCiAgICAtICJ5ZXMiIMSRxrDhu6NjIHTDtCBtw6B1IG7DonUgKCJicm93biIpLg0KICAgIC0gIm5vIiDEkcaw4bujYyB0w7QgbcOgdSB2w6BuZyBuaOG6oXQgKCJsaWdodHllbGxvdyIpLg0KDQojIyBCaeG7g3UgxJDhu5MgU2NhdHRlciBQbG90IGNobyB0xrDGoW5nIHF1YW4gZ2nhu69hIEJNSSB2w6AgUmVnaW9uOg0KYGBge3J9DQpnZ3Bsb3QoYSwgYWVzKHggPSBibWksIHkgPSBhcy5mYWN0b3IocmVnaW9uKSwgY29sb3IgPSBibWkpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGxhYnModGl0bGUgPSAiU2NhdHRlciBQbG90IG9mIEJNSSBieSBSZWdpb24iLCB4ID0gIkJNSSIsIHkgPSAiUmVnaW9uIikgKw0KICBzY2FsZV9jb2xvcl92aXJpZGlzX2MoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxKSkNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gZ2dwbG90KGEsIGFlcyh4ID0gYm1pLCB5ID0gYXMuZmFjdG9yKHJlZ2lvbiksIGNvbG9yID0gYm1pKSk6IEto4bufaSB04bqhbyBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHThu6sgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbMawdSB0cuG7ryB0cm9uZyBiaeG6v24gYS4NCg0KICAgIC0gYWVzKHggPSBibWksIHkgPSBhcy5mYWN0b3IocmVnaW9uKSwgY29sb3IgPSBibWkpOiBYw6FjIMSR4buLbmggY8OhYyBiaeG6v24gxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTLg0KICAgIC0geCA9IGJtaTogVHLhu6VjIGhvw6BuaCB0aOG7gyBoaeG7h24gIkJNSSIuDQogICAgLSB5ID0gYXMuZmFjdG9yKHJlZ2lvbik6IFRy4bulYyB0dW5nIHRo4buDIGhp4buHbiAiUmVnaW9uIiDEkcaw4bujYyBjaHV54buDbiDEkeG7lWkgdGjDoG5oIGThuqFuZyBmYWN0b3IuIENodXnhu4NuIMSR4buVaSBuw6B5IGdpw7pwIHBow6JuIGJp4buHdCBjw6FjIHbDuW5nIG1p4buBbiByacOqbmcgYmnhu4d0IHRoYXkgdsOsIGNo4buJIGzDoCBnacOhIHRy4buLIHbEg24gYuG6o24uDQogICAgLSBjb2xvciA9IGJtaTogTcOgdSBz4bqvYyBj4bunYSBjw6FjIMSRaeG7g20gZOG7ryBsaeG7h3UgxJHGsOG7o2MgeMOhYyDEkeG7i25oIGLhu59pIGdpw6EgdHLhu4sgY+G7p2EgYmnhur9uICJibWkiLg0KICAtIGdlb21fcG9pbnQoKTogVGjDqm0gbGF5ZXIgYmnhu4N1IMSR4buTIMSRaeG7g20gdsOgbyBnZ3Bsb3Qgb2JqZWN0LiBCaeG7g3UgxJHhu5MgxJFp4buDbSBoaeG7g24gdGjhu4sgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgdOG7q25nIMSRaeG7g20gZOG7ryBsaeG7h3UgKEJNSSwgdsO5bmcgbWnhu4FuKS4NCg0KICAtIGxhYnModGl0bGUgPSAiU2NhdHRlciBQbG90IG9mIEJNSSBieSBSZWdpb24iLCB4ID0gIkJNSSIsIHkgPSAiUmVnaW9uIik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiAgICAtIHRpdGxlID0gIlNjYXR0ZXIgUGxvdCBvZiBCTUkgYnkgUmVnaW9uIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoZGnhu4VuIMSR4bqhdCBi4bqxbmcgdGnhur9uZyBBbmgpLg0KICAgIC0geCA9ICJCTUkiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaC4NCiAgICAtIHkgPSAiUmVnaW9uIjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB0dW5nLg0KICAtIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYygpOiBDaOG7jW4gYuG6o25nIG3DoHUgInZpcmlkaXMiIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIMSRaeG7g20gZOG7ryBsaeG7h3UuIELhuqNuZyBtw6B1IHZpcmlkaXMgY2h1eeG7g24gbcOgdSB04burIHhhbmggbMOhIGPDonkgc2FuZyB2w6BuZyBy4buTaSDEkeG6v24gxJHhu48gdGhlbyBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBibWkuDQoNCiAgLSB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSkpOiBUw7l5IGNo4buJbmggaGnhu4NuIHRo4buLIG5ow6NuIGNobyB0cuG7pWMgdHVuZy4NCg0KICAgIC0gYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpOiBYb2F5IG5ow6NuIGPhu6dhIHRy4bulYyB0dW5nIDAgxJHhu5kgKGdp4buvIHRo4bqzbmcgxJHhu6luZykgdsOgIGNhbmggY2jhu4luaCBzYW5nIHBo4bqjaS4NCg0KIyMgQmnhu4N1IMSR4buTIEJhciBQbG90IGdp4buvYSBTZXggdsOgIE51bWJlciBvZiBDaGlsZHJlbjoNCmBgYHtyfQ0KZ2dwbG90KGEsIGFlcyh4ID0gc2V4LCBmaWxsID0gYXMuZmFjdG9yKGNoaWxkcmVuKSkpICsNCiAgZ2VvbV9iYXIoKSArDQogIGxhYnModGl0bGUgPSAiQmFyIFBsb3Qgb2YgTnVtYmVyIG9mIENoaWxkcmVuIGJ5IFNleCIsIHggPSAiU2V4IiwgeSA9ICJDb3VudCIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikNCmBgYA0KDQotICpHaeG6o2kgdGjDrWNoIMO9IG5naMSpYSBjw6J1IGzhu4duaDoqDQogIC0gZ2dwbG90KGEsIGFlcyh4ID0gc2V4LCBmaWxsID0gYXMuZmFjdG9yKGNoaWxkcmVuKSkpOiBLaOG7n2kgdOG6oW8gbeG7mXQgZ2dwbG90IG9iamVjdCB04burIGThu68gbGnhu4d1IMSRxrDhu6NjIGzGsHUgdHLhu68gdHJvbmcgYmnhur9uIGEuDQoNCiAgICAtIGFlcyh4ID0gc2V4LCBmaWxsID0gYXMuZmFjdG9yKGNoaWxkcmVuKSk6IFjDoWMgxJHhu4tuaCBjw6FjIGJp4bq/biDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgdGhhbmguDQogICAgLSB4ID0gc2V4OiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiU2V4IiAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCiAgICAtIGZpbGwgPSBhcy5mYWN0b3IoY2hpbGRyZW4pOiBNw6B1IHPhuq9jIGPhu6dhIGPDoWMgY+G7mXQgYmFyIHRo4buDIGhp4buHbiAiU+G7kSBjb24iIChDaGlsZHJlbikgxJHGsOG7o2MgY2h1eeG7g24gxJHhu5VpIHRow6BuaCBk4bqhbmcgZmFjdG9yLiBDaHV54buDbiDEkeG7lWkgbsOgeSBnacO6cCBwaMOibiBiaeG7h3QgbmjDs20gY8OzIGNvbi9raMO0bmcgY29uIHJpw6puZyBiaeG7h3QgdGhheSB2w6wgY2jhu4kgbMOgIGdpw6EgdHLhu4sgc+G7kS4NCiAgLSBnZW9tX2JhcigpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgdGhhbmggdsOgbyBnZ3Bsb3Qgb2JqZWN0LiBCaeG7g3UgxJHhu5MgdGhhbmggZ2nDunAgaGnhu4NuIHRo4buLIHPhu5EgbMaw4bujbmcgdGhlbyB04burbmcgbmjDs20gKG5hbS9u4buvKSB0csOqbiB0cuG7pWMgaG/DoG5oLg0KDQogIC0gbGFicyh0aXRsZSA9ICJCYXIgUGxvdCBvZiBOdW1iZXIgb2YgQ2hpbGRyZW4gYnkgU2V4IiwgeCA9ICJTZXgiLCB5ID0gIkNvdW50Iik6IFRow6ptIHRpw6p1IMSR4buBIHbDoCBjaMO6IHRow61jaCBjaG8gY8OhYyB0cuG7pWMuDQoNCiAgICAtIHRpdGxlID0gIkJhciBQbG90IG9mIE51bWJlciBvZiBDaGlsZHJlbiBieSBTZXgiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTIChkaeG7hW4gxJHhuqF0IGLhurFuZyB0aeG6v25nIEFuaCkuDQogICAgLSB4ID0gIlNleCI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgaG/DoG5oIChnaeG7ryBuZ3V5w6puIHTDqm4gdGnhur9uZyBBbmgpLg0KICAgIC0geSA9ICJDb3VudCI6IENow7ogdGjDrWNoIGNobyB0cuG7pWMgdHVuZywgbeG6t2MgZMO5IHTDqm4gY2jDrW5oIHjDoWMgaMahbiBjw7MgdGjhu4MgbMOgICJOdW1iZXIgb2YgQ2hpbGRyZW4iIChT4buRIGNvbikuDQogIC0gc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIik6IENo4buNbiBi4bqjbmcgbcOgdSAiU2V0MyIgdOG7qyBi4buZIG3DoHUgQnJld2VyIMSR4buDIHTDtCBtw6B1IGNobyBjw6FjIGPhu5l0IGJhciB0aGVvIG5ow7NtIGPDsyBjb24va2jDtG5nIGNvbi4NCiAgDQojIyBCaeG7g3UgxJHhu5MgYmFyIHBsb3QgZ2nhu69hIGdp4bubaSB0w61uaCB2w6Aga2h1IHbhu7FjIA0KDQpgYGB7cn0NCmdncGxvdChhLCBhZXMoeCA9IHNleCwgZmlsbCA9IHJlZ2lvbikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0ID0gImNvdW50IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3RhdChjb3VudCkpLCBzdGF0ID0gImNvdW50IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkpDQogIGxhYnModGl0bGUgPSAiQmFyIFBsb3Qgb2YgU2V4IHZzIHJlZ2lvbiIsDQogICAgICAgeCA9ICJTZXgiLA0KICAgICAgIHkgPSAiQ291bnQiKSANCiAgDQpgYGANCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCiAgLSBnZ3Bsb3QoYSwgYWVzKHggPSBzZXgsIGZpbGwgPSByZWdpb24pKTogS2jhu59pIHThuqFvIG3hu5l0IGdncGxvdCBvYmplY3QgdOG7qyBk4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IHRy4buvIHRyb25nIGJp4bq/biBhLg0KDQogICAgLSBhZXMoeCA9IHNleCwgZmlsbCA9IHJlZ2lvbik6IFjDoWMgxJHhu4tuaCBjw6FjIGJp4bq/biDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgdGhhbmguDQogICAgLSB4ID0gc2V4OiBUcuG7pWMgaG/DoG5oIHRo4buDIGhp4buHbiAiU2V4IiAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCmZpbGwgPSByZWdpb246IE3DoHUgc+G6r2MgY+G7p2EgY8OhYyBj4buZdCBiYXIgdGjhu4MgaGnhu4duICJWw7luZyBtaeG7gW4iIChyZWdpb24pLg0KICAtIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdCA9ICJjb3VudCIpOiBUaMOqbSBsYXllciBiaeG7g3UgxJHhu5MgdGhhbmggeOG6v3AgY2jhu5NuZyAoZG9kZ2UpIHbDoG8gZ2dwbG90IG9iamVjdC4NCg0KICAgIC0gcG9zaXRpb24gPSAiZG9kZ2UiOiBY4bq/cCBjaOG7k25nIGPDoWMgY+G7mXQgYmFyIHRoZW8gbmjDs20gZ2nhu5tpIHTDrW5oIChuYW0vbuG7rykgdHLDqm4gdHLhu6VjIGhvw6BuaCDEkeG7gyB0csOhbmggY2jhu5NuZyBjaMOpbyBsw6puIG5oYXUuDQogICAgLSBzdGF0ID0gImNvdW50IjogU+G7rSBk4bulbmcgdGjhu5FuZyBrw6ogImNvdW50IiDEkeG7gyB0w61uaCB04buVbmcgc+G7kSBuZ8aw4budaSBjaG8gbeG7l2kgbmjDs20gKGdp4bubaSB0w61uaCArIHbDuW5nIG1p4buBbikuDQogIC0gZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHN0YXQoY291bnQpKSwgc3RhdCA9ICJjb3VudCIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKTogVGjDqm0gbGF5ZXIgdGV4dCDEkeG7gyBoaeG7g24gdGjhu4sgZ2nDoSB0cuG7iyAoc+G7kSBsxrDhu6NuZykgdHLDqm4gbeG7l2kgY+G7mXQgYmFyLg0KDQogICAgLSBhZXMobGFiZWwgPSBzdGF0KGNvdW50KSk6IEzhuqV5IGdpw6EgdHLhu4sgdHLhuqMgduG7gSBj4bunYSB0aOG7kW5nIGvDqiAiY291bnQiIChz4buRIGzGsOG7o25nKSDEkeG7gyBoaeG7g24gdGjhu4sgdHLDqm4gbeG7l2kgY+G7mXQgYmFyLg0KICAgIC0gc3RhdCA9ICJjb3VudCI6IFPhu60gZOG7pW5nIHRo4buRbmcga8OqICJjb3VudCIgxJHhu4MgdMOtbmggdG/DoW4gZ2nDoSB0cuG7iyBoaeG7g24gdGjhu4sgKGdp4buRbmcgduG7m2kgZ2VvbV9iYXIpLg0KICAgIC0gcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSk6IFbhu4sgdHLDrSDEkeG6t3QgdGV4dCBjxaluZyB44bq/cCBjaOG7k25nIHRoZW8gbmjDs20gZ2nhu5FuZyB24bubaSBnZW9tX2JhciwgxJHhu5kgcuG7mW5nIHRleHQgYuG6sW5nIDkwJSBjaGnhu4F1IHLhu5luZyBj4bunYSBj4buZdCBiYXIgKMSR4buDIHRyw6FuaCB0ZXh0IGLhu4sgY2hlIGtodeG6pXQpLg0KICAtIGxhYnModGl0bGUgPSAiQmFyIFBsb3Qgb2YgU2V4IHZzIHJlZ2lvbiIsIHggPSAiU2V4IiwgeSA9ICJDb3VudCIpOiBUaMOqbSB0acOqdSDEkeG7gSB2w6AgY2jDuiB0aMOtY2ggY2hvIGPDoWMgdHLhu6VjLg0KDQogICAgLSB0aXRsZSA9ICJCYXIgUGxvdCBvZiBTZXggdnMgcmVnaW9uIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoZGnhu4VuIMSR4bqhdCBi4bqxbmcgdGnhur9uZyBBbmgpLg0KICAgIC0geCA9ICJTZXgiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIGhvw6BuaCAoZ2nhu68gbmd1ecOqbiB0w6puIHRp4bq/bmcgQW5oKS4NCiAgICAtIHkgPSAiQ291bnQiOiBDaMO6IHRow61jaCBjaG8gdHLhu6VjIHR1bmcuDQoNCiMjIEJp4buDdSDEkeG7kyBj4buZdCBoaeG7g24gdGjhu4sgc+G7kSBsxrDhu6NuZyBuZ8aw4budaSBow7p0IHRodeG7kWMgdsOgIGtow7RuZyBow7p0IHRodeG7kWMgdGhlbyBnaeG7m2kgdMOtbmgNCmBgYHtyfQ0KZ2dwbG90KGEsIGFlcyh4ID0gc2V4LCBmaWxsID0gc21va2VyKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiY291bnQiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzdGF0KGNvdW50KSksIHN0YXQgPSAiY291bnQiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkNCiAgbGFicyh0aXRsZSA9ICIgQmnhu4N1IMSR4buTIGPhu5l0IGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIG5nxrDhu51pIGjDunQgdGh14buRYyB2w6Aga2jDtG5nIGjDunQgdGh14buRYyB0aGVvIGdp4bubaSB0w61uaCIsIHkgPSAiQ291bnQiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInllcyIgPSAic2t5Ymx1ZSIsICJubyIgPSAicGluayIpKQ0KYGBgDQoNCi0gKkdp4bqjaSB0aMOtY2ggw70gbmdoxKlhIGPDonUgbOG7h25oOioNCiAgLSBnZ3Bsb3QoYSwgYWVzKHggPSBzZXgsIGZpbGwgPSBzbW9rZXIpKQ0KDQogICAgLSBnZ3Bsb3QoYSk6IEto4bufaSB04bqhbyBt4buZdCBiaeG7g3UgxJHhu5MgZ2dwbG90IGThu7FhIHRyw6puIGThu68gbGnhu4d1IHRyb25nIGRhdGFmcmFtZSBhLg0KICAgIC0gYWVzKHggPSBzZXgsIGZpbGwgPSBzbW9rZXIpOg0KICAgIC0gYWVzOiDDgW5oIHjhuqEgY8OhYyBiaeG6v24gdHJvbmcgZGF0YWZyYW1lIHbDoG8gY8OhYyB0aHXhu5ljIHTDrW5oIGPhu6dhIGJp4buDdSDEkeG7ky4NCiAgICAtIHggPSBzZXg6IEfDoW4gYmnhur9uIHNleCAoZ2nhu5tpIHTDrW5oKSBjaG8gdHLhu6VjIHggY+G7p2EgYmnhu4N1IMSR4buTLg0KICAgIC0gZmlsbCA9IHNtb2tlcjogR8OhbiBiaeG6v24gc21va2VyIChow7p0IHRodeG7kWMpIGNobyBtw6B1IHPhuq9jIGPhu6dhIGPDoWMgdGhhbmggdHJvbmcgYmnhu4N1IMSR4buTLg0KICAtIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdCA9ICJjb3VudCIpDQoNCiAgICAtIGdlb21fYmFyOiBUaMOqbSBow6xuaCBk4bqhbmcgdGhhbmggdsOgbyBiaeG7g3UgxJHhu5MuDQogICAgLSBwb3NpdGlvbiA9ICJkb2RnZSI6IFjhur9wIGPDoWMgdGhhbmggY+G6oW5oIG5oYXUgdGhlbyBuaMOzbSAoZ2nhu5tpIHTDrW5oKSB24bubaSBraG/huqNuZyBjw6FjaCBuaOG6pXQgxJHhu4tuaC4NCiAgICAtIHN0YXQgPSAiY291bnQiOiBUw61uaCB0b8OhbiBz4buRIGzGsOG7o25nIG5nxrDhu51pIGNobyBt4buXaSBuaMOzbSAoZ2nhu5tpIHTDrW5oKSB2w6AgaGnhu4NuIHRo4buLIHRyw6puIHRoYW5oLg0KICAtIGdlb21fdGV4dChhZXMobGFiZWwgPSBzdGF0KGNvdW50KSksIHN0YXQgPSAiY291bnQiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkNCg0KICAgIC0gZ2VvbV90ZXh0OiBUaMOqbSBjaMO6IHRow61jaCBz4buRIGzGsOG7o25nIHbDoG8gbeG7l2kgdGhhbmguDQogICAgLSBhZXMobGFiZWwgPSBzdGF0KGNvdW50KSk6IEfDoW4gZ2nDoSB0cuG7iyBz4buRIGzGsOG7o25nICh0w61uaCB0b8OhbiBi4bufaSAgICAgICAgICAgLSBzdGF0KGNvdW50KSkgY2hvIG7hu5lpIGR1bmcgY2jDuiB0aMOtY2guDQpwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KTogVuG7iyB0csOtIGNow7ogdGjDrWNoIMSRxrDhu6NjIGPEg24gY2jhu4luaCB24bubaSB24buLIHRyw60gY+G7p2EgdGhhbmggdsOgIGPDsyDEkeG7mSBy4buZbmcgMC45Lg0KICAtIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIG5nxrDhu51pIGjDunQgdGh14buRYyB2w6Aga2jDtG5nIGjDunQgdGh14buRYyB0aGVvIGdp4bubaSB0w61uaCIsIHkgPSAiQ291bnQiKQ0KDQogICAgLSBsYWJzOiBUaMOqbSB0acOqdSDEkeG7gSB2w6AgY2jDuiB0aMOtY2ggY2hvIGPDoWMgdHLhu6VjLg0KICAgIC0gdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIG5nxrDhu51pIGjDunQgdGh14buRYyB2w6Aga2jDtG5nIGjDunQgdGh14buRYyB0aGVvIGdp4bubaSB0w61uaCI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQogICAgLSB5ID0gIkNvdW50IjogQ2jDuiB0aMOtY2ggY2hvIHRy4bulYyB5Lg0KICAtIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInllcyIgPSAic2t5Ymx1ZSIsICJubyIgPSAicGluayIpKQ0KDQogICAgLSBzY2FsZV9maWxsX21hbnVhbDogQ2jhu41uIG3DoHUgc+G6r2MgY2hvIGPDoWMgbmjDs20gKGdp4bubaSB0w61uaCkuDQogICAgLSB2YWx1ZXMgPSBjKCJ5ZXMiID0gInNreWJsdWUiLCAibm8iID0gInBpbmsiKTogR8OhbiBtw6B1IHhhbmggZGEgdHLhu51pIGNobyBuaMOzbSAieWVzIiAoaMO6dCB0aHXhu5FjKSB2w6AgbcOgdSBo4buTbmcgY2hvIG5ow7NtICJubyIgKGtow7RuZyBow7p0IHRodeG7kWMpLg==