1 Tổng quan về bộ dữ liệu

  • Bộ dữ liệu ChickWeight là một bộ dữ liệu phổ biến trong thống kê và nghiên cứu sinh học. Bộ dữ liệu này cung cấp thông tin về sự phát triển của gà con dưới điều kiện dinh dưỡng khác nhau. Bằng cách theo dõi trọng lượng của gà con theo thời gian và dưới sự ảnh hưởng của các loại khẩu phần khác nhau, bộ dữ liệu này có thể cung cấp thông tin giá trị về sinh lý và phát triển của động vật.

  • Bộ dự liệu ChickenWeight bao gồm các cột sau:

    • Weight (Trọng lượng): Biến này đo lường trọng lượng của gà con và được ghi lại bằng đơn vị grams. Trọng lượng của gà con được theo dõi qua thời gian để đo lường sự phát triển và tăng trưởng của chúng.

    • Time (Thời gian): Biến này thể hiện thời gian quan sát, thường được đo bằng đơn vị ngày. Nó cho biết khoảng thời gian mà mỗi quan sát trọng lượng được thực hiện.

    • Chick (Con gà): Đây là số thứ tự của từng con gà trong bộ dữ liệu. Mỗi con gà có một số thứ tự duy nhất để phân biệt chúng.

    • Diet (Chế độ dinh dưỡng): Biến này chỉ ra loại chế độ dinh dưỡng mà mỗi con gà được cung cấp. Có bốn loại chế độ dinh dưỡng được sử dụng trong bộ dữ liệu, thường được đánh số từ 1 đến 4.

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

Gọi bộ dữ liệu ggplot2 để dùng hiệu quả hơn cho các phép tính

options(repos = c(CRAN = "http://cran.rstudio.com/"))
install.packages("ggplot2")
## Installing package into 'C:/Users/PC_Dell/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'ggplot2' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\PC_Dell\AppData\Local\Temp\RtmpQDV5zX\downloaded_packages
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
library(scales)
library(DT)

Trước hết tôi sẽ gán bộ dữ liệu cho biến cụ thể

ck <- ChickWeight
datatable(ck)

2.1 Biểu đồ thể hiện số lượng gà theo Diet

ck  %>% group_by(Diet) %>% summarise(n = n()) %>% #Tạo một bảng dữ liệu mới bằng cột Diet và tổng các phần tử
 ggplot( aes( x = as.factor(Diet), y = n)) + #Bắt đầu một biểu đồ sử dụng gói ggplot với trục x là Diet, trục y là các phần tử n
  geom_col(fill = 'skyblue') + #Thêm các cột vào biểu đồ, các cột được thiết lập màu là skyblue
  geom_text(aes(label = n), vjust = 1, color = 'red') + #thêm nhãn số lượng gà vào mỗi cột, căn chỉnh độ dọc của nhãn cũng như đặt màu là đỏ
  xlab('Số thứ tự Chick') + #Đặt nhãn trục x 
  ylab('Số lượng gà') + #Đặt nhãn trục y
  labs(title = 'Biểu đồ số lượng gà theo loại khẩu phần của gà con') #Đặt tên cho tiêu đề của bảng vẽ

  • Nhìn vào ta thấy biểu đồ thể hiện số lượng gà con trên mỗi chế độ dinh dưỡng
  • Loại dinh dưỡng 1 nhiều nhất có 220 con, loại 2 có 120 con, loại 3 có 120 con, loại 4 có 118 con là ít nhất nhưng không đáng kể

2.2 Biểu đồ thể hiện Trọng lượng gà trung bình theo Diet

ck %>% group_by(Diet) %>% summarise(avg = mean(weight)) %>% #Sử dụng dữ liệu từ ck nhóm cột Diet cũng nhưng tính cân nặng trung bình của cột weight
   ggplot(aes(x = as.factor(Diet), y = avg)) + #Bắt đầu một biểu đồ sử dụng gói ggplot với trục x là Diet, trục y là lượng trung bình 
  geom_col(fill = 'yellow') + #Thêm các cột vào biểu đồ, thiết lập màu các cột là yellow
  geom_text(aes(label = round(avg,2)), vjust = 1, color = 'red') + #Thêm nhãn về lượng trung bình vào mỗi cột, thiết lập sau dấu phẩy chỉ lấy 2 chữ số, căn chỉnh độ dọc của của nhãn cũng như màu sắc là đỏ
  labs( x = 'loại Diet', y = 'Trọng lượng gà con trung bình  (gram)', title = 'trọng lượng gà con trung bình theo Diet') + #Đặt nhãn cho trục x, y cũng như tiêu đề của vùng dữ liệu được vẽ
  coord_flip() #Đảo ngược trục của biểu đồ, từ dọc thành ngang và ngược lại

  • Biểu đồ thể hiện trọng lượng gà trung bình theo từng loại Diet
  • Loại 1 thấp nhất với trọng lượng trung bình xấp xỉ 102.65, tiếp đó là loại 2 là 122.52, loại 4 là 135.26 và cao nhất là loại 4 với trọng lượng trung bình đạt 142.95

2.3 Biểu độ phân tích trung tâm cân nặng ( theo từng Diet)

ck %>% group_by(Diet) %>% summarise(m= median(weight)) %>% #Sử dụng dữ liệu từ ck tạo một bảng dữ liệu mới, nhóm cột Diet lại và chọn dự liệu là trung vị của weight đưa vào
  ggplot(aes(x = Diet,y = m)) + #Chọn chỉ định trục x sẽ lấy từ Diet, trục y là trung vị của weight
  geom_col(position = 'dodge', fill = 'pink', color = 'black') + #sắp xếp cột dữ liệu, đổ màu nền, màu viền
  geom_text(aes(label = round(m,2)), vjust = 2, color = 'red') + #Chỉ định ký tự cột dữ liệu có giá trị, giá trị sau dấu phẩu có 2, khoảng cách chỉ định chiều dọc là 2, màu đỏ
  labs(x = 'Loại dinh dưỡng', y = 'Trung vị', title ='Trung vị theo cân nặng từng loại dinh dưỡng') #gán nhãn cho trục x, y và tiêu đề cho biểu đồ

  • Biểu độ cho ta thấy được trung vị, từng có 50% phần tử bên trong nhỏ hơn và số còn lại lớn hơn. Tức với mỗi từng loại dinh dưỡng, trung vị theo cân nặng sẽ khác nhau.
  • với loại dinh dưỡng 1, có khoảng 50% số kg được ghi nhận là nhỏ hơn 88, 50% số kg được ghi nhân là lớn hơn 88, theo đó thi loại 2 là 104.5, loại 3 là 125.5 và loại dinh dưỡng 4 là 129.5

2.4 Biểu đồ thể hiện tương quan giữa weight và Diet

ck %>% ggplot(aes(x = weight, y = Time, color = Diet)) + #Sử dụng dữ liệu từ ck tạo một bảng dữ liệu mới trong gói ggplot, thiết lập trục x, y, phân loại các điểm theo từng loại dinh dưỡng và phân bố màu cho chúng
  geom_point() + #Thêm các điểm vào biểu đồ, mỗi điểm là một quan sát được đối chiếu theo trục x và y
  labs( x = 'cân nặng gà con', y = 'Thời gian quan sát', title = 'Tương quan giữa gà con và cân nặng theo loại dinh dưỡng') #Đặt nhãn cho trục x và y, thiết lập lại tên tiêu đề mới cho vùng dữ liêụ

  • Biểu độ cho ta thấy tượng quan giữa cân nặng gà con theo thời gian quan sát chúng theo từng loại dinh dưỡng
  • Ta thấy được cân nặng gà con càng lớn thì thòi gian quan sát cũng phải lâu, tùy theo loại dinh dưỡng có ảnh hưởng tới cân nặng của gà con
  • Mật độ dinh dưỡng của loại 4, 1 phân bổ rất dày với gà con trong khoảng 0 đến 200 gam.

2.5 Biểu đồ thể hiện số lượng Diet theo Pie chart

ck %>% group_by(Diet) %>% summarise(n=n()) %>% #Tạo bảng dữ liệu mới các các cộng Diet và tổng n
  ggplot(aes(x= '', y=n, fill = Diet))+ #Bắt đầu một biểu đồ sử dụng gói ggplot với trục x không có dữ liệu, trục y là các phần tử n, và màu sắc được thêm vào phân biệt các loại Diet
  geom_col(color = 'black', width = 1) + #Thêm các cột vào biểu đồ, mỗi cột là một loại dinh dưỡng cũng như độ rộng là 1
  coord_polar('y') + #Chuyển đổi biểu đồ thành hệ tọa độ cực, biểu thị các phần tương đối trong một vòng tròn
  geom_text(aes(x = 1.4, label = n), position = position_stack(vjust = .5)) + #Các nhãn sẽ đật ở vị trí 1.3 trên trục x, trục y hiển thị số lượng và  các nhãn được chồng với nhau lên căn chỉnh ở vị trí .5
  labs( title = 'Số lượng Diet') + #Thêm phần tiêu đề vào vùng vẽ biểu đồ
  theme_void() #Loại bỏ các phần mặc định của giao diện của biểu đồ, chỉ hiển thị dữ liệu và các yếu tố trực tiếp liên quan đến nó. 

  • Biểu đồ cho ta thấy số lượng gà con của từng loại dinh dưỡng nhưng ở dạng Pie chart
  • với loại 1 là 220 con là lớn nhất và loại 4 là ít nhất với 118 con

2.6 Biểu đồ density thể hiện weight và Diet theo số lượng

ck %>% ggplot( aes(x = weight, fill = as.factor(Diet))) +
  geom_density(alpha = 0.5) +  # Thiết lập độ mờ của các đường density
  labs(title = "Density plot của trọng lượng gà con theo loại khẩu phần", x = "Trọng lượng (grams)", y = "Mật độ") +
  scale_fill_discrete(name = "Loại khẩu phần") +  # Thêm chú thích cho fill
  theme_minimal()# Chọn theme cho biểu đồ

  • Biểu đồ cho ta thấy sự phân bố trọng lượng trong mỗi nhóm với từng loại khẩu phần dinh dưỡng cho gà con riêng biệt
  • Mật độ loại một chiếm rất cao và dày trong khoảng từ 100 đến nửa 200g rồi làm giảm một cách rõ rệt, tiếp đó là loại 2 và xuống lần tới loại 3,4
  • Khoang có sự chênh lệnh quá lớn từ khoảng nửa 100 đến 200g trở đi của khẩu phần 1, 2, 3, Loại dinh dưỡng 4 ảnh hưởng lớn đến cân nặng từ 100 đến 200g của gà con

2.7 Biểu đồ thể hiện mật độ trọng trọng lượng gà con (Density plot)

ck %>% ggplot( aes(x = weight, fill = as.factor(Diet))) +
  geom_density(alpha = 0.5) +  # Thiết lập độ mờ của các đường density
  facet_wrap(~Diet) + #Phân tổ các biểu đồ nhỏ hơn theo Diet
  labs(title = "Density plot của trọng lượng gà con theo loại khẩu phần", x = "Trọng lượng (grams)", y = "Mật độ") +
  scale_fill_discrete(name = "Loại khẩu phần")  # Thêm chú thích cho fill

  • Tương tự như biểu đồ trên, mỗi phần nhỏ chỉ ra mật độ trọng lượng khi cho các loại khẩu phần riêng biệt đối với gà con
  • Loại khẩu phần 1 với trọng lượng gà con 100g đổ lại rất nhiều

2.8 Biểu đồ thể hiện số lượng gà theo Diet

ck %>% group_by(Diet) %>% summarise(n = n()) %>% #Nhóm các dòng dữ liệu của ck theo cột Diet, sau đó tính tổng số lượng cho mỗi nhóm
  ggplot(aes(x = '', y = n,fill = Diet)) + #Sử dụng dữ liệu từ bước trước thiết lập biểu đồ với trục x là không có dữ liệu, y là n, màu sắc đc ánh xạ vào Diet
  geom_col( color = 'black' ) + #Thêm các cột vào biểu đồ, với màu được thiết lập là màu đen
  geom_text(aes(label = n),position = position_stack(vjust = 1)) + #Thêm nhãn vào biểu đồ, hiển thị số lượng gà con trên mỗi cột, căn chỉnh vị trí dọc các nhãn, đặt trên cùng mỗi cột
  labs( y = 'số lượng', title = 'số lượng gà con cho mỗi chế độ dinh dưỡng') #Thiết lập nhãn cho trụ y, tiêu đề của vùng dữ liệu được vẽ

  • Biểu đồ thể hiện cho ta thấy số lượng gà con theo từng loại dinh dưỡng, các số liệu được chồng theo một cột và tùy theo số lượng mà độ dày khác nhau
  • Loại dinh dưỡng 1 có độ dày chiếm ưu thế, số lượng nhiều nhất, 3 loại kia không chênh lệch đáng kể

2.9 Biểu đồ thể hiện tương quan giữa cân nặng gà con và loại dinh dưỡng theo Diet

ck %>% ggplot(aes(x = weight, y = Time, color = Diet)) + #Sử dụng dữ liệu từ ck tạo một bảng dữ liệu mới trong gói ggplot, thiết lập trục x, y, phân loại các điểm theo từng loại dinh dưỡng và phân bố màu cho chúng
  geom_point() + #Thêm các điểm vào biểu đồ, mỗi điểm là một quan sát được đối chiếu theo trục x và y
  labs( x = 'cân nặng gà con', y = 'Thời gian quan sát', title = 'Tương quan giữa gà con và cân nặng theo loại dinh dưỡng') +  #Đặt nhãn cho trục x và y, thiết lập lại tên tiêu đề mới cho vùng dữ liêụ
geom_smooth(method = 'lm', color = 'black')
## `geom_smooth()` using formula = 'y ~ x'

  • Đường trend line có xu hướng lên trên, mối tương quan dương giữa các dữ liệu
  • Với cân nặng gà con lớn, phải bổ sung dinh dưỡng theo đó mà thời gian quan sát cũng sẽ phải tăng lên

2.10 Biểu đồ thể hiện tỷ lệ dinh dưỡng theo Diet

ck %>% group_by(Diet) %>% summarise(n = n()) %>%  #Nhóm các cột dữ liệu theo giá trị trong cột Diet
  ggplot(aes(Diet,n)) + #Sử dụng dữ liệu trước đó, ánh xạ trụng x là cột Diet, trục y là cột n
  geom_col(fill='green') + #Thêm các cột vào biểu đồ, màu của các cột xanh lá cây
  geom_text(aes(label = percent(n/length(ck$Diet))),vjust = 2, color = 'red') + #thêm nhãn cho các cột của biểu đồ, ở đây là phần trăm số lượng mỗi loại Diet trên tổng, căn chỉnh chiều dọc và màu đỏ cho nhãn
  labs(x = 'Loại dinh dưỡng', y = 'Số lượng', title = 'Tỷ lệ loại dinh dưỡng') #Thêm nhãn cho trục x, trục y và tiêu đề

  • Biểu đồ cho ta thấy phần trăm số lượng gà con trong mỗi loại dinh dưỡng được nuôi
  • Loại dinh dưỡng số 1 có số lượng gà con chiếm 38.6%, loại dinh dưỡng số 2,3 có 20.76% tổng số lượng gà con, còn lại là loại dinh dưỡng số 4 số lượng gà con chiếm 20.42%.

2.11 Biểu đồ thể hiện Tương quan giữa cân nặng gà con và thời gian quan sát theo loại Diet

ck %>% ggplot(aes(x = weight, y = Time, color = Diet)) + #Sử dụng dữ liệu từ ck tạo một bảng dữ liệu mới trong gói ggplot, thiết lập trục x, y, phân loại các điểm theo từng loại dinh dưỡng và phân bố màu cho chúng
  geom_point() + #Thêm các điểm vào biểu đồ, mỗi điểm là một quan sát được đối chiếu theo trục x và y
  labs( x = 'cân nặng gà con', y = 'Thời gian quan sát', title = 'Tương quan giữa gà con và cân nặng theo loại dinh dưỡng') +  #Đặt nhãn cho trục x và y, thiết lập lại tên tiêu đề mới cho vùng dữ liêụ
geom_smooth(method = 'lm', color = 'green') + #Thêm đường phù hợp tuyến tính, bằng phương pháp hồi quy tuyến tính
  facet_wrap(~Diet) #Phân loại các bảng nhỏ hơn theo loại Diet
## `geom_smooth()` using formula = 'y ~ x'

  • Cân nặng gà con tùy theo từng loại dinh dưỡng có xu hướng tăng theo thời gian quan sát

2.12 Biểu đồ thể hiện lượng cân nặng trung bình theo Diet ( Dạng Pie )

ck %>% group_by(Diet) %>% summarise(n=mean(weight)) %>% #Tạo bảng dữ liệu mới các các cộng Diet và tính lượng trung bình 
  ggplot(aes(x= '', y=n, fill = Diet))+ #Bắt đầu một biểu đồ sử dụng gói ggplot với trục x không có dữ liệu, trục y là các phần tử n, và màu sắc được thêm vào phân biệt các loại Diet
  geom_col(color = 'black', width = 1) + #Thêm các cột vào biểu đồ, mỗi cột là một loại dinh dưỡng cũng như độ rộng là 1
  coord_polar('y') + #Chuyển đổi biểu đồ thành hệ tọa độ cực, biểu thị các phần tương đối trong một vòng tròn
  geom_text(aes(x = 1.3, label = round(n,2)), position = position_stack(vjust = .5)) + #Các nhãn sẽ đật ở vị trí 1.3 trên trục x, trục y, tính giá trị trung bình và lấy hai giá trị sau đó, hiển thị số lượng và  các nhãn được chồng với nhau lên căn chỉnh ở vị trí .5
  labs( title = 'Trọng lượng trung bình') + #Thêm phần tiêu đề vào vùng vẽ biểu đồ
  theme_void() #Loại bỏ các phần mặc định của giao diện của biểu đồ, chỉ hiển thị dữ liệu và các yếu tố trực tiếp liên quan đến nó. 

  • Biểu đồ thể hiện trọng lượng gà con trung bình theo từng loại dinh dưỡng
  • Loại 1 có trọng lượng trung bình là 102.65, loại 2 là 122.62, loại 3 là 142.95, loại 4 là 135.26

2.13 Biểu đồ thể hiện thời gian trung bình theo Diet ( dạng Pie )

ck %>% group_by(Diet) %>% summarise(n=mean(Time)) %>% #Tạo bảng dữ liệu mới các các cộng Diet và tính thời gian trung bình 
  ggplot(aes(x= '', y=n, fill = Diet))+ #Bắt đầu một biểu đồ sử dụng gói ggplot với trục x không có dữ liệu, trục y là các phần tử n, và màu sắc được thêm vào phân biệt các loại Diet
  geom_col(color = 'black', width = 1) + #Thêm các cột vào biểu đồ, mỗi cột là một loại dinh dưỡng cũng như độ rộng là 1
  coord_polar('y') + #Chuyển đổi biểu đồ thành hệ tọa độ cực, biểu thị các phần tương đối trong một vòng tròn
  geom_text(aes(x = 1.3, label = round(n,2)), position = position_stack(vjust = .5)) + #Các nhãn sẽ đật ở vị trí 1.3 trên trục x, trục y, tính giá trị trung bình và lấy hai giá trị sau đó, hiển thị số lượng và  các nhãn được chồng với nhau lên căn chỉnh ở vị trí .5
  labs( title = 'Thời gian trung bình') + #Thêm phần tiêu đề vào vùng vẽ biểu đồ
  theme_void() #Loại bỏ các phần mặc định của giao diện của biểu đồ, chỉ hiển thị dữ liệu và các yếu tố trực tiếp liên quan đến nó. 

  • Thời gian quan sát trung bình của gà con theo từng loại dinh dưỡng
  • Loại dinh dưỡng 1 có thời gian quan sát trung bình là 10.48, loại 2 là 10.92, loại 3 là 10.92 còn loại 4 là 10.75

2.14 Biểu đồ thể hiện tần suất xuất hiện trọng lượng gà con

ck %>% ggplot(aes(x = weight)) + #Bắt đầu một biểu đồ ggplot với trục x được thiết lập là cột "weight"
  geom_histogram(binwidth = 50, fill = "skyblue", color = "black", aes(y=..count..)) + #Thiết lập dữ liệu hiển thị dưới dạng histogram, đặt chiều rộng bin, màu nền và viền, sử dụng tần suất tuyệt đối
  labs(x = "Trọng lượng (g)", y = "Tần suất") + #Thiết lập nhãn cho trục x và trục y
  ggtitle("Phân phối của trọng lượng gà con") + #Thiết lập tiêu đề cho biểu đồ
  theme_minimal() #Chọn giao diện đơn giản, đường lưới cho biểu đồ

  • Biểu đồ cho thấy tần suất suất hiện các chỉ số trọng lượng gà con
  • tần suất xuất hiện của trọng lượng dưới 100g xuất hiện nhiều nhất hơn 200 lần và giảm dần

2.15 Biểu đồ phân phối trong lượng gà con với tần suất (theo Diet)

ck %>% ggplot(aes(x = weight)) + #Bắt đầu một biểu đồ ggplot với trục x được thiết lập là cột "weight"
  geom_histogram(binwidth = 50, fill = "skyblue", color = "black", aes(y=..count..)) + #Thiết lập dữ liệu hiển thị dưới dạng histogram, đặt chiều rộng bin, màu nền và viền, sử dụng tần suất tuyệt đối
  labs(x = "Trọng lượng (g)", y = "Tần suất") + #Thiết lập nhãn cho trục x và trục y
  facet_wrap(~Diet) + #Phân loại các bảng nhỏ theo loại Diet
  ggtitle("Phân phối của trọng lượng gà con")  #Thiết lập tiêu đề cho biểu đồ

  • Biểu đồ cho ra thấy chỉ số xuất hiện của các chỉ số trọng lượng gà con được phân ra theo loại dinh dưỡng

2.16 Biểu đồ thể hiện tần suất xuất hiện các mốc thời gian quan sát

ck %>% ggplot(aes(x = Time)) + #Bắt đầu một biểu đồ ggplot với trục x được thiết lập là cột "Time"
  geom_histogram(binwidth = 3, fill = "red", color = "black", aes(y=..count..)) + #Thiết lập dữ liệu hiển thị dưới dạng histogram, đặt chiều rộng bin là 5, màu nền và màu viền
  labs(x = "Thời gian (h)", y = "Tần suất") + #Thiết lập nhãn cho trục x và y
  ggtitle("Phân phối của thời gian theo dõi gà con") + #Thiết lập tiêu đề cho biểu đồ
  theme_minimal() #Giao diện dạng lưới

  • Biểu đố cho ta thấy các tần suất các khoảng thời gian xuất hiện
  • Khoảng thời gian xuất hiện nhiều nhất từ 0 đến 5 và giảm dần về 20

2.17 Biểu đồ thể hiện trọng lượng gà con theo thời gian (line)

ggplot(ChickWeight, aes(x = Time, y = weight, color = Chick)) +
  geom_line() +
  labs(x = "Thời gian (ngày)", y = "Trọng lượng (g)", color = "Gà") +
  ggtitle("Biểu đồ đường của trọng lượng gà theo thời gian") +
  theme_minimal()

2.18 Biểu đồ thể hiện mật độ của trọng lượng gà ( violin plot)

ck %>% ggplot(aes(x = as.factor(Diet), y = weight, fill = as.factor(Diet))) + #Lấy dữ liệu từ ck, thiết lập trục x, y, màu fill được dựa trên chế độ dinh dưỡng
  geom_violin() + #Thiết lập biểu đồ violin plot vào biểu đồ
  labs(x = "chế độ dinh dưỡng", y = "Trọng lượng (g)") +
  ggtitle("Biểu đồ violin plot của trọng lượng gà") + #Thiết lập tiêu đề cho biểu đồ
  theme_minimal() #lấy giao diện dạng lưới 

  • Biểu đồ cho ta thấy mật độ phân phối của trọng lượng các gà con theo từng chế độ dinh dưỡng
  • ở chế độ dinh dưỡng 1 thì có mật độ phân phối trọng lượng dưới 100g nhiều nhất, cả 4 loại đều có xu hướng giảm dần, trọng lượng các lớn thì càng ít, lớn nhất có thể đạt được ở khẩu phần dinh dưỡng số 3

2.19 Biểu đồ thể hiện mật độ trọng lượng qua các mốc

ck %>% 
  ggplot(aes(x = Time, y = weight)) + #Bắt đầu một chuỗi dữ liệu mới với việc thiết lập trục x, y
  geom_violin(fill = "skyblue", color = "black") + #Thiết lập dạng violin cho biểu độ, màu và màu viền
  labs(x = "Thời gian", y = "Trọng lượng (g)",
       title = "Sự phát triển của trọng lượng gà con  theo thời gian") + #gán nhãn cho từng trục x, y và tiêu đề
  theme_minimal() #giao diện dạng lưới

  • Biểu đồ cho ta thấy mật độ phân phối của trọng lượng, trọng lượng càng lớn và ít

2.20 Biểu đồ phân phối trọng lượng dạng Boxplot

ck %>% ggplot(aes(x = factor(Diet), y = weight, fill = factor(Diet))) + #Bắt đầu tạo một đối tượng ggplot, thiết lập trục x, y và màu sắc được xác định bằng diet
  geom_boxplot() + #Thêm lớp bloxpot và biến động của trọng lượng gà con theo từng loại khẩu phần
  labs(x = "Loại khẩu phần", y = "Trọng lượng gà con", fill = "Loại khẩu phần") + #Đặt nhãn cho trục x, y và màu sắc
  ggtitle("Biểu đồ Boxplot của trọng lượng gà con theo loại khẩu phần") #Thêm tiêu đề cho biểu đồ

  • Biểu đồ cho thấy các giá trị như trung vị, tứ phân vị và các giá trị ngoại vi có thể xuất hiện
LS0tDQp0aXRsZTogIk5oaWVtdnU1Ig0KYXV0aG9yOiAiTmd1eeG7hW4gUGjDumMgVGjhu4tuaCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgICB0b2M6IHRydWUNCiAgICAgdG9jX2RlcHRoOiAnMicNCiAgcGRmX2RvY3VtZW50Og0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgKlThu5VuZyBxdWFuIHbhu4EgYuG7mSBk4buvIGxp4buHdSoNCg0KLSBC4buZIGThu68gbGnhu4d1ICpDaGlja1dlaWdodCogbMOgIG3hu5l0IGLhu5kgZOG7ryBsaeG7h3UgcGjhu5UgYmnhur9uIHRyb25nIHRo4buRbmcga8OqIHbDoCBuZ2hpw6puIGPhu6l1IHNpbmggaOG7jWMuIELhu5kgZOG7ryBsaeG7h3UgbsOgeSBjdW5nIGPhuqVwIHRow7RuZyB0aW4gduG7gSBz4buxIHBow6F0IHRyaeG7g24gY+G7p2EgZ8OgIGNvbiBkxrDhu5tpIMSRaeG7gXUga2nhu4duIGRpbmggZMaw4buhbmcga2jDoWMgbmhhdS4gQuG6sW5nIGPDoWNoIHRoZW8gZMO1aSB0cuG7jW5nIGzGsOG7o25nIGPhu6dhIGfDoCBjb24gdGhlbyB0aOG7nWkgZ2lhbiB2w6AgZMaw4bubaSBz4buxIOG6o25oIGjGsOG7n25nIGPhu6dhIGPDoWMgbG/huqFpIGto4bqpdSBwaOG6p24ga2jDoWMgbmhhdSwgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyB0aOG7gyBjdW5nIGPhuqVwIHRow7RuZyB0aW4gZ2nDoSB0cuG7iyB24buBIHNpbmggbMO9IHbDoCBwaMOhdCB0cmnhu4NuIGPhu6dhIMSR4buZbmcgduG6rXQuDQotIELhu5kgZOG7sSBsaeG7h3UgKkNoaWNrZW5XZWlnaHQqIGJhbyBn4buTbSBjw6FjIGPhu5l0IHNhdToNCiAgIA0KICAgLSAgV2VpZ2h0IChUcuG7jW5nIGzGsOG7o25nKTogQmnhur9uIG7DoHkgxJFvIGzGsOG7nW5nIHRy4buNbmcgbMaw4bujbmcgY+G7p2EgZ8OgIGNvbiB2w6AgxJHGsOG7o2MgZ2hpIGzhuqFpIGLhurFuZyDEkcahbiB24buLIGdyYW1zLiBUcuG7jW5nIGzGsOG7o25nIGPhu6dhIGfDoCBjb24gxJHGsOG7o2MgdGhlbyBkw7VpIHF1YSB0aOG7nWkgZ2lhbiDEkeG7gyDEkW8gbMaw4budbmcgc+G7sSBwaMOhdCB0cmnhu4NuIHbDoCB0xINuZyB0csaw4bufbmcgY+G7p2EgY2jDum5nLg0KDQogICAtICBUaW1lIChUaOG7nWkgZ2lhbik6IEJp4bq/biBuw6B5IHRo4buDIGhp4buHbiB0aOG7nWkgZ2lhbiBxdWFuIHPDoXQsIHRoxrDhu51uZyDEkcaw4bujYyDEkW8gYuG6sW5nIMSRxqFuIHbhu4sgbmfDoHkuIE7DsyBjaG8gYmnhur90IGtob+G6o25nIHRo4budaSBnaWFuIG3DoCBt4buXaSBxdWFuIHPDoXQgdHLhu41uZyBsxrDhu6NuZyDEkcaw4bujYyB0aOG7sWMgaGnhu4duLg0KDQogICAtICBDaGljayAoQ29uIGfDoCk6IMSQw6J5IGzDoCBz4buRIHRo4bupIHThu7EgY+G7p2EgdOG7q25nIGNvbiBnw6AgdHJvbmcgYuG7mSBk4buvIGxp4buHdS4gTeG7l2kgY29uIGfDoCBjw7MgbeG7mXQgc+G7kSB0aOG7qSB04buxIGR1eSBuaOG6pXQgxJHhu4MgcGjDom4gYmnhu4d0IGNow7puZy4NCg0KICAgLSAgRGlldCAoQ2jhur8gxJHhu5kgZGluaCBkxrDhu6FuZyk6IEJp4bq/biBuw6B5IGNo4buJIHJhIGxv4bqhaSBjaOG6vyDEkeG7mSBkaW5oIGTGsOG7oW5nIG3DoCBt4buXaSBjb24gZ8OgIMSRxrDhu6NjIGN1bmcgY+G6pXAuIEPDsyBi4buRbiBsb+G6oWkgY2jhur8gxJHhu5kgZGluaCBkxrDhu6FuZyDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyBi4buZIGThu68gbGnhu4d1LCB0aMaw4budbmcgxJHGsOG7o2MgxJHDoW5oIHPhu5EgdOG7qyAxIMSR4bq/biA0Lg0KICAgDQojICpQaMOibiB0w61jaCBk4buvIGxp4buHdSoNCg0KR+G7jWkgYuG7mSBk4buvIGxp4buHdSAqZ2dwbG90MiogxJHhu4MgZMO5bmcgaGnhu4d1IHF14bqjIGjGoW4gY2hvIGPDoWMgcGjDqXAgdMOtbmgNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kb3B0aW9ucyhyZXBvcyA9IGMoQ1JBTiA9ICJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKSkNCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShEVCkNCmBgYA0KDQpUcsaw4bubYyBo4bq/dCB0w7RpIHPhur0gZ8OhbiBi4buZIGThu68gbGnhu4d1IGNobyBiaeG6v24gY+G7pSB0aOG7gw0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjayA8LSBDaGlja1dlaWdodA0KZGF0YXRhYmxlKGNrKQ0KYGBgDQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBnw6AgdGhlbyBEaWV0DQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCg0KY2sgICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAjVOG6oW8gbeG7mXQgYuG6o25nIGThu68gbGnhu4d1IG3hu5tpIGLhurFuZyBj4buZdCBEaWV0IHbDoCB04buVbmcgY8OhYyBwaOG6p24gdOG7rQ0KIGdncGxvdCggYWVzKCB4ID0gYXMuZmFjdG9yKERpZXQpLCB5ID0gbikpICsgI0Lhuq90IMSR4bqndSBt4buZdCBiaeG7g3UgxJHhu5Mgc+G7rSBk4bulbmcgZ8OzaSBnZ3Bsb3QgduG7m2kgdHLhu6VjIHggbMOgIERpZXQsIHRy4bulYyB5IGzDoCBjw6FjIHBo4bqnbiB04butIG4NCiAgZ2VvbV9jb2woZmlsbCA9ICdza3libHVlJykgKyAjVGjDqm0gY8OhYyBj4buZdCB2w6BvIGJp4buDdSDEkeG7kywgY8OhYyBj4buZdCDEkcaw4bujYyB0aGnhur90IGzhuq1wIG3DoHUgbMOgIHNreWJsdWUNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCB2anVzdCA9IDEsIGNvbG9yID0gJ3JlZCcpICsgI3Row6ptIG5ow6NuIHPhu5EgbMaw4bujbmcgZ8OgIHbDoG8gbeG7l2kgY+G7mXQsIGPEg24gY2jhu4luaCDEkeG7mSBk4buNYyBj4bunYSBuaMOjbiBjxaluZyBuaMawIMSR4bq3dCBtw6B1IGzDoCDEkeG7jw0KICB4bGFiKCdT4buRIHRo4bupIHThu7EgQ2hpY2snKSArICPEkOG6t3QgbmjDo24gdHLhu6VjIHggDQogIHlsYWIoJ1Phu5EgbMaw4bujbmcgZ8OgJykgKyAjxJDhurd0IG5ow6NuIHRy4bulYyB5DQogIGxhYnModGl0bGUgPSAnQmnhu4N1IMSR4buTIHPhu5EgbMaw4bujbmcgZ8OgIHRoZW8gbG/huqFpIGto4bqpdSBwaOG6p24gY+G7p2EgZ8OgIGNvbicpICPEkOG6t3QgdMOqbiBjaG8gdGnDqnUgxJHhu4EgY+G7p2EgYuG6o25nIHbhur0NCmBgYA0KIA0KLSBOaMOsbiB2w6BvIHRhIHRo4bqleSBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgZ8OgIGNvbiB0csOqbiBt4buXaSBjaOG6vyDEkeG7mSBkaW5oIGTGsOG7oW5nDQotIExv4bqhaSBkaW5oIGTGsOG7oW5nIDEgbmhp4buBdSBuaOG6pXQgY8OzIDIyMCBjb24sIGxv4bqhaSAyIGPDsyAxMjAgY29uLCBsb+G6oWkgMyBjw7MgMTIwIGNvbiwgbG/huqFpIDQgY8OzIDExOCBjb24gbMOgIMOtdCBuaOG6pXQgbmjGsG5nIGtow7RuZyDEkcOhbmcga+G7gw0KDQojIyBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIFRy4buNbmcgbMaw4bujbmcgZ8OgIHRydW5nIGLDrG5oIHRoZW8gRGlldA0KDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjayAlPiUgZ3JvdXBfYnkoRGlldCkgJT4lIHN1bW1hcmlzZShhdmcgPSBtZWFuKHdlaWdodCkpICU+JSAjU+G7rSBk4bulbmcgZOG7ryBsaeG7h3UgdOG7qyBjayBuaMOzbSBj4buZdCBEaWV0IGPFqW5nIG5oxrBuZyB0w61uaCBjw6JuIG7hurduZyB0cnVuZyBiw6xuaCBj4bunYSBj4buZdCB3ZWlnaHQNCiAgIGdncGxvdChhZXMoeCA9IGFzLmZhY3RvcihEaWV0KSwgeSA9IGF2ZykpICsgI0Lhuq90IMSR4bqndSBt4buZdCBiaeG7g3UgxJHhu5Mgc+G7rSBk4bulbmcgZ8OzaSBnZ3Bsb3QgduG7m2kgdHLhu6VjIHggbMOgIERpZXQsIHRy4bulYyB5IGzDoCBsxrDhu6NuZyB0cnVuZyBiw6xuaCANCiAgZ2VvbV9jb2woZmlsbCA9ICd5ZWxsb3cnKSArICNUaMOqbSBjw6FjIGPhu5l0IHbDoG8gYmnhu4N1IMSR4buTLCB0aGnhur90IGzhuq1wIG3DoHUgY8OhYyBj4buZdCBsw6AgeWVsbG93DQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChhdmcsMikpLCB2anVzdCA9IDEsIGNvbG9yID0gJ3JlZCcpICsgI1Row6ptIG5ow6NuIHbhu4EgbMaw4bujbmcgdHJ1bmcgYsOsbmggdsOgbyBt4buXaSBj4buZdCwgdGhp4bq/dCBs4bqtcCBzYXUgZOG6pXUgcGjhuql5IGNo4buJIGzhuqV5IDIgY2jhu68gc+G7kSwgY8SDbiBjaOG7iW5oIMSR4buZIGThu41jIGPhu6dhIGPhu6dhIG5ow6NuIGPFqW5nIG5oxrAgbcOgdSBz4bqvYyBsw6AgxJHhu48NCiAgbGFicyggeCA9ICdsb+G6oWkgRGlldCcsIHkgPSAnVHLhu41uZyBsxrDhu6NuZyBnw6AgY29uIHRydW5nIGLDrG5oICAoZ3JhbSknLCB0aXRsZSA9ICd0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gdHJ1bmcgYsOsbmggdGhlbyBEaWV0JykgKyAjxJDhurd0IG5ow6NuIGNobyB0cuG7pWMgeCwgeSBjxaluZyBuaMawIHRpw6p1IMSR4buBIGPhu6dhIHbDuW5nIGThu68gbGnhu4d1IMSRxrDhu6NjIHbhur0NCiAgY29vcmRfZmxpcCgpICPEkOG6o28gbmfGsOG7o2MgdHLhu6VjIGPhu6dhIGJp4buDdSDEkeG7kywgdOG7qyBk4buNYyB0aMOgbmggbmdhbmcgdsOgIG5nxrDhu6NjIGzhuqFpDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHRy4buNbmcgbMaw4bujbmcgZ8OgIHRydW5nIGLDrG5oIHRoZW8gdOG7q25nIGxv4bqhaSBEaWV0DQotIExv4bqhaSAxIHRo4bqlcCBuaOG6pXQgduG7m2kgdHLhu41uZyBsxrDhu6NuZyB0cnVuZyBiw6xuaCB44bqlcCB44buJIDEwMi42NSwgdGnhur9wIMSRw7MgbMOgIGxv4bqhaSAyIGzDoCAxMjIuNTIsIGxv4bqhaSA0IGzDoCAxMzUuMjYgdsOgIGNhbyBuaOG6pXQgbMOgIGxv4bqhaSA0IHbhu5tpIHRy4buNbmcgbMaw4bujbmcgdHJ1bmcgYsOsbmggxJHhuqF0IDE0Mi45NQ0KDQojIyBCaeG7g3UgxJHhu5kgcGjDom4gdMOtY2ggdHJ1bmcgdMOibSBjw6JuIG7hurduZyAoIHRoZW8gdOG7q25nIERpZXQpDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG09IG1lZGlhbih3ZWlnaHQpKSAlPiUgI1Phu60gZOG7pW5nIGThu68gbGnhu4d1IHThu6sgY2sgdOG6oW8gbeG7mXQgYuG6o25nIGThu68gbGnhu4d1IG3hu5tpLCBuaMOzbSBj4buZdCBEaWV0IGzhuqFpIHbDoCBjaOG7jW4gZOG7sSBsaeG7h3UgbMOgIHRydW5nIHbhu4sgY+G7p2Egd2VpZ2h0IMSRxrBhIHbDoG8NCiAgZ2dwbG90KGFlcyh4ID0gRGlldCx5ID0gbSkpICsgI0No4buNbiBjaOG7iSDEkeG7i25oIHRy4bulYyB4IHPhur0gbOG6pXkgdOG7qyBEaWV0LCB0cuG7pWMgeSBsw6AgdHJ1bmcgduG7iyBj4bunYSB3ZWlnaHQNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnLCBmaWxsID0gJ3BpbmsnLCBjb2xvciA9ICdibGFjaycpICsgI3Phuq9wIHjhur9wIGPhu5l0IGThu68gbGnhu4d1LCDEkeG7lSBtw6B1IG7hu4FuLCBtw6B1IHZp4buBbg0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKyAjQ2jhu4kgxJHhu4tuaCBrw70gdOG7sSBj4buZdCBk4buvIGxp4buHdSBjw7MgZ2nDoSB0cuG7iywgZ2nDoSB0cuG7iyBzYXUgZOG6pXUgcGjhuql1IGPDsyAyLCBraG/huqNuZyBjw6FjaCBjaOG7iSDEkeG7i25oIGNoaeG7gXUgZOG7jWMgbMOgIDIsIG3DoHUgxJHhu48NCiAgbGFicyh4ID0gJ0xv4bqhaSBkaW5oIGTGsOG7oW5nJywgeSA9ICdUcnVuZyB24buLJywgdGl0bGUgPSdUcnVuZyB24buLIHRoZW8gY8OibiBu4bq3bmcgdOG7q25nIGxv4bqhaSBkaW5oIGTGsOG7oW5nJykgI2fDoW4gbmjDo24gY2hvIHRy4bulYyB4LCB5IHbDoCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTDQpgYGANCg0KLSBCaeG7g3UgxJHhu5kgY2hvIHRhIHRo4bqleSDEkcaw4bujYyB0cnVuZyB24buLLCB04burbmcgY8OzIDUwJSBwaOG6p24gdOG7rSBiw6puIHRyb25nIG5o4buPIGjGoW4gdsOgIHPhu5EgY8OybiBs4bqhaSBs4bubbiBoxqFuLiBU4bupYyB24bubaSBt4buXaSB04burbmcgbG/huqFpIGRpbmggZMaw4buhbmcsIHRydW5nIHbhu4sgdGhlbyBjw6JuIG7hurduZyBz4bq9IGtow6FjIG5oYXUuDQotIHbhu5tpIGxv4bqhaSBkaW5oIGTGsOG7oW5nIDEsIGPDsyBraG/huqNuZyA1MCUgc+G7kSBrZyDEkcaw4bujYyBnaGkgbmjhuq1uIGzDoCBuaOG7jyBoxqFuIDg4LCA1MCUgc+G7kSBrZyDEkcaw4bujYyBnaGkgbmjDom4gbMOgIGzhu5tuIGjGoW4gODgsIHRoZW8gxJHDsyB0aGkgbG/huqFpIDIgbMOgIDEwNC41LCBsb+G6oWkgMyBsw6AgMTI1LjUgdsOgIGxv4bqhaSBkaW5oIGTGsOG7oW5nIDQgbMOgIDEyOS41DQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdMawxqFuZyBxdWFuIGdp4buvYSB3ZWlnaHQgdsOgIERpZXQNCg0KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KY2sgJT4lIGdncGxvdChhZXMoeCA9IHdlaWdodCwgeSA9IFRpbWUsIGNvbG9yID0gRGlldCkpICsgI1Phu60gZOG7pW5nIGThu68gbGnhu4d1IHThu6sgY2sgdOG6oW8gbeG7mXQgYuG6o25nIGThu68gbGnhu4d1IG3hu5tpIHRyb25nIGfDs2kgZ2dwbG90LCB0aGnhur90IGzhuq1wIHRy4bulYyB4LCB5LCBwaMOibiBsb+G6oWkgY8OhYyDEkWnhu4NtIHRoZW8gdOG7q25nIGxv4bqhaSBkaW5oIGTGsOG7oW5nIHbDoCBwaMOibiBi4buRIG3DoHUgY2hvIGNow7puZw0KICBnZW9tX3BvaW50KCkgKyAjVGjDqm0gY8OhYyDEkWnhu4NtIHbDoG8gYmnhu4N1IMSR4buTLCBt4buXaSDEkWnhu4NtIGzDoCBt4buZdCBxdWFuIHPDoXQgxJHGsOG7o2MgxJHhu5FpIGNoaeG6v3UgdGhlbyB0cuG7pWMgeCB2w6AgeQ0KICBsYWJzKCB4ID0gJ2PDom4gbuG6t25nIGfDoCBjb24nLCB5ID0gJ1Ro4budaSBnaWFuIHF1YW4gc8OhdCcsIHRpdGxlID0gJ1TGsMahbmcgcXVhbiBnaeG7r2EgZ8OgIGNvbiB2w6AgY8OibiBu4bq3bmcgdGhlbyBsb+G6oWkgZGluaCBkxrDhu6FuZycpICPEkOG6t3QgbmjDo24gY2hvIHRy4bulYyB4IHbDoCB5LCB0aGnhur90IGzhuq1wIGzhuqFpIHTDqm4gdGnDqnUgxJHhu4EgbeG7m2kgY2hvIHbDuW5nIGThu68gbGnDquG7pQ0KYGBgDQoNCi0gIEJp4buDdSDEkeG7mSBjaG8gdGEgdGjhuqV5IHTGsOG7o25nIHF1YW4gZ2nhu69hIGPDom4gbuG6t25nIGfDoCBjb24gdGhlbyB0aOG7nWkgZ2lhbiBxdWFuIHPDoXQgY2jDum5nIHRoZW8gdOG7q25nIGxv4bqhaSBkaW5oIGTGsOG7oW5nDQotICBUYSB0aOG6pXkgxJHGsOG7o2MgY8OibiBu4bq3bmcgZ8OgIGNvbiBjw6BuZyBs4bubbiB0aMOsIHRow7JpIGdpYW4gcXVhbiBzw6F0IGPFqW5nIHBo4bqjaSBsw6J1LCB0w7l5IHRoZW8gbG/huqFpIGRpbmggZMaw4buhbmcgY8OzIOG6o25oIGjGsOG7n25nIHThu5tpIGPDom4gbuG6t25nIGPhu6dhIGfDoCBjb24NCi0gIE3huq10IMSR4buZIGRpbmggZMaw4buhbmcgY+G7p2EgbG/huqFpIDQsIDEgcGjDom4gYuG7lSBy4bqldCBkw6B5IHbhu5tpIGfDoCBjb24gdHJvbmcga2hv4bqjbmcgMCDEkeG6v24gMjAwIGdhbS4NCg0KIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIERpZXQgdGhlbyBQaWUgY2hhcnQNCg0KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KY2sgJT4lIGdyb3VwX2J5KERpZXQpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JSAjVOG6oW8gYuG6o25nIGThu68gbGnhu4d1IG3hu5tpIGPDoWMgY8OhYyBj4buZbmcgRGlldCB2w6AgdOG7lW5nIG4NCiAgZ2dwbG90KGFlcyh4PSAnJywgeT1uLCBmaWxsID0gRGlldCkpKyAjQuG6r3QgxJHhuqd1IG3hu5l0IGJp4buDdSDEkeG7kyBz4butIGThu6VuZyBnw7NpIGdncGxvdCB24bubaSB0cuG7pWMgeCBraMO0bmcgY8OzIGThu68gbGnhu4d1LCB0cuG7pWMgeSBsw6AgY8OhYyBwaOG6p24gdOG7rSBuLCB2w6AgbcOgdSBz4bqvYyDEkcaw4bujYyB0aMOqbSB2w6BvIHBow6JuIGJp4buHdCBjw6FjIGxv4bqhaSBEaWV0DQogIGdlb21fY29sKGNvbG9yID0gJ2JsYWNrJywgd2lkdGggPSAxKSArICNUaMOqbSBjw6FjIGPhu5l0IHbDoG8gYmnhu4N1IMSR4buTLCBt4buXaSBj4buZdCBsw6AgbeG7mXQgbG/huqFpIGRpbmggZMaw4buhbmcgY8WpbmcgbmjGsCDEkeG7mSBy4buZbmcgbMOgIDENCiAgY29vcmRfcG9sYXIoJ3knKSArICNDaHV54buDbiDEkeG7lWkgYmnhu4N1IMSR4buTIHRow6BuaCBo4buHIHThu41hIMSR4buZIGPhu7FjLCBiaeG7g3UgdGjhu4sgY8OhYyBwaOG6p24gdMawxqFuZyDEkeG7kWkgdHJvbmcgbeG7mXQgdsOybmcgdHLDsm4NCiAgZ2VvbV90ZXh0KGFlcyh4ID0gMS40LCBsYWJlbCA9IG4pLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpKSArICNDw6FjIG5ow6NuIHPhur0gxJHhuq10IOG7nyB24buLIHRyw60gMS4zIHRyw6puIHRy4bulYyB4LCB0cuG7pWMgeSBoaeG7g24gdGjhu4sgc+G7kSBsxrDhu6NuZyB2w6AgIGPDoWMgbmjDo24gxJHGsOG7o2MgY2jhu5NuZyB24bubaSBuaGF1IGzDqm4gY8SDbiBjaOG7iW5oIOG7nyB24buLIHRyw60gLjUNCiAgbGFicyggdGl0bGUgPSAnU+G7kSBsxrDhu6NuZyBEaWV0JykgKyAjVGjDqm0gcGjhuqduIHRpw6p1IMSR4buBIHbDoG8gdsO5bmcgduG6vSBiaeG7g3UgxJHhu5MNCiAgdGhlbWVfdm9pZCgpICNMb+G6oWkgYuG7jyBjw6FjIHBo4bqnbiBt4bq3YyDEkeG7i25oIGPhu6dhIGdpYW8gZGnhu4duIGPhu6dhIGJp4buDdSDEkeG7kywgY2jhu4kgaGnhu4NuIHRo4buLIGThu68gbGnhu4d1IHbDoCBjw6FjIHnhur91IHThu5EgdHLhu7FjIHRp4bq/cCBsacOqbiBxdWFuIMSR4bq/biBuw7MuIA0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIGNobyB0YSB0aOG6pXkgc+G7kSBsxrDhu6NuZyBnw6AgY29uIGPhu6dhIHThu6tuZyBsb+G6oWkgZGluaCBkxrDhu6FuZyBuaMawbmcg4bufIGThuqFuZyBQaWUgY2hhcnQNCi0gduG7m2kgbG/huqFpIDEgbMOgIDIyMCBjb24gbMOgIGzhu5tuIG5o4bqldCB2w6AgbG/huqFpIDQgbMOgIMOtdCBuaOG6pXQgduG7m2kgMTE4IGNvbg0KDQojIyBCaeG7g3UgxJHhu5MgZGVuc2l0eSB0aOG7gyBoaeG7h24gd2VpZ2h0IHbDoCBEaWV0IHRoZW8gc+G7kSBsxrDhu6NuZw0KDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjayAlPiUgZ2dwbG90KCBhZXMoeCA9IHdlaWdodCwgZmlsbCA9IGFzLmZhY3RvcihEaWV0KSkpICsNCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSArICAjIFRoaeG6v3QgbOG6rXAgxJHhu5kgbeG7nSBj4bunYSBjw6FjIMSRxrDhu51uZyBkZW5zaXR5DQogIGxhYnModGl0bGUgPSAiRGVuc2l0eSBwbG90IGPhu6dhIHRy4buNbmcgbMaw4bujbmcgZ8OgIGNvbiB0aGVvIGxv4bqhaSBraOG6qXUgcGjhuqduIiwgeCA9ICJUcuG7jW5nIGzGsOG7o25nIChncmFtcykiLCB5ID0gIk3huq10IMSR4buZIikgKw0KICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiTG/huqFpIGto4bqpdSBwaOG6p24iKSArICAjIFRow6ptIGNow7ogdGjDrWNoIGNobyBmaWxsDQogIHRoZW1lX21pbmltYWwoKSMgQ2jhu41uIHRoZW1lIGNobyBiaeG7g3UgxJHhu5MNCmBgYA0KDQotIEJp4buDdSDEkeG7kyBjaG8gdGEgdGjhuqV5IHPhu7EgcGjDom4gYuG7kSB0cuG7jW5nIGzGsOG7o25nIHRyb25nIG3hu5dpIG5ow7NtIHbhu5tpIHThu6tuZyBsb+G6oWkga2jhuql1IHBo4bqnbiBkaW5oIGTGsOG7oW5nIGNobyBnw6AgY29uIHJpw6puZyBiaeG7h3QNCi0gTeG6rXQgxJHhu5kgbG/huqFpIG3hu5l0IGNoaeG6v20gcuG6pXQgY2FvIHbDoCBkw6B5IHRyb25nIGtob+G6o25nIHThu6sgMTAwIMSR4bq/biBu4butYSAyMDBnIHLhu5NpIGzDoG0gZ2nhuqNtIG3hu5l0IGPDoWNoIHLDtSBy4buHdCwgdGnhur9wIMSRw7MgbMOgIGxv4bqhaSAyIHbDoCB4deG7kW5nIGzhuqduIHThu5tpIGxv4bqhaSAzLDQNCi0gS2hvYW5nIGPDsyBz4buxIGNow6puaCBs4buHbmggcXXDoSBs4bubbiB04burIGtob+G6o25nIG7hu61hIDEwMCDEkeG6v24gMjAwZyB0cuG7nyDEkWkgY+G7p2Ega2jhuql1IHBo4bqnbiAxLCAyLCAzLCBMb+G6oWkgZGluaCBkxrDhu6FuZyA0IOG6o25oIGjGsOG7n25nIGzhu5tuIMSR4bq/biBjw6JuIG7hurduZyB04burIDEwMCDEkeG6v24gMjAwZyBj4bunYSBnw6AgY29uDQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbeG6rXQgxJHhu5kgdHLhu41uZyB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gKERlbnNpdHkgcGxvdCkNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBnZ3Bsb3QoIGFlcyh4ID0gd2VpZ2h0LCBmaWxsID0gYXMuZmFjdG9yKERpZXQpKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpICsgICMgVGhp4bq/dCBs4bqtcCDEkeG7mSBt4budIGPhu6dhIGPDoWMgxJHGsOG7nW5nIGRlbnNpdHkNCiAgZmFjZXRfd3JhcCh+RGlldCkgKyAjUGjDom4gdOG7lSBjw6FjIGJp4buDdSDEkeG7kyBuaOG7jyBoxqFuIHRoZW8gRGlldA0KICBsYWJzKHRpdGxlID0gIkRlbnNpdHkgcGxvdCBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gdGhlbyBsb+G6oWkga2jhuql1IHBo4bqnbiIsIHggPSAiVHLhu41uZyBsxrDhu6NuZyAoZ3JhbXMpIiwgeSA9ICJN4bqtdCDEkeG7mSIpICsNCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIkxv4bqhaSBraOG6qXUgcGjhuqduIikgICMgVGjDqm0gY2jDuiB0aMOtY2ggY2hvIGZpbGwNCmBgYA0KDQotIFTGsMahbmcgdOG7sSBuaMawIGJp4buDdSDEkeG7kyB0csOqbiwgbeG7l2kgcGjhuqduIG5o4buPIGNo4buJIHJhIG3huq10IMSR4buZIHRy4buNbmcgbMaw4bujbmcga2hpIGNobyBjw6FjIGxv4bqhaSBraOG6qXUgcGjhuqduIHJpw6puZyBiaeG7h3QgxJHhu5FpIHbhu5tpIGfDoCBjb24NCi0gTG/huqFpIGto4bqpdSBwaOG6p24gMSB24bubaSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gMTAwZyDEkeG7lSBs4bqhaSBy4bqldCBuaGnhu4F1DQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBnw6AgdGhlbyBEaWV0DQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAjTmjDs20gY8OhYyBkw7JuZyBk4buvIGxp4buHdSBj4bunYSBjayB0aGVvIGPhu5l0IERpZXQsIHNhdSDEkcOzIHTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nIGNobyBt4buXaSBuaMOzbQ0KICBnZ3Bsb3QoYWVzKHggPSAnJywgeSA9IG4sZmlsbCA9IERpZXQpKSArICNT4butIGThu6VuZyBk4buvIGxp4buHdSB04burIGLGsOG7m2MgdHLGsOG7m2MgdGhp4bq/dCBs4bqtcCBiaeG7g3UgxJHhu5MgduG7m2kgdHLhu6VjIHggbMOgIGtow7RuZyBjw7MgZOG7ryBsaeG7h3UsIHkgbMOgIG4sIG3DoHUgc+G6r2MgxJFjIMOhbmggeOG6oSB2w6BvIERpZXQNCiAgZ2VvbV9jb2woIGNvbG9yID0gJ2JsYWNrJyApICsgI1Row6ptIGPDoWMgY+G7mXQgdsOgbyBiaeG7g3UgxJHhu5MsIHbhu5tpIG3DoHUgxJHGsOG7o2MgdGhp4bq/dCBs4bqtcCBsw6AgbcOgdSDEkWVuDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMSkpICsgI1Row6ptIG5ow6NuIHbDoG8gYmnhu4N1IMSR4buTLCBoaeG7g24gdGjhu4sgc+G7kSBsxrDhu6NuZyBnw6AgY29uIHRyw6puIG3hu5dpIGPhu5l0LCBjxINuIGNo4buJbmggduG7iyB0csOtIGThu41jIGPDoWMgbmjDo24sIMSR4bq3dCB0csOqbiBjw7luZyBt4buXaSBj4buZdA0KICBsYWJzKCB5ID0gJ3Phu5EgbMaw4bujbmcnLCB0aXRsZSA9ICdz4buRIGzGsOG7o25nIGfDoCBjb24gY2hvIG3hu5dpIGNo4bq/IMSR4buZIGRpbmggZMaw4buhbmcnKSAjVGhp4bq/dCBs4bqtcCBuaMOjbiBjaG8gdHLhu6UgeSwgdGnDqnUgxJHhu4EgY+G7p2EgdsO5bmcgZOG7ryBsaeG7h3UgxJHGsOG7o2MgduG6vQ0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBjaG8gdGEgdGjhuqV5IHPhu5EgbMaw4bujbmcgZ8OgIGNvbiB0aGVvIHThu6tuZyBsb+G6oWkgZGluaCBkxrDhu6FuZywgY8OhYyBz4buRIGxp4buHdSDEkcaw4bujYyBjaOG7k25nIHRoZW8gbeG7mXQgY+G7mXQgdsOgIHTDuXkgdGhlbyBz4buRIGzGsOG7o25nIG3DoCDEkeG7mSBkw6B5IGtow6FjIG5oYXUNCi0gTG/huqFpIGRpbmggZMaw4buhbmcgMSBjw7MgxJHhu5kgZMOgeSBjaGnhur9tIMawdSB0aOG6vywgc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCwgMyBsb+G6oWkga2lhIGtow7RuZyBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDDQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdMawxqFuZyBxdWFuIGdp4buvYSBjw6JuIG7hurduZyBnw6AgY29uIHbDoCBsb+G6oWkgZGluaCBkxrDhu6FuZyB0aGVvIERpZXQNCg0KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KY2sgJT4lIGdncGxvdChhZXMoeCA9IHdlaWdodCwgeSA9IFRpbWUsIGNvbG9yID0gRGlldCkpICsgI1Phu60gZOG7pW5nIGThu68gbGnhu4d1IHThu6sgY2sgdOG6oW8gbeG7mXQgYuG6o25nIGThu68gbGnhu4d1IG3hu5tpIHRyb25nIGfDs2kgZ2dwbG90LCB0aGnhur90IGzhuq1wIHRy4bulYyB4LCB5LCBwaMOibiBsb+G6oWkgY8OhYyDEkWnhu4NtIHRoZW8gdOG7q25nIGxv4bqhaSBkaW5oIGTGsOG7oW5nIHbDoCBwaMOibiBi4buRIG3DoHUgY2hvIGNow7puZw0KICBnZW9tX3BvaW50KCkgKyAjVGjDqm0gY8OhYyDEkWnhu4NtIHbDoG8gYmnhu4N1IMSR4buTLCBt4buXaSDEkWnhu4NtIGzDoCBt4buZdCBxdWFuIHPDoXQgxJHGsOG7o2MgxJHhu5FpIGNoaeG6v3UgdGhlbyB0cuG7pWMgeCB2w6AgeQ0KICBsYWJzKCB4ID0gJ2PDom4gbuG6t25nIGfDoCBjb24nLCB5ID0gJ1Ro4budaSBnaWFuIHF1YW4gc8OhdCcsIHRpdGxlID0gJ1TGsMahbmcgcXVhbiBnaeG7r2EgZ8OgIGNvbiB2w6AgY8OibiBu4bq3bmcgdGhlbyBsb+G6oWkgZGluaCBkxrDhu6FuZycpICsgICPEkOG6t3QgbmjDo24gY2hvIHRy4bulYyB4IHbDoCB5LCB0aGnhur90IGzhuq1wIGzhuqFpIHTDqm4gdGnDqnUgxJHhu4EgbeG7m2kgY2hvIHbDuW5nIGThu68gbGnDquG7pQ0KZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgY29sb3IgPSAnYmxhY2snKQ0KYGBgDQoNCi0gxJDGsOG7nW5nIHRyZW5kIGxpbmUgY8OzIHh1IGjGsOG7m25nIGzDqm4gdHLDqm4sIG3hu5FpIHTGsMahbmcgcXVhbiBkxrDGoW5nIGdp4buvYSBjw6FjIGThu68gbGnhu4d1DQotIFbhu5tpIGPDom4gbuG6t25nIGfDoCBjb24gbOG7m24sIHBo4bqjaSBi4buVIHN1bmcgZGluaCBkxrDhu6FuZyB0aGVvIMSRw7MgbcOgIHRo4budaSBnaWFuIHF1YW4gc8OhdCBjxaluZyBz4bq9IHBo4bqjaSB0xINuZyBsw6puDQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG7tyBs4buHIGRpbmggZMaw4buhbmcgdGhlbyBEaWV0IA0KICANCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAgI05ow7NtIGPDoWMgY+G7mXQgZOG7ryBsaeG7h3UgdGhlbyBnacOhIHRy4buLIHRyb25nIGPhu5l0IERpZXQNCiAgZ2dwbG90KGFlcyhEaWV0LG4pKSArICNT4butIGThu6VuZyBk4buvIGxp4buHdSB0csaw4bubYyDEkcOzLCDDoW5oIHjhuqEgdHLhu6VuZyB4IGzDoCBj4buZdCBEaWV0LCB0cuG7pWMgeSBsw6AgY+G7mXQgbg0KICBnZW9tX2NvbChmaWxsPSdncmVlbicpICsgI1Row6ptIGPDoWMgY+G7mXQgdsOgbyBiaeG7g3UgxJHhu5MsIG3DoHUgY+G7p2EgY8OhYyBj4buZdCB4YW5oIGzDoSBjw6J5DQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKGNrJERpZXQpKSksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArICN0aMOqbSBuaMOjbiBjaG8gY8OhYyBj4buZdCBj4bunYSBiaeG7g3UgxJHhu5MsIOG7nyDEkcOieSBsw6AgcGjhuqduIHRyxINtIHPhu5EgbMaw4bujbmcgbeG7l2kgbG/huqFpIERpZXQgdHLDqm4gdOG7lW5nLCBjxINuIGNo4buJbmggY2hp4buBdSBk4buNYyB2w6AgbcOgdSDEkeG7jyBjaG8gbmjDo24NCiAgbGFicyh4ID0gJ0xv4bqhaSBkaW5oIGTGsOG7oW5nJywgeSA9ICdT4buRIGzGsOG7o25nJywgdGl0bGUgPSAnVOG7tyBs4buHIGxv4bqhaSBkaW5oIGTGsOG7oW5nJykgI1Row6ptIG5ow6NuIGNobyB0cuG7pWMgeCwgdHLhu6VjIHkgdsOgIHRpw6p1IMSR4buBDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgY2hvIHRhIHRo4bqleSBwaOG6p24gdHLEg20gc+G7kSBsxrDhu6NuZyBnw6AgY29uIHRyb25nIG3hu5dpIGxv4bqhaSBkaW5oIGTGsOG7oW5nIMSRxrDhu6NjIG51w7RpDQotIExv4bqhaSBkaW5oIGTGsOG7oW5nIHPhu5EgMSBjw7Mgc+G7kSBsxrDhu6NuZyBnw6AgY29uIGNoaeG6v20gMzguNiUsIGxv4bqhaSBkaW5oIGTGsOG7oW5nIHPhu5EgMiwzIGPDsyAyMC43NiUgdOG7lW5nIHPhu5EgbMaw4bujbmcgZ8OgIGNvbiwgY8OybiBs4bqhaSBsw6AgbG/huqFpIGRpbmggZMaw4buhbmcgc+G7kSA0IHPhu5EgbMaw4bujbmcgZ8OgIGNvbiBjaGnhur9tIDIwLjQyJS4NCg0KIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBUxrDGoW5nIHF1YW4gZ2nhu69hIGPDom4gbuG6t25nIGfDoCBjb24gdsOgIHRo4budaSBnaWFuIHF1YW4gc8OhdCB0aGVvIGxv4bqhaSBEaWV0DQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBnZ3Bsb3QoYWVzKHggPSB3ZWlnaHQsIHkgPSBUaW1lLCBjb2xvciA9IERpZXQpKSArICNT4butIGThu6VuZyBk4buvIGxp4buHdSB04burIGNrIHThuqFvIG3hu5l0IGLhuqNuZyBk4buvIGxp4buHdSBt4bubaSB0cm9uZyBnw7NpIGdncGxvdCwgdGhp4bq/dCBs4bqtcCB0cuG7pWMgeCwgeSwgcGjDom4gbG/huqFpIGPDoWMgxJFp4buDbSB0aGVvIHThu6tuZyBsb+G6oWkgZGluaCBkxrDhu6FuZyB2w6AgcGjDom4gYuG7kSBtw6B1IGNobyBjaMO6bmcNCiAgZ2VvbV9wb2ludCgpICsgI1Row6ptIGPDoWMgxJFp4buDbSB2w6BvIGJp4buDdSDEkeG7kywgbeG7l2kgxJFp4buDbSBsw6AgbeG7mXQgcXVhbiBzw6F0IMSRxrDhu6NjIMSR4buRaSBjaGnhur91IHRoZW8gdHLhu6VjIHggdsOgIHkNCiAgbGFicyggeCA9ICdjw6JuIG7hurduZyBnw6AgY29uJywgeSA9ICdUaOG7nWkgZ2lhbiBxdWFuIHPDoXQnLCB0aXRsZSA9ICdUxrDGoW5nIHF1YW4gZ2nhu69hIGfDoCBjb24gdsOgIGPDom4gbuG6t25nIHRoZW8gbG/huqFpIGRpbmggZMaw4buhbmcnKSArICAjxJDhurd0IG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgeSwgdGhp4bq/dCBs4bqtcCBs4bqhaSB0w6puIHRpw6p1IMSR4buBIG3hu5tpIGNobyB2w7luZyBk4buvIGxpw6rhu6UNCmdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGNvbG9yID0gJ2dyZWVuJykgKyAjVGjDqm0gxJHGsOG7nW5nIHBow7kgaOG7o3AgdHV54bq/biB0w61uaCwgYuG6sW5nIHBoxrDGoW5nIHBow6FwIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oDQogIGZhY2V0X3dyYXAofkRpZXQpICNQaMOibiBsb+G6oWkgY8OhYyBi4bqjbmcgbmjhu48gaMahbiB0aGVvIGxv4bqhaSBEaWV0DQpgYGANCg0KLSBDw6JuIG7hurduZyBnw6AgY29uIHTDuXkgdGhlbyB04burbmcgbG/huqFpIGRpbmggZMaw4buhbmcgY8OzIHh1IGjGsOG7m25nIHTEg25nIHRoZW8gdGjhu51pIGdpYW4gcXVhbiBzw6F0DQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbMaw4bujbmcgY8OibiBu4bq3bmcgdHJ1bmcgYsOsbmggdGhlbyBEaWV0ICggROG6oW5nIFBpZSApDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG49bWVhbih3ZWlnaHQpKSAlPiUgI1ThuqFvIGLhuqNuZyBk4buvIGxp4buHdSBt4bubaSBjw6FjIGPDoWMgY+G7mW5nIERpZXQgdsOgIHTDrW5oIGzGsOG7o25nIHRydW5nIGLDrG5oIA0KICBnZ3Bsb3QoYWVzKHg9ICcnLCB5PW4sIGZpbGwgPSBEaWV0KSkrICNC4bqvdCDEkeG6p3UgbeG7mXQgYmnhu4N1IMSR4buTIHPhu60gZOG7pW5nIGfDs2kgZ2dwbG90IHbhu5tpIHRy4bulYyB4IGtow7RuZyBjw7MgZOG7ryBsaeG7h3UsIHRy4bulYyB5IGzDoCBjw6FjIHBo4bqnbiB04butIG4sIHbDoCBtw6B1IHPhuq9jIMSRxrDhu6NjIHRow6ptIHbDoG8gcGjDom4gYmnhu4d0IGPDoWMgbG/huqFpIERpZXQNCiAgZ2VvbV9jb2woY29sb3IgPSAnYmxhY2snLCB3aWR0aCA9IDEpICsgI1Row6ptIGPDoWMgY+G7mXQgdsOgbyBiaeG7g3UgxJHhu5MsIG3hu5dpIGPhu5l0IGzDoCBt4buZdCBsb+G6oWkgZGluaCBkxrDhu6FuZyBjxaluZyBuaMawIMSR4buZIHLhu5luZyBsw6AgMQ0KICBjb29yZF9wb2xhcigneScpICsgI0NodXnhu4NuIMSR4buVaSBiaeG7g3UgxJHhu5MgdGjDoG5oIGjhu4cgdOG7jWEgxJHhu5kgY+G7sWMsIGJp4buDdSB0aOG7iyBjw6FjIHBo4bqnbiB0xrDGoW5nIMSR4buRaSB0cm9uZyBt4buZdCB2w7JuZyB0csOybg0KICBnZW9tX3RleHQoYWVzKHggPSAxLjMsIGxhYmVsID0gcm91bmQobiwyKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSkpICsgI0PDoWMgbmjDo24gc+G6vSDEkeG6rXQg4bufIHbhu4sgdHLDrSAxLjMgdHLDqm4gdHLhu6VjIHgsIHRy4bulYyB5LCB0w61uaCBnacOhIHRy4buLIHRydW5nIGLDrG5oIHbDoCBs4bqleSBoYWkgZ2nDoSB0cuG7iyBzYXUgxJHDsywgaGnhu4NuIHRo4buLIHPhu5EgbMaw4bujbmcgdsOgICBjw6FjIG5ow6NuIMSRxrDhu6NjIGNo4buTbmcgduG7m2kgbmhhdSBsw6puIGPEg24gY2jhu4luaCDhu58gduG7iyB0csOtIC41DQogIGxhYnMoIHRpdGxlID0gJ1Ry4buNbmcgbMaw4bujbmcgdHJ1bmcgYsOsbmgnKSArICNUaMOqbSBwaOG6p24gdGnDqnUgxJHhu4EgdsOgbyB2w7luZyB24bq9IGJp4buDdSDEkeG7kw0KICB0aGVtZV92b2lkKCkgI0xv4bqhaSBi4buPIGPDoWMgcGjhuqduIG3hurdjIMSR4buLbmggY+G7p2EgZ2lhbyBkaeG7h24gY+G7p2EgYmnhu4N1IMSR4buTLCBjaOG7iSBoaeG7g24gdGjhu4sgZOG7ryBsaeG7h3UgdsOgIGPDoWMgeeG6v3UgdOG7kSB0cuG7sWMgdGnhur9wIGxpw6puIHF1YW4gxJHhur9uIG7Dsy4gDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHRy4buNbmcgbMaw4bujbmcgZ8OgIGNvbiB0cnVuZyBiw6xuaCB0aGVvIHThu6tuZyBsb+G6oWkgZGluaCBkxrDhu6FuZw0KLSBMb+G6oWkgMSBjw7MgdHLhu41uZyBsxrDhu6NuZyB0cnVuZyBiw6xuaCBsw6AgMTAyLjY1LCBsb+G6oWkgMiBsw6AgMTIyLjYyLCBsb+G6oWkgMyBsw6AgMTQyLjk1LCBsb+G6oWkgNCBsw6AgMTM1LjI2DQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdGjhu51pIGdpYW4gdHJ1bmcgYsOsbmggdGhlbyBEaWV0ICggZOG6oW5nIFBpZSApDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBncm91cF9ieShEaWV0KSAlPiUgc3VtbWFyaXNlKG49bWVhbihUaW1lKSkgJT4lICNU4bqhbyBi4bqjbmcgZOG7ryBsaeG7h3UgbeG7m2kgY8OhYyBjw6FjIGPhu5luZyBEaWV0IHbDoCB0w61uaCB0aOG7nWkgZ2lhbiB0cnVuZyBiw6xuaCANCiAgZ2dwbG90KGFlcyh4PSAnJywgeT1uLCBmaWxsID0gRGlldCkpKyAjQuG6r3QgxJHhuqd1IG3hu5l0IGJp4buDdSDEkeG7kyBz4butIGThu6VuZyBnw7NpIGdncGxvdCB24bubaSB0cuG7pWMgeCBraMO0bmcgY8OzIGThu68gbGnhu4d1LCB0cuG7pWMgeSBsw6AgY8OhYyBwaOG6p24gdOG7rSBuLCB2w6AgbcOgdSBz4bqvYyDEkcaw4bujYyB0aMOqbSB2w6BvIHBow6JuIGJp4buHdCBjw6FjIGxv4bqhaSBEaWV0DQogIGdlb21fY29sKGNvbG9yID0gJ2JsYWNrJywgd2lkdGggPSAxKSArICNUaMOqbSBjw6FjIGPhu5l0IHbDoG8gYmnhu4N1IMSR4buTLCBt4buXaSBj4buZdCBsw6AgbeG7mXQgbG/huqFpIGRpbmggZMaw4buhbmcgY8WpbmcgbmjGsCDEkeG7mSBy4buZbmcgbMOgIDENCiAgY29vcmRfcG9sYXIoJ3knKSArICNDaHV54buDbiDEkeG7lWkgYmnhu4N1IMSR4buTIHRow6BuaCBo4buHIHThu41hIMSR4buZIGPhu7FjLCBiaeG7g3UgdGjhu4sgY8OhYyBwaOG6p24gdMawxqFuZyDEkeG7kWkgdHJvbmcgbeG7mXQgdsOybmcgdHLDsm4NCiAgZ2VvbV90ZXh0KGFlcyh4ID0gMS4zLCBsYWJlbCA9IHJvdW5kKG4sMikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpKSArICNDw6FjIG5ow6NuIHPhur0gxJHhuq10IOG7nyB24buLIHRyw60gMS4zIHRyw6puIHRy4bulYyB4LCB0cuG7pWMgeSwgdMOtbmggZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCB2w6AgbOG6pXkgaGFpIGdpw6EgdHLhu4sgc2F1IMSRw7MsIGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIHbDoCAgY8OhYyBuaMOjbiDEkcaw4bujYyBjaOG7k25nIHbhu5tpIG5oYXUgbMOqbiBjxINuIGNo4buJbmgg4bufIHbhu4sgdHLDrSAuNQ0KICBsYWJzKCB0aXRsZSA9ICdUaOG7nWkgZ2lhbiB0cnVuZyBiw6xuaCcpICsgI1Row6ptIHBo4bqnbiB0acOqdSDEkeG7gSB2w6BvIHbDuW5nIHbhur0gYmnhu4N1IMSR4buTDQogIHRoZW1lX3ZvaWQoKSAjTG/huqFpIGLhu48gY8OhYyBwaOG6p24gbeG6t2MgxJHhu4tuaCBj4bunYSBnaWFvIGRp4buHbiBj4bunYSBiaeG7g3UgxJHhu5MsIGNo4buJIGhp4buDbiB0aOG7iyBk4buvIGxp4buHdSB2w6AgY8OhYyB54bq/dSB04buRIHRy4buxYyB0aeG6v3AgbGnDqm4gcXVhbiDEkeG6v24gbsOzLiANCmBgYA0KDQotIFRo4budaSBnaWFuIHF1YW4gc8OhdCB0cnVuZyBiw6xuaCBj4bunYSBnw6AgY29uIHRoZW8gdOG7q25nIGxv4bqhaSBkaW5oIGTGsOG7oW5nDQotIExv4bqhaSBkaW5oIGTGsOG7oW5nIDEgY8OzIHRo4budaSBnaWFuIHF1YW4gc8OhdCB0cnVuZyBiw6xuaCBsw6AgMTAuNDgsIGxv4bqhaSAyIGzDoCAxMC45MiwgbG/huqFpIDMgbMOgIDEwLjkyIGPDsm4gbG/huqFpIDQgbMOgIDEwLjc1DQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG6p24gc3XhuqV0IHh14bqldCBoaeG7h24gdHLhu41uZyBsxrDhu6NuZyBnw6AgY29uDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBnZ3Bsb3QoYWVzKHggPSB3ZWlnaHQpKSArICNC4bqvdCDEkeG6p3UgbeG7mXQgYmnhu4N1IMSR4buTIGdncGxvdCB24bubaSB0cuG7pWMgeCDEkcaw4bujYyB0aGnhur90IGzhuq1wIGzDoCBj4buZdCAid2VpZ2h0Ig0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwLCBmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIsIGFlcyh5PS4uY291bnQuLikpICsgI1RoaeG6v3QgbOG6rXAgZOG7ryBsaeG7h3UgaGnhu4NuIHRo4buLIGTGsOG7m2kgZOG6oW5nIGhpc3RvZ3JhbSwgxJHhurd0IGNoaeG7gXUgcuG7mW5nIGJpbiwgbcOgdSBu4buBbiB2w6Agdmnhu4FuLCBz4butIGThu6VuZyB04bqnbiBzdeG6pXQgdHV54buHdCDEkeG7kWkNCiAgbGFicyh4ID0gIlRy4buNbmcgbMaw4bujbmcgKGcpIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArICNUaGnhur90IGzhuq1wIG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkNCiAgZ2d0aXRsZSgiUGjDom4gcGjhu5FpIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgZ8OgIGNvbiIpICsgI1RoaeG6v3QgbOG6rXAgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kw0KICB0aGVtZV9taW5pbWFsKCkgI0No4buNbiBnaWFvIGRp4buHbiDEkcahbiBnaeG6o24sIMSRxrDhu51uZyBsxrDhu5tpIGNobyBiaeG7g3UgxJHhu5MNCmBgYA0KDQotIEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IHThuqduIHN14bqldCBzdeG6pXQgaGnhu4duIGPDoWMgY2jhu4kgc+G7kSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24NCi0gdOG6p24gc3XhuqV0IHh14bqldCBoaeG7h24gY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBkxrDhu5tpIDEwMGcgeHXhuqV0IGhp4buHbiBuaGnhu4F1IG5o4bqldCBoxqFuIDIwMCBs4bqnbiB2w6AgZ2nhuqNtIGThuqduDQoNCiMjIEJp4buDdSDEkeG7kyBwaMOibiBwaOG7kWkgdHJvbmcgbMaw4bujbmcgZ8OgIGNvbiB24bubaSB04bqnbiBzdeG6pXQgICh0aGVvIERpZXQpDQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBnZ3Bsb3QoYWVzKHggPSB3ZWlnaHQpKSArICNC4bqvdCDEkeG6p3UgbeG7mXQgYmnhu4N1IMSR4buTIGdncGxvdCB24bubaSB0cuG7pWMgeCDEkcaw4bujYyB0aGnhur90IGzhuq1wIGzDoCBj4buZdCAid2VpZ2h0Ig0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUwLCBmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIsIGFlcyh5PS4uY291bnQuLikpICsgI1RoaeG6v3QgbOG6rXAgZOG7ryBsaeG7h3UgaGnhu4NuIHRo4buLIGTGsOG7m2kgZOG6oW5nIGhpc3RvZ3JhbSwgxJHhurd0IGNoaeG7gXUgcuG7mW5nIGJpbiwgbcOgdSBu4buBbiB2w6Agdmnhu4FuLCBz4butIGThu6VuZyB04bqnbiBzdeG6pXQgdHV54buHdCDEkeG7kWkNCiAgbGFicyh4ID0gIlRy4buNbmcgbMaw4bujbmcgKGcpIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArICNUaGnhur90IGzhuq1wIG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkNCiAgZmFjZXRfd3JhcCh+RGlldCkgKyAjUGjDom4gbG/huqFpIGPDoWMgYuG6o25nIG5o4buPIHRoZW8gbG/huqFpIERpZXQNCiAgZ2d0aXRsZSgiUGjDom4gcGjhu5FpIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgZ8OgIGNvbiIpICAjVGhp4bq/dCBs4bqtcCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTDQpgYGANCg0KLSAgQmnhu4N1IMSR4buTIGNobyByYSB0aOG6pXkgY2jhu4kgc+G7kSB4deG6pXQgaGnhu4duIGPhu6dhIGPDoWMgY2jhu4kgc+G7kSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gxJHGsOG7o2MgcGjDom4gcmEgdGhlbyBsb+G6oWkgZGluaCBkxrDhu6FuZw0KDQojIyBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThuqduIHN14bqldCB4deG6pXQgaGnhu4duIGPDoWMgbeG7kWMgdGjhu51pIGdpYW4gcXVhbiBzw6F0DQoNCmBgYHtyIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1GQUxTRX0NCmNrICU+JSBnZ3Bsb3QoYWVzKHggPSBUaW1lKSkgKyAjQuG6r3QgxJHhuqd1IG3hu5l0IGJp4buDdSDEkeG7kyBnZ3Bsb3QgduG7m2kgdHLhu6VjIHggxJHGsOG7o2MgdGhp4bq/dCBs4bqtcCBsw6AgY+G7mXQgIlRpbWUiDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMywgZmlsbCA9ICJyZWQiLCBjb2xvciA9ICJibGFjayIsIGFlcyh5PS4uY291bnQuLikpICsgI1RoaeG6v3QgbOG6rXAgZOG7ryBsaeG7h3UgaGnhu4NuIHRo4buLIGTGsOG7m2kgZOG6oW5nIGhpc3RvZ3JhbSwgxJHhurd0IGNoaeG7gXUgcuG7mW5nIGJpbiBsw6AgNSwgbcOgdSBu4buBbiB2w6AgbcOgdSB2aeG7gW4NCiAgbGFicyh4ID0gIlRo4budaSBnaWFuIChoKSIsIHkgPSAiVOG6p24gc3XhuqV0IikgKyAjVGhp4bq/dCBs4bqtcCBuaMOjbiBjaG8gdHLhu6VjIHggdsOgIHkNCiAgZ2d0aXRsZSgiUGjDom4gcGjhu5FpIGPhu6dhIHRo4budaSBnaWFuIHRoZW8gZMO1aSBnw6AgY29uIikgKyAjVGhp4bq/dCBs4bqtcCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTDQogIHRoZW1lX21pbmltYWwoKSAjR2lhbyBkaeG7h24gZOG6oW5nIGzGsOG7m2kNCmBgYA0KDQotIEJp4buDdSDEkeG7kSBjaG8gdGEgdGjhuqV5IGPDoWMgdOG6p24gc3XhuqV0IGPDoWMgIGtob+G6o25nIHRo4budaSBnaWFuIHh14bqldCBoaeG7h24NCi0gS2hv4bqjbmcgdGjhu51pIGdpYW4geHXhuqV0IGhp4buHbiBuaGnhu4F1IG5o4bqldCB04burIDAgxJHhur9uIDUgdsOgIGdp4bqjbSBk4bqnbiB24buBIDIwDQoNCiMjIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdHLhu41uZyBsxrDhu6NuZyBnw6AgY29uIHRoZW8gdGjhu51pIGdpYW4gKGxpbmUpDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoQ2hpY2tXZWlnaHQsIGFlcyh4ID0gVGltZSwgeSA9IHdlaWdodCwgY29sb3IgPSBDaGljaykpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHggPSAiVGjhu51pIGdpYW4gKG5nw6B5KSIsIHkgPSAiVHLhu41uZyBsxrDhu6NuZyAoZykiLCBjb2xvciA9ICJHw6AiKSArDQogIGdndGl0bGUoIkJp4buDdSDEkeG7kyDEkcaw4budbmcgY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBnw6AgdGhlbyB0aOG7nWkgZ2lhbiIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bqtdCDEkeG7mSBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGfDoCAoIHZpb2xpbiBwbG90KQ0KDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjayAlPiUgZ2dwbG90KGFlcyh4ID0gYXMuZmFjdG9yKERpZXQpLCB5ID0gd2VpZ2h0LCBmaWxsID0gYXMuZmFjdG9yKERpZXQpKSkgKyAjTOG6pXkgZOG7ryBsaeG7h3UgdOG7qyBjaywgdGhp4bq/dCBs4bqtcCB0cuG7pWMgeCwgeSwgbcOgdSBmaWxsIMSRxrDhu6NjIGThu7FhIHRyw6puIGNo4bq/IMSR4buZIGRpbmggZMaw4buhbmcNCiAgZ2VvbV92aW9saW4oKSArICNUaGnhur90IGzhuq1wIGJp4buDdSDEkeG7kyB2aW9saW4gcGxvdCB2w6BvIGJp4buDdSDEkeG7kw0KICBsYWJzKHggPSAiY2jhur8gxJHhu5kgZGluaCBkxrDhu6FuZyIsIHkgPSAiVHLhu41uZyBsxrDhu6NuZyAoZykiKSArDQogIGdndGl0bGUoIkJp4buDdSDEkeG7kyB2aW9saW4gcGxvdCBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGfDoCIpICsgI1RoaeG6v3QgbOG6rXAgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kw0KICB0aGVtZV9taW5pbWFsKCkgI2zhuqV5IGdpYW8gZGnhu4duIGThuqFuZyBsxrDhu5tpIA0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIGNobyB0YSB0aOG6pXkgbeG6rXQgxJHhu5kgcGjDom4gcGjhu5FpIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgY8OhYyBnw6AgY29uIHRoZW8gdOG7q25nIGNo4bq/IMSR4buZIGRpbmggZMaw4buhbmcNCi0g4bufIGNo4bq/IMSR4buZIGRpbmggZMaw4buhbmcgMSB0aMOsIGPDsyBt4bqtdCDEkeG7mSBwaMOibiBwaOG7kWkgdHLhu41uZyBsxrDhu6NuZyBkxrDhu5tpIDEwMGcgbmhp4buBdSBuaOG6pXQsIGPhuqMgNCBsb+G6oWkgxJHhu4F1IGPDsyB4dSBoxrDhu5tuZyBnaeG6o20gZOG6p24sIHRy4buNbmcgbMaw4bujbmcgY8OhYyBs4bubbiB0aMOsIGPDoG5nIMOtdCwgbOG7m24gbmjhuqV0IGPDsyB0aOG7gyDEkeG6oXQgxJHGsOG7o2Mg4bufIGto4bqpdSBwaOG6p24gZGluaCBkxrDhu6FuZyBz4buRIDMNCg0KIyMgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bqtdCDEkeG7mSB0cuG7jW5nIGzGsOG7o25nIHF1YSBjw6FjIG3hu5FjIA0KDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpjayAlPiUgDQogIGdncGxvdChhZXMoeCA9IFRpbWUsIHkgPSB3ZWlnaHQpKSArICNC4bqvdCDEkeG6p3UgbeG7mXQgY2h14buXaSBk4buvIGxp4buHdSBt4bubaSB24bubaSB2aeG7h2MgdGhp4bq/dCBs4bqtcCB0cuG7pWMgeCwgeQ0KICBnZW9tX3Zpb2xpbihmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIpICsgI1RoaeG6v3QgbOG6rXAgZOG6oW5nIHZpb2xpbiBjaG8gYmnhu4N1IMSR4buZLCBtw6B1IHbDoCBtw6B1IHZp4buBbg0KICBsYWJzKHggPSAiVGjhu51pIGdpYW4iLCB5ID0gIlRy4buNbmcgbMaw4bujbmcgKGcpIiwNCiAgICAgICB0aXRsZSA9ICJT4buxIHBow6F0IHRyaeG7g24gY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBnw6AgY29uICB0aGVvIHRo4budaSBnaWFuIikgKyAjZ8OhbiBuaMOjbiBjaG8gdOG7q25nIHRy4bulYyB4LCB5IHbDoCB0acOqdSDEkeG7gQ0KICB0aGVtZV9taW5pbWFsKCkgI2dpYW8gZGnhu4duIGThuqFuZyBsxrDhu5tpDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgY2hvIHRhIHRo4bqleSBt4bqtdCDEkeG7mSBwaMOibiBwaOG7kWkgY+G7p2EgdHLhu41uZyBsxrDhu6NuZywgdHLhu41uZyBsxrDhu6NuZyBjw6BuZyBs4bubbiB2w6Agw610IA0KDQojIyBCaeG7g3UgxJHhu5MgcGjDom4gcGjhu5FpIHRy4buNbmcgbMaw4bujbmcgZOG6oW5nIEJveHBsb3QNCg0KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KY2sgJT4lIGdncGxvdChhZXMoeCA9IGZhY3RvcihEaWV0KSwgeSA9IHdlaWdodCwgZmlsbCA9IGZhY3RvcihEaWV0KSkpICsgI0Lhuq90IMSR4bqndSB04bqhbyBt4buZdCDEkeG7kWkgdMaw4bujbmcgZ2dwbG90LCB0aGnhur90IGzhuq1wIHRy4bulYyB4LCB5IHbDoCBtw6B1IHPhuq9jIMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBi4bqxbmcgZGlldA0KICBnZW9tX2JveHBsb3QoKSArICNUaMOqbSBs4bubcCBibG94cG90IHbDoCBiaeG6v24gxJHhu5luZyBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gdGhlbyB04burbmcgbG/huqFpIGto4bqpdSBwaOG6p24NCiAgbGFicyh4ID0gIkxv4bqhaSBraOG6qXUgcGjhuqduIiwgeSA9ICJUcuG7jW5nIGzGsOG7o25nIGfDoCBjb24iLCBmaWxsID0gIkxv4bqhaSBraOG6qXUgcGjhuqduIikgKyAjxJDhurd0IG5ow6NuIGNobyB0cuG7pWMgeCwgeSB2w6AgbcOgdSBz4bqvYw0KICBnZ3RpdGxlKCJCaeG7g3UgxJHhu5MgQm94cGxvdCBj4bunYSB0cuG7jW5nIGzGsOG7o25nIGfDoCBjb24gdGhlbyBsb+G6oWkga2jhuql1IHBo4bqnbiIpICNUaMOqbSB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBjw6FjIGdpw6EgdHLhu4sgbmjGsCB0cnVuZyB24buLLCB04bupIHBow6JuIHbhu4sgdsOgIGPDoWMgZ2nDoSB0cuG7iyBuZ2/huqFpIHZpIGPDsyB0aOG7gyB4deG6pXQgaGnhu4du