Biểu đồ
Biểu đồ của dữ liệu cut
d %>% ggplot(aes(x = cut)) +
geom_bar() +
labs(title = "Hình 1: Biểu đồ số lượng kim cương theo mặt cắt",x = 'Loại', y = 'Số lượng')

- Qua biểu đồ chúng ta thấy các viên kim cương được chia thành 5 loại.
Trong đó loại Ideal có số lượng kimm cương cao nhất, Fair chứa số lượng
kim cương thấp nhất.
d %>% group_by(cut) %>% summarise(n = n()) %>%
ggplot(aes(cut,n)) +
geom_col(fill='lightblue') +
geom_text(aes(label = n),vjust = 2, color = 'white') +
labs(title = "Hình 2: Biểu đồ số lượng kim cương theo mặt cắt",x = 'Loại', y = 'Số lượng')

Số lượng viên kim cương thuộc loai Fair: 1610
Số lượng viên kim cương thuộc loại Good: 4906
Số lượng viên kim cương thuộc loại Very Good: 12082
Số lượng viên kim cương thuộc loại Premium: 13791
Số lượng viên kim cương thuộc loại Ideal: 21551
Kết luận: Số kim cương loại Ideal nhiều gấp 13 lần
loại Fair, nhiều gấp 4 lần loại Good, nhiều gấp 1.7 lần loại Very Good
và gấp 1.5 lần loai Premium.
Biểu đồ của dữ liệu color
d %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(color,n)) +
geom_col(fill='pink') +
geom_text(aes(label = n),vjust = 2, color = 'white') +
labs(title = "Hình 3: Biểu đồ số lượng kim cương theo màu sắc",x = 'Loại', y = 'Số lượng')

Viên kim cương có màu G có số lượng nhiều nhất (11292), viên kim
cương có màu J có số lượng ít nhất (2808).
Số lượng kim cương màu G nhiều gấp 4 lần so với màu J.
Biểu đồ của dữ liệu clarity
d %>% group_by(clarity) %>% summarise(n = n()) %>%
ggplot(aes(clarity,n)) +
geom_col(fill='lightgreen') +
geom_text(aes(label = n),vjust = 2, color = 'white') +
labs(title ="Hình 4: Biểu đồ số lượng kim cương theo độ tinh khiết",x = 'Loại', y = 'Số lượng')

Loại SI1 có số lượng kim cương cao nhất (13065)
Loại I1 có số lượng kim cương thấp nhất (741)
Số lượng kim cương có độ tinh khiết I1(Bao thể hiện thị):
741
Số lượng kim cương có độ tinh khiết SI2/SI1(Bao thể nhỏ):
9194/13605
Số lượng kim cương có độ tinh khiết VS2/VS1(Bao thể nhỏ cấp 2/
cấp 1):12258/8171
Số lượng kim cương có độ tinh khiết VVS2/VVS1(Khuyết tật rất
nhỏ):5066/3655
Số lượng kim cương có độ tinh khiết IF(Hoàn toàn tinh khiết):
1790
Biểu đồ với số lượng các loại diamond được phân loại theo
màu sắc
d %>% ggplot(mapping = aes(x = cut, fill = color)) +
geom_bar() +
scale_fill_manual(values = sort(unique(diamonds$color)))+
labs(title = "Hình 5: Biểu đồ số lượng kim cương chia theo màu sắc",x = 'Loại', y = 'Số lượng')

- Số lượng màu sắc các viên kim cương được phân bố đồng đều tại các
loại. Trong đó, màu D,E,G,H là màu có số lượng nhiều nhất trong các
loại
Biểu đồ trung bình trọng lượng diamond theo màu
sắc
d %>% group_by(color) %>% summarise(m= mean(carat)) %>%
ggplot(aes(x = color,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,2)), vjust = 2, color = 'green') +
labs(title = "Hình 6: Biểu đồ mean của kim cương theo màu sắc",x = 'Màu', y = 'Mean')

- Biểu đồ thể hiện trung bình trọng lượng kim cương theo màu sắc.
Trong đó, trung bình kim cương màu D và E là ngang nhau. Màu J có số
trung bình cao nhất là 1.16
Biểu đồ phương sai trọng lượng diamond theo màu
sắc
d %>% group_by(color) %>% summarise(v= var(carat)) %>%
ggplot(aes(x = color,y = v)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(v,2)), vjust = 2, color = 'green') +
labs(title = "Hình 7: Biểu đồ var của kim cương theo màu sắc",x = 'Màu', y = 'Var')

- Phương sai của màu J có phương sai cao nhất là 0.35, màu D có phương
sai thấp nhất là 0.13
Biểu đồ tỷ lệ phần trăm các loại diamond
d %>% ggplot(mapping = aes(x = cut, y = ..prop.., group = 1)) +
geom_bar() +
scale_y_continuous(labels = scales::percent_format())+
labs(title = "Hình 8: Biểu đồ số lượng kim cương theo mặt cắt đơn vị phần trăm",x = 'Loại', y = 'Số lượng')

Kim cương thuộc loại Fair và Good có số lượng dưới 20%.
Kim cương thuộc loại Very Good, Premium, Ideal có số lượng kim
cương trên 20%.
d %>% ggplot(mapping = aes(x = cut, fill = clarity)) +
geom_bar() +
facet_wrap(~ color) +
scale_fill_manual(values = sort(unique(diamonds$clarity))) +
labs(title = "Hình 9: Số lượng các loại diamond theo clarity và màu sắc", x = "Loại", y = "Số lượng")

Biểu đồ màu sắc J có độ biến động thấp, sau đó là biểu đồ màu
I.
Biểu đồ màu sắc G có độ biến động cao. Trong đó, loại Ideal của G
cao nhất so với các màu sắc còn lại.
Độ tinh khiết của kim cương có SI1, SI2, VS1, VS2 là biến động
nhiều ở các biểu đồ.
Biểu đồ trung bình giá kim cương theo từng loại cắt và màu
sắc
d %>% ggplot() +
stat_summary(mapping = aes(x = cut, y = price, fill = color), fun.y = "mean", geom = "bar", position = "dodge") +
coord_flip() +
scale_fill_brewer(palette = "Set3") +
labs(title = "Hình 10: Biểu đồ trung bình giá kim cương theo từng loại cắt và màu sắc",x = "Loại cắt", y = "Giá trung bình")

Biểu đồ tần suất của các loại cắt kim cương theo giá trị
(price)
d %>% ggplot( aes(x = cut, y = price, fill = color)) +
geom_bar(stat = "summary", fun.y = "mean")+
labs(title = "Hình 11: Tần suất cá loại cắt kim cương theo giá trị", x = "Loại", y = "Giá trị")

- Giá trị của các viên kim cương thuộc loại Premium có giá trị trung
bình cao nhất. Trong đó, màu J là màu có giá trị trung bình cao
nhất.
Biểu đồ tần suất của các loại cắt kim cương theo trọng lượng
(carat)
d %>% ggplot(aes(x = cut, y = carat, fill = color)) +
geom_bar(stat = "summary", fun.y = "mean")+
labs(title = "Hình 12: Tần suất các loại cắt kim cương theo trọng lượng", x = "Loại", y = "Trọng lượng")

- Trọng lượng của viên kiim cương loại Fair có trọng lượng trung bình
cao nhất.
Biểu đồ tần suất của các loại cắt kim cương
Biểu đồ tần suất của các loại cắt kim cương theo giá trị
(price), với màu sắc phụ thuộc vào độ trong suốt
d %>% ggplot(aes(x = cut, y = price, fill = clarity)) +
geom_bar(stat = "summary", fun.y = "mean", position = "dodge")+
labs(title = "Hình 13: Tần suất kim cương theo giá trị phụ thuộc vào màu sắc và độ trong suốt", x = "Loại", y = "Giá trị")

Giá trị trung bình của kim cương theo độ tình khiết IF ở loại
Very Good có giá trị cao nhất.
Giá trị trung bình của kim cương theo độ tình khiết VVS1 loại
Premium có giá trị cao nhất.
Giá trị trung bình của kim cương theo độ tình khiết VVS2 loại
Premium có giá trị cao nhất.
Giá trị trung bình của kim cương theo độ tình khiết VS1 loại
Premium có giá trị cao nhất.
Giá trị trung bình của kim cương theo độ tình khiết VS2 loại
Premium có giá trị cao nhất.
Giá trị trung bình của kim cương theo độ tình khiết SI1 loại
Premium có giá trị cao nhất.
Giá trị trung bình của kim cương theo độ tình khiết SI2 loại
Premium có giá trị cao nhất.
Giá trị trung bình của kim cương theo độ tình khiết I1 loại Ideal
có giá trị cao nhất.
Biểu đồ tần suất của các loại cắt kim cương theo trọng lượng
(carat), với màu sắc phụ thuộc vào độ trong suốt
d %>% ggplot( aes(x = cut, y = carat, fill = clarity)) +
geom_bar(stat = "summary", fun.y = "mean", position = "dodge")+
labs(title = "Hình 14: Tần suất kim cương theo trong lượng phụ thuộc vào màu sắc và độ trong suốt", x = "Loại", y = "Trọng lượng")

- Biểu đồ loại Fair có trọng lượng trung bình cao nhất với độ tinh
khiết I1, SI2, SI1, VS2.
Biểu đồ tần suất của các loại cắt kim cương theo giá trị
(price), với màu sắc phụ thuộc vào độ trong suốt, được phân loại theo
màu sắc của kim cương
d %>% ggplot(aes(x = cut, y = price, fill = clarity)) +
geom_bar(stat = "summary", fun.y = "mean", position = "dodge") +
facet_wrap(~color)+
labs(title = "Hình 15: Tần suất các loại kim cương theo giá trị", x = "Loại", y = "Giá trị")

Biểu đồ trung bình giá trị của các loại cắt kim cương với màu
sắc được phân loại
d %>% group_by(cut, color) %>% summarise(mean_price = mean(price)) %>%
ggplot(aes(x = cut, y = mean_price, fill = color)) +
geom_bar(stat = "identity", position = "dodge")+
labs(title = "Hình 16: Trung bình giá trị của các loại cắt kim cương với màu sắc", x = "Loại", y = "Giá trị trung bình")

Biểu đồ này hiển thị trung bình giá trị của các loại cắt kim
cương theo màu sắc.
Giá trị trung bình của màu D,E loại Fair cao nhất.
Giá trị trung bình của màu F,G,H,I,J loại Premium cao
nhất.
Biểu đồ tần suất của các loại cắt kim cương theo màu sắc và
độ trong suốt
d%>% group_by(cut, color, clarity) %>% count() %>%
ggplot(aes(x = cut, y = n, fill = color, color = clarity)) +
geom_bar(stat = "identity") +
labs(title = "Hình 17: Tần suất của các loại cắt kim cương theo màu sắc và độ trong suốt", x = "Loại", y = "Tần suất")

group_by(cut, color, clarity) %>% : Nhóm dữ liệu theo
cut, color và clarity
count() %>% : Đếm số lượng mẫu trong mỗi nhóm
ggplot(aes(x = cut, y = n, fill = color, color = clarity)) +
: Thiết lập biến x, y, màu sắc và màu viền
geom_bar(stat = “identity”) : Vẽ biểu đồ bar-chart
- Biểu đồ này hiển thị tần suất của các loại cắt kim cương theo màu
sắc và độ trong suốt. Trục x đại diện cho các loại cắt, trục y đại diện
cho tần suất, màu sắc biểu đồ phản ánh màu sắc của kim cương, và màu
viền biểu đồ phản ánh độ trong suốt của kim cương.
Biểu đồ tần suất của các loại cắt kim cương theo độ trong
suốt và màu sắc
d %>% group_by(clarity, color) %>% count() %>%
ggplot(aes(x = clarity, y = n, fill = color)) +
geom_bar(stat = "identity") +
labs(title = "Hình 18: Tần suất của các loại cắt kim cương theo độ trong suốt và màu sắc", x = "Loại", y = "Tần suất")

So sánh tần suất của các loại cắt kim cương trong từng màu
sắc cụ thể
tmp <- diamonds
tmp <- tmp %>% group_by(cut, color) %>% summarise(n = n())
tmp %>% ggplot(aes(x = cut, y = n)) +
geom_col(data = tmp %>% filter(color == 'D'), fill = 'yellow') +
geom_col(data = tmp %>% filter(color == 'J'), fill = 'green')+
labs(title = "Hình 19: So sánh tần suất của các loại cắt kim cương màu D và J", x = "Loại", y = "Tần suất")

Loại Fair có số kim cương màu J nhiều hơn màu D
Loại Good, Very Good, Premium số kim cương màu J vs D xấp xỉ
nhau
Loại Ideal có số kim cương màu J ít hơn màu D
Biểu đồ trung bình giá trị của các loại cắt kim cương với
màu sắc và độ trong suốt
d %>%group_by(cut, color, clarity) %>%summarise(mean_price = mean(price)) %>% arrange(desc(mean_price)) %>%
ggplot(aes(x = cut, y = mean_price, fill = color, color = clarity)) +
geom_bar(stat = "identity", position = "dodge")+
labs(title = "Hình 20: Biểu đồ trung bình giá trị của các loại cắt kim cương với màu sắc và độ trong suốt", x = "Loại", y = "Trung bình giá trị")

Trục x biểu thị các loại cắt kim cương (cut): Fair, Good, Very
Good, Premium và Ideal.
Trục y biểu thị giá trị trung bình của cột price (mean_price) dựa
trên các nhóm cut, color và clarity.
Mỗi cột biểu thị giá trị trung bình của price cho một nhóm cut,
color và clarity cụ thể.
Màu sắc của các cột được đặt bởi giá trị color, và màu sắc của
đường viền (color) của các cột được đặt bởi giá trị clarity.
Các cột được xếp chồng lên nhau (position = “dodge”) để so sánh
giá trị trung bình của price giữa các nhóm cut.
Số lượng viên kim cương theo từng mức độ tinh khiết (clarity)
cho ba màu sắc ‘D’, ‘I’ và ’J
tmp <- diamonds
tmp <- tmp %>% group_by(clarity, color) %>% summarise(n = n())
tmp %>% ggplot(aes(x = clarity, y = n)) +
geom_col(data = tmp %>% filter(color == 'D'), fill = 'darkgreen') +
geom_col(data = tmp %>% filter(color == 'I'),fill = 'purple') +
geom_col(data = tmp %>% filter(color == 'J'), fill = 'darkblue') +
labs(x = "Độ tinh khiết", y = "Số lượng") +
labs( title = "Hình 21: Đồ thị số lượng viên kim cương theo từng mức độ tinh khiết (clarity) cho ba màu sắc 'D', 'I' và 'J'")

số lượng viên kim cương ‘J’ cao hơn ‘D’ và ‘I’ cho hầu hết các
mức độ tinh khiết.
Số lương viên kim cương màu D xuất hiện ở mức độ tinh khiết SI2,
SI1,VS2,VVS2
Biểu đồ giá trị trung bình độ sâu của kim
cương
d%>% group_by(cut, clarity)%>%summarise(m=mean(depth))%>%ggplot(aes(x=cut, y= m))+
geom_col(position='dodge')+
facet_wrap(~clarity)+
geom_text(aes(label= round(m)), vjust=2, color='red')+
labs(x= 'Loại', y= 'Độ sâu trung bình',title='Hình 22: Giá trị trung bình của depth theo cut và clarity ')

group_by(cut, clarity) : Nhóm dữ liệu theo cột “cut” và
“clarity”.
summarise(m = mean(depth)) : Tính giá trị trung bình của cột
“depth” trong mỗi nhóm và tạo một cột mới có tên “m” để lưu giá trị
trung bình.
ggplot(aes(x = cut, y = m)) : Tạo một đối tượng ggplot với
trục x là “cut” và trục y là “m”.
geom_col(position = ‘dodge’) : Vẽ biểu đồ cột sử dụng hình
dạng mặc định và sử dụng phương pháp “dodge” để xếp chồng các cột của
các nhóm.
facet_wrap(~clarity) : Chia biểu đồ thành các panel riêng
biệt dựa trên cột “clarity”.
geom_text(aes(label = round(m)), vjust = 2, color = ‘red’):
Thêm nhãn dữ liệu trên mỗi cột, với giá trị được làm tròn và màu chữ đỏ.
Tham số vjust = 2 làm tăng khoảng cách giữa cột và nhãn.
- Độ sâu trung bình của các loại kim cương ở các mức độ tinh khiết
không có sự chênh lệch nhiều, đều dao động ở các mức độ
60,61,62,63,64.
d %>% group_by(cut,color) %>% summarise(m = mean(depth)) %>%
ggplot(aes(x = cut,y = m)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
geom_text(aes(label= round(m)), vjust=2, color='red')+
labs(x= 'Loại', y= 'Độ sâu trung bình',title='Hình 23: Giá trị trung bình của depth theo cut và color ')

Độ sâu trung bình của các loại kim cương ở các màu sắc khác nhau
không có sự chênh lệch nhiều, đều dao động ở các mức độ
60,61,62,63,64.
Biểu đồ tỷ lệ phần trăm số lượng kim cương theo màu
sắc
d %>% ggplot() +
geom_bar(mapping = aes(x = cut, y = ..prop.., group = color, fill = color)) +
scale_y_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = sort(unique(diamonds$color)))+
facet_wrap(~clarity)+
labs(x= 'Loại', y= 'Phần trăm',title='Hình 24: Biểu đồ tỷ lệ phần trăm số lượng kim cương theo màu sắc ')

Biểu đồ này hiển thị tỷ lệ phần trăm của mỗi loại diamond dựa
trên cột “cut” của bộ dữ liệu “diamonds”, và các thanh bar được phân
loại theo cột “color”. Màu sắc các thanh bar được sắp xếp theo thứ tự
giá trị màu sắc.
Số lượng kim cương ở các mức độ tinh khiết đều có sự biến
động.
Trong đó, I1,SI2,SI1 màu sắc ở các loại có sự biến động.
VS2, VS1 tăng đều.
so sánh số lượng các mẫu kim cương cho từng mức độ cắt và màu
sắc
d %>% group_by(cut,color) %>% summarise(n=n()) %>%
ggplot(aes(x = cut,y = n)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
geom_text(aes(label = n),vjust = 2, color = 'green') +
labs(title='Hình 25: Biểu đồ so sánh số lượng các mẫu kim cương cho từng mức độ cắt và màu sắc ',x = 'Loại', y = 'Số lượng')

-Nhìn chung các viên kim cương theo màu sắc ở các loại đều có xu
hướng tăng.
- Trong đó loại Ideal có số lương kim cương theo màu sắc là cao
nhất.
Biểu đồ số lượng viên kim cương theo từng mức độ tinh khiết
(clarity) cho hai màu sắc “H” và “I”
df_new <- diamonds %>%
group_by(clarity, color) %>%
summarise(n = n()) %>%
mutate(color = factor(color, levels = c("H", "I")))
df_new %>%
ggplot(aes(x = clarity, y = n, fill = color)) +
geom_col(position = position_dodge()) +
labs(title = "Hình 26: Đồ thị số lượng viên kim cương theo từng mức độ tinh khiết (clarity) cho hai màu sắc 'G' và 'J'") + labs(x = "Độ tinh khiết", y = "Số lượng")

Biểu đồ này giúp trực quan hóa và so sánh số lượng viên kim cương
theo từng mức độ tinh khiết cho hai màu sắc ‘G’ và ‘J’. Bằng cách sử
dụng các cột và màu sắc, chúng ta có thể dễ dàng so sánh số lượng giữa
các nhóm và nhận thấy phân bố của viên kim cương theo mức độ tinh khiết
và màu sắc của chúng.
Nhìn chung, ta thấy màu H có số lượng viên kim cương nhiều hơn
màu I.
Mức độ tinh khiết SI1 là có số lượng kim cương cao nhất.
** Biểu đồ số lượng viên kim cương theo chất lượng cắt và màu sắc (D
và J)**
tmp <- diamonds
tmp <- tmp %>% group_by(cut, color) %>% summarise(n = n())
tmp %>% ggplot(aes(x = cut, y = n)) +
geom_col(data = tmp %>% filter(color == 'D'), fill = 'lightblue') +
geom_col(data = tmp %>% filter(color == 'J'), fill = 'blue')+labs(x="Chất lượng",y="Số lượng")+
labs( title = "Hình 27: Số lượng viên kim cương theo chất lượng cắt và màu sắc (D và J)")

Nhìn chung, số lượng viên kim cương ‘D’ cao hơn ‘J’ cho tất cả
các mức chất lượng cắt. Cả hai màu đều có xu hướng giảm số lượng viên
kim cương khi chất lượng cắt giảm.
Phân bố số lượng viên kim cương theo màu sắc: Màu ‘J’ có xu hướng
phân bố đều hơn giữa các mức chất lượng cắt. Màu ‘D’ có xu hướng tập
trung nhiều hơn ở các mức chất lượng cắt ‘Ideal’.
Dữ liệu trong biểu đồ cho thấy chất lượng cắt ảnh hưởng đến số lượng
viên kim cương. Màu sắc cũng ảnh hưởng đến số lượng viên kim cương,
nhưng mức độ ảnh hưởng thấp hơn so với chất lượng cắt.
Biểu đồ trung vị giá theo biến cut
d %>% group_by(cut) %>% summarise(m= median(price)) %>%
ggplot(aes(x = cut,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,2)), vjust = 2, color = 'white') +
labs(x = 'Loại', y = 'Trung vị',title = "Hình 28: Biểu đồ trung vị giá theo biến cut")

Trung vị Price của loại kim cương loại Fair là 3282
Trung vị Price của loại kim cương loại Good là 3050.5
Trung vị Price của loại kim cương loại Very Good là 2648
Trung vị Price của loại kim cương loại Premium là 3185
Trung vị Price của loại kim cương loại Ideal là 1810
Biểu đồ độ lệch chuẩn của table theo độ tinh
khiết
d %>% group_by(clarity) %>% summarise(m= sd(table)) %>%
ggplot(aes(x = clarity,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,2)), vjust = 2, color = 'red') +
labs(x = 'Độ tinh khiết', y = 'Độ lệch chuẩn',title = "Hình 29: Độ lệch chuẩn của table theo độ tinh khiết")

Độ lệch chuẩn của kim cương về bề mặt kim cương I1 là : 2.57 Độ lệch
chuẩn của kim cương về bề mặt kim cương SI2 là : 2.33 Độ lệch chuẩn của
kim cương về bề mặt kim cương SI1 là : 2.25 Độ lệch chuẩn của kim cương
về bề mặt kim cương VS2 là : 2.16 Độ lệch chuẩn của kim cương về bề mặt
kim cương VS1 là : 2.23 Độ lệch chuẩn của kim cương về bề mặt kim cương
VVS2 là : 2.07 Độ lệch chuẩn của kim cương về bề mặt kim cương VVS1 là :
2.02 Độ lệch chuẩn của kim cương về bề mặt kim cương IF là : 1.98
Biểu đồ số lượng kim cương sắp xếp theo độ lớn
d <- diamonds
d <- d %>% mutate(caratC = cut(carat,5, label = c('rất nhỏ', 'nhỏ','vừa','lớn','rất lớn')))
d %>% ggplot(aes(x = caratC)) +
geom_bar(fill = 'pink')+
labs(title = "Hình 30: Biểu đồ số lượng kim cương sắp xếp theo độ lớn")

Kim cương rất nhỏ chiếm số lượng lớn kim cương.
kim cương vừa có số lượng thấp.
Lớn và rất lớn không có kim cương tồn tại.
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA0Ig0KYXV0aG9yOiAiTMOqIFRo4buLIE5n4buNYyDDgW5oIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDogDQogaHRtbF9kb2N1bWVudDogDQogICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgdG9jOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmQgPC0gZGlhbW9uZHMNCg0KYGBgDQojICoqR2nhu5tpIHRoaeG7h3UgduG7gSBi4buZIGThu68gbGnhu4d1IGRpYW1vbmRzKiogDQoNCkLhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2MgZOG7pW5nIGzDoCBi4buZIGThu68gbGnhu4d1IERpYW1vbmRzIGPDsyBz4bq1biB0cm9uZyBSLg0KDQpC4buZIGThu68gbGnhu4d1IGRpYW1vbmRzIHRyb25nIFIgZ+G7k20gdGjDtG5nIHRpbiB24buBIDUzLjk0MCB2acOqbiBraW0gY8awxqFuZyBj4bqvdCB0csOybiwgduG7m2kgMTAgYmnhur9uIG3DtCB04bqjIGPDoWMgxJHhurdjIMSRaeG7g20ga2jDoWMgbmhhdSBj4bunYSBt4buXaSB2acOqbiBraW0gY8awxqFuZzoNCg0KYGBge3J9DQpuYW1lcyhkKQ0KYGBgDQorIGNhcmF0OiBUcuG7jW5nIGzGsOG7o25nIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChjYXJhdCkNCg0KKyBjdXQ6IENo4bqldCBsxrDhu6NuZyDEkcaw4budbmcgY+G6r3QgKEZhaXIsIEdvb2QsIFZlcnkgR29vZCwgSWRlYWwsIFByZW1pdW0pDQpjb2xvcjogTcOgdSBz4bqvYyBj4bunYSB2acOqbiBraW0gY8awxqFuZyAodOG7qyBEICh04buRdCBuaOG6pXQpIMSR4bq/biBKIChrw6ltIG5o4bqldCkpDQoNCisgcHJpY2U6IEdpw6EgdHLhu4sgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKMSRxqFuIHbhu4sgVVNEKQ0KDQorIGNsYXJpdHk6IMSQ4buZIHRyb25nIHN14buRdCBj4bunYSB2acOqbiBraW0gY8awxqFuZyAodOG7qyBJRiAodOG7kXQgbmjhuqV0KSDEkeG6v24gSTEgKGvDqW0gbmjhuqV0KSkNCg0KKyBkZXB0aDogVOG7tyBs4buHIHBo4bqnbiB0csSDbSDEkeG7mSBzw6J1ICh0w61uaCB0aGVvIHogLyB4KQ0KDQorIHRhYmxlOiBDaGnhu4F1IHLhu5luZyBj4bunYSBt4bq3dCBiw6BuICh0w61uaCB0aGVvICUgY+G7p2EgxJHGsOG7nW5nIGvDrW5oKQ0KDQorIHg6IENoaeG7gXUgZMOgaSBj4bunYSB2acOqbiBraW0gY8awxqFuZyAobW0pDQoNCisgeTogQ2hp4buBdSBy4buZbmcgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKQ0KDQorIHo6IMSQ4buZIHPDonUgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKQ0KDQojICoqQmnhu4N1IMSR4buTKioNCiMjICoqQmnhu4N1IMSR4buTIGPhu6dhIGThu68gbGnhu4d1IGN1dCoqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IGN1dCkpICsNCiAgICBnZW9tX2JhcigpICsNCiAgICBsYWJzKHRpdGxlID0gIkjDrG5oIDE6IEJp4buDdSDEkeG7kyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbeG6t3QgY+G6r3QiLHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KICAgICAgICAgIA0KLSBRdWEgYmnhu4N1IMSR4buTIGNow7puZyB0YSB0aOG6pXkgY8OhYyB2acOqbiBraW0gY8awxqFuZyDEkcaw4bujYyBjaGlhIHRow6BuaCA1IGxv4bqhaS4gVHJvbmcgxJHDsyBsb+G6oWkgSWRlYWwgY8OzIHPhu5EgbMaw4bujbmcga2ltbSBjxrDGoW5nIGNhbyBuaOG6pXQsIEZhaXIgY2jhu6lhIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGjhuqVwIG5o4bqldC4NCg0KYGBge3J9DQpkICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY3V0LG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nbGlnaHRibHVlJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ3doaXRlJykgKw0KICAgIGxhYnModGl0bGUgPSAiSMOsbmggMjogQmnhu4N1IMSR4buTIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBt4bq3dCBj4bqvdCIseCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCi0gU+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aHXhu5ljIGxvYWkgRmFpcjogMTYxMA0KDQotIFPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGh14buZYyBsb+G6oWkgR29vZDogNDkwNg0KDQotIFPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGh14buZYyBsb+G6oWkgVmVyeSBHb29kOiAxMjA4Mg0KDQotIFPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGh14buZYyBsb+G6oWkgUHJlbWl1bTogMTM3OTENCg0KLSBT4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRodeG7mWMgbG/huqFpIElkZWFsOiAyMTU1MQ0KDQoqKkvhur90IGx14bqtbjoqKiBT4buRIGtpbSBjxrDGoW5nIGxv4bqhaSBJZGVhbCBuaGnhu4F1IGfhuqVwIDEzIGzhuqduIGxv4bqhaSBGYWlyLCBuaGnhu4F1IGfhuqVwIDQgbOG6p24gbG/huqFpIEdvb2QsIG5oaeG7gXUgZ+G6pXAgMS43IGzhuqduIGxv4bqhaSBWZXJ5IEdvb2QgdsOgIGfhuqVwIDEuNSBs4bqnbiBsb2FpIFByZW1pdW0uDQoNCg0KIyMgKipCaeG7g3UgxJHhu5MgY+G7p2EgZOG7ryBsaeG7h3UgY29sb3IqKg0KDQpgYGB7cn0NCmQgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKGNvbG9yLG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0ncGluaycpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICd3aGl0ZScpICsNCiAgICBsYWJzKHRpdGxlID0gIkjDrG5oIDM6IEJp4buDdSDEkeG7kyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyIseCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCg0KLSBWacOqbiBraW0gY8awxqFuZyBjw7MgbcOgdSBHIGPDsyBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0ICgxMTI5MiksIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBtw6B1IEogY8OzIHPhu5EgbMaw4bujbmcgw610IG5o4bqldCAoMjgwOCkuDQoNCi0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBtw6B1IEcgbmhp4buBdSBn4bqlcCA0IGzhuqduIHNvIHbhu5tpIG3DoHUgSi4NCg0KIyMgKipCaeG7g3UgxJHhu5MgY+G7p2EgZOG7ryBsaeG7h3UgY2xhcml0eSoqDQoNCmBgYHtyfQ0KZCAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhjbGFyaXR5LG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nbGlnaHRncmVlbicpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICd3aGl0ZScpICsNCiAgICBsYWJzKHRpdGxlID0iSMOsbmggNDogQmnhu4N1IMSR4buTIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QiLHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoNCi0gTG/huqFpIFNJMSBjw7Mgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjYW8gbmjhuqV0ICgxMzA2NSkNCg0KLSBMb+G6oWkgSTEgY8OzIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGjhuqVwIG5o4bqldCAoNzQxKQ0KDQotIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY8OzIMSR4buZIHRpbmgga2hp4bq/dCBJMShCYW8gdGjhu4MgaGnhu4duIHRo4buLKTogNzQxDQoNCi0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjw7MgxJHhu5kgdGluaCBraGnhur90IFNJMi9TSTEoQmFvIHRo4buDIG5o4buPKTogOTE5NC8xMzYwNQ0KDQotIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY8OzIMSR4buZIHRpbmgga2hp4bq/dCBWUzIvVlMxKEJhbyB0aOG7gyBuaOG7jyBj4bqlcCAyLyBj4bqlcCAxKToxMjI1OC84MTcxDQoNCi0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjw7MgxJHhu5kgdGluaCBraGnhur90IFZWUzIvVlZTMShLaHV54bq/dCB04bqtdCBy4bqldCBuaOG7jyk6NTA2Ni8zNjU1DQoNCi0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjw7MgxJHhu5kgdGluaCBraGnhur90IElGKEhvw6BuIHRvw6BuIHRpbmgga2hp4bq/dCk6IDE3OTANCg0KIyMgKipCaeG7g3UgxJHhu5MgduG7m2kgc+G7kSBsxrDhu6NuZyBjw6FjIGxv4bqhaSBkaWFtb25kIMSRxrDhu6NjIHBow6JuIGxv4bqhaSB0aGVvIG3DoHUgc+G6r2MqKg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBjdXQsIGZpbGwgPSBjb2xvcikpICsNCiAgZ2VvbV9iYXIoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHNvcnQodW5pcXVlKGRpYW1vbmRzJGNvbG9yKSkpKw0KICAgbGFicyh0aXRsZSA9ICJIw6xuaCA1OiBCaeG7g3UgxJHhu5Mgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjaGlhIHRoZW8gbcOgdSBz4bqvYyIseCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCi0gU+G7kSBsxrDhu6NuZyBtw6B1IHPhuq9jIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgxJHGsOG7o2MgcGjDom4gYuG7kSDEkeG7k25nIMSR4buBdSB04bqhaSBjw6FjIGxv4bqhaS4gVHJvbmcgxJHDsywgbcOgdSBELEUsRyxIIGzDoCBtw6B1IGPDsyBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0IHRyb25nIGPDoWMgbG/huqFpDQoNCiMjICoqQmnhu4N1IMSR4buTIHRydW5nIGLDrG5oIHRy4buNbmcgbMaw4bujbmcgZGlhbW9uZCB0aGVvIG3DoHUgc+G6r2MqKg0KDQpgYGB7cn0NCmQgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG09IG1lYW4oY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY29sb3IseSA9IG0pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLCB2anVzdCA9IDIsIGNvbG9yID0gJ2dyZWVuJykgKw0KICAgIGxhYnModGl0bGUgPSAiSMOsbmggNjogQmnhu4N1IMSR4buTIG1lYW4gY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jIix4ID0gJ03DoHUnLCB5ID0gJ01lYW4nKQ0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB0cnVuZyBiw6xuaCB0cuG7jW5nIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYy4gVHJvbmcgxJHDsywgdHJ1bmcgYsOsbmgga2ltIGPGsMahbmcgbcOgdSBEIHbDoCBFIGzDoCBuZ2FuZyBuaGF1LiBNw6B1IEogY8OzIHPhu5EgdHJ1bmcgYsOsbmggY2FvIG5o4bqldCBsw6AgMS4xNg0KDQojIyAqKkJp4buDdSDEkeG7kyBwaMawxqFuZyBzYWkgdHLhu41uZyBsxrDhu6NuZyBkaWFtb25kIHRoZW8gbcOgdSBz4bqvYyoqDQoNCmBgYHtyfQ0KZCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2Uodj0gdmFyKGNhcmF0KSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGNvbG9yLHkgPSB2KSkgKw0KICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZCh2LDIpKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpICsNCiAgICBsYWJzKHRpdGxlID0gIkjDrG5oIDc6IEJp4buDdSDEkeG7kyB2YXIgY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jIix4ID0gJ03DoHUnLCB5ID0gJ1ZhcicpDQpgYGANCg0KLSBQaMawxqFuZyBzYWkgY+G7p2EgbcOgdSBKIGPDsyBwaMawxqFuZyBzYWkgY2FvIG5o4bqldCBsw6AgMC4zNSwgbcOgdSBEIGPDsyBwaMawxqFuZyBzYWkgdGjhuqVwIG5o4bqldCBsw6AgMC4xMw0KDQojIyAqKkJp4buDdSDEkeG7kyB04bu3IGzhu4cgcGjhuqduIHRyxINtIGPDoWMgbG/huqFpIGRpYW1vbmQqKiANCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gY3V0LCB5ID0gLi5wcm9wLi4sIGdyb3VwID0gMSkpICsNCiAgZ2VvbV9iYXIoKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCkpKw0KICBsYWJzKHRpdGxlID0gIkjDrG5oIDg6IEJp4buDdSDEkeG7kyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbeG6t3QgY+G6r3QgxJHGoW4gduG7iyBwaOG6p24gdHLEg20iLHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCg0KYGBgDQoNCi0gS2ltIGPGsMahbmcgdGh14buZYyBsb+G6oWkgRmFpciB2w6AgR29vZCBjw7Mgc+G7kSBsxrDhu6NuZyBkxrDhu5tpIDIwJS4NCg0KLSBLaW0gY8awxqFuZyB0aHXhu5ljIGxv4bqhaSBWZXJ5IEdvb2QsIFByZW1pdW0sIElkZWFsIGPDsyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRyw6puIDIwJS4NCg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBjdXQsIGZpbGwgPSBjbGFyaXR5KSkgKw0KICBnZW9tX2JhcigpICsNCiAgZmFjZXRfd3JhcCh+IGNvbG9yKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHNvcnQodW5pcXVlKGRpYW1vbmRzJGNsYXJpdHkpKSkgKw0KICBsYWJzKHRpdGxlID0gIkjDrG5oIDk6IFPhu5EgbMaw4bujbmcgY8OhYyBsb+G6oWkgZGlhbW9uZCB0aGVvIGNsYXJpdHkgdsOgIG3DoHUgc+G6r2MiLCB4ID0gIkxv4bqhaSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgbcOgdSBz4bqvYyBKIGPDsyDEkeG7mSBiaeG6v24gxJHhu5luZyB0aOG6pXAsIHNhdSDEkcOzIGzDoCBiaeG7g3UgxJHhu5MgbcOgdSBJLg0KDQotIEJp4buDdSDEkeG7kyBtw6B1IHPhuq9jIEcgY8OzIMSR4buZIGJp4bq/biDEkeG7mW5nIGNhby4gVHJvbmcgxJHDsywgbG/huqFpIElkZWFsIGPhu6dhIEcgY2FvIG5o4bqldCBzbyB24bubaSBjw6FjIG3DoHUgc+G6r2MgY8OybiBs4bqhaS4NCg0KLSDEkOG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgY8OzIFNJMSwgU0kyLCBWUzEsIFZTMiBsw6AgYmnhur9uIMSR4buZbmcgbmhp4buBdSDhu58gY8OhYyBiaeG7g3UgxJHhu5MuDQoNCiMjICoqQmnhu4N1IMSR4buTIHRydW5nIGLDrG5oIGdpw6Ega2ltIGPGsMahbmcgdGhlbyB04burbmcgbG/huqFpIGPhuq90IHbDoCBtw6B1IHPhuq9jKioNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoKSArDQogIHN0YXRfc3VtbWFyeShtYXBwaW5nID0gYWVzKHggPSBjdXQsIHkgPSBwcmljZSwgZmlsbCA9IGNvbG9yKSwgZnVuLnkgPSAibWVhbiIsIGdlb20gPSAiYmFyIiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpICsNCiAgbGFicyh0aXRsZSA9ICJIw6xuaCAxMDogQmnhu4N1IMSR4buTIHRydW5nIGLDrG5oIGdpw6Ega2ltIGPGsMahbmcgdGhlbyB04burbmcgbG/huqFpIGPhuq90IHbDoCBtw6B1IHPhuq9jIix4ID0gIkxv4bqhaSBj4bqvdCIsIHkgPSAiR2nDoSB0cnVuZyBiw6xuaCIpDQpgYGANCg0KLSBMb+G6oWkgUHJlbWl1bSBjw7MgZ2nDoSB0cnVuZyBiw6xuaCBtw6B1IEkgdnMgSiBjYW8gbmjhuqV0IHNvIHbhu5tpIGPDoWMgbG/huqFpIGPDsm4gbOG6oWkNCg0KLSBMb+G6oWkgSWRlYWwgY8OzIGdpw6EgdHJ1bmcgYsOsbmggbcOgdSBEIHbDoCBFIHRo4bqlcCBuaOG6pXQgc28gduG7m2kgY8OhYyBsb+G6oWkgY8OybiBs4bqhaQ0KDQojIyAqKkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgY+G7p2EgY8OhYyBsb+G6oWkgY+G6r3Qga2ltIGPGsMahbmcgdGhlbyBnacOhIHRy4buLIChwcmljZSkqKg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdCggYWVzKHggPSBjdXQsIHkgPSBwcmljZSwgZmlsbCA9IGNvbG9yKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gInN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIikrDQogIGxhYnModGl0bGUgPSAiSMOsbmggMTE6IFThuqduIHN14bqldCBjw6EgbG/huqFpIGPhuq90IGtpbSBjxrDGoW5nIHRoZW8gZ2nDoSB0cuG7iyIsIHggPSAiTG/huqFpIiwgeSA9ICJHacOhIHRy4buLIikNCmBgYA0KDQotIEdpw6EgdHLhu4sgY+G7p2EgY8OhYyB2acOqbiBraW0gY8awxqFuZyB0aHXhu5ljIGxv4bqhaSBQcmVtaXVtIGPDsyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGNhbyBuaOG6pXQuIFRyb25nIMSRw7MsIG3DoHUgSiBsw6AgbcOgdSBjw7MgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBjYW8gbmjhuqV0Lg0KDQojIyAqKkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgY+G7p2EgY8OhYyBsb+G6oWkgY+G6r3Qga2ltIGPGsMahbmcgdGhlbyB0cuG7jW5nIGzGsOG7o25nIChjYXJhdCkqKg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IGN1dCwgeSA9IGNhcmF0LCBmaWxsID0gY29sb3IpKSArDQogIGdlb21fYmFyKHN0YXQgPSAic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iKSsNCiAgbGFicyh0aXRsZSA9ICJIw6xuaCAxMjogVOG6p24gc3XhuqV0IGPDoWMgbG/huqFpIGPhuq90IGtpbSBjxrDGoW5nIHRoZW8gdHLhu41uZyBsxrDhu6NuZyIsIHggPSAiTG/huqFpIiwgeSA9ICJUcuG7jW5nIGzGsOG7o25nIikNCmBgYA0KDQotIFRy4buNbmcgbMaw4bujbmcgY+G7p2EgdmnDqm4ga2lpbSBjxrDGoW5nIGxv4bqhaSBGYWlyIGPDsyB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIGNhbyBuaOG6pXQuDQoNCiMjICoqQmnhu4N1IMSR4buTIHThuqduIHN14bqldCBj4bunYSBjw6FjIGxv4bqhaSBj4bqvdCBraW0gY8awxqFuZyoqDQoNCioqQmnhu4N1IMSR4buTIHThuqduIHN14bqldCBj4bunYSBjw6FjIGxv4bqhaSBj4bqvdCBraW0gY8awxqFuZyB0aGVvIGdpw6EgdHLhu4sgKHByaWNlKSwgduG7m2kgbcOgdSBz4bqvYyBwaOG7pSB0aHXhu5ljIHbDoG8gxJHhu5kgdHJvbmcgc3Xhu5F0KioNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBwcmljZSwgZmlsbCA9IGNsYXJpdHkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBsYWJzKHRpdGxlID0gIkjDrG5oIDEzOiBU4bqnbiBzdeG6pXQga2ltIGPGsMahbmcgdGhlbyBnacOhIHRy4buLIHBo4bulIHRodeG7mWMgdsOgbyBtw6B1IHPhuq9jIHbDoCDEkeG7mSB0cm9uZyBzdeG7kXQiLCB4ID0gIkxv4bqhaSIsIHkgPSAiR2nDoSB0cuG7iyIpDQpgYGANCg0KLSBHacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdMOsbmgga2hp4bq/dCBJRiDhu58gbG/huqFpIFZlcnkgR29vZCBjw7MgZ2nDoSB0cuG7iyBjYW8gbmjhuqV0Lg0KDQotIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0w6xuaCBraGnhur90IFZWUzEgbG/huqFpIFByZW1pdW0gY8OzIGdpw6EgdHLhu4sgY2FvIG5o4bqldC4NCg0KLSBHacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdMOsbmgga2hp4bq/dCBWVlMyICBsb+G6oWkgUHJlbWl1bSBjw7MgZ2nDoSB0cuG7iyBjYW8gbmjhuqV0Lg0KDQotIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0w6xuaCBraGnhur90IFZTMSBsb+G6oWkgUHJlbWl1bSBjw7MgZ2nDoSB0cuG7iyBjYW8gbmjhuqV0Lg0KDQotIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0w6xuaCBraGnhur90IFZTMiBsb+G6oWkgUHJlbWl1bSBjw7MgZ2nDoSB0cuG7iyBjYW8gbmjhuqV0Lg0KDQotIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0w6xuaCBraGnhur90IFNJMSBsb+G6oWkgUHJlbWl1bSBjw7MgZ2nDoSB0cuG7iyBjYW8gbmjhuqV0Lg0KDQotIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0w6xuaCBraGnhur90IFNJMiBsb+G6oWkgUHJlbWl1bSBjw7MgZ2nDoSB0cuG7iyBjYW8gbmjhuqV0Lg0KDQotIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0w6xuaCBraGnhur90IEkxIGxv4bqhaSBJZGVhbCBjw7MgZ2nDoSB0cuG7iyBjYW8gbmjhuqV0Lg0KDQoqKkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgY+G7p2EgY8OhYyBsb+G6oWkgY+G6r3Qga2ltIGPGsMahbmcgdGhlbyB0cuG7jW5nIGzGsOG7o25nIChjYXJhdCksIHbhu5tpIG3DoHUgc+G6r2MgcGjhu6UgdGh14buZYyB2w6BvIMSR4buZIHRyb25nIHN14buRdCoqDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KCBhZXMoeCA9IGN1dCwgeSA9IGNhcmF0LCBmaWxsID0gY2xhcml0eSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIHBvc2l0aW9uID0gImRvZGdlIikrDQogIGxhYnModGl0bGUgPSAiSMOsbmggMTQ6IFThuqduIHN14bqldCBraW0gY8awxqFuZyB0aGVvIHRyb25nIGzGsOG7o25nIHBo4bulIHRodeG7mWMgdsOgbyBtw6B1IHPhuq9jIHbDoCDEkeG7mSB0cm9uZyBzdeG7kXQiLCB4ID0gIkxv4bqhaSIsIHkgPSAiVHLhu41uZyBsxrDhu6NuZyIpDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgbG/huqFpIEZhaXIgY8OzIHRy4buNbmcgbMaw4bujbmcgdHJ1bmcgYsOsbmggY2FvIG5o4bqldCB24bubaSDEkeG7mSB0aW5oIGtoaeG6v3QgSTEsIFNJMiwgU0kxLCBWUzIuDQoNCioqQmnhu4N1IMSR4buTIHThuqduIHN14bqldCBj4bunYSBjw6FjIGxv4bqhaSBj4bqvdCBraW0gY8awxqFuZyB0aGVvIGdpw6EgdHLhu4sgKHByaWNlKSwgduG7m2kgbcOgdSBz4bqvYyBwaOG7pSB0aHXhu5ljIHbDoG8gxJHhu5kgdHJvbmcgc3Xhu5F0LCDEkcaw4bujYyBwaMOibiBsb+G6oWkgdGhlbyBtw6B1IHPhuq9jIGPhu6dhIGtpbSBjxrDGoW5nKioNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBwcmljZSwgZmlsbCA9IGNsYXJpdHkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZmFjZXRfd3JhcCh+Y29sb3IpKw0KICBsYWJzKHRpdGxlID0gIkjDrG5oIDE1OiBU4bqnbiBzdeG6pXQgY8OhYyBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBnacOhIHRy4buLIiwgeCA9ICJMb+G6oWkiLCB5ID0gIkdpw6EgdHLhu4siKQ0KYGBgDQoNCioqQmnhu4N1IMSR4buTIHRydW5nIGLDrG5oIGdpw6EgdHLhu4sgY+G7p2EgY8OhYyBsb+G6oWkgY+G6r3Qga2ltIGPGsMahbmcgduG7m2kgbcOgdSBz4bqvYyDEkcaw4bujYyBwaMOibiBsb+G6oWkqKg0KDQpgYGB7cn0NCmQgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobWVhbl9wcmljZSA9IG1lYW4ocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbWVhbl9wcmljZSwgZmlsbCA9IGNvbG9yKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgbGFicyh0aXRsZSA9ICJIw6xuaCAxNjogVHJ1bmcgYsOsbmggZ2nDoSB0cuG7iyBj4bunYSBjw6FjIGxv4bqhaSBj4bqvdCBraW0gY8awxqFuZyB24bubaSBtw6B1IHPhuq9jIiwgeCA9ICJMb+G6oWkiLCB5ID0gIkdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgiKQ0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIG7DoHkgaGnhu4NuIHRo4buLIHRydW5nIGLDrG5oIGdpw6EgdHLhu4sgY+G7p2EgY8OhYyBsb+G6oWkgY+G6r3Qga2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jLiANCg0KLSBHacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIG3DoHUgRCxFIGxv4bqhaSBGYWlyIGNhbyBuaOG6pXQuDQoNCi0gR2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBtw6B1IEYsRyxILEksSiBsb+G6oWkgUHJlbWl1bSBjYW8gbmjhuqV0Lg0KDQoqKkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgY+G7p2EgY8OhYyBsb+G6oWkgY+G6r3Qga2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jIHbDoCDEkeG7mSB0cm9uZyBzdeG7kXQqKg0KYGBge3J9DQpkJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IsIGNsYXJpdHkpICU+JSBjb3VudCgpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbiwgZmlsbCA9IGNvbG9yLCBjb2xvciA9IGNsYXJpdHkpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIkjDrG5oIDE3OiBU4bqnbiBzdeG6pXQgY+G7p2EgY8OhYyBsb+G6oWkgY+G6r3Qga2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jIHbDoCDEkeG7mSB0cm9uZyBzdeG7kXQiLCB4ID0gIkxv4bqhaSIsIHkgPSAiVOG6p24gc3XhuqV0IikNCmBgYA0KDQoqZ3JvdXBfYnkoY3V0LCBjb2xvciwgY2xhcml0eSkgJT4lKiA6IE5ow7NtIGThu68gbGnhu4d1IHRoZW8gY3V0LCBjb2xvciB2w6AgY2xhcml0eQ0KDQoqY291bnQoKSAlPiUqIDogIMSQ4bq/bSBz4buRIGzGsOG7o25nIG3huqt1IHRyb25nIG3hu5dpIG5ow7NtDQoNCipnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuLCBmaWxsID0gY29sb3IsIGNvbG9yID0gY2xhcml0eSkpICsqIDogVGhp4bq/dCBs4bqtcCBiaeG6v24geCwgeSwgbcOgdSBz4bqvYyB2w6AgbcOgdSB2aeG7gW4NCg0KKmdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSogOiBW4bq9IGJp4buDdSDEkeG7kyBiYXItY2hhcnQNCg0KLSBCaeG7g3UgxJHhu5MgbsOgeSBoaeG7g24gdGjhu4sgdOG6p24gc3XhuqV0IGPhu6dhIGPDoWMgbG/huqFpIGPhuq90IGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyB2w6AgxJHhu5kgdHJvbmcgc3Xhu5F0LiBUcuG7pWMgeCDEkeG6oWkgZGnhu4duIGNobyBjw6FjIGxv4bqhaSBj4bqvdCwgdHLhu6VjIHkgxJHhuqFpIGRp4buHbiBjaG8gdOG6p24gc3XhuqV0LCBtw6B1IHPhuq9jIGJp4buDdSDEkeG7kyBwaOG6o24gw6FuaCBtw6B1IHPhuq9jIGPhu6dhIGtpbSBjxrDGoW5nLCB2w6AgbcOgdSB2aeG7gW4gYmnhu4N1IMSR4buTIHBo4bqjbiDDoW5oIMSR4buZIHRyb25nIHN14buRdCBj4bunYSBraW0gY8awxqFuZy4NCg0KKipCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IGPhu6dhIGPDoWMgbG/huqFpIGPhuq90IGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdHJvbmcgc3Xhu5F0IHbDoCBtw6B1IHPhuq9jKioNCmBgYHtyfQ0KZCAlPiUgZ3JvdXBfYnkoY2xhcml0eSwgY29sb3IpICU+JSBjb3VudCgpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LCB5ID0gbiwgZmlsbCA9IGNvbG9yKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIkjDrG5oIDE4OiBU4bqnbiBzdeG6pXQgY+G7p2EgY8OhYyBsb+G6oWkgY+G6r3Qga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0cm9uZyBzdeG7kXQgdsOgIG3DoHUgc+G6r2MiLCB4ID0gIkxv4bqhaSIsIHkgPSAiVOG6p24gc3XhuqV0IikNCmBgYA0KDQojIyAqKlNvIHPDoW5oIHThuqduIHN14bqldCBj4bunYSBjw6FjIGxv4bqhaSBj4bqvdCBraW0gY8awxqFuZyB0cm9uZyB04burbmcgbcOgdSBz4bqvYyBj4bulIHRo4buDKioNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCA8LSB0bXAgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdEJyksIGZpbGwgPSAneWVsbG93JykgKw0KICBnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0onKSwgZmlsbCA9ICdncmVlbicpKw0KICBsYWJzKHRpdGxlID0gIkjDrG5oIDE5OiBTbyBzw6FuaCB04bqnbiBzdeG6pXQgY+G7p2EgY8OhYyBsb+G6oWkgY+G6r3Qga2ltIGPGsMahbmcgbcOgdSBEIHbDoCBKIiwgeCA9ICJMb+G6oWkiLCB5ID0gIlThuqduIHN14bqldCIpDQoNCmBgYA0KDQotIExv4bqhaSBGYWlyIGPDsyBz4buRIGtpbSBjxrDGoW5nIG3DoHUgSiBuaGnhu4F1IGjGoW4gbcOgdSBEDQoNCi0gTG/huqFpIEdvb2QsIFZlcnkgR29vZCwgUHJlbWl1bSBz4buRIGtpbSBjxrDGoW5nIG3DoHUgSiB2cyBEIHjhuqVwIHjhu4kgbmhhdQ0KDQotIExv4bqhaSBJZGVhbCBjw7Mgc+G7kSBraW0gY8awxqFuZyBtw6B1IEogw610IGjGoW4gbcOgdSBEDQoNCiMjICoqQmnhu4N1IMSR4buTIHRydW5nIGLDrG5oIGdpw6EgdHLhu4sgY+G7p2EgY8OhYyBsb+G6oWkgY+G6r3Qga2ltIGPGsMahbmcgduG7m2kgbcOgdSBz4bqvYyB2w6AgxJHhu5kgdHJvbmcgc3Xhu5F0KioNCg0KYGBge3J9DQpkICU+JWdyb3VwX2J5KGN1dCwgY29sb3IsIGNsYXJpdHkpICU+JXN1bW1hcmlzZShtZWFuX3ByaWNlID0gbWVhbihwcmljZSkpICU+JSBhcnJhbmdlKGRlc2MobWVhbl9wcmljZSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBtZWFuX3ByaWNlLCBmaWxsID0gY29sb3IsIGNvbG9yID0gY2xhcml0eSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikrDQogICBsYWJzKHRpdGxlID0gIkjDrG5oIDIwOiBCaeG7g3UgxJHhu5MgdHJ1bmcgYsOsbmggZ2nDoSB0cuG7iyBj4bunYSBjw6FjIGxv4bqhaSBj4bqvdCBraW0gY8awxqFuZyB24bubaSBtw6B1IHPhuq9jIHbDoCDEkeG7mSB0cm9uZyBzdeG7kXQiLCB4ID0gIkxv4bqhaSIsIHkgPSAiVHJ1bmcgYsOsbmggZ2nDoSB0cuG7iyIpDQoNCmBgYA0KDQotIFRy4bulYyB4IGJp4buDdSB0aOG7iyBjw6FjIGxv4bqhaSBj4bqvdCBraW0gY8awxqFuZyAoY3V0KTogRmFpciwgR29vZCwgVmVyeSBHb29kLCBQcmVtaXVtIHbDoCBJZGVhbC4NCg0KLSBUcuG7pWMgeSBiaeG7g3UgdGjhu4sgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBj4buZdCBwcmljZSAobWVhbl9wcmljZSkgZOG7sWEgdHLDqm4gY8OhYyBuaMOzbSBjdXQsIGNvbG9yIHbDoCBjbGFyaXR5Lg0KDQotIE3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHByaWNlIGNobyBt4buZdCBuaMOzbSBjdXQsIGNvbG9yIHbDoCBjbGFyaXR5IGPhu6UgdGjhu4MuDQoNCi0gTcOgdSBz4bqvYyBj4bunYSBjw6FjIGPhu5l0IMSRxrDhu6NjIMSR4bq3dCBi4bufaSBnacOhIHRy4buLIGNvbG9yLCB2w6AgbcOgdSBz4bqvYyBj4bunYSDEkcaw4budbmcgdmnhu4FuIChjb2xvcikgY+G7p2EgY8OhYyBj4buZdCDEkcaw4bujYyDEkeG6t3QgYuG7n2kgZ2nDoSB0cuG7iyBjbGFyaXR5Lg0KDQotIEPDoWMgY+G7mXQgxJHGsOG7o2MgeOG6v3AgY2jhu5NuZyBsw6puIG5oYXUgKHBvc2l0aW9uID0gImRvZGdlIikgxJHhu4Mgc28gc8OhbmggZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBwcmljZSBnaeG7r2EgY8OhYyBuaMOzbSBjdXQuDQoNCioqU+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgKGNsYXJpdHkpIGNobyBiYSBtw6B1IHPhuq9jICdEJywgJ0knIHbDoCAnSioqDQpgYGB7cn0NCnRtcCA8LSBkaWFtb25kcw0KdG1wIDwtIHRtcCAlPiUgZ3JvdXBfYnkoY2xhcml0eSwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSwgeSA9IG4pKSArDQogIGdlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnRCcpLCBmaWxsID0gJ2RhcmtncmVlbicpICsgDQogIGdlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnSScpLGZpbGwgPSAncHVycGxlJykgKw0KICBnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0onKSwgZmlsbCA9ICdkYXJrYmx1ZScpICsgDQogIGxhYnMoeCA9ICLEkOG7mSB0aW5oIGtoaeG6v3QiLCB5ID0gIlPhu5EgbMaw4bujbmciKSArIA0KICBsYWJzKCB0aXRsZSA9ICJIw6xuaCAyMTogxJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgKGNsYXJpdHkpIGNobyBiYSBtw6B1IHPhuq9jICdEJywgJ0knIHbDoCAnSiciKQ0KDQpgYGANCg0KLSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nICdKJyBjYW8gaMahbiAnRCcgdsOgICdJJyBjaG8gaOG6p3UgaOG6v3QgY8OhYyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QuDQoNCi0gU+G7kSBsxrDGoW5nIHZpw6puIGtpbSBjxrDGoW5nIG3DoHUgRCB4deG6pXQgaGnhu4duIOG7nyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgU0kyLCBTSTEsVlMyLFZWUzINCg0KIyMgKipCaeG7g3UgxJHhu5MgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCDEkeG7mSBzw6J1IGPhu6dhIGtpbSBjxrDGoW5nKioNCmBgYHtyfQ0KZCU+JSBncm91cF9ieShjdXQsIGNsYXJpdHkpJT4lc3VtbWFyaXNlKG09bWVhbihkZXB0aCkpJT4lZ2dwbG90KGFlcyh4PWN1dCwgeT0gbSkpKw0KICBnZW9tX2NvbChwb3NpdGlvbj0nZG9kZ2UnKSsNCiAgZmFjZXRfd3JhcCh+Y2xhcml0eSkrDQogIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKG0pKSwgdmp1c3Q9MiwgY29sb3I9J3JlZCcpKyANCiAgbGFicyh4PSAnTG/huqFpJywgeT0gJ8SQ4buZIHPDonUgdHJ1bmcgYsOsbmgnLHRpdGxlPSdIw6xuaCAyMjogR2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBkZXB0aCB0aGVvIGN1dCB2w6AgY2xhcml0eSAnKQ0KYGBgDQoNCipncm91cF9ieShjdXQsIGNsYXJpdHkpKiA6IE5ow7NtIGThu68gbGnhu4d1IHRoZW8gY+G7mXQgImN1dCIgdsOgICJjbGFyaXR5Ii4NCg0KKnN1bW1hcmlzZShtID0gbWVhbihkZXB0aCkpKiA6IFTDrW5oIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgY+G7mXQgImRlcHRoIiB0cm9uZyBt4buXaSBuaMOzbSB2w6AgdOG6oW8gbeG7mXQgY+G7mXQgbeG7m2kgY8OzIHTDqm4gIm0iIMSR4buDIGzGsHUgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaC4NCg0KKmdncGxvdChhZXMoeCA9IGN1dCwgeSA9IG0pKSogOiBU4bqhbyBt4buZdCDEkeG7kWkgdMaw4bujbmcgZ2dwbG90IHbhu5tpIHRy4bulYyB4IGzDoCAiY3V0IiB2w6AgdHLhu6VjIHkgbMOgICJtIi4NCg0KKmdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykqIDogVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgc+G7rSBk4bulbmcgaMOsbmggZOG6oW5nIG3hurdjIMSR4buLbmggdsOgIHPhu60gZOG7pW5nIHBoxrDGoW5nIHBow6FwICJkb2RnZSIgxJHhu4MgeOG6v3AgY2jhu5NuZyBjw6FjIGPhu5l0IGPhu6dhIGPDoWMgbmjDs20uDQoNCipmYWNldF93cmFwKH5jbGFyaXR5KSogOiBDaGlhIGJp4buDdSDEkeG7kyB0aMOgbmggY8OhYyBwYW5lbCByacOqbmcgYmnhu4d0IGThu7FhIHRyw6puIGPhu5l0ICJjbGFyaXR5Ii4NCg0KKmdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtKSksIHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJyk6KiAgVGjDqm0gbmjDo24gZOG7ryBsaeG7h3UgdHLDqm4gbeG7l2kgY+G7mXQsIHbhu5tpIGdpw6EgdHLhu4sgxJHGsOG7o2MgbMOgbSB0csOybiB2w6AgbcOgdSBjaOG7ryDEkeG7jy4gVGhhbSBz4buRIHZqdXN0ID0gMiBsw6BtIHTEg25nIGtob+G6o25nIGPDoWNoIGdp4buvYSBj4buZdCB2w6AgbmjDo24uDQoNCi0gxJDhu5kgc8OidSB0cnVuZyBiw6xuaCBj4bunYSBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyDhu58gY8OhYyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3Qga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggbmhp4buBdSwgxJHhu4F1IGRhbyDEkeG7mW5nIOG7nyBjw6FjIG3hu6ljIMSR4buZIDYwLDYxLDYyLDYzLDY0Lg0KDQoNCmBgYHtyfQ0KZCAlPiUgZ3JvdXBfYnkoY3V0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKGRlcHRoKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGN1dCx5ID0gbSkpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsNCiAgICBmYWNldF93cmFwKH5jb2xvcikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKG0pKSwgdmp1c3Q9MiwgY29sb3I9J3JlZCcpKyANCiAgbGFicyh4PSAnTG/huqFpJywgeT0gJ8SQ4buZIHPDonUgdHJ1bmcgYsOsbmgnLHRpdGxlPSdIw6xuaCAyMzogR2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBkZXB0aCB0aGVvIGN1dCB2w6AgY29sb3IgJykNCmBgYA0KDQrEkOG7mSBzw6J1IHRydW5nIGLDrG5oIGPhu6dhIGPDoWMgbG/huqFpIGtpbSBjxrDGoW5nIOG7nyBjw6FjIG3DoHUgc+G6r2Mga2jDoWMgbmhhdSBraMO0bmcgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCBuaGnhu4F1LCDEkeG7gXUgZGFvIMSR4buZbmcg4bufIGPDoWMgbeG7qWMgxJHhu5kgNjAsNjEsNjIsNjMsNjQuDQoNCiMjICoqQmnhu4N1IMSR4buTIHThu7cgbOG7hyBwaOG6p24gdHLEg20gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2MqKg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdCgpICsNCiAgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4ID0gY3V0LCB5ID0gLi5wcm9wLi4sIGdyb3VwID0gY29sb3IsIGZpbGwgPSBjb2xvcikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBzb3J0KHVuaXF1ZShkaWFtb25kcyRjb2xvcikpKSsNCiAgZmFjZXRfd3JhcCh+Y2xhcml0eSkrDQogICAgbGFicyh4PSAnTG/huqFpJywgeT0gJ1Bo4bqnbiB0csSDbScsdGl0bGU9J0jDrG5oIDI0OiBCaeG7g3UgxJHhu5MgdOG7tyBs4buHIHBo4bqnbiB0csSDbSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyAnKQ0KDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgbsOgeSBoaeG7g24gdGjhu4sgdOG7tyBs4buHIHBo4bqnbiB0csSDbSBj4bunYSBt4buXaSBsb+G6oWkgZGlhbW9uZCBk4buxYSB0csOqbiBj4buZdCAiY3V0IiBj4bunYSBi4buZIGThu68gbGnhu4d1ICJkaWFtb25kcyIsIHbDoCBjw6FjIHRoYW5oIGJhciDEkcaw4bujYyBwaMOibiBsb+G6oWkgdGhlbyBj4buZdCAiY29sb3IiLiBNw6B1IHPhuq9jIGPDoWMgdGhhbmggYmFyIMSRxrDhu6NjIHPhuq9wIHjhur9wIHRoZW8gdGjhu6kgdOG7sSBnacOhIHRy4buLIG3DoHUgc+G6r2MuDQoNCi0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyDhu58gY8OhYyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgxJHhu4F1IGPDsyBz4buxIGJp4bq/biDEkeG7mW5nLg0KDQotIFRyb25nIMSRw7MsIEkxLFNJMixTSTEgbcOgdSBz4bqvYyDhu58gY8OhYyBsb+G6oWkgY8OzIHPhu7EgYmnhur9uIMSR4buZbmcuDQoNCi0gVlMyLCBWUzEgdMSDbmcgxJHhu4F1Lg0KDQoqKnNvIHPDoW5oIHPhu5EgbMaw4bujbmcgY8OhYyBt4bqrdSBraW0gY8awxqFuZyBjaG8gdOG7q25nIG3hu6ljIMSR4buZIGPhuq90IHbDoCBtw6B1IHPhuq9jKioNCmBgYHtyfQ0KZCAlPiUgZ3JvdXBfYnkoY3V0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY3V0LHkgPSBuKSkgKw0KICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICAgIGZhY2V0X3dyYXAofmNvbG9yKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnZ3JlZW4nKSArDQogICAgbGFicyh0aXRsZT0nSMOsbmggMjU6IEJp4buDdSDEkeG7kyBzbyBzw6FuaCBz4buRIGzGsOG7o25nIGPDoWMgbeG6q3Uga2ltIGPGsMahbmcgY2hvIHThu6tuZyBt4bupYyDEkeG7mSBj4bqvdCB2w6AgbcOgdSBz4bqvYyAnLHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQotTmjDrG4gY2h1bmcgY8OhYyB2acOqbiBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2Mg4bufIGPDoWMgbG/huqFpIMSR4buBdSBjw7MgeHUgaMaw4bubbmcgdMSDbmcuDQoNCi0gVHJvbmcgxJHDsyBsb+G6oWkgSWRlYWwgY8OzIHPhu5EgbMawxqFuZyBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2MgbMOgIGNhbyBuaOG6pXQuDQoNCiMjICoqQmnhu4N1IMSR4buTIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgxJHhu5kgdGluaCBraGnhur90IChjbGFyaXR5KSBjaG8gaGFpIG3DoHUgc+G6r2MgIkgiIHbDoCAiSSIqKg0KYGBge3J9DQpkZl9uZXcgPC0gZGlhbW9uZHMgJT4lDQogIGdyb3VwX2J5KGNsYXJpdHksIGNvbG9yKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBtdXRhdGUoY29sb3IgPSBmYWN0b3IoY29sb3IsIGxldmVscyA9IGMoIkgiLCAiSSIpKSkNCg0KZGZfbmV3ICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LCB5ID0gbiwgZmlsbCA9IGNvbG9yKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsNCiAgbGFicyh0aXRsZSA9ICJIw6xuaCAyNjogxJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgKGNsYXJpdHkpIGNobyBoYWkgbcOgdSBz4bqvYyAnRycgdsOgICdKJyIpICsgbGFicyh4ID0gIsSQ4buZIHRpbmgga2hp4bq/dCIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB0cuG7sWMgcXVhbiBow7NhIHbDoCBzbyBzw6FuaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCBjaG8gaGFpIG3DoHUgc+G6r2MgJ0cnIHbDoCAnSicuIELhurFuZyBjw6FjaCBz4butIGThu6VuZyBjw6FjIGPhu5l0IHbDoCBtw6B1IHPhuq9jLCBjaMO6bmcgdGEgY8OzIHRo4buDIGThu4UgZMOgbmcgc28gc8Ohbmggc+G7kSBsxrDhu6NuZyBnaeG7r2EgY8OhYyBuaMOzbSB2w6Agbmjhuq1uIHRo4bqleSBwaMOibiBi4buRIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gbeG7qWMgxJHhu5kgdGluaCBraGnhur90IHbDoCBtw6B1IHPhuq9jIGPhu6dhIGNow7puZy4NCg0KLSBOaMOsbiBjaHVuZywgdGEgdGjhuqV5IG3DoHUgSCBjw7Mgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBuaGnhu4F1IGjGoW4gbcOgdSBJLg0KDQotIE3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCBTSTEgbMOgIGPDsyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNhbyBuaOG6pXQuDQoNCiMjICoqIEJp4buDdSDEkeG7kyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBtw6B1IHPhuq9jIChEIHbDoCBKKSoqDQpgYGB7cn0NCnRtcCA8LSBkaWFtb25kcw0KdG1wIDwtIHRtcCAlPiUgZ3JvdXBfYnkoY3V0LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KdG1wICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSkgKyANCiAgZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdEJyksIGZpbGwgPSAnbGlnaHRibHVlJykgKw0KICBnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0onKSwgZmlsbCA9ICdibHVlJykrbGFicyh4PSJDaOG6pXQgbMaw4bujbmciLHk9IlPhu5EgbMaw4bujbmciKSsgDQogIGxhYnMoIHRpdGxlID0gIkjDrG5oIDI3OiBT4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBtw6B1IHPhuq9jIChEIHbDoCBKKSIpDQoNCmBgYA0KDQotIE5ow6xuIGNodW5nLCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nICdEJyBjYW8gaMahbiAnSicgY2hvIHThuqV0IGPhuqMgY8OhYyBt4bupYyBjaOG6pXQgbMaw4bujbmcgY+G6r3QuIEPhuqMgaGFpIG3DoHUgxJHhu4F1IGPDsyB4dSBoxrDhu5tuZyBnaeG6o20gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBraGkgY2jhuqV0IGzGsOG7o25nIGPhuq90IGdp4bqjbS4NCg0KLSBQaMOibiBi4buRIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jOiBNw6B1ICdKJyBjw7MgeHUgaMaw4bubbmcgcGjDom4gYuG7kSDEkeG7gXUgaMahbiBnaeG7r2EgY8OhYyBt4bupYyBjaOG6pXQgbMaw4bujbmcgY+G6r3QuDQpNw6B1ICdEJyBjw7MgeHUgaMaw4bubbmcgdOG6rXAgdHJ1bmcgbmhp4buBdSBoxqFuIOG7nyBjw6FjIG3hu6ljIGNo4bqldCBsxrDhu6NuZyBj4bqvdCAnSWRlYWwnLg0KDQpE4buvIGxp4buHdSB0cm9uZyBiaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBjaOG6pXQgbMaw4bujbmcgY+G6r3Qg4bqjbmggaMaw4bufbmcgxJHhur9uIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcuIE3DoHUgc+G6r2MgY8Wpbmcg4bqjbmggaMaw4bufbmcgxJHhur9uIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcsIG5oxrBuZyBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyB0aOG6pXAgaMahbiBzbyB24bubaSBjaOG6pXQgbMaw4bujbmcgY+G6r3QuDQoNCiMjICoqQmnhu4N1IMSR4buTIHRydW5nIHbhu4sgZ2nDoSB0aGVvIGJp4bq/biBjdXQqKg0KYGBge3J9DQpkICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobT0gbWVkaWFuKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGN1dCx5ID0gbSkpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnVHJ1bmcgduG7iycsdGl0bGUgPSAiSMOsbmggMjg6IEJp4buDdSDEkeG7kyB0cnVuZyB24buLIGdpw6EgdGhlbyBiaeG6v24gY3V0IikNCmBgYA0KDQotIFRydW5nIHbhu4sgUHJpY2UgY+G7p2EgbG/huqFpIGtpbSBjxrDGoW5nIGxv4bqhaSBGYWlyIGzDoCAzMjgyIA0KDQotIFRydW5nIHbhu4sgUHJpY2UgY+G7p2EgbG/huqFpIGtpbSBjxrDGoW5nIGxv4bqhaSBHb29kIGzDoCAzMDUwLjUgDQoNCi0gVHJ1bmcgduG7iyBQcmljZSBj4bunYSBsb+G6oWkga2ltIGPGsMahbmcgbG/huqFpIFZlcnkgR29vZCBsw6AgMjY0OCANCg0KLSBUcnVuZyB24buLIFByaWNlIGPhu6dhIGxv4bqhaSBraW0gY8awxqFuZyBsb+G6oWkgUHJlbWl1bSBsw6AgMzE4NSANCg0KLSBUcnVuZyB24buLIFByaWNlIGPhu6dhIGxv4bqhaSBraW0gY8awxqFuZyBsb+G6oWkgSWRlYWwgbMOgIDE4MTAgDQoNCiMjICoqQmnhu4N1IMSR4buTIMSR4buZIGzhu4djaCBjaHXhuqluIGPhu6dhIHRhYmxlIHRoZW8gxJHhu5kgdGluaCBraGnhur90KioNCmBgYHtyfQ0KZCAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShtPSBzZCh0YWJsZSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LHkgPSBtKSkgKw0KICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDIpKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArDQogICAgbGFicyh4ID0gJ8SQ4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnxJDhu5kgbOG7h2NoIGNodeG6qW4nLHRpdGxlID0gIkjDrG5oIDI5OiDEkOG7mSBs4buHY2ggY2h14bqpbiBj4bunYSB0YWJsZSB0aGVvIMSR4buZIHRpbmgga2hp4bq/dCIpDQpgYGANCg0KxJDhu5kgbOG7h2NoIGNodeG6qW4gY+G7p2Ega2ltIGPGsMahbmcgduG7gSBi4buBIG3hurd0IGtpbSBjxrDGoW5nIEkxIGzDoCA6IDIuNTcNCsSQ4buZIGzhu4djaCBjaHXhuqluIGPhu6dhIGtpbSBjxrDGoW5nIHbhu4EgYuG7gSBt4bq3dCBraW0gY8awxqFuZyBTSTIgbMOgIDogMi4zMw0KxJDhu5kgbOG7h2NoIGNodeG6qW4gY+G7p2Ega2ltIGPGsMahbmcgduG7gSBi4buBIG3hurd0IGtpbSBjxrDGoW5nIFNJMSBsw6AgOiAyLjI1DQrEkOG7mSBs4buHY2ggY2h14bqpbiBj4bunYSBraW0gY8awxqFuZyB24buBIGLhu4EgbeG6t3Qga2ltIGPGsMahbmcgVlMyIGzDoCA6IDIuMTYNCsSQ4buZIGzhu4djaCBjaHXhuqluIGPhu6dhIGtpbSBjxrDGoW5nIHbhu4EgYuG7gSBt4bq3dCBraW0gY8awxqFuZyBWUzEgbMOgIDogMi4yMw0KxJDhu5kgbOG7h2NoIGNodeG6qW4gY+G7p2Ega2ltIGPGsMahbmcgduG7gSBi4buBIG3hurd0IGtpbSBjxrDGoW5nIFZWUzIgbMOgIDogMi4wNw0KxJDhu5kgbOG7h2NoIGNodeG6qW4gY+G7p2Ega2ltIGPGsMahbmcgduG7gSBi4buBIG3hurd0IGtpbSBjxrDGoW5nIFZWUzEgbMOgIDogMi4wMg0KxJDhu5kgbOG7h2NoIGNodeG6qW4gY+G7p2Ega2ltIGPGsMahbmcgduG7gSBi4buBIG3hurd0IGtpbSBjxrDGoW5nIElGIGzDoCA6IDEuOTgNCg0KIyMgKipCaeG7g3UgxJHhu5Mgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBz4bqvcCB44bq/cCB0aGVvIMSR4buZIGzhu5tuKioNCmBgYHtyfQ0KZCA8LSBkaWFtb25kcyANCmQgPC0gZCAlPiUgbXV0YXRlKGNhcmF0QyA9IGN1dChjYXJhdCw1LCBsYWJlbCA9IGMoJ3LhuqV0IG5o4buPJywgJ25o4buPJywnduG7q2EnLCds4bubbicsJ3LhuqV0IGzhu5tuJykpKQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gY2FyYXRDKSkgKw0KICBnZW9tX2JhcihmaWxsID0gJ3BpbmsnKSsNCiAgICBsYWJzKHRpdGxlID0gIkjDrG5oIDMwOiBCaeG7g3UgxJHhu5Mgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBz4bqvcCB44bq/cCB0aGVvIMSR4buZIGzhu5tuIikNCmBgYA0KDQotIEtpbSBjxrDGoW5nIHLhuqV0IG5o4buPIGNoaeG6v20gc+G7kSBsxrDhu6NuZyBs4bubbiBraW0gY8awxqFuZy4NCg0KLSBraW0gY8awxqFuZyB24burYSBjw7Mgc+G7kSBsxrDhu6NuZyB0aOG6pXAuDQoNCi0gTOG7m24gdsOgIHLhuqV0IGzhu5tuIGtow7RuZyBjw7Mga2ltIGPGsMahbmcgdOG7k24gdOG6oWku