PHẦN 1: TÌM HIỂU VÀ CHUẨN BỊ DỮ LIỆU

1.1 ĐỌC DỮ LIỆU

Đọc file dữ liệu gốc

data <- read.csv(file = file.choose(), header = T)

Các biến định tính

  • dat <- data[, dldt]: lấy trong bộ dữ liệu data các cột trong dldt vừa tạo ra (các biến định tính), và lấy tất cả các hàng
# Chọn các biến định tính
dldt <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome", "City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")

# Tạo bộ dữ liệu mới chỉ chứa định tính
dat <- data[, dldt]

1.2. NỘI DUNG DỮ LIỆU

  • Bộ dữ liệu này gồm 14,059 giao dịch mua hàng tại siêu thị, với các thông tin liên quan đến khách hàng và sản phẩm bao gồm mã định danh khách hàng và các thông tin liên quan, vị trí địa lý, chi tiết các sản phẩm được mua.

  • Dữ liệu này có thể được sử dụng để phân tích hành vi mua sắm của khách hàng, phân khúc thị trường, hoặc đánh giá hiệu quả kinh doanh theo từng sản phẩm, từng khu vực và từng nhóm đối tượng.

Danh sách các biến và mô tả

Cấu trúc bộ dữ liệu Supermarket Transactions

str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ AnnualIncome     : chr  "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
##  $ City             : chr  "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
##  $ StateorProvince  : chr  "CA" "CA" "WA" "OR" ...
##  $ Country          : chr  "USA" "USA" "USA" "USA" ...
##  $ ProductFamily    : chr  "Food" "Food" "Food" "Food" ...
##  $ ProductDepartment: chr  "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
##  $ ProductCategory  : chr  "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...
  • Gender: Giới tính (F - Nữ, M - Nam)
  • MaritalStatus: Tình trạng hôn nhân (S - Độc thân, M - Đã kết hôn)
  • Homeowner: Có sở hữu nhà hay không (Y - Có, N - Không)
  • AnnualIncome: Thu nhập hàng năm (được biểu thị dưới dạng các khoảng)
  • City, StateorProvince, Country: Thông tin địa lý
  • ProductFamily, ProductDepartment, ProductCategory: Phân loại sản phẩm

Số biến và số quan sát

dim(dat)
## [1] 14059    10
  • Bộ dữ liệu dat chứa tổng cộng 14.059 quan sát cùng với 10 biến đặc trưng tương ứng là biến định tính.
  • Mỗi quan sát sẽ tưởng ứng với mỗi giao dịch mua hàng tại siêu thị.

Kiểm tra số lượng NA trong cột định tính

sapply(dat, …): áp dụng hàm cho từng cột trong dữ liệu dat.

sum(is.na(x)): đếm số lượng NA trong từng cột.

# Kiểm tra số lượng NA trong mỗi cột định tính
na_counts <- sapply(dat, function(x) sum(is.na(x)))
na_counts
##            Gender     MaritalStatus         Homeowner      AnnualIncome 
##                 0                 0                 0                 0 
##              City   StateorProvince           Country     ProductFamily 
##                 0                 0                 0                 0 
## ProductDepartment   ProductCategory 
##                 0                 0

Nhận xét - Kết quả thu được cho thấy rằng tất cả các cột định tính đều không có giá trị thiếu (NA) vì số lượng NA trong các cột đều hiển thị là 0

Chuyển đổi các cột sang factor
# Chuyển đổi các cột sang factor nếu chưa phải là factor
dat <- as.data.frame(lapply(dat, function(x) {
  if (!is.factor(x)) {
    return(as.factor(x))
  } else {
    return(x)
  }
}))

Kết quả thu được toàn bộ các biến đã được chuyển đổi thành dạng factor.

PHẦN 2: PHÂN TÍCH BIẾN ĐỊNH TÍNH

PRODUCTCATEGORY

Thống kê tuần suất và trực quan hóa

tab_ProductCategory <- table(dat$ProductCategory)
tab_ProductCategory
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##                  484                  365                  356 
##                Bread      Breakfast Foods              Candles 
##                  425                  417                   45 
##                Candy     Canned Anchovies         Canned Clams 
##                  352                   44                   53 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##                   35                   40                   38 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##                  404                   87                  154 
##    Cleaning Supplies        Cold Remedies                Dairy 
##                  189                   93                  903 
##        Decongestants               Drinks                 Eggs 
##                   85                  135                  198 
##           Electrical      Frozen Desserts       Frozen Entrees 
##                  355                  323                  118 
##                Fruit             Hardware        Hot Beverages 
##                  765                  129                  226 
##              Hygiene     Jams and Jellies     Kitchen Products 
##                  197                  588                  217 
##            Magazines                 Meat        Miscellaneous 
##                  202                  761                   42 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##                   48                  192                  345 
##                Pizza     Plastic Products Pure Juice Beverages 
##                  194                  141                  165 
##              Seafood          Side Dishes          Snack Foods 
##                  102                  153                 1600 
##            Specialty        Starchy Foods           Vegetables 
##                  289                  277                 1728
table(dat$ProductCategory)/sum(nrow(dat))
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##          0.034426346          0.025962017          0.025321858 
##                Bread      Breakfast Foods              Candles 
##          0.030229746          0.029660716          0.003200797 
##                Candy     Canned Anchovies         Canned Clams 
##          0.025037343          0.003129668          0.003769827 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##          0.002489508          0.002845153          0.002702895 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##          0.028736041          0.006188207          0.010953837 
##    Cleaning Supplies        Cold Remedies                Dairy 
##          0.013443346          0.006614980          0.064229319 
##        Decongestants               Drinks                 Eggs 
##          0.006045949          0.009602390          0.014083505 
##           Electrical      Frozen Desserts       Frozen Entrees 
##          0.025250729          0.022974607          0.008393200 
##                Fruit             Hardware        Hot Beverages 
##          0.054413543          0.009175617          0.016075112 
##              Hygiene     Jams and Jellies     Kitchen Products 
##          0.014012376          0.041823743          0.015434953 
##            Magazines                 Meat        Miscellaneous 
##          0.014368020          0.054129028          0.002987410 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##          0.003414183          0.013656732          0.024539441 
##                Pizza     Plastic Products Pure Juice Beverages 
##          0.013798990          0.010029163          0.011736254 
##              Seafood          Side Dishes          Snack Foods 
##          0.007255139          0.010882709          0.113806103 
##            Specialty        Starchy Foods           Vegetables 
##          0.020556227          0.019702682          0.122910591
barplot(tab_ProductCategory, main = "Danh mục sản phẩm - ProductCategory", col = "#FF0000", las = 2)

Nhận xét

  • Các loại thực phẩm phổ biến được quan sát từ biểu đồ:

    • Vegetables (Rau): với số lượng là 1728 khách hàng và chiếm hết (12.2910591%)

    • Snack Foods: 1600 khách hàng và chiếm hết (11.3806103%)

    • Dairy (Sữa): 903 khách hàng và chiếm hết (6.4229319%)

    • Fruit, Meat, Frozen Foods…

  • Đây là những mặt hàng tiêu dùng nhanh, có vòng đời ngắn.

  • Việc khách hàng mua chủ yếu các mặt hàng thiết yếu cho thấy siêu thị hoạt động tốt trong việc phục vụ nhu cầu cơ bản, chứ không phải sản phẩm xa xỉ hay không thường xuyên.

ANNUALINCOME

Thống kê tần suất và trực quan hóa

tab_AnnualIncome <- table(dat$AnnualIncome)
tab_AnnualIncome
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##          3090           643           760           273          4601 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##          2370          1709           613
table(dat$AnnualIncome)/sum(nrow(dat))
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##    0.21978804    0.04573583    0.05405790    0.01941817    0.32726367 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##    0.16857529    0.12155914    0.04360196
barplot(tab_AnnualIncome, main = "Thu nhập/tháng - AnnualIncome", col = "lightblue", las = 2)

Nhận xét

  • Nhóm $30K - $50K chiếm đa số với 3090 khách hàng (chiếm 32.7263675%), theo sau là:

    • Nhóm $10K - $30K (21.9788036%)

    • Nhóm $50K - $70K (16.857529%)

  • Rất ít khách hàng có thu nhập trên $150K (1.9418166%)

  • Điều này cho thấy rằng chuỗi siêu thị chủ yếu phục vụ nhóm thu nhập trung bình và thấp – phù hợp với chiến lược giá rẻ, hàng hóa thiết yếu.

  • Chiến lược marketing, khuyến mãi, và chính sách giá nên tập trung vào nhóm này (ví dụ: combo tiết kiệm, chiết khấu theo số lượng).

COUNTRY

Thống kê tần suất và trực quan hóa

tab_Country <- table(dat$Country)
tab_Country
## 
## Canada Mexico    USA 
##    809   3688   9562
table(dat$Country)/sum(nrow(dat))
## 
##     Canada     Mexico        USA 
## 0.05754321 0.26232307 0.68013372
barplot(tab_Country, main = "Quốc gia - Country", col = "orchid", las = 2)

Nhận xét

  • Tỷ lệ khách hàng theo quốc gia phân bổ theo trình tự giảm dần:

    • Cao nhất là USA: 68.0133722%

    • Kế tiếp là Mexico: 26.2323067%

    • Thấp nhất là Canada: 5.7543211%

  • US Hoa Kỳ rõ ràng là thị trường trọng điểm với tỷ lệ khách hàng giao dịch cao nhất trong 3 quốc gia. Điều này chứng tỏ Hoa Kỳ là một quốc gia phát triển mạnh với nhu cầu tiêu dùng chiến phần lớn.

  • Tuy nhiên, sự hiện diện tại Mexico (hơn 1/4 số giao dịch) cho thấy đây là thị trường thứ cấp tiềm năng, có thể mở rộng hoặc tăng nhận diện thương hiệu.

GENDER

Thống kê tần suất và trực quan hóa

  • Sử dụng hàm table() để đếm số lần xuất hiện (tần suất) của từng giá trị trong biến định tính.

  • prop.table(tab_gender) tạo bảng tỷ lệ phần trăm (theo dạng thập phân). Nhân với 100 để ra phần trăm.

  • round(…, 2) làm tròn 2 chữ số sau dấu phẩy.

  • barplot() tạo biểu đồ cột từ bảng tần suất.

  • main: tiêu đề biểu đồ.

  • col: màu sắc cột (ở đây là màu “steelblue”).

  • las = 2: xoay nhãn trục hoành (X) theo chiều dọc để dễ đọc.

tab_gender <- table(dat$Gender)
tab_gender
## 
##    F    M 
## 7170 6889
table(dat$Gender)/sum(nrow(dat))
## 
##         F         M 
## 0.5099936 0.4900064
barplot(tab_gender, main = "Tần suất - Gender", col = "lightyellow", las = 2)

Nhận xét

  • Dữ liệu cho thấy có 7170 khách hàng là nữ (50.9993598%) và 6889 là khách hàng nam (49.0006402%).

  • Tỷ lệ giới tính giữa nam và nữ trong dữ liệu khá cân bằng, không có sự khác biệt đáng kể nào.

  • Điều này cho thấy chuỗi siêu thị hướng tới phục vụ cả hai giới một cách đồng đều, thay vì tập trung vào một nhóm cụ thể.

  • Mặt khác, việc nữ giới chiếm tỷ lệ nhỉnh hơn đôi chút có thể xuất phát từ vai trò thường thấy của họ trong việc mua sắm nhu yếu phẩm và quản lý chi tiêu gia đình, dẫn đến khả năng cao họ là người thực hiện các giao dịch được ghi nhận trong hóa đơn.

MARITALSTATUS

Thống kê tuần suất và trực quan hóa

tab_MaritalStatus <- table(dat$MaritalStatus)
tab_MaritalStatus
## 
##    M    S 
## 6866 7193
table(dat$MaritalStatus)/sum(nrow(dat))
## 
##         M         S 
## 0.4883704 0.5116296
barplot(tab_MaritalStatus, main = "Tình trạng hôn nhân - MaritalStatus", col = "skyblue", las = 2) 

Nhận xét

  • Số lượng khách hàng độc thân (Single – ký hiệu S) là 6866 người (chiếm 48.8370439%), còn người đã kết hôn (Married – M) là 1, 0 người (chiếm 51.1629561%)

  • Mặc dù tỷ lệ khá cân bằng, nhưng nhóm độc thân chiếm tỷ lệ cao hơn một chút.

  • Giải thích hợp lý cho điều này có thể là:

    • Những người độc thân có xu hướng tự đi mua sắm nhiều hơn, không dựa vào bạn đời.

    • Ngoài ra, người trẻ độc thân thường sống ở thành thị và sử dụng dịch vụ siêu thị thường xuyên hơn, trong khi người đã kết hôn có thể mua theo nhóm hoặc theo hộ gia đình lớn và ít giao dịch hơn trên mỗi cá nhân.

HOMEOWNER

Thống kê tần suất và trực quan hóa

tab_Homeowner <- table(dat$Homeowner)
tab_Homeowner
## 
##    N    Y 
## 5615 8444
table(dat$Homeowner)/sum(nrow(dat))
## 
##         N         Y 
## 0.3993883 0.6006117
barplot(tab_Homeowner, main = "Sở hữu nhà - Homeowner", col = "darkseagreen", las = 2)

Nhận xét

  • Từ kết quả thu được ta thấy có 5615 khách hàng (chiếm 39.9388292%) không sở hữu nhà, còn 8444 khách hàng (chiếm 60.0611708%) là chủ sở hữu nhà.

  • Đây là một chỉ báo quan trọng về sự ổn định tài chính của khách hàng.

  • Người sở hữu nhà thường có:

    • Chi tiêu ổn định hơn.

    • Nhu cầu mua sắm nhiều hơn cho gia đình (thực phẩm, đồ gia dụng).

  • Trong khi đó, người không sở hữu nhà (có thể thuê nhà hoặc sống tạm thời) có thể:

    • Chi tiêu dè dặt hơn.

    • Ít mua hàng số lượng lớn, hoặc ưu tiên hàng nhỏ gọn, dễ vận chuyển.

CITY

Thống kê tần suất và trực quan hóa

tab_City <- table(dat$City)
tab_City
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##           383           143           811           834           452 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##            75           845           926           654           194 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##           464           876          1386           621           866 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##           130           922           875          1257           633 
##      Victoria   Walla Walla        Yakima 
##           176           160           376
table(dat$City)/sum(nrow(dat))
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##   0.027242336   0.010171420   0.057685468   0.059321431   0.032150224 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##   0.005334661   0.060103848   0.065865282   0.046518245   0.013798990 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##   0.033003770   0.062308841   0.098584537   0.044170994   0.061597553 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##   0.009246746   0.065580767   0.062237712   0.089408920   0.045024539 
##      Victoria   Walla Walla        Yakima 
##   0.012518671   0.011380610   0.026744434
barplot(tab_City, main = "Thành phố - City", col = "pink", las = 2)

Nhận xét

  • Các thành phố có tỷ lệ giao dịch cao là:

    • Salem là thành phố có tỉ lệ khách hàng mua sản phẩm cao nhất với 1386 khách hàng và chiếm hết (9.8584537%)

    • Theo sau là thành phố Tacoma (1.2518671%)

    • Kế tiếp là thành phố Los Angeles (6.5865282%) và ta thấy thành phố Seattle với 6.5580767% xấp xỉ bằng với thành phố Los Angeles. Qua đó ta nhìn nhận được rằng 2 thành phố này có lượng khách hàng mua sắm gần như nhau.

  • Có thể nhận thấy sự tập trung mạnh tại các thành phố bờ Tây Hoa Kỳ, đặc biệt ở các bang Washington, Oregon và California.

  • Điều này gợi ý rằng:

    • Các chi nhánh ở các thành phố này có lưu lượng khách hàng lớn, hoặc

    • Các thành phố này có mật độ dân cư cao, nhu cầu tiêu dùng thường xuyên.

STATEORPROVINCE

Thống kê tần suất và trực quan hóa

tab_StateorProvince <- table(dat$StateorProvince)
tab_StateorProvince
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297
table(dat$StateorProvince)/sum(nrow(dat))
## 
##          BC          CA          DF    Guerrero     Jalisco          OR 
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378 
##    Veracruz          WA     Yucatan   Zacatecas 
## 0.033003770 0.324845295 0.046518245 0.092254072
barplot(tab_StateorProvince, main = "Bang/Tỉnh - StateorProvince", col = "goldenrod", las = 2)

Nhận xét

  • Phân bố:

    • Washington(WA): 32.4845295%

    • California(CA): 19.4395049%

    • Oregon(OR): 16.0893378%

  • Ba bang này đều ở bờ Tây Hoa Kỳ, và là những bang có:

    • Dân số đông, thị trường bán lẻ phát triển.

    • Thói quen tiêu dùng hiện đại, sử dụng dịch vụ siêu thị nhiều hơn so với các khu vực nông thôn.

  • Việc mở rộng kinh doanh hoặc đầu tư thêm vào các bang này là chiến lược khả thi.

PRODUCTFAMILY

Thống kê tần suất và trực quan hóa

tab_ProductFamily <- table(dat$ProductFamily)
tab_ProductFamily
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
table(dat$ProductFamily)/sum(nrow(dat))
## 
##          Drink           Food Non-Consumable 
##     0.08891102     0.72217085     0.18891813
barplot(tab_ProductFamily, main = "Nhóm sản phẩm - ProductFamily", col = "darkblue", las = 2)

Nhận xét

  • Thực phẩm (Food) chiếm đa số (72.2170851%), cao vượt trội so với:

    • Non-Consumables chiếm 18.8918131%

    • Nhóm đồ uống chiếm 8.8911018%

  • Điều này cho thấy khách hàng mua sắm chủ yếu là để phục vụ nhu cầu ăn uống hàng ngày.

  • Siêu thị nên tiếp tục đầu tư mạnh vào:

    • Nguồn cung thực phẩm tươi,

    • Các sản phẩm thiết yếu giá tốt,

    • Chính sách ưu đãi số lượng lớn cho thực phẩm.

PRODUCTDEPARTMENT

Thống kê tần suất và trực quan hóa

tab_ProductDepartment <- table(dat$ProductDepartment)
tab_ProductDepartment
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##                 356                 425                1072                 680 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##                 188                 977                 109                  59 
##            Checkout               Dairy                Deli                Eggs 
##                  82                 903                 699                 198 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##                1382                 893                1420                  89 
##         Periodicals             Produce             Seafood         Snack Foods 
##                 202                1994                 102                1600 
##              Snacks       Starchy Foods 
##                 352                 277
table(dat$ProductDepartment)/sum(nrow(dat))
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##         0.025321858         0.030229746         0.076250089         0.048367594 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##         0.013372217         0.069492852         0.007753041         0.004196600 
##            Checkout               Dairy                Deli                Eggs 
##         0.005832563         0.064229319         0.049719041         0.014083505 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##         0.098300021         0.063518031         0.101002916         0.006330464 
##         Periodicals             Produce             Seafood         Snack Foods 
##         0.014368020         0.141830856         0.007255139         0.113806103 
##              Snacks       Starchy Foods 
##         0.025037343         0.019702682
barplot(tab_ProductDepartment, main = "Bộ phận sản phẩm - ProductDepartment", col = "darkred", las = 2)

Nhận xét

  • Các bộ phân chiếm đa số trong toàn bộ các bộ phận được thống kê:

    • Produce (Rau quả): 14.1830856%

    • Snack Foods: 11.3806103%

    • Household: 10.1002916%

  • Khách hàng mua nhiều các mặt hàng:

    • Tươi sống, dễ hỏng (produce) -> yêu cầu bảo quản và chuỗi cung ứng tốt.

    • Đồ ăn vặt và hàng gia dụng -> phản ánh thói quen tiêu dùng nhanh, tiện lợi.

  • Đây là cơ hội để tăng cường marketing nhóm sản phẩm tiện lợi, combo bữa ăn, sản phẩm cho hộ gia đình.

PHẦN 3: ƯỚC LƯỢNG KHOẢNG VÀ KIỂM ĐỊNH GIẢ THUYẾT CHO TỶ LỆ

  • table(): Thống kê số lượng từng loại trong biến định tính
  • sum(…): Đếm bao nhiêu dòng thỏa điều kiện (giá trị quan tâm)
  • length(…): Tổng số mẫu
  • prop.test(…): Tính khoảng tin cậy và kiểm định giả thuyết cho tỷ lệ
  • p = … : Tỷ lệ giả định trong giả thuyết H0
  • alternative = …: Kiểm định hai phía (“two.sided”), một phía lớn hơn (“greater”), nhỏ hơn (“less”)

3.1 Biến Gender

# Xác định hạng mục quan tâm
table(dat$Gender)
## 
##    F    M 
## 7170 6889
# Số lượng và tổng số 
slfemale <- sum(dat$Gender == "F")
totalgender <- length(dat$Gender)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ "Female"
prop.test(slfemale, totalgender, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slfemale out of totalgender, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5016931 0.5182886
## sample estimates:
##         p 
## 0.5099936
# Kiểm định giả thuyết: tỷ lệ Female = 0.5
prop.test(slfemale, totalgender, p = 0.5, alternative = "two.sided", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slfemale out of totalgender, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5016931 0.5182886
## sample estimates:
##         p 
## 0.5099936

Giả thuyết

  • H0: p = 0.5

  • H1: p ≠ 0.5

Đọc kết quả và kết luận

  • Tổng số cá thể trong mẫu là 14.059 người, trong đó có 7.170 người là nữ và 6.889 người là nam. Tỷ lệ nữ giới trong mẫu là 50.99936%.

  • Kết quả kiểm định tỷ lệ một mẫu với giả thuyết tỷ lệ nữ trong tổng thể là 50% (H₀: p = 0.5) cho thấy giá trị thống kê Chi-squared = 5.5765 với 1 bậc tự do, và p-value = 0.0182. Với mức ý nghĩa thông thường α = 0.05, ta bác bỏ giả thuyết không, cho thấy tỷ lệ nữ giới trong mẫu có sự khác biệt có ý nghĩa thống kê so với tỷ lệ 50%.

  • Khoảng tin cậy 95% cho tỷ lệ nữ trong quần thể nằm trong khoảng từ 50.16931% đến 51.82886%, cho thấy tỷ lệ này chỉ hơi cao hơn 50%.

Tóm lại

  • Tuy tỷ lệ nữ giới trong mẫu chỉ nhỉnh hơn nam giới không quá cao (50.99936%), nhưng sự chênh lệch này là có ý nghĩa thống kê. Do đó, có thể kết luận rằng nữ giới chiếm ưu thế nhẹ nhưng đáng kể về mặt thống kê trong mẫu khảo sát này.

Kết luận

  • Tỷ lệ nữ trong tổng mẫu là 50.999%, khác có ý nghĩa thống kê so với 50%.
  • Với p-value = 0.0182, bạn bác bỏ giả thuyết rằng tỷ lệ nữ là 50% ở mức ý nghĩa 5%.
  • Tuy nhiên, sự chênh lệch dù có ý nghĩa thống kê, nhưng rất nhỏ về mặt thực tế (~1%)

3.2 Biến Homeowner

# Xác định hạng mục quan tâm
table(dat$Homeowner)
## 
##    N    Y 
## 5615 8444
slshn <- sum(dat$Homeowner == "Y")
totalhomeowner <- length(dat$Homeowner)

# Ước lượng khoảng tin cậy
prop.test(slshn, totalhomeowner, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slshn out of totalhomeowner, null probability 0.5
## X-squared = 568.86, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5924537 0.6087145
## sample estimates:
##         p 
## 0.6006117
# Kiểm định giả thuyết H0: tỷ lệ chủ nhà = 0.6
prop.test(slshn, totalhomeowner, p = 0.6, alternative = "two.sided", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slshn out of totalhomeowner, null probability 0.6
## X-squared = 0.019445, df = 1, p-value = 0.8891
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
##  0.5924537 0.6087145
## sample estimates:
##         p 
## 0.6006117

Giả thuyết 1

  • H0: p = 0.5

  • H1: p ≠ 0.5

Đọc kết quả và kết luận

  • Kết quả phân tích tỷ lệ một mẫu cho thấy tỷ lệ đối tượng chọn lựa trong tổng thể mẫu là 60.06%. Khi tiến hành kiểm định giả thuyết với tỷ lệ chuẩn là 50%, ta thu được giá trị thống kê Chi-squared là 568.86 với một bậc tự do, và p-value < 2.2e-16. Với mức ý nghĩa thông thường (α = 0.05), ta bác bỏ giả thuyết không (H₀: p = 0.5). Điều này cho thấy tỷ lệ thực tế khác biệt một cách có ý nghĩa thống kê so với 50%.

Giả thuyết 2

  • H0: p = 0.6

  • H1: p ≠ 0.6

Đọc kết quả và kết luận

  • Ngược lại, khi kiểm định với tỷ lệ giả định là 60%, giá trị thống kê Chi-squared chỉ là 0.019445 với p-value = 0.8891. Do p-value lớn hơn đáng kể so với mức ý nghĩa 0.05, ta không bác bỏ giả thuyết không (H₀: p = 0.6). Điều này cho thấy không có bằng chứng thống kê cho thấy tỷ lệ thực tế khác biệt so với 60%.

Tóm lại:

  • Tỷ lệ lựa chọn trong mẫu khảo sát là khoảng 60.06% và khác biệt có ý nghĩa thống kê so với tỷ lệ giả định 50%, nhưng không khác biệt đáng kể so với tỷ lệ 60%. Đây là cơ sở để giả định rằng tỷ lệ lựa chọn trong quần thể có thể vào khoảng 60%.

3.3 Biến ProductFamily

# Xác định hạng mục đề cập
table(dat$ProductFamily)
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
slfood <- sum(dat$ProductFamily == "Food")
totalproduct <- length(dat$ProductFamily)
# Ước lượng khoảng tin cậy
prop.test(slfood, totalproduct, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slfood out of totalproduct, null probability 0.5
## X-squared = 2774.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7146709 0.7295489
## sample estimates:
##         p 
## 0.7221709
# Kiểm định giả thuyết H0: tỷ lệ >= 0.7 (alternative = "greater": kiểm định 1 phía (>))
prop.test(slfood, totalproduct, p = 0.7, alternative = "greater", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slfood out of totalproduct, null probability 0.7
## X-squared = 32.802, df = 1, p-value = 5.101e-09
## alternative hypothesis: true p is greater than 0.7
## 95 percent confidence interval:
##  0.7158789 1.0000000
## sample estimates:
##         p 
## 0.7221709

Giả thuyết 1

  • H0: p = 0.5

  • H1: p ≠ 0.5

Đọc kết quả và kết luận

  • Kết quả kiểm định tỷ lệ một mẫu cho giả thuyết rằng tỷ lệ sản phẩm thuộc nhóm Food bằng 50% (H₀: p = 0.5) cho thấy:

    • Giá trị thống kê Chi-squared = 2774.9, df = 1

    • p-value < 2.2e-16

  • Với mức ý nghĩa là 0.05, ta bác bỏ giả thuyết H0, nghĩa là tỷ lệ sản phẩm nhóm Food không chiếm 50% trong tổng số “ProductFamily”.

  • Khoảng tin cậy 95% cho tỷ lệ này nằm trong khoảng từ 71.47% đến 72.95%.

Giả thuyết 2

  • H0: p = 0.7

  • H1: p > 0.7

Đọc kết quả và kết luận

  • Kết quả kiểm định tiếp theo kiểm tra xem liệu tỷ lệ sản phẩm nhóm Food có cao hơn 70% hay không, cho thấy:

    • Giá trị Chi-squared = 32.802, df = 1

    • p-value = 5.101e-09

  • Với mức ý nghĩa 0.05, ta tiếp tục bác bỏ giả thuyết không, và chấp nhận giả thuyết đối (H₁: p > 0.7). Điều này chứng tỏ tỷ lệ sản phẩm nhóm Food lớn hơn 70% với ý nghĩa thống kê cao.

  • Khoảng tin cậy 95% cho tỷ lệ này nằm trong khoảng từ 71.58% đến 100%.

PHẦN 4: PHÂN TÍCH MỐI QUAN HỆ GIỮA HAI BIẾN ĐỊNH TÍNH

  • Chọn lần lượt các cặp biến có mối tương quan thú vị làm ảnh hưởng đến hành vi mua hàng, giao dịch của khách hàng.
install.packages("tidyverse", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/Tuyet Nhi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'tidyverse' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Tuyet Nhi\AppData\Local\Temp\RtmpaQRhM9\downloaded_packages
install.packages("janitor", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/Tuyet Nhi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'janitor' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Tuyet Nhi\AppData\Local\Temp\RtmpaQRhM9\downloaded_packages
install.packages("gmodels", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/Tuyet Nhi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'gmodels' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Tuyet Nhi\AppData\Local\Temp\RtmpaQRhM9\downloaded_packages
install.packages("ggplot2", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/Tuyet Nhi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## 
##   There is a binary version available but the source version is later:
##         binary source needs_compilation
## ggplot2  3.5.1  3.5.2             FALSE
## installing the source package 'ggplot2'
## Warning in install.packages("ggplot2", repos = "https://cran.r-project.org"):
## installation of package 'ggplot2' had non-zero exit status
install.packages("scales", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/Tuyet Nhi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## 
##   There is a binary version available but the source version is later:
##        binary source needs_compilation
## scales  1.3.0  1.4.0             FALSE
## installing the source package 'scales'
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## Warning: package 'stringr' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(janitor)
## Warning: package 'janitor' was built under R version 4.3.3
## 
## Attaching package: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(gmodels)
## Warning: package 'gmodels' was built under R version 4.3.3
library(ggplot2)
library(scales)
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor

4.1 Gender và ProductFamily

Bảng tần suất chéo

tab1 <- table(dat$Gender, dat$ProductFamily)
tab1 
##    
##     Drink Food Non-Consumable
##   F   669 5149           1352
##   M   581 5004           1304
prop.table(tab1, 1) # theo hàng
##    
##          Drink       Food Non-Consumable
##   F 0.09330544 0.71813110     0.18856346
##   M 0.08433735 0.72637538     0.18928727
  • Dựa trên bảng tần suất chéo giữa Giới tính (Gender) và Nhóm sản phẩm (ProductFamily):

  • Nữ giới (F) có xu hướng chọn sản phẩm Food nhiều nhất, chiếm khoảng 71.8% trong tổng số sản phẩm mà nữ giới chọn. Tiếp theo là nhóm Non-Consumable (18.9%) và Drink (9.3%).

  • Nam giới (M) cũng có xu hướng tương tự khi lựa chọn nhiều nhất là Food (72.6%), kế đến là Non-Consumable (18.9%) và ít nhất là Drink (8.4%).

  • So sánh giới tính:

    • Cả hai giới đều ưu tiên nhóm sản phẩm Food với tỷ lệ cao nhất, trên 70%.

    • Tỷ lệ chọn Drink của nữ cao hơn nam một chút (9.3% so với 8.4%).

    • Tỷ lệ chọn Non-Consumable gần như tương đương giữa hai giới (18.9%).

Kết luận:

  • Sở thích về nhóm sản phẩm không có sự khác biệt đáng kể giữa nam và nữ. Nhóm sản phẩm Food chiếm ưu thế trong lựa chọn của cả hai giới tính, trong khi nhóm Drink là ít được chọn nhất.

Trực quan hóa

ggplot(dat, aes(x = Gender, fill = ProductFamily)) +
  geom_bar(position = "fill") +
  labs(title = "Tỷ lệ ProductFamily theo  Gender", y = "Tỷ lệ", x = "Gender") +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

Nhận xét

  • Dựa trên bảng tần suất chéo giữa Giới tính (Gender) và Nhóm sản phẩm (ProductFamily):

  • Nữ giới (F) có xu hướng chọn sản phẩm Food nhiều nhất, chiếm khoảng 71.8% trong tổng số sản phẩm mà nữ giới chọn. Tiếp theo là nhóm Non-Consumable (18.9%) và Drink (9.3%).

  • Nam giới (M) cũng có xu hướng tương tự khi lựa chọn nhiều nhất là Food (72.6%), kế đến là Non-Consumable (18.9%) và ít nhất là Drink (8.4%).

  • So sánh giới tính:

    • Cả hai giới đều ưu tiên nhóm sản phẩm Food với tỷ lệ cao nhất, trên 70%.

    • Tỷ lệ chọn Drink của nữ cao hơn nam một chút (9.3% so với 8.4%).

    • Tỷ lệ chọn Non-Consumable gần như tương đương giữa hai giới (18.9%).

Kết luận:

  • Sở thích về nhóm sản phẩm không có sự khác biệt đáng kể giữa nam và nữ. Nhóm sản phẩm Food chiếm ưu thế trong lựa chọn của cả hai giới, trong khi nhóm Drink là ít được chọn nhất.

Kiểm định Chi-bình phương

chi_result1 <- chisq.test(tab1)
chi_result1
## 
##  Pearson's Chi-squared test
## 
## data:  tab1
## X-squared = 3.5185, df = 2, p-value = 0.1722
# Giá trị thống kê Chi-squared
chi_result1$statistic
## X-squared 
##   3.51849
# Bậc tự do 
chi_result1$parameter
## df 
##  2
# Giá trị p
chi_result1$p.value
## [1] 0.1721748

Giả thuyết

  • Giả thuyết H0: Giới tính (Gender) và Nhóm sản phẩm (ProductFamily) là độc lập, không có mối liên hệ.

  • Giả thuyết H1: Giới tính và Nhóm sản phẩm có liên hệ với nhau.

Kết quả kiểm định:

  • Giá trị thống kê Chi-squared: X-squared = 3.51849

  • Bậc tự do: df = 2

  • Giá trị p: p = 0.1721748

Kết luận:

  • Với mức ý nghĩa 0.05, p_value = 0.1722 >= 0.05 → không đủ bằng chứng để bác bỏ H0, tức là không có mối liên hệ giữa 2 biến Gender và ProductFamily.

4.2 MaritalStatus và Homeowner

Bảng tần suất chéo

tab2 <- table(dat$MaritalStatus, dat$Homeowner)
tab2 
##    
##        N    Y
##   M 1719 5147
##   S 3896 3297
prop.table(tab2, 1)
##    
##             N         Y
##   M 0.2503641 0.7496359
##   S 0.5416377 0.4583623

Trực quan hóa

ggplot(dat, aes(x = MaritalStatus, fill = Homeowner)) +
  geom_bar(position = "fill") +
  labs(title = "Tỷ lệ Homeowner theo Marital Status", y = "Tỷ lệ", x = "Marital Status") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("Y" = "#FFDAB9", "N" = "#D8BFD8"))

  theme_minimal()
## List of 136
##  $ line                            :List of 6
##   ..$ colour       : chr "black"
##   ..$ linewidth    : num 0.5
##   ..$ linetype     : num 1
##   ..$ lineend      : chr "butt"
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ rect                            :List of 5
##   ..$ fill         : chr "white"
##   ..$ colour       : chr "black"
##   ..$ linewidth    : num 0.5
##   ..$ linetype     : num 1
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ text                            :List of 11
##   ..$ family       : chr ""
##   ..$ face         : chr "plain"
##   ..$ colour       : chr "black"
##   ..$ size         : num 11
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : num 0
##   ..$ lineheight   : num 0.9
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ title                           : NULL
##  $ aspect.ratio                    : NULL
##  $ axis.title                      : NULL
##  $ axis.title.x                    :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.75points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.top                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.75points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.bottom             : NULL
##  $ axis.title.y                    :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.75points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.y.left               : NULL
##  $ axis.title.y.right              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.75points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text                       :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey30"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.2points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.top                 :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.2points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.bottom              : NULL
##  $ axis.text.y                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 1
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.y.left                : NULL
##  $ axis.text.y.right               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.theta                 : NULL
##  $ axis.text.r                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0.5
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.ticks                      : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.ticks.x                    : NULL
##  $ axis.ticks.x.top                : NULL
##  $ axis.ticks.x.bottom             : NULL
##  $ axis.ticks.y                    : NULL
##  $ axis.ticks.y.left               : NULL
##  $ axis.ticks.y.right              : NULL
##  $ axis.ticks.theta                : NULL
##  $ axis.ticks.r                    : NULL
##  $ axis.minor.ticks.x.top          : NULL
##  $ axis.minor.ticks.x.bottom       : NULL
##  $ axis.minor.ticks.y.left         : NULL
##  $ axis.minor.ticks.y.right        : NULL
##  $ axis.minor.ticks.theta          : NULL
##  $ axis.minor.ticks.r              : NULL
##  $ axis.ticks.length               : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ axis.ticks.length.x             : NULL
##  $ axis.ticks.length.x.top         : NULL
##  $ axis.ticks.length.x.bottom      : NULL
##  $ axis.ticks.length.y             : NULL
##  $ axis.ticks.length.y.left        : NULL
##  $ axis.ticks.length.y.right       : NULL
##  $ axis.ticks.length.theta         : NULL
##  $ axis.ticks.length.r             : NULL
##  $ axis.minor.ticks.length         : 'rel' num 0.75
##  $ axis.minor.ticks.length.x       : NULL
##  $ axis.minor.ticks.length.x.top   : NULL
##  $ axis.minor.ticks.length.x.bottom: NULL
##  $ axis.minor.ticks.length.y       : NULL
##  $ axis.minor.ticks.length.y.left  : NULL
##  $ axis.minor.ticks.length.y.right : NULL
##  $ axis.minor.ticks.length.theta   : NULL
##  $ axis.minor.ticks.length.r       : NULL
##  $ axis.line                       : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.line.x                     : NULL
##  $ axis.line.x.top                 : NULL
##  $ axis.line.x.bottom              : NULL
##  $ axis.line.y                     : NULL
##  $ axis.line.y.left                : NULL
##  $ axis.line.y.right               : NULL
##  $ axis.line.theta                 : NULL
##  $ axis.line.r                     : NULL
##  $ legend.background               : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.margin                   : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing                  : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing.x                : NULL
##  $ legend.spacing.y                : NULL
##  $ legend.key                      : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.key.size                 : 'simpleUnit' num 1.2lines
##   ..- attr(*, "unit")= int 3
##  $ legend.key.height               : NULL
##  $ legend.key.width                : NULL
##  $ legend.key.spacing              : 'simpleUnit' num 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.key.spacing.x            : NULL
##  $ legend.key.spacing.y            : NULL
##  $ legend.frame                    : NULL
##  $ legend.ticks                    : NULL
##  $ legend.ticks.length             : 'rel' num 0.2
##  $ legend.axis.line                : NULL
##  $ legend.text                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.text.position            : NULL
##  $ legend.title                    :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.title.position           : NULL
##  $ legend.position                 : chr "right"
##  $ legend.position.inside          : NULL
##  $ legend.direction                : NULL
##  $ legend.byrow                    : NULL
##  $ legend.justification            : chr "center"
##  $ legend.justification.top        : NULL
##  $ legend.justification.bottom     : NULL
##  $ legend.justification.left       : NULL
##  $ legend.justification.right      : NULL
##  $ legend.justification.inside     : NULL
##  $ legend.location                 : NULL
##  $ legend.box                      : NULL
##  $ legend.box.just                 : NULL
##  $ legend.box.margin               : 'margin' num [1:4] 0cm 0cm 0cm 0cm
##   ..- attr(*, "unit")= int 1
##  $ legend.box.background           : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.box.spacing              : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##   [list output truncated]
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi TRUE
##  - attr(*, "validate")= logi TRUE

Nhận xét

  • Người đã kết hôn (M) có tỷ lệ sở hữu nhà cao hơn đáng kể so với người độc thân (S):
    • Trong nhóm đã kết hôn (M): Gần 75% là chủ sở hữu nhà (Y).

    • Trong nhóm độc thân (S): Chỉ khoảng 50% là chủ sở hữu nhà, phần còn lại là không sở hữu nhà (N).

  • Sự khác biệt rõ ràng trong cấu trúc tài sản theo tình trạng hôn nhân:
    • Điều này phản ánh thực tế rằng những người kết hôn thường có động lực kinh tế và tài chính ổn định hơn, hoặc có xu hướng đầu tư chung vào tài sản như nhà ởở

Kiểm định Chi-bình phương

chi_result2 <- chisq.test(tab2)
chi_result2
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tab2
## X-squared = 1241.2, df = 1, p-value < 2.2e-16
# Giá trị thống kê Chi-squared
chi_result2$statistic
## X-squared 
##  1241.218
# Bậc tự do 
chi_result2$parameter
## df 
##  1
# Giá trị p
chi_result2$p.value
## [1] 6.724506e-272

Giả thuyết

  • Giả thuyết H0: Tình trạng hôn nhân (MaritalStatus) và sở hữu nhà (Homeowwner) là độc lập, không có mối liên hệ.

  • Giả thuyết H1: Tình trạng hôn nhân (MaritalStatus) và sở hữu nhà (Homeowwner) có liên hệ với nhau.

Kết quả kiểm định:

  • Giá trị thống kê Chi-squared: X-squared = 1241.22

  • Bậc tự do: df = 1

  • Giá trị p: p < 2.2e-16

Kết luận:

  • Với mức ý nghĩa 0.05, p_value < 0.05 → ta đủ điều kiện để bác bỏ H0, tức là có mối liên hệ giữa 2 biến MaritalStatus và Homeowner. Có thể hiểu rằng tình trạng hôn nhân có ảnh hưởng đến việc một người có sở hữu nhà hay không (hoặc ngược lại).

4.3 AnnualIncome và ProductCategory

Bảng tần suất chéo

tab3 <- table(dat$AnnualIncome, dat$ProductDepartment)
tab3 
##                
##                 Alcoholic Beverages Baked Goods Baking Goods Beverages
##   $10K - $30K                    80         108          256       148
##   $110K - $130K                  14          23           49        35
##   $130K - $150K                  15          24           54        25
##   $150K +                         3          10           19        20
##   $30K - $50K                   121         134          336       228
##   $50K - $70K                    61          63          189        97
##   $70K - $90K                    39          50          130        91
##   $90K - $110K                   23          13           39        36
##                
##                 Breakfast Foods Canned Foods Canned Products Carousel Checkout
##   $10K - $30K                54          203              29        8       20
##   $110K - $130K               3           49               4        1        2
##   $130K - $150K              11           46               6        3        9
##   $150K +                     3           21               0        1        1
##   $30K - $50K                63          335              37       30       21
##   $50K - $70K                31          170              18        8       22
##   $70K - $90K                19          120              11        7        5
##   $90K - $110K                4           33               4        1        2
##                
##                 Dairy Deli Eggs Frozen Foods Health and Hygiene Household Meat
##   $10K - $30K     174  147   37          327                201       313   24
##   $110K - $130K    38   33    9           66                 33        63    5
##   $130K - $150K    49   45   15           84                 51        76    4
##   $150K +          17   13    4           26                 19        27    2
##   $30K - $50K     299  233   67          442                292       432   27
##   $50K - $70K     160  107   36          212                134       272   17
##   $70K - $90K     126   96   20          151                120       182    7
##   $90K - $110K     40   25   10           74                 43        55    3
##                
##                 Periodicals Produce Seafood Snack Foods Snacks Starchy Foods
##   $10K - $30K            49     420      17         329     76            70
##   $110K - $130K          17      77       3          85     16            18
##   $130K - $150K           9     109       8          83     19            15
##   $150K +                 1      33       5          35      8             5
##   $30K - $50K            65     650      44         533    127            85
##   $50K - $70K            36     344      11         274     60            48
##   $70K - $90K            18     264      12         184     29            28
##   $90K - $110K            7      97       2          77     17             8
prop.table(tab3, 1)
##                
##                 Alcoholic Beverages Baked Goods Baking Goods   Beverages
##   $10K - $30K           0.025889968 0.034951456  0.082847896 0.047896440
##   $110K - $130K         0.021772939 0.035769829  0.076205288 0.054432348
##   $130K - $150K         0.019736842 0.031578947  0.071052632 0.032894737
##   $150K +               0.010989011 0.036630037  0.069597070 0.073260073
##   $30K - $50K           0.026298631 0.029124103  0.073027603 0.049554445
##   $50K - $70K           0.025738397 0.026582278  0.079746835 0.040928270
##   $70K - $90K           0.022820363 0.029256875  0.076067876 0.053247513
##   $90K - $110K          0.037520392 0.021207178  0.063621533 0.058727569
##                
##                 Breakfast Foods Canned Foods Canned Products    Carousel
##   $10K - $30K       0.017475728  0.065695793     0.009385113 0.002588997
##   $110K - $130K     0.004665630  0.076205288     0.006220840 0.001555210
##   $130K - $150K     0.014473684  0.060526316     0.007894737 0.003947368
##   $150K +           0.010989011  0.076923077     0.000000000 0.003663004
##   $30K - $50K       0.013692676  0.072810259     0.008041730 0.006520322
##   $50K - $70K       0.013080169  0.071729958     0.007594937 0.003375527
##   $70K - $90K       0.011117613  0.070216501     0.006436513 0.004095963
##   $90K - $110K      0.006525285  0.053833605     0.006525285 0.001631321
##                
##                    Checkout       Dairy        Deli        Eggs Frozen Foods
##   $10K - $30K   0.006472492 0.056310680 0.047572816 0.011974110  0.105825243
##   $110K - $130K 0.003110420 0.059097978 0.051321928 0.013996890  0.102643857
##   $130K - $150K 0.011842105 0.064473684 0.059210526 0.019736842  0.110526316
##   $150K +       0.003663004 0.062271062 0.047619048 0.014652015  0.095238095
##   $30K - $50K   0.004564225 0.064985873 0.050641165 0.014562052  0.096066073
##   $50K - $70K   0.009282700 0.067510549 0.045147679 0.015189873  0.089451477
##   $70K - $90K   0.002925688 0.073727326 0.056173201 0.011702750  0.088355764
##   $90K - $110K  0.003262643 0.065252855 0.040783034 0.016313214  0.120717781
##                
##                 Health and Hygiene   Household        Meat Periodicals
##   $10K - $30K          0.065048544 0.101294498 0.007766990 0.015857605
##   $110K - $130K        0.051321928 0.097978227 0.007776050 0.026438569
##   $130K - $150K        0.067105263 0.100000000 0.005263158 0.011842105
##   $150K +              0.069597070 0.098901099 0.007326007 0.003663004
##   $30K - $50K          0.063464464 0.093892632 0.005868290 0.014127364
##   $50K - $70K          0.056540084 0.114767932 0.007172996 0.015189873
##   $70K - $90K          0.070216501 0.106495026 0.004095963 0.010532475
##   $90K - $110K         0.070146819 0.089722675 0.004893964 0.011419250
##                
##                     Produce     Seafood Snack Foods      Snacks Starchy Foods
##   $10K - $30K   0.135922330 0.005501618 0.106472492 0.024595469   0.022653722
##   $110K - $130K 0.119751166 0.004665630 0.132192846 0.024883359   0.027993779
##   $130K - $150K 0.143421053 0.010526316 0.109210526 0.025000000   0.019736842
##   $150K +       0.120879121 0.018315018 0.128205128 0.029304029   0.018315018
##   $30K - $50K   0.141273636 0.009563138 0.115844382 0.027602695   0.018474245
##   $50K - $70K   0.145147679 0.004641350 0.115611814 0.025316456   0.020253165
##   $70K - $90K   0.154476302 0.007021650 0.107665301 0.016968988   0.016383850
##   $90K - $110K  0.158238173 0.003262643 0.125611746 0.027732463   0.013050571

Trực quan hóa

ggplot(dat, aes(x = AnnualIncome, fill = ProductDepartment)) +
  geom_bar(position = "fill") +
  labs(title = "Tỷ lệ ProductDepartment theo Annual Income", y = "Tỷ lệ", x = "Annual Income") +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

Nhận xét

Kiểm định chi - bình phương

chi_result3 <- chisq.test(tab3)
## Warning in stats::chisq.test(x, y, ...): Chi-squared approximation may be
## incorrect
chi_result3
## 
##  Pearson's Chi-squared test
## 
## data:  tab3
## X-squared = 170.16, df = 147, p-value = 0.09276
# Giá trị thống kê Chi-squared
chi_result3$statistic
## X-squared 
##  170.1572
# Bậc tự do 
chi_result3$parameter
##  df 
## 147
# Giá trị p
chi_result3$p.value
## [1] 0.0927647

Giả thuyết

  • Giả thuyết H0: Thu nhập hàng tháng (AnnualIncome) và ProductDepartment là độc lập, không có mối liên hệ.

  • Giả thuyết H1: Thu nhập hàng tháng (AnnualIncome) và ProductDepartment có liên hệ với nhau.

Kết quả kiểm định:

  • Giá trị thống kê Chi-squared: X-squared = 170.16

  • Bậc tự do: df = 147

  • Giá trị p: p = 0.0927647

Kết luận:

  • Với mức ý nghĩa 0.05 p_value = 0.09276 > 0.05 → ta không đủ điều kiện để bác bỏ H0, tức là không có mối liên hệ giữa 2 biến AnnualIncome và ProductDepartment.

Homeowner và AnnualIncome

Bảng tần suất chéo

tab4 <- table(dat$Homeowner, dat$AnnualIncome)
tab4
##    
##     $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K $50K - $70K
##   N        1359           119           136      48        2087        1063
##   Y        1731           524           624     225        2514        1307
##    
##     $70K - $90K $90K - $110K
##   N         686          117
##   Y        1023          496
prop.table(tab4, 1)
##    
##     $10K - $30K $110K - $130K $130K - $150K     $150K + $30K - $50K $50K - $70K
##   N 0.242030276   0.021193232   0.024220837 0.008548531 0.371682992 0.189314337
##   Y 0.204997631   0.062055898   0.073898626 0.026646139 0.297726196 0.154784462
##    
##     $70K - $90K $90K - $110K
##   N 0.122172752  0.020837044
##   Y 0.121151113  0.058739934

Trực quan hóa

ggplot(dat, aes(x = AnnualIncome, fill = Homeowner)) +
  geom_bar(position = "fill") +
  labs(title = "Tỷ lệ Homeowner theo Annual Income", y = "Tỷ lệ", x = "Annual Income") +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

Nhận xét

Kiểm định chi - bình phương

chi_result4 <- chisq.test(tab4)
chi_result4
## 
##  Pearson's Chi-squared test
## 
## data:  tab4
## X-squared = 546.37, df = 7, p-value < 2.2e-16
# Giá trị thống kê Chi-squared
chi_result4$statistic
## X-squared 
##  546.3723
# Bậc tự do 
chi_result4$parameter
## df 
##  7
# Giá trị p
chi_result4$p.value
## [1] 8.517274e-114

Giả thuyết

  • Giả thuyết H0: Thu nhập hàng tháng (AnnualIncome) và tình trạng sở hữu nhà (Homeowner) là độc lập, không có mối liên hệ.

  • Giả thuyết H1: Thu nhập hàng tháng (AnnualIncome) và tình trạng sở hữu nhà (Homeowner) có liên hệ với nhau.

Kết quả kiểm định:

  • Giá trị thống kê Chi-squared: X-squared = 546.37

  • Bậc tự do: df = 7

  • Giá trị p: p <2.2e-16

Kết luận:

  • Với mức ý nghĩa 0.05 p_value < 0.05 → ta có đủ điều kiện để bác bỏ H0, tức là có mối liên hệ giữa 2 biến thu nhập hàng tháng và tình trạng sở hữu nhà.

4.5 City và Gender

Bảng tần suất chéo

tab5 <- table(dat$Gender, dat$Country)
tab5
##    
##     Canada Mexico  USA
##   F    373   2056 4741
##   M    436   1632 4821
prop.table(tab5, 1)
##    
##         Canada     Mexico        USA
##   F 0.05202232 0.28675035 0.66122734
##   M 0.06328930 0.23689940 0.69981129

Trực quan hóa

ggplot(dat, aes(x = Country, fill = Gender)) +
  geom_bar(position = "fill") +
  labs(title = "Tỷ lệ giới tính theo quốc gia", y = "Tỷ lệ", x = "Country") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("M" = "yellow", "F" = "pink")) +
  theme_minimal()

Nhận xét

Kiểm định chi - bình phương

chi_result5 <- chisq.test(tab5)
chi_result5
## 
##  Pearson's Chi-squared test
## 
## data:  tab5
## X-squared = 48.725, df = 2, p-value = 2.628e-11
# Giá trị thống kê Chi-squared
chi_result5$statistic
## X-squared 
##  48.72464
# Bậc tự do 
chi_result5$parameter
## df 
##  2
# Giá trị p
chi_result5$p.value
## [1] 2.627719e-11

Giả thuyết

  • Giả thuyết H0: Giới tính (Gender) và quốc gia (Country) là 2 biến độc lập, không có mối liên hệ.

  • Giả thuyết H1: Giới tính (Gender) và quốc gia (Country) là 2 biến có mối liên hệ với nhau.

Kết quả kiểm định:

  • Giá trị thống kê Chi-squared: X-squared = 48.725

  • Bậc tự do: df = 2

  • Giá trị p: p = 2.628e-11

Kết luận:

  • Với mức ý nghĩa 0.05 p_value = 2.628e-11 < 0.05 → ta có đủ điều kiện để bác bỏ H0, tức là có mối liên hệ giữa 2 biến là giới tính và quốc gia.

PHẦN 5: TỔNG KẾT VÀ THẢO LUẬN

  • Thông qua quá trình nghiên cứu, phân tích dữ liệu, trực quan hóa cũng như áp dụng các phương pháp thống kê, có thể rút ra một số kết luận quan trọng về hành vi tiêu dùng của khách hàng. Mặc dù các yếu tố nhân khẩu học như giới tính, tình trạng hôn nhân hay tình trạng sở hữu nhà ở không cho thấy sự ảnh hưởng mạnh mẽ đến hành vi mua sắm, nhưng chúng vẫn góp phần tạo nên một số khác biệt đáng lưu ý giữa các nhóm khách hàng. Những khác biệt này, dù không mang tính quyết định, vẫn có thể tác động nhất định đến xu hướng tiêu dùng trong một số bối cảnh cụ thể.

  • Phân tích dữ liệu cũng cho thấy phần lớn khách hàng thuộc nhóm thu nhập trung bình, dao động từ khoảng 30.000 đến 100.000 USD mỗi năm. Đáng chú ý, đa số trong số họ là những người đã sở hữu nhà riêng, điều này có thể phản ánh mức độ ổn định về tài chính và nhu cầu tiêu dùng ở mức cơ bản nhưng ổn định.

  • Xét theo giới tính, hành vi lựa chọn nhóm sản phẩm giữa nam và nữ không thể hiện sự khác biệt rõ ràng. Điều này cho thấy sự tương đồng nhất định trong nhu cầu tiêu dùng thiết yếu, đặc biệt là trong các mặt hàng như thực phẩm và đồ uống – những sản phẩm chiếm tỷ trọng tiêu thụ cao ở cả hai giới. Kết quả kiểm định thống kê càng củng cố nhận định này khi cho thấy rằng giới tính không phải là một yếu tố có ý nghĩa thống kê trong việc ảnh hưởng đến lựa chọn nhóm sản phẩm. Từ đó có thể suy ra rằng, trong một số ngành hàng như tiêu dùng nhanh, việc phân khúc thị trường theo giới tính có thể không còn quá cần thiết, trừ khi được kết hợp với các yếu tố khác như độ tuổi, thu nhập hoặc khu vực địa lý.

  • Đáng chú ý, nhóm sản phẩm “Food” là lựa chọn phổ biến nhất, với tỷ lệ người tiêu dùng lựa chọn vượt ngưỡng 70% ở cả hai giới – phản ánh rõ vai trò thiết yếu của nhóm hàng này trong đời sống hàng ngày.

  • Khi so sánh hành vi mua sắm theo quốc gia, dữ liệu chỉ ra rằng sự khác biệt về giới tính trong tiêu dùng hầu như không tồn tại tại hai quốc gia USA và Canada. Tuy nhiên, điều này không đúng với Mexico, nơi tỷ lệ khách hàng nữ chiếm ưu thế rõ rệt, khoảng 55% tổng số khách hàng. Sự chênh lệch này gợi ý rằng yếu tố địa lý có thể tương tác với yếu tố giới tính để tạo nên khác biệt trong hành vi tiêu dùng.

LS0tCnRpdGxlOiAiTkhJ4buGTSBW4bukIFRV4bqmTiAyIgphdXRob3I6ICJWw7UgSG/DoG5nIFTDrW5oIgpkYXRlOiAiMjAyNS0wNS0yNSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jOiB0cnVlCiAgcGRmX2RvY3VtZW50OgogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojIyAqKlBI4bqmTiAxOiBUw4xNIEhJ4buCVSBWw4AgQ0hV4bqoTiBC4buKIEThu64gTEnhu4ZVKioKCiMjIyAqKjEuMSDEkOG7jEMgROG7riBMSeG7hlUqKgoKCioqxJDhu41jIGZpbGUgZOG7ryBsaeG7h3UgZ+G7kWMqKgoKYGBge3J9CmRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9IGZpbGUuY2hvb3NlKCksIGhlYWRlciA9IFQpCmBgYAoKKipDw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oKioKCi0gZGF0IDwtIGRhdGFbLCBkbGR0XTogbOG6pXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBkYXRhIGPDoWMgY+G7mXQgdHJvbmcgZGxkdCB24burYSB04bqhbyByYSAoY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCksIHbDoCBs4bqleSB04bqldCBj4bqjIGPDoWMgaMOgbmcgCgpgYGB7cn0KIyBDaOG7jW4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaApkbGR0IDwtIGMoIkdlbmRlciIsICJNYXJpdGFsU3RhdHVzIiwgIkhvbWVvd25lciIsICJBbm51YWxJbmNvbWUiLCAiQ2l0eSIsICJTdGF0ZW9yUHJvdmluY2UiLCAiQ291bnRyeSIsICJQcm9kdWN0RmFtaWx5IiwgIlByb2R1Y3REZXBhcnRtZW50IiwgIlByb2R1Y3RDYXRlZ29yeSIpCgojIFThuqFvIGLhu5kgZOG7ryBsaeG7h3UgbeG7m2kgY2jhu4kgY2jhu6lhIMSR4buLbmggdMOtbmgKZGF0IDwtIGRhdGFbLCBkbGR0XQpgYGAKCgojIyMgKioxLjIuIE7hu5hJIERVTkcgROG7riBMSeG7hlUqKgoKLSBC4buZIGThu68gbGnhu4d1IG7DoHkgZ+G7k20gMTQsMDU5IGdpYW8gZOG7i2NoIG11YSBow6BuZyB04bqhaSBzacOqdSB0aOG7iywgduG7m2kgY8OhYyB0aMO0bmcgdGluIGxpw6puIHF1YW4gxJHhur9uIGtow6FjaCBow6BuZyB2w6Agc+G6o24gcGjhuqltIGJhbyBn4buTbSAqKm3DoyDEkeG7i25oIGRhbmgga2jDoWNoIGjDoG5nIHbDoCBjw6FjIHRow7RuZyB0aW4gbGnDqm4gcXVhbioqLCAqKnbhu4sgdHLDrSDEkeG7i2EgbMO9KiosICoqY2hpIHRp4bq/dCBjw6FjIHPhuqNuIHBo4bqpbSDEkcaw4bujYyBtdWEqKi4KCi0gROG7ryBsaeG7h3UgbsOgeSBjw7MgdGjhu4MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgKipwaMOibiB0w61jaCBow6BuaCB2aSBtdWEgc+G6r20gY+G7p2Ega2jDoWNoIGjDoG5nKiosICoqcGjDom4ga2jDumMgdGjhu4sgdHLGsOG7nW5nKiosIGhv4bq3YyAqKsSRw6FuaCBnacOhIGhp4buHdSBxdeG6oyBraW5oIGRvYW5oKiogdGhlbyB04burbmcgc+G6o24gcGjhuqltLCB04burbmcga2h1IHbhu7FjIHbDoCB04burbmcgbmjDs20gxJHhu5FpIHTGsOG7o25nLiAKCioqRGFuaCBzw6FjaCBjw6FjIGJp4bq/biB2w6AgbcO0IHThuqMqKgoKKipD4bqldSB0csO6YyBi4buZIGThu68gbGnhu4d1IFN1cGVybWFya2V0IFRyYW5zYWN0aW9ucyoqCgpgYGB7cn0Kc3RyKGRhdGEpCmBgYAoKICAtIEdlbmRlcjogR2nhu5tpIHTDrW5oIChGIC0gTuG7rywgTSAtIE5hbSkKICAtIE1hcml0YWxTdGF0dXM6IFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAoUyAtIMSQ4buZYyB0aMOibiwgTSAtIMSQw6Mga+G6v3QgaMO0bikKICAtIEhvbWVvd25lcjogQ8OzIHPhu58gaOG7r3UgbmjDoCBoYXkga2jDtG5nIChZIC0gQ8OzLCBOIC0gS2jDtG5nKQogIC0gQW5udWFsSW5jb21lOiBUaHUgbmjhuq1wIGjDoG5nIG7Eg20gKMSRxrDhu6NjIGJp4buDdSB0aOG7iyBkxrDhu5tpIGThuqFuZyBjw6FjIGtob+G6o25nKQogIC0gQ2l0eSwgU3RhdGVvclByb3ZpbmNlLCBDb3VudHJ5OiBUaMO0bmcgdGluIMSR4buLYSBsw70KICAtIFByb2R1Y3RGYW1pbHksIFByb2R1Y3REZXBhcnRtZW50LCBQcm9kdWN0Q2F0ZWdvcnk6IFBow6JuIGxv4bqhaSBz4bqjbiBwaOG6qW0KICAKKipT4buRIGJp4bq/biB2w6Agc+G7kSBxdWFuIHPDoXQqKgoKYGBge3J9CmRpbShkYXQpCmBgYAoKLSBC4buZIGThu68gbGnhu4d1ICoqZGF0KiogY2jhu6lhIHThu5VuZyBj4buZbmcgKioxNC4wNTkgcXVhbiBzw6F0KiogY8O5bmcgduG7m2kgKioxMCBiaeG6v24qKiDEkeG6t2MgdHLGsG5nIHTGsMahbmcg4bupbmcgbMOgIGJp4bq/biDEkeG7i25oIHTDrW5oLgotIE3hu5dpIHF1YW4gc8OhdCBz4bq9IHTGsOG7n25nIOG7qW5nIHbhu5tpIG3hu5dpIGdpYW8gZOG7i2NoIG11YSBow6BuZyB04bqhaSBzacOqdSB0aOG7iy4KCgoqKktp4buDbSB0cmEgc+G7kSBsxrDhu6NuZyBOQSB0cm9uZyBj4buZdCDEkeG7i25oIHTDrW5oKioKCgpzYXBwbHkoZGF0LCAuLi4pOiDDoXAgZOG7pW5nIGjDoG0gY2hvIHThu6tuZyBj4buZdCB0cm9uZyBk4buvIGxp4buHdSAqKmRhdCoqLgoKc3VtKGlzLm5hKHgpKTogxJHhur9tIHPhu5EgbMaw4bujbmcgTkEgdHJvbmcgdOG7q25nIGPhu5l0LgoKYGBge3J9CiMgS2nhu4NtIHRyYSBz4buRIGzGsOG7o25nIE5BIHRyb25nIG3hu5dpIGPhu5l0IMSR4buLbmggdMOtbmgKbmFfY291bnRzIDwtIHNhcHBseShkYXQsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCm5hX2NvdW50cwpgYGAKCioqTmjhuq1uIHjDqXQqKiAKLSBL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgY2hvIHRo4bqleSBy4bqxbmcgdOG6pXQgY+G6oyBjw6FjIGPhu5l0IMSR4buLbmggdMOtbmggxJHhu4F1IGtow7RuZyBjw7MgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkgdsOsIHPhu5EgbMaw4bujbmcgTkEgdHJvbmcgY8OhYyBj4buZdCDEkeG7gXUgaGnhu4NuIHRo4buLIGzDoCAwCgojIyMjIyAqKkNodXnhu4NuIMSR4buVaSBjw6FjIGPhu5l0IHNhbmcgZmFjdG9yKioKCgpgYGB7cn0KIyBDaHV54buDbiDEkeG7lWkgY8OhYyBj4buZdCBzYW5nIGZhY3RvciBu4bq/dSBjaMawYSBwaOG6o2kgbMOgIGZhY3RvcgpkYXQgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkoZGF0LCBmdW5jdGlvbih4KSB7CiAgaWYgKCFpcy5mYWN0b3IoeCkpIHsKICAgIHJldHVybihhcy5mYWN0b3IoeCkpCiAgfSBlbHNlIHsKICAgIHJldHVybih4KQogIH0KfSkpCmBgYAogIEvhur90IHF14bqjIHRodSDEkcaw4bujYyB0b8OgbiBi4buZIGPDoWMgYmnhur9uIMSRw6MgxJHGsOG7o2MgY2h1eeG7g24gxJHhu5VpIHRow6BuaCBk4bqhbmcgZmFjdG9yLgoKIyMgKipQSOG6pk4gMjogUEjDgk4gVMONQ0ggQknhur5OIMSQ4buKTkggVMONTkgqKgojIyMgKipQUk9EVUNUQ0FURUdPUlkqKgoKKipUaOG7kW5nIGvDqiB0deG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioKCmBgYHtyfQp0YWJfUHJvZHVjdENhdGVnb3J5IDwtIHRhYmxlKGRhdCRQcm9kdWN0Q2F0ZWdvcnkpCnRhYl9Qcm9kdWN0Q2F0ZWdvcnkKdGFibGUoZGF0JFByb2R1Y3RDYXRlZ29yeSkvc3VtKG5yb3coZGF0KSkKYmFycGxvdCh0YWJfUHJvZHVjdENhdGVnb3J5LCBtYWluID0gIkRhbmggbeG7pWMgc+G6o24gcGjhuqltIC0gUHJvZHVjdENhdGVnb3J5IiwgY29sID0gIiNGRjAwMDAiLCBsYXMgPSAyKQpgYGAKCioqTmjhuq1uIHjDqXQqKgoKLSBDw6FjIGxv4bqhaSB0aOG7sWMgcGjhuqltIHBo4buVIGJp4bq/biDEkcaw4bujYyBxdWFuIHPDoXQgdOG7qyBiaeG7g3UgxJHhu5M6CgogIC0gVmVnZXRhYmxlcyAoUmF1KTogduG7m2kgc+G7kSBsxrDhu6NuZyBsw6AgYHIgdGFibGUoZGF0JFByb2R1Y3RDYXRlZ29yeSlbNDVdYCBraMOhY2ggaMOgbmcgdsOgIGNoaeG6v20gaOG6v3QgKGByIHRhYmxlKGRhdCRQcm9kdWN0Q2F0ZWdvcnkpWzQ1XS9zdW0obnJvdyhkYXQpKSoxMDBgXCUpCgogIC0gU25hY2sgRm9vZHM6IGByIHRhYmxlKGRhdCRQcm9kdWN0Q2F0ZWdvcnkpWzQyXWAga2jDoWNoIGjDoG5nIHbDoCBjaGnhur9tIGjhur90IChgciB0YWJsZShkYXQkUHJvZHVjdENhdGVnb3J5KVs0Ml0vc3VtKG5yb3coZGF0KSkqMTAwYFwlKQoKICAtIERhaXJ5IChT4buvYSk6IGByIHRhYmxlKGRhdCRQcm9kdWN0Q2F0ZWdvcnkpWzE4XWAga2jDoWNoIGjDoG5nIHbDoCBjaGnhur9tIGjhur90IChgciB0YWJsZShkYXQkUHJvZHVjdENhdGVnb3J5KVsxOF0vc3VtKG5yb3coZGF0KSkqMTAwYFwlKQoKICAtIEZydWl0LCBNZWF0LCBGcm96ZW4gRm9vZHMuLi4KCi0gxJDDonkgbMOgIG5o4buvbmcgbeG6t3QgaMOgbmcgdGnDqnUgZMO5bmcgbmhhbmgsIGPDsyB2w7JuZyDEkeG7nWkgbmfhuq9uLgoKLSBWaeG7h2Mga2jDoWNoIGjDoG5nIG11YSBjaOG7pyB54bq/dSBjw6FjIG3hurd0IGjDoG5nIHRoaeG6v3QgeeG6v3UgY2hvIHRo4bqleSBzacOqdSB0aOG7iyBob+G6oXQgxJHhu5luZyB04buRdCB0cm9uZyB2aeG7h2MgcGjhu6VjIHbhu6Ugbmh1IGPhuqd1IGPGoSBi4bqjbiwgY2jhu6kga2jDtG5nIHBo4bqjaSBz4bqjbiBwaOG6qW0geGEgeOG7iSBoYXkga2jDtG5nIHRoxrDhu51uZyB4dXnDqm4uCgojIyMgKipBTk5VQUxJTkNPTUUqKgoKKipUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKgoKYGBge3J9CnRhYl9Bbm51YWxJbmNvbWUgPC0gdGFibGUoZGF0JEFubnVhbEluY29tZSkKdGFiX0FubnVhbEluY29tZQp0YWJsZShkYXQkQW5udWFsSW5jb21lKS9zdW0obnJvdyhkYXQpKQpiYXJwbG90KHRhYl9Bbm51YWxJbmNvbWUsIG1haW4gPSAiVGh1IG5o4bqtcC90aMOhbmcgLSBBbm51YWxJbmNvbWUiLCBjb2wgPSAibGlnaHRibHVlIiwgbGFzID0gMikKYGBgCgoqKk5o4bqtbiB4w6l0KioKCi0gTmjDs20gJDMwSyAtICQ1MEsgY2hp4bq/bSDEkWEgc+G7kSB24bubaSBgciB0YWJsZShkYXQkQW5udWFsSW5jb21lKVsxXWAga2jDoWNoIGjDoG5nICAoY2hp4bq/bSBgciB0YWJsZShkYXQkQW5udWFsSW5jb21lKVs1XS9zdW0obnJvdyhkYXQpKSoxMDBgXCUpLCB0aGVvIHNhdSBsw6A6CgogIC0gTmjDs20gJDEwSyAtICQzMEsgKGByIHRhYmxlKGRhdCRBbm51YWxJbmNvbWUpWzFdL3N1bShucm93KGRhdCkpKjEwMGBcJSkKCiAgLSBOaMOzbSAkNTBLIC0gJDcwSyAoYHIgdGFibGUoZGF0JEFubnVhbEluY29tZSlbNl0vc3VtKG5yb3coZGF0KSkqMTAwYFwlKQoKLSBS4bqldCDDrXQga2jDoWNoIGjDoG5nIGPDsyB0aHUgbmjhuq1wIHRyw6puICQxNTBLIChgciB0YWJsZShkYXQkQW5udWFsSW5jb21lKVs0XS9zdW0obnJvdyhkYXQpKSoxMDBgXCUpCgotIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBjaHXhu5dpIHNpw6p1IHRo4buLIGNo4bunIHnhur91IHBo4bulYyB24bulIG5ow7NtIHRodSBuaOG6rXAgdHJ1bmcgYsOsbmggdsOgIHRo4bqlcCDigJMgcGjDuSBo4bujcCB24bubaSBjaGnhur9uIGzGsOG7o2MgZ2nDoSBy4bq7LCBow6BuZyBow7NhIHRoaeG6v3QgeeG6v3UuCgotIENoaeG6v24gbMaw4bujYyBtYXJrZXRpbmcsIGtodXnhur9uIG3Do2ksIHbDoCBjaMOtbmggc8OhY2ggZ2nDoSBuw6puIHThuq1wIHRydW5nIHbDoG8gbmjDs20gbsOgeSAodsOtIGThu6U6IGNvbWJvIHRp4bq/dCBraeG7h20sIGNoaeG6v3Qga2jhuqV1IHRoZW8gc+G7kSBsxrDhu6NuZykuCgojIyMgKipDT1VOVFJZKioKCioqVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioKCmBgYHtyfQp0YWJfQ291bnRyeSA8LSB0YWJsZShkYXQkQ291bnRyeSkKdGFiX0NvdW50cnkKdGFibGUoZGF0JENvdW50cnkpL3N1bShucm93KGRhdCkpCmJhcnBsb3QodGFiX0NvdW50cnksIG1haW4gPSAiUXXhu5FjIGdpYSAtIENvdW50cnkiLCBjb2wgPSAib3JjaGlkIiwgbGFzID0gMikKYGBgCgoqKk5o4bqtbiB4w6l0KioKCi0gVOG7tyBs4buHIGtow6FjaCBow6BuZyB0aGVvIHF14buRYyBnaWEgcGjDom4gYuG7lSB0aGVvIHRyw6xuaCB04buxIGdp4bqjbSBk4bqnbjoKCiAgLSBDYW8gbmjhuqV0IGzDoCBVU0E6IGByIHRhYmxlKGRhdCRDb3VudHJ5KVszXS9zdW0obnJvdyhkYXQpKSoxMDBgXCUKCiAgLSBL4bq/IHRp4bq/cCBsw6AgTWV4aWNvOiBgciB0YWJsZShkYXQkQ291bnRyeSlbMl0vc3VtKG5yb3coZGF0KSkqMTAwYFwlCgogIC0gVGjhuqVwIG5o4bqldCBsw6AgQ2FuYWRhOiBgciB0YWJsZShkYXQkQ291bnRyeSlbMV0vc3VtKG5yb3coZGF0KSkqMTAwYFwlCiAgCi0gVVMgSG9hIEvhu7MgcsO1IHLDoG5nIGzDoCB0aOG7iyB0csaw4budbmcgdHLhu41uZyDEkWnhu4NtIHbhu5tpIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgZ2lhbyBk4buLY2ggIGNhbyBuaOG6pXQgdHJvbmcgMyBxdeG7kWMgZ2lhLiDEkGnhu4F1IG7DoHkgY2jhu6luZyB04buPIEhvYSBL4buzIGzDoCBt4buZdCBxdeG7kWMgZ2lhIHBow6F0IHRyaeG7g24gbeG6oW5oIHbhu5tpIG5odSBj4bqndSB0acOqdSBkw7luZyBjaGnhur9uIHBo4bqnbiBs4bubbi4gCgotIFR1eSBuaGnDqm4sIHPhu7EgaGnhu4duIGRp4buHbiB04bqhaSBNZXhpY28gKGjGoW4gMS80IHPhu5EgZ2lhbyBk4buLY2gpIGNobyB0aOG6pXkgxJHDonkgbMOgIHRo4buLIHRyxrDhu51uZyB0aOG7qSBj4bqlcCB0aeG7gW0gbsSDbmcsIGPDsyB0aOG7gyBt4bufIHLhu5luZyBob+G6t2MgdMSDbmcgbmjhuq1uIGRp4buHbiB0aMawxqFuZwpoaeG7h3UuCgojIyMgKipHRU5ERVIqKgoKKipUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKgoKLSBT4butIGThu6VuZyBow6BtIHRhYmxlKCkgxJHhu4MgxJHhur9tIHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiAodOG6p24gc3XhuqV0KSBj4bunYSB04burbmcgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gxJHhu4tuaCB0w61uaC4KCi0gcHJvcC50YWJsZSh0YWJfZ2VuZGVyKSB04bqhbyBi4bqjbmcgdOG7tyBs4buHIHBo4bqnbiB0csSDbSAodGhlbyBk4bqhbmcgdGjhuq1wIHBow6JuKS4gTmjDom4gduG7m2kgMTAwIMSR4buDIHJhIHBo4bqnbiB0csSDbS4KCi0gcm91bmQoLi4uLCAyKSBsw6BtIHRyw7JuIDIgY2jhu68gc+G7kSBzYXUgZOG6pXUgcGjhuql5LgoKLSBiYXJwbG90KCkgdOG6oW8gYmnhu4N1IMSR4buTIGPhu5l0IHThu6sgYuG6o25nIHThuqduIHN14bqldC4KCi0gbWFpbjogdGnDqnUgxJHhu4EgYmnhu4N1IMSR4buTLgoKLSBjb2w6IG3DoHUgc+G6r2MgY+G7mXQgKOG7nyDEkcOieSBsw6AgbcOgdSAic3RlZWxibHVlIikuCgotIGxhcyA9IDI6IHhvYXkgbmjDo24gdHLhu6VjIGhvw6BuaCAoWCkgdGhlbyBjaGnhu4F1IGThu41jIMSR4buDIGThu4UgxJHhu41jLgoKYGBge3J9CnRhYl9nZW5kZXIgPC0gdGFibGUoZGF0JEdlbmRlcikKdGFiX2dlbmRlcgp0YWJsZShkYXQkR2VuZGVyKS9zdW0obnJvdyhkYXQpKQpiYXJwbG90KHRhYl9nZW5kZXIsIG1haW4gPSAiVOG6p24gc3XhuqV0IC0gR2VuZGVyIiwgY29sID0gImxpZ2h0eWVsbG93IiwgbGFzID0gMikKYGBgCgoqKk5o4bqtbiB4w6l0KioKCi0gROG7ryBsaeG7h3UgY2hvIHRo4bqleSBjw7MgYHIgdGFibGUoZGF0JEdlbmRlcilbMV1gIGtow6FjaCBow6BuZyBsw6AgbuG7ryAoYHIgdGFibGUoZGF0JEdlbmRlcilbMV0vc3VtKG5yb3coZGF0KSkqMTAwYFwlKSB2w6AgYHIgdGFibGUoZGF0JEdlbmRlcilbMl1gIGzDoCBraMOhY2ggaMOgbmcgbmFtIChgciB0YWJsZShkYXQkR2VuZGVyKVsyXS9zdW0obnJvdyhkYXQpKSoxMDBgXCUpLgoKLSBU4bu3IGzhu4cgZ2nhu5tpIHTDrW5oIGdp4buvYSBuYW0gdsOgIG7hu68gdHJvbmcgZOG7ryBsaeG7h3Uga2jDoSBjw6JuIGLhurFuZywga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyBuw6BvLgoKLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjaHXhu5dpIHNpw6p1IHRo4buLIGjGsOG7m25nIHThu5tpIHBo4bulYyB24bulIGPhuqMgaGFpIGdp4bubaSBt4buZdCBjw6FjaCDEkeG7k25nIMSR4buBdSwgdGhheSB2w6wgdOG6rXAgdHJ1bmcgdsOgbyBt4buZdCBuaMOzbSBj4bulIHRo4buDLgoKLSBN4bq3dCBraMOhYywgdmnhu4djIG7hu68gZ2nhu5tpIGNoaeG6v20gdOG7tyBs4buHIG5o4buJbmggaMahbiDEkcO0aSBjaMO6dCBjw7MgdGjhu4MgeHXhuqV0IHBow6F0IHThu6sgdmFpIHRyw7IgdGjGsOG7nW5nIHRo4bqleSBj4bunYSBo4buNIHRyb25nIHZp4buHYyBtdWEgc+G6r20gbmh1IHnhur91IHBo4bqpbSB2w6AgcXXhuqNuIGzDvSBjaGkgdGnDqnUgZ2lhIMSRw6xuaCwgZOG6q24gxJHhur9uIGto4bqjIG7Eg25nIGNhbyBo4buNIGzDoCBuZ8aw4budaSB0aOG7sWMgaGnhu4duIGPDoWMgZ2lhbyBk4buLY2ggxJHGsOG7o2MgZ2hpIG5o4bqtbiB0cm9uZyBow7NhIMSRxqFuLgoKIyMjICoqTUFSSVRBTFNUQVRVUyoqCgoqKlRo4buRbmcga8OqIHR14bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKgoKYGBge3J9CnRhYl9NYXJpdGFsU3RhdHVzIDwtIHRhYmxlKGRhdCRNYXJpdGFsU3RhdHVzKQp0YWJfTWFyaXRhbFN0YXR1cwp0YWJsZShkYXQkTWFyaXRhbFN0YXR1cykvc3VtKG5yb3coZGF0KSkKYmFycGxvdCh0YWJfTWFyaXRhbFN0YXR1cywgbWFpbiA9ICJUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gLSBNYXJpdGFsU3RhdHVzIiwgY29sID0gInNreWJsdWUiLCBsYXMgPSAyKSAKYGBgCgoqKk5o4bqtbiB4w6l0KioKCi0gU+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgxJHhu5ljIHRow6JuIChTaW5nbGUg4oCTIGvDvSBoaeG7h3UgUykgbMOgIGByIHRhYmxlKGRhdCRNYXJpdGFsU3RhdHVzKVsxXWAgbmfGsOG7nWkgKGNoaeG6v20gYHIgdGFibGUoZGF0JE1hcml0YWxTdGF0dXMpWzFdL3N1bShucm93KGRhdCkpKjEwMGBcJSksIGPDsm4gbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIChNYXJyaWVkIOKAkyBNKSBsw6AgYHIgdGFibGUoZGF0JE1hcml0YWxTdGF0dXNbMl0pYCBuZ8aw4budaSAoY2hp4bq/bSBgciB0YWJsZShkYXQkTWFyaXRhbFN0YXR1cylbMl0vc3VtKG5yb3coZGF0KSkqMTAwYFwlKQotIE3hurdjIGTDuSB04bu3IGzhu4cga2jDoSBjw6JuIGLhurFuZywgbmjGsG5nIG5ow7NtIMSR4buZYyB0aMOibiBjaGnhur9tIHThu7cgbOG7hyBjYW8gaMahbiBt4buZdCBjaMO6dC4KCi0gR2nhuqNpIHRow61jaCBo4bujcCBsw70gY2hvIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4MgbMOgOgoKICAtIE5o4buvbmcgbmfGsOG7nWkgxJHhu5ljIHRow6JuIGPDsyB4dSBoxrDhu5tuZyB04buxIMSRaSBtdWEgc+G6r20gbmhp4buBdSBoxqFuLCBraMO0bmcgZOG7sWEgdsOgbyBi4bqhbiDEkeG7nWkuCgogIC0gTmdvw6BpIHJhLCBuZ8aw4budaSB0cuG6uyDEkeG7mWMgdGjDom4gdGjGsOG7nW5nIHPhu5FuZyDhu58gdGjDoG5oIHRo4buLIHbDoCBz4butIGThu6VuZyBk4buLY2ggduG7pSBzacOqdSB0aOG7iyB0aMaw4budbmcgeHV5w6puIGjGoW4sIHRyb25nIGtoaSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHRo4buDIG11YSB0aGVvIG5ow7NtIGhv4bq3YyB0aGVvIGjhu5kgZ2lhIMSRw6xuaCBs4bubbiB2w6Agw610IGdpYW8gZOG7i2NoIGjGoW4gdHLDqm4gbeG7l2kgY8OhIG5ow6JuLgogIAojIyMgKipIT01FT1dORVIqKgoKKipUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKgoKYGBge3J9CnRhYl9Ib21lb3duZXIgPC0gdGFibGUoZGF0JEhvbWVvd25lcikKdGFiX0hvbWVvd25lcgp0YWJsZShkYXQkSG9tZW93bmVyKS9zdW0obnJvdyhkYXQpKQpiYXJwbG90KHRhYl9Ib21lb3duZXIsIG1haW4gPSAiU+G7nyBo4buvdSBuaMOgIC0gSG9tZW93bmVyIiwgY29sID0gImRhcmtzZWFncmVlbiIsIGxhcyA9IDIpCmBgYAoKKipOaOG6rW4geMOpdCoqCgotIFThu6sga+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIHRhIHRo4bqleSBjw7MgYHIgdGFibGUoZGF0JEhvbWVvd25lcilbMV1gIGtow6FjaCBow6BuZyAoY2hp4bq/bSBgciB0YWJsZShkYXQkSG9tZW93bmVyKVsxXS9zdW0obnJvdyhkYXQpKSoxMDBgXCUpIGtow7RuZyBz4bufIGjhu691IG5ow6AsIGPDsm4gYHIgdGFibGUoZGF0JEhvbWVvd25lcilbMl1gIGtow6FjaCBow6BuZyAoY2hp4bq/bSBgciB0YWJsZShkYXQkSG9tZW93bmVyKVsyXS9zdW0obnJvdyhkYXQpKSoxMDBgXCUpIGzDoCBjaOG7pyBz4bufIGjhu691IG5ow6AuCgotIMSQw6J5IGzDoCBt4buZdCBjaOG7iSBiw6FvIHF1YW4gdHLhu41uZyB24buBIHPhu7Eg4buVbiDEkeG7i25oIHTDoGkgY2jDrW5oIGPhu6dhIGtow6FjaCBow6BuZy4KCi0gTmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIHRoxrDhu51uZyBjw7M6CgogIC0gQ2hpIHRpw6p1IOG7lW4gxJHhu4tuaCBoxqFuLgoKICAtIE5odSBj4bqndSBtdWEgc+G6r20gbmhp4buBdSBoxqFuIGNobyBnaWEgxJHDrG5oICh0aOG7sWMgcGjhuqltLCDEkeG7kyBnaWEgZOG7pW5nKS4KCi0gVHJvbmcga2hpIMSRw7MsIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgKGPDsyB0aOG7gyB0aHXDqiBuaMOgIGhv4bq3YyBz4buRbmcgdOG6oW0gdGjhu51pKSBjw7MgdGjhu4M6CgogIC0gQ2hpIHRpw6p1IGTDqCBk4bq3dCBoxqFuLgoKICAtIMONdCBtdWEgaMOgbmcgc+G7kSBsxrDhu6NuZyBs4bubbiwgaG/hurdjIMawdSB0acOqbiBow6BuZyBuaOG7jyBn4buNbiwgZOG7hSB24bqtbiBjaHV54buDbi4KICAKIyMjICoqQ0lUWSoqCgoqKlRo4buRbmcga8OqIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqCgpgYGB7cn0KdGFiX0NpdHkgPC0gdGFibGUoZGF0JENpdHkpCnRhYl9DaXR5CnRhYmxlKGRhdCRDaXR5KS9zdW0obnJvdyhkYXQpKQpiYXJwbG90KHRhYl9DaXR5LCBtYWluID0gIlRow6BuaCBwaOG7kSAtIENpdHkiLCBjb2wgPSAicGluayIsIGxhcyA9IDIpCmBgYAoKKipOaOG6rW4geMOpdCoqCgotIEPDoWMgdGjDoG5oIHBo4buRIGPDsyB04bu3IGzhu4cgZ2lhbyBk4buLY2ggY2FvIGzDoDoKCiAgLSBTYWxlbSBsw6AgdGjDoG5oIHBo4buRIGPDsyB04buJIGzhu4cga2jDoWNoIGjDoG5nIG11YSBz4bqjbiBwaOG6qW0gY2FvIG5o4bqldCB24bubaSBgciB0YWJsZShkYXQkQ2l0eSlbMTNdYCBraMOhY2ggaMOgbmcgdsOgIGNoaeG6v20gaOG6v3QgKGByIHRhYmxlKGRhdCRDaXR5KVsxM10vc3VtKG5yb3coZGF0KSkqMTAwYFwlKQoKICAtIFRoZW8gc2F1IGzDoCB0aMOgbmggcGjhu5EgVGFjb21hIChgciB0YWJsZShkYXQkQ2l0eSlbMjFdL3N1bShucm93KGRhdCkpKjEwMGBcJSkKCiAgLSBL4bq/IHRp4bq/cCBsw6AgdGjDoG5oIHBo4buRIExvcyBBbmdlbGVzIChgciB0YWJsZShkYXQkQ2l0eSlbOF0vc3VtKG5yb3coZGF0KSkqMTAwYFwlKSB2w6AgdGEgdGjhuqV5IHRow6BuaCBwaOG7kSBTZWF0dGxlIHbhu5tpIGByIHRhYmxlKGRhdCRDaXR5KVsxN10vc3VtKG5yb3coZGF0KSkqMTAwYFwlIHjhuqVwIHjhu4kgYuG6sW5nIHbhu5tpIHRow6BuaCBwaOG7kSBMb3MgQW5nZWxlcy4gUXVhIMSRw7MgdGEgbmjDrG4gbmjhuq1uIMSRxrDhu6NjIHLhurFuZyAyIHRow6BuaCBwaOG7kSBuw6B5IGPDsyBsxrDhu6NuZyBraMOhY2ggaMOgbmcgbXVhIHPhuq9tIGfhuqduIG5oxrAgbmhhdS4gCgotIEPDsyB0aOG7gyBuaOG6rW4gdGjhuqV5IHPhu7EgdOG6rXAgdHJ1bmcgbeG6oW5oIHThuqFpIGPDoWMgdGjDoG5oIHBo4buRIGLhu50gVMOieSBIb2EgS+G7sywgxJHhurdjIGJp4buHdCDhu58gY8OhYyBiYW5nIFdhc2hpbmd0b24sIE9yZWdvbiB2w6AgQ2FsaWZvcm5pYS4KCi0gxJBp4buBdSBuw6B5IGfhu6NpIMO9IHLhurFuZzoKCiAgLSBDw6FjIGNoaSBuaMOhbmgg4bufIGPDoWMgdGjDoG5oIHBo4buRIG7DoHkgY8OzIGzGsHUgbMaw4bujbmcga2jDoWNoIGjDoG5nIGzhu5tuLCBob+G6t2MKCiAgLSBDw6FjIHRow6BuaCBwaOG7kSBuw6B5IGPDsyBt4bqtdCDEkeG7mSBkw6JuIGPGsCBjYW8sIG5odSBj4bqndSB0acOqdSBkw7luZyB0aMaw4budbmcgeHV5w6puLgogIAojIyMgKipTVEFURU9SUFJPVklOQ0UqKgoKKipUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKgoKYGBge3J9CnRhYl9TdGF0ZW9yUHJvdmluY2UgPC0gdGFibGUoZGF0JFN0YXRlb3JQcm92aW5jZSkKdGFiX1N0YXRlb3JQcm92aW5jZQp0YWJsZShkYXQkU3RhdGVvclByb3ZpbmNlKS9zdW0obnJvdyhkYXQpKQpiYXJwbG90KHRhYl9TdGF0ZW9yUHJvdmluY2UsIG1haW4gPSAiQmFuZy9U4buJbmggLSBTdGF0ZW9yUHJvdmluY2UiLCBjb2wgPSAiZ29sZGVucm9kIiwgbGFzID0gMikKYGBgCgoqKk5o4bqtbiB4w6l0KioKCi0gUGjDom4gYuG7kToKCiAgLSBXYXNoaW5ndG9uKFdBKTogYHIgdGFibGUoZGF0JFN0YXRlb3JQcm92aW5jZSlbOF0vc3VtKG5yb3coZGF0KSkqMTAwYFwlCgogIC0gQ2FsaWZvcm5pYShDQSk6IGByIHRhYmxlKGRhdCRTdGF0ZW9yUHJvdmluY2UpWzJdL3N1bShucm93KGRhdCkpKjEwMGBcJQoKICAtIE9yZWdvbihPUik6IGByIHRhYmxlKGRhdCRTdGF0ZW9yUHJvdmluY2UpWzZdL3N1bShucm93KGRhdCkpKjEwMGBcJQoKLSBCYSBiYW5nIG7DoHkgxJHhu4F1IOG7nyBi4budIFTDonkgSG9hIEvhu7MsIHbDoCBsw6Agbmjhu69uZyBiYW5nIGPDszoKCiAgLSBEw6JuIHPhu5EgxJHDtG5nLCB0aOG7iyB0csaw4budbmcgYsOhbiBs4bq7IHBow6F0IHRyaeG7g24uCgogIC0gVGjDs2kgcXVlbiB0acOqdSBkw7luZyBoaeG7h24gxJHhuqFpLCBz4butIGThu6VuZyBk4buLY2ggduG7pSBzacOqdSB0aOG7iyBuaGnhu4F1IGjGoW4gc28gduG7m2kgY8OhYyBraHUgduG7sWMgbsO0bmcgdGjDtG4uCgotIFZp4buHYyBt4bufIHLhu5luZyBraW5oIGRvYW5oIGhv4bq3YyDEkeG6p3UgdMawIHRow6ptIHbDoG8gY8OhYyBiYW5nIG7DoHkgbMOgIGNoaeG6v24gbMaw4bujYyBraOG6oyB0aGkuCgoKIyMjICoqUFJPRFVDVEZBTUlMWSoqCgoqKlRo4buRbmcga8OqIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqCgpgYGB7cn0KdGFiX1Byb2R1Y3RGYW1pbHkgPC0gdGFibGUoZGF0JFByb2R1Y3RGYW1pbHkpCnRhYl9Qcm9kdWN0RmFtaWx5CnRhYmxlKGRhdCRQcm9kdWN0RmFtaWx5KS9zdW0obnJvdyhkYXQpKQpiYXJwbG90KHRhYl9Qcm9kdWN0RmFtaWx5LCBtYWluID0gIk5ow7NtIHPhuqNuIHBo4bqpbSAtIFByb2R1Y3RGYW1pbHkiLCBjb2wgPSAiZGFya2JsdWUiLCBsYXMgPSAyKQpgYGAKCioqTmjhuq1uIHjDqXQqKgoKLSBUaOG7sWMgcGjhuqltIChGb29kKSBjaGnhur9tIMSRYSBz4buRIChgciB0YWJsZShkYXQkUHJvZHVjdEZhbWlseSlbMl0vc3VtKG5yb3coZGF0KSkqMTAwYFwlKSwgY2FvIHbGsOG7o3QgdHLhu5lpIHNvIHbhu5tpOgoKICAtIE5vbi1Db25zdW1hYmxlcyBjaGnhur9tIGByIHRhYmxlKGRhdCRQcm9kdWN0RmFtaWx5KVszXS9zdW0obnJvdyhkYXQpKSoxMDBgXCUKCiAgLSBOaMOzbSDEkeG7kyB14buRbmcgY2hp4bq/bSBgciB0YWJsZShkYXQkUHJvZHVjdEZhbWlseSlbMV0vc3VtKG5yb3coZGF0KSkqMTAwYFwlCgotIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBtdWEgc+G6r20gY2jhu6cgeeG6v3UgbMOgIMSR4buDIHBo4bulYyB24bulIG5odSBj4bqndSDEg24gdeG7kW5nIGjDoG5nIG5nw6B5LgoKLSBTacOqdSB0aOG7iyBuw6puIHRp4bq/cCB04bulYyDEkeG6p3UgdMawIG3huqFuaCB2w6BvOgoKICAtIE5ndeG7k24gY3VuZyB0aOG7sWMgcGjhuqltIHTGsMahaSwKCiAgLSBDw6FjIHPhuqNuIHBo4bqpbSB0aGnhur90IHnhur91IGdpw6EgdOG7kXQsCgogIC0gQ2jDrW5oIHPDoWNoIMawdSDEkcOjaSBz4buRIGzGsOG7o25nIGzhu5tuIGNobyB0aOG7sWMgcGjhuqltLgoKIyMjICoqUFJPRFVDVERFUEFSVE1FTlQqKgoKKipUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKgoKYGBge3J9CnRhYl9Qcm9kdWN0RGVwYXJ0bWVudCA8LSB0YWJsZShkYXQkUHJvZHVjdERlcGFydG1lbnQpCnRhYl9Qcm9kdWN0RGVwYXJ0bWVudAp0YWJsZShkYXQkUHJvZHVjdERlcGFydG1lbnQpL3N1bShucm93KGRhdCkpCmJhcnBsb3QodGFiX1Byb2R1Y3REZXBhcnRtZW50LCBtYWluID0gIkLhu5kgcGjhuq1uIHPhuqNuIHBo4bqpbSAtIFByb2R1Y3REZXBhcnRtZW50IiwgY29sID0gImRhcmtyZWQiLCBsYXMgPSAyKQpgYGAKCioqTmjhuq1uIHjDqXQgKioKCi0gQ8OhYyBi4buZIHBow6JuIGNoaeG6v20gxJFhIHPhu5EgdHJvbmcgdG/DoG4gYuG7mSBjw6FjIGLhu5kgcGjhuq1uIMSRxrDhu6NjIHRo4buRbmcga8OqOgoKICAtIFByb2R1Y2UgKFJhdSBxdeG6oyk6IGByIHRhYmxlKGRhdCRQcm9kdWN0RGVwYXJ0bWVudClbMThdL3N1bShucm93KGRhdCkpKjEwMGBcJQoKICAtIFNuYWNrIEZvb2RzOiBgciB0YWJsZShkYXQkUHJvZHVjdERlcGFydG1lbnQpWzIwXS9zdW0obnJvdyhkYXQpKSoxMDBgXCUKCiAgLSBIb3VzZWhvbGQ6IGByIHRhYmxlKGRhdCRQcm9kdWN0RGVwYXJ0bWVudClbMTVdL3N1bShucm93KGRhdCkpKjEwMGBcJQoKLSBLaMOhY2ggaMOgbmcgbXVhIG5oaeG7gXUgY8OhYyBt4bq3dCBow6BuZzoKCiAgLSBUxrDGoWkgc+G7kW5nLCBk4buFIGjhu49uZyAocHJvZHVjZSkgLT4gecOqdSBj4bqndSBi4bqjbyBxdeG6o24gdsOgIGNodeG7l2kgY3VuZyDhu6luZyB04buRdC4KCiAgLSDEkOG7kyDEg24gduG6t3QgdsOgIGjDoG5nIGdpYSBk4bulbmcgLT4gcGjhuqNuIMOhbmggdGjDs2kgcXVlbiB0acOqdSBkw7luZyBuaGFuaCwgdGnhu4duIGzhu6NpLgoKLSDEkMOieSBsw6AgY8ahIGjhu5lpIMSR4buDIHTEg25nIGPGsOG7nW5nIG1hcmtldGluZyBuaMOzbSBz4bqjbiBwaOG6qW0gdGnhu4duIGzhu6NpLCBjb21ibyBi4buvYSDEg24sIHPhuqNuIHBo4bqpbSBjaG8gaOG7mSBnaWEgxJHDrG5oLgoKCiMjICoqUEjhuqZOIDM6IMav4buaQyBMxq/hu6JORyBLSE/huqJORyBWw4AgS0nhu4JNIMSQ4buKTkggR0nhuqIgVEhVWeG6vlQgQ0hPIFThu7YgTOG7hioqCgotIHRhYmxlKCk6CVRo4buRbmcga8OqIHPhu5EgbMaw4bujbmcgdOG7q25nIGxv4bqhaSB0cm9uZyBiaeG6v24gxJHhu4tuaCB0w61uaAotIHN1bSguLi4pOgnEkOG6v20gYmFvIG5oacOqdSBkw7JuZyB0aOG7j2EgxJFp4buBdSBraeG7h24gKGdpw6EgdHLhu4sgcXVhbiB0w6JtKQotIGxlbmd0aCguLi4pOglU4buVbmcgc+G7kSBt4bqrdQotIHByb3AudGVzdCguLi4pOglUw61uaCBraG/huqNuZyB0aW4gY+G6rXkgdsOgIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IGNobyB04bu3IGzhu4cKLSBwID0gLi4uCTogVOG7tyBs4buHIGdp4bqjIMSR4buLbmggdHJvbmcgZ2nhuqMgdGh1eeG6v3QgSDAKLSBhbHRlcm5hdGl2ZSA9IC4uLjoJS2nhu4NtIMSR4buLbmggaGFpIHBow61hICgidHdvLnNpZGVkIiksIG3hu5l0IHBow61hIGzhu5tuIGjGoW4gKCJncmVhdGVyIiksIG5o4buPIGjGoW4gKCJsZXNzIikKCiMjIyAqKjMuMSBCaeG6v24gR2VuZGVyKioKCmBgYHtyfQojIFjDoWMgxJHhu4tuaCBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtCnRhYmxlKGRhdCRHZW5kZXIpCiMgU+G7kSBsxrDhu6NuZyB2w6AgdOG7lW5nIHPhu5EgCnNsZmVtYWxlIDwtIHN1bShkYXQkR2VuZGVyID09ICJGIikKdG90YWxnZW5kZXIgPC0gbGVuZ3RoKGRhdCRHZW5kZXIpCiMgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyAiRmVtYWxlIgpwcm9wLnRlc3Qoc2xmZW1hbGUsIHRvdGFsZ2VuZGVyLCBjb25mLmxldmVsID0gMC45NSkKIyBLaeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dDogdOG7tyBs4buHIEZlbWFsZSA9IDAuNQpwcm9wLnRlc3Qoc2xmZW1hbGUsIHRvdGFsZ2VuZGVyLCBwID0gMC41LCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBjb25mLmxldmVsID0gMC45NSkKYGBgCgoqKkdp4bqjIHRodXnhur90KioKCi0gSDA6IHAgPSAwLjUKCi0gSDE6IHAg4omgIDAuNQoKKirEkOG7jWMga+G6v3QgcXXhuqMgdsOgIGvhur90IGx14bqtbiAqKgoKLSBU4buVbmcgc+G7kSBjw6EgdGjhu4MgdHJvbmcgbeG6q3UgbMOgIDE0LjA1OSBuZ8aw4budaSwgdHJvbmcgxJHDsyBjw7MgNy4xNzAgbmfGsOG7nWkgbMOgIG7hu68gdsOgIDYuODg5IG5nxrDhu51pIGzDoCBuYW0uIFThu7cgbOG7hyBu4buvIGdp4bubaSB0cm9uZyBt4bqrdSBsw6AgNTAuOTk5MzYlLgoKLSBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB04bu3IGzhu4cgbeG7mXQgbeG6q3UgduG7m2kgZ2nhuqMgdGh1eeG6v3QgdOG7tyBs4buHIG7hu68gdHJvbmcgdOG7lW5nIHRo4buDIGzDoCA1MCUgKEjigoA6IHAgPSAwLjUpIGNobyB0aOG6pXkgZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZCA9IDUuNTc2NSB24bubaSAxIGLhuq1jIHThu7EgZG8sIHbDoCBwLXZhbHVlID0gMC4wMTgyLiBW4bubaSBt4bupYyDDvSBuZ2jEqWEgdGjDtG5nIHRoxrDhu51uZyDOsSA9IDAuMDUsIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcsIGNobyB0aOG6pXkgdOG7tyBs4buHIG7hu68gZ2nhu5tpIHRyb25nIG3huqt1IGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHNvIHbhu5tpIHThu7cgbOG7hyA1MCUuCgotIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBu4buvIHRyb25nIHF14bqnbiB0aOG7gyBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDUwLjE2OTMxJSDEkeG6v24gNTEuODI4ODYlLCBjaG8gdGjhuqV5IHThu7cgbOG7hyBuw6B5IGNo4buJIGjGoWkgY2FvIGjGoW4gNTAlLgoKKipUw7NtIGzhuqFpKioKCi0gVHV5IHThu7cgbOG7hyBu4buvIGdp4bubaSB0cm9uZyBt4bqrdSBjaOG7iSBuaOG7iW5oIGjGoW4gbmFtIGdp4bubaSBraMO0bmcgcXXDoSBjYW8gICg1MC45OTkzNiUpLCBuaMawbmcgc+G7sSBjaMOqbmggbOG7h2NoIG7DoHkgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIERvIMSRw7MsIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIG7hu68gZ2nhu5tpIGNoaeG6v20gxrB1IHRo4bq/IG5o4bq5IG5oxrBuZyDEkcOhbmcga+G7gyB24buBIG3hurd0IHRo4buRbmcga8OqIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IG7DoHkuCgoqKkvhur90IGx14bqtbioqCgotIFThu7cgbOG7hyBu4buvIHRyb25nIHThu5VuZyBt4bqrdSBsw6AgNTAuOTk5JSwga2jDoWMgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBzbyB24bubaSA1MCUuCi0gVuG7m2kgcC12YWx1ZSA9IDAuMDE4MiwgYuG6oW4gYsOhYyBi4buPIGdp4bqjIHRodXnhur90IHLhurFuZyB04bu3IGzhu4cgbuG7ryBsw6AgNTAlIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuCi0gVHV5IG5oacOqbiwgc+G7sSBjaMOqbmggbOG7h2NoIGTDuSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLCBuaMawbmcgcuG6pXQgbmjhu48gduG7gSBt4bq3dCB0aOG7sWMgdOG6vyAofjElKQoKIyMjICoqMy4yIEJp4bq/biBIb21lb3duZXIqKgoKYGBge3J9CiMgWMOhYyDEkeG7i25oIGjhuqFuZyBt4bulYyBxdWFuIHTDom0KdGFibGUoZGF0JEhvbWVvd25lcikKc2xzaG4gPC0gc3VtKGRhdCRIb21lb3duZXIgPT0gIlkiKQp0b3RhbGhvbWVvd25lciA8LSBsZW5ndGgoZGF0JEhvbWVvd25lcikKCiMgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteQpwcm9wLnRlc3Qoc2xzaG4sIHRvdGFsaG9tZW93bmVyLCBjb25mLmxldmVsID0gMC45NSkKCiMgS2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgSDA6IHThu7cgbOG7hyBjaOG7pyBuaMOgID0gMC42CnByb3AudGVzdChzbHNobiwgdG90YWxob21lb3duZXIsIHAgPSAwLjYsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQpgYGAKCioqR2nhuqMgdGh1eeG6v3QgMSoqCgotIEgwOiBwID0gMC41CgotIEgxOiBwIOKJoCAwLjUKCioqxJDhu41jIGvhur90IHF14bqjIHbDoCBr4bq/dCBsdeG6rW4qKgoKLSBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCB04bu3IGzhu4cgbeG7mXQgbeG6q3UgY2hvIHRo4bqleSB04bu3IGzhu4cgxJHhu5FpIHTGsOG7o25nIGNo4buNbiBs4buxYSB0cm9uZyB04buVbmcgdGjhu4MgbeG6q3UgbMOgIDYwLjA2JS4gS2hpIHRp4bq/biBow6BuaCBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB24bubaSB04bu3IGzhu4cgY2h14bqpbiBsw6AgNTAlLCB0YSB0aHUgxJHGsOG7o2MgZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZCBsw6AgNTY4Ljg2IHbhu5tpIG3hu5l0IGLhuq1jIHThu7EgZG8sIHbDoCBwLXZhbHVlIDwgMi4yZS0xNi4gVuG7m2kgbeG7qWMgw70gbmdoxKlhIHRow7RuZyB0aMaw4budbmcgKM6xID0gMC4wNSksIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgKEjigoA6IHAgPSAwLjUpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB04bu3IGzhu4cgdGjhu7FjIHThur8ga2jDoWMgYmnhu4d0IG3hu5l0IGPDoWNoIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogc28gduG7m2kgNTAlLgoKKipHaeG6oyB0aHV54bq/dCAyKioKCi0gSDA6IHAgPSAwLjYKCi0gSDE6IHAg4omgIDAuNgoKKirEkOG7jWMga+G6v3QgcXXhuqMgdsOgIGvhur90IGx14bqtbioqCgotIE5nxrDhu6NjIGzhuqFpLCBraGkga2nhu4NtIMSR4buLbmggduG7m2kgdOG7tyBs4buHIGdp4bqjIMSR4buLbmggbMOgIDYwJSwgZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZCBjaOG7iSBsw6AgMC4wMTk0NDUgduG7m2kgcC12YWx1ZSA9IDAuODg5MS4gRG8gcC12YWx1ZSBs4bubbiBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLjA1LCB0YSBraMO0bmcgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyAoSOKCgDogcCA9IDAuNikuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogY2hvIHRo4bqleSB04bu3IGzhu4cgdGjhu7FjIHThur8ga2jDoWMgYmnhu4d0IHNvIHbhu5tpIDYwJS4KCioqVMOzbSBs4bqhaToqKgoKLSBU4bu3IGzhu4cgbOG7sWEgY2jhu41uIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IGzDoCBraG/huqNuZyA2MC4wNiUgdsOgIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHNvIHbhu5tpIHThu7cgbOG7hyBnaeG6oyDEkeG7i25oIDUwJSwgbmjGsG5nIGtow7RuZyBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4Mgc28gduG7m2kgdOG7tyBs4buHIDYwJS4gxJDDonkgbMOgIGPGoSBz4bufIMSR4buDIGdp4bqjIMSR4buLbmggcuG6sW5nIHThu7cgbOG7hyBs4buxYSBjaOG7jW4gdHJvbmcgcXXhuqduIHRo4buDIGPDsyB0aOG7gyB2w6BvIGtob+G6o25nIDYwJS4KCiMjIyAqKjMuMyBCaeG6v24gUHJvZHVjdEZhbWlseSoqCgpgYGB7cn0KIyBYw6FjIMSR4buLbmggaOG6oW5nIG3hu6VjIMSR4buBIGPhuq1wCnRhYmxlKGRhdCRQcm9kdWN0RmFtaWx5KQpzbGZvb2QgPC0gc3VtKGRhdCRQcm9kdWN0RmFtaWx5ID09ICJGb29kIikKdG90YWxwcm9kdWN0IDwtIGxlbmd0aChkYXQkUHJvZHVjdEZhbWlseSkKIyDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15CnByb3AudGVzdChzbGZvb2QsIHRvdGFscHJvZHVjdCwgY29uZi5sZXZlbCA9IDAuOTUpCiMgS2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgSDA6IHThu7cgbOG7hyA+PSAwLjcgKGFsdGVybmF0aXZlID0gImdyZWF0ZXIiOiBraeG7g20gxJHhu4tuaCAxIHBow61hICg+KSkKcHJvcC50ZXN0KHNsZm9vZCwgdG90YWxwcm9kdWN0LCBwID0gMC43LCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgY29uZi5sZXZlbCA9IDAuOTUpCgoKYGBgCgoqKkdp4bqjIHRodXnhur90IDEqKgoKLSBIMDogcCA9IDAuNQoKLSBIMTogcCDiiaAgMC41CgoqKsSQ4buNYyBr4bq/dCBxdeG6oyB2w6Aga+G6v3QgbHXhuq1uKioKCi0gS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggdOG7tyBs4buHIG3hu5l0IG3huqt1IGNobyBnaeG6oyB0aHV54bq/dCBy4bqxbmcgdOG7tyBs4buHIHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtIEZvb2QgYuG6sW5nIDUwJSAoSOKCgDogcCA9IDAuNSkgY2hvIHRo4bqleToKCiAgLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkID0gMjc3NC45LCBkZiA9IDEKCiAgLSBwLXZhbHVlIDwgMi4yZS0xNgoKLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgbMOgIDAuMDUsIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMCwgbmdoxKlhIGzDoCB04bu3IGzhu4cgc+G6o24gcGjhuqltIG5ow7NtIEZvb2Qga2jDtG5nIGNoaeG6v20gNTAlIHRyb25nIHThu5VuZyBz4buRICJQcm9kdWN0RmFtaWx5Ii4KCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIG7DoHkgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA3MS40NyUgxJHhur9uIDcyLjk1JS4KCioqR2nhuqMgdGh1eeG6v3QgMioqCgotIEgwOiBwID0gMC43CgotIEgxOiBwID4gMC43CgoqKsSQ4buNYyBr4bq/dCBxdeG6oyB2w6Aga+G6v3QgbHXhuq1uKioKCi0gS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggdGnhur9wIHRoZW8ga2nhu4NtIHRyYSB4ZW0gbGnhu4d1IHThu7cgbOG7hyBz4bqjbiBwaOG6qW0gbmjDs20gRm9vZCBjw7MgY2FvIGjGoW4gNzAlIGhheSBraMO0bmcsIGNobyB0aOG6pXk6CgogIC0gR2nDoSB0cuG7iyBDaGktc3F1YXJlZCA9IDMyLjgwMiwgZGYgPSAxCgogIC0gcC12YWx1ZSA9IDUuMTAxZS0wOQoKLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgdGEgdGnhur9wIHThu6VjIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcsIHbDoCBjaOG6pXAgbmjhuq1uIGdp4bqjIHRodXnhur90IMSR4buRaSAoSOKCgTogcCA+IDAuNykuIMSQaeG7gXUgbsOgeSBjaOG7qW5nIHThu48gdOG7tyBs4buHIHPhuqNuIHBo4bqpbSBuaMOzbSBGb29kIGzhu5tuIGjGoW4gNzAlIHbhu5tpIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBjYW8uCgotIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBuw6B5IG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgNzEuNTglIMSR4bq/biAxMDAlLgoKCiMjICoqUEjhuqZOIDQ6IFBIw4JOIFTDjUNIIE3hu5BJIFFVQU4gSOG7hiBHSeG7rkEgSEFJIEJJ4bq+TiDEkOG7ik5IIFTDjU5IKioKCi0gQ2jhu41uIGzhuqduIGzGsOG7o3QgY8OhYyBj4bq3cCBiaeG6v24gY8OzIG3hu5FpIHTGsMahbmcgcXVhbiB0aMO6IHbhu4sgbMOgbSDhuqNuaCBoxrDhu59uZyDEkeG6v24gaMOgbmggdmkgbXVhIGjDoG5nLCBnaWFvIGThu4tjaCBj4bunYSBraMOhY2ggaMOgbmcuCgoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIsIHJlcG9zID0gImh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKaW5zdGFsbC5wYWNrYWdlcygiamFuaXRvciIsIHJlcG9zID0gImh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKaW5zdGFsbC5wYWNrYWdlcygiZ21vZGVscyIsIHJlcG9zID0gImh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIsIHJlcG9zID0gImh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKaW5zdGFsbC5wYWNrYWdlcygic2NhbGVzIiwgcmVwb3MgPSAiaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmciKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShqYW5pdG9yKQpsaWJyYXJ5KGdtb2RlbHMpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShzY2FsZXMpCmBgYAoKCiMjIyAqKjQuMSBHZW5kZXIgdsOgIFByb2R1Y3RGYW1pbHkqKgoKKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioKCmBgYHtyfQp0YWIxIDwtIHRhYmxlKGRhdCRHZW5kZXIsIGRhdCRQcm9kdWN0RmFtaWx5KQp0YWIxIApwcm9wLnRhYmxlKHRhYjEsIDEpICMgdGhlbyBow6BuZwpgYGAKCgotIEThu7FhIHRyw6puIGLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gZ2nhu69hIEdp4bubaSB0w61uaCAoR2VuZGVyKSB2w6AgTmjDs20gc+G6o24gcGjhuqltIChQcm9kdWN0RmFtaWx5KToKCi0gTuG7ryBnaeG7m2kgKEYpIGPDsyB4dSBoxrDhu5tuZyBjaOG7jW4gc+G6o24gcGjhuqltIEZvb2Qgbmhp4buBdSBuaOG6pXQsIGNoaeG6v20ga2hv4bqjbmcgNzEuOCUgdHJvbmcgdOG7lW5nIHPhu5Egc+G6o24gcGjhuqltIG3DoCBu4buvIGdp4bubaSBjaOG7jW4uIFRp4bq/cCB0aGVvIGzDoCBuaMOzbSBOb24tQ29uc3VtYWJsZSAoMTguOSUpIHbDoCBEcmluayAoOS4zJSkuCgotIE5hbSBnaeG7m2kgKE0pIGPFqW5nIGPDsyB4dSBoxrDhu5tuZyB0xrDGoW5nIHThu7Ega2hpIGzhu7FhIGNo4buNbiBuaGnhu4F1IG5o4bqldCBsw6AgRm9vZCAoNzIuNiUpLCBr4bq/IMSR4bq/biBsw6AgTm9uLUNvbnN1bWFibGUgKDE4LjklKSB2w6Agw610IG5o4bqldCBsw6AgRHJpbmsgKDguNCUpLgoKLSBTbyBzw6FuaCBnaeG7m2kgdMOtbmg6CgogIC0gQ+G6oyBoYWkgZ2nhu5tpIMSR4buBdSDGsHUgdGnDqm4gbmjDs20gc+G6o24gcGjhuqltIEZvb2QgduG7m2kgdOG7tyBs4buHIGNhbyBuaOG6pXQsIHRyw6puIDcwJS4KCiAgLSBU4bu3IGzhu4cgY2jhu41uIERyaW5rIGPhu6dhIG7hu68gY2FvIGjGoW4gbmFtIG3hu5l0IGNow7p0ICg5LjMlIHNvIHbhu5tpIDguNCUpLgoKICAtIFThu7cgbOG7hyBjaOG7jW4gTm9uLUNvbnN1bWFibGUgZ+G6p24gbmjGsCB0xrDGoW5nIMSRxrDGoW5nIGdp4buvYSBoYWkgZ2nhu5tpICgxOC45JSkuCgoqKkvhur90IGx14bqtbjoqKgoKLSBT4bufIHRow61jaCB24buBIG5ow7NtIHPhuqNuIHBo4bqpbSBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIGdp4buvYSBuYW0gdsOgIG7hu68uIE5ow7NtIHPhuqNuIHBo4bqpbSBGb29kIGNoaeG6v20gxrB1IHRo4bq/IHRyb25nIGzhu7FhIGNo4buNbiBj4bunYSBj4bqjIGhhaSBnaeG7m2kgdMOtbmgsIHRyb25nIGtoaSBuaMOzbSBEcmluayBsw6Agw610IMSRxrDhu6NjIGNo4buNbiBuaOG6pXQuCgoqKlRy4buxYyBxdWFuIGjDs2EqKgoKYGBge3J9CmdncGxvdChkYXQsIGFlcyh4ID0gR2VuZGVyLCBmaWxsID0gUHJvZHVjdEZhbWlseSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIFByb2R1Y3RGYW1pbHkgdGhlbyAgR2VuZGVyIiwgeSA9ICJU4bu3IGzhu4ciLCB4ID0gIkdlbmRlciIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCioqTmjhuq1uIHjDqXQqKgoKLSBE4buxYSB0csOqbiBi4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIGdp4buvYSBHaeG7m2kgdMOtbmggKEdlbmRlcikgdsOgIE5ow7NtIHPhuqNuIHBo4bqpbSAoUHJvZHVjdEZhbWlseSk6CgotIE7hu68gZ2nhu5tpIChGKSBjw7MgeHUgaMaw4bubbmcgY2jhu41uIHPhuqNuIHBo4bqpbSBGb29kIG5oaeG7gXUgbmjhuqV0LCBjaGnhur9tIGtob+G6o25nIDcxLjglIHRyb25nIHThu5VuZyBz4buRIHPhuqNuIHBo4bqpbSBtw6AgbuG7ryBnaeG7m2kgY2jhu41uLiBUaeG6v3AgdGhlbyBsw6AgbmjDs20gTm9uLUNvbnN1bWFibGUgKDE4LjklKSB2w6AgRHJpbmsgKDkuMyUpLgoKLSBOYW0gZ2nhu5tpIChNKSBjxaluZyBjw7MgeHUgaMaw4bubbmcgdMawxqFuZyB04buxIGtoaSBs4buxYSBjaOG7jW4gbmhp4buBdSBuaOG6pXQgbMOgIEZvb2QgKDcyLjYlKSwga+G6vyDEkeG6v24gbMOgIE5vbi1Db25zdW1hYmxlICgxOC45JSkgdsOgIMOtdCBuaOG6pXQgbMOgIERyaW5rICg4LjQlKS4KCi0gU28gc8OhbmggZ2nhu5tpIHTDrW5oOgoKICAtIEPhuqMgaGFpIGdp4bubaSDEkeG7gXUgxrB1IHRpw6puIG5ow7NtIHPhuqNuIHBo4bqpbSBGb29kIHbhu5tpIHThu7cgbOG7hyBjYW8gbmjhuqV0LCB0csOqbiA3MCUuCgogIC0gVOG7tyBs4buHIGNo4buNbiBEcmluayBj4bunYSBu4buvIGNhbyBoxqFuIG5hbSBt4buZdCBjaMO6dCAoOS4zJSBzbyB24bubaSA4LjQlKS4KCiAgLSBU4bu3IGzhu4cgY2jhu41uIE5vbi1Db25zdW1hYmxlIGfhuqduIG5oxrAgdMawxqFuZyDEkcawxqFuZyBnaeG7r2EgaGFpIGdp4bubaSAoMTguOSUpLgoKKipL4bq/dCBsdeG6rW46KioKCi0gU+G7nyB0aMOtY2ggduG7gSBuaMOzbSBz4bqjbiBwaOG6qW0ga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyBnaeG7r2EgbmFtIHbDoCBu4buvLiBOaMOzbSBz4bqjbiBwaOG6qW0gRm9vZCBjaGnhur9tIMawdSB0aOG6vyB0cm9uZyBs4buxYSBjaOG7jW4gY+G7p2EgY+G6oyBoYWkgZ2nhu5tpLCB0cm9uZyBraGkgbmjDs20gRHJpbmsgbMOgIMOtdCDEkcaw4bujYyBjaOG7jW4gbmjhuqV0LgoKKipLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcqKgoKYGBge3J9CmNoaV9yZXN1bHQxIDwtIGNoaXNxLnRlc3QodGFiMSkKY2hpX3Jlc3VsdDEKCiMgR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZApjaGlfcmVzdWx0MSRzdGF0aXN0aWMKIyBC4bqtYyB04buxIGRvIApjaGlfcmVzdWx0MSRwYXJhbWV0ZXIKIyBHacOhIHRy4buLIHAKY2hpX3Jlc3VsdDEkcC52YWx1ZQpgYGAKCioqR2nhuqMgdGh1eeG6v3QqKgoKLSBHaeG6oyB0aHV54bq/dCBIMDogR2nhu5tpIHTDrW5oIChHZW5kZXIpIHbDoCBOaMOzbSBz4bqjbiBwaOG6qW0gKFByb2R1Y3RGYW1pbHkpIGzDoCDEkeG7mWMgbOG6rXAsIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hy4KCi0gR2nhuqMgdGh1eeG6v3QgSDE6IEdp4bubaSB0w61uaCB2w6AgTmjDs20gc+G6o24gcGjhuqltIGPDsyBsacOqbiBo4buHIHbhu5tpIG5oYXUuCgoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqCgotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLXNxdWFyZWQ6IFgtc3F1YXJlZCA9IDMuNTE4NDkKCi0gQuG6rWMgdOG7sSBkbzogZGYgPSAyCgotIEdpw6EgdHLhu4sgcDogcCA9IDAuMTcyMTc0OAoKKipL4bq/dCBsdeG6rW46KioKCi0gVuG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMDUsIHBfdmFsdWUgPSAwLjE3MjIgPj0gMC4wNSDihpIga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBIMCwgdOG7qWMgbMOgIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgMiBiaeG6v24gR2VuZGVyIHbDoCBQcm9kdWN0RmFtaWx5LgoKCiMjIyAqKjQuMiBNYXJpdGFsU3RhdHVzIHbDoCBIb21lb3duZXIqKgoKKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioKCmBgYHtyfQp0YWIyIDwtIHRhYmxlKGRhdCRNYXJpdGFsU3RhdHVzLCBkYXQkSG9tZW93bmVyKQp0YWIyIApwcm9wLnRhYmxlKHRhYjIsIDEpCmBgYAoKKipUcuG7sWMgcXVhbiBow7NhKioKCmBgYHtyfQpnZ3Bsb3QoZGF0LCBhZXMoeCA9IE1hcml0YWxTdGF0dXMsIGZpbGwgPSBIb21lb3duZXIpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICBsYWJzKHRpdGxlID0gIlThu7cgbOG7hyBIb21lb3duZXIgdGhlbyBNYXJpdGFsIFN0YXR1cyIsIHkgPSAiVOG7tyBs4buHIiwgeCA9ICJNYXJpdGFsIFN0YXR1cyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiWSIgPSAiI0ZGREFCOSIsICJOIiA9ICIjRDhCRkQ4IikpCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKKipOaOG6rW4geMOpdCoqCgotIE5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biAoTSkgY8OzIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmfGsOG7nWkgxJHhu5ljIHRow6JuIChTKToKICAtIFRyb25nIG5ow7NtIMSRw6Mga+G6v3QgaMO0biAoTSk6IEfhuqduIDc1JSBsw6AgY2jhu6cgc+G7nyBo4buvdSBuaMOgIChZKS4KCiAgLSBUcm9uZyBuaMOzbSDEkeG7mWMgdGjDom4gKFMpOiBDaOG7iSBraG/huqNuZyA1MCUgbMOgIGNo4bunIHPhu58gaOG7r3UgbmjDoCwgcGjhuqduIGPDsm4gbOG6oWkgbMOgIGtow7RuZyBz4bufIGjhu691IG5ow6AgKE4pLgoKLSBT4buxIGtow6FjIGJp4buHdCByw7UgcsOgbmcgdHJvbmcgY+G6pXUgdHLDumMgdMOgaSBz4bqjbiB0aGVvIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibjoKICAtIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCB0aOG7sWMgdOG6vyBy4bqxbmcgbmjhu69uZyBuZ8aw4budaSBr4bq/dCBow7RuIHRoxrDhu51uZyBjw7MgxJHhu5luZyBs4buxYyBraW5oIHThur8gdsOgIHTDoGkgY2jDrW5oIOG7lW4gxJHhu4tuaCBoxqFuLCBob+G6t2MgY8OzIHh1IGjGsOG7m25nIMSR4bqndSB0xrAgY2h1bmcgdsOgbyB0w6BpIHPhuqNuIG5oxrAgbmjDoCDhu5/hu58KCioqS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKioKCmBgYHtyfQpjaGlfcmVzdWx0MiA8LSBjaGlzcS50ZXN0KHRhYjIpCmNoaV9yZXN1bHQyCgojIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLXNxdWFyZWQKY2hpX3Jlc3VsdDIkc3RhdGlzdGljCiMgQuG6rWMgdOG7sSBkbyAKY2hpX3Jlc3VsdDIkcGFyYW1ldGVyCiMgR2nDoSB0cuG7iyBwCmNoaV9yZXN1bHQyJHAudmFsdWUKYGBgCgoqKkdp4bqjIHRodXnhur90KioKCi0gR2nhuqMgdGh1eeG6v3QgSDA6IFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAoTWFyaXRhbFN0YXR1cykgdsOgIHPhu58gaOG7r3UgbmjDoCAoSG9tZW93d25lcikgbMOgIMSR4buZYyBs4bqtcCwga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHLgoKLSBHaeG6oyB0aHV54bq/dCBIMTogVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChNYXJpdGFsU3RhdHVzKSB2w6Agc+G7nyBo4buvdSBuaMOgIChIb21lb3d3bmVyKSBjw7MgbGnDqm4gaOG7hyB24bubaSBuaGF1LgoKKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKgoKLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkOiBYLXNxdWFyZWQgPSAxMjQxLjIyCgotIELhuq1jIHThu7EgZG86IGRmID0gMQoKLSBHacOhIHRy4buLIHA6IHAgPCAyLjJlLTE2CgoqKkvhur90IGx14bqtbjoqKgoKLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgcF92YWx1ZSA8IDAuMDUg4oaSIHRhIMSR4bunIMSRaeG7gXUga2nhu4duIMSR4buDIGLDoWMgYuG7jyBIMCwgdOG7qWMgbMOgIGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSAyIGJp4bq/biBNYXJpdGFsU3RhdHVzIHbDoCBIb21lb3duZXIuIEPDsyB0aOG7gyBoaeG7g3UgcuG6sW5nIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHZp4buHYyBt4buZdCBuZ8aw4budaSBjw7Mgc+G7nyBo4buvdSBuaMOgIGhheSBraMO0bmcgKGhv4bq3YyBuZ8aw4bujYyBs4bqhaSkuCgojIyMgKio0LjMgQW5udWFsSW5jb21lIHbDoCBQcm9kdWN0Q2F0ZWdvcnkqKgoKKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioKCmBgYHtyfQp0YWIzIDwtIHRhYmxlKGRhdCRBbm51YWxJbmNvbWUsIGRhdCRQcm9kdWN0RGVwYXJ0bWVudCkKdGFiMyAKcHJvcC50YWJsZSh0YWIzLCAxKQpgYGAKCioqVHLhu7FjIHF1YW4gaMOzYSoqCgpgYGB7cn0KZ2dwbG90KGRhdCwgYWVzKHggPSBBbm51YWxJbmNvbWUsIGZpbGwgPSBQcm9kdWN0RGVwYXJ0bWVudCkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIFByb2R1Y3REZXBhcnRtZW50IHRoZW8gQW5udWFsIEluY29tZSIsIHkgPSAiVOG7tyBs4buHIiwgeCA9ICJBbm51YWwgSW5jb21lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoqKk5o4bqtbiB4w6l0KioKCioqS2nhu4NtIMSR4buLbmggY2hpIC0gYsOsbmggcGjGsMahbmcqKgoKYGBge3J9CmNoaV9yZXN1bHQzIDwtIGNoaXNxLnRlc3QodGFiMykKY2hpX3Jlc3VsdDMKCiMgR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZApjaGlfcmVzdWx0MyRzdGF0aXN0aWMKIyBC4bqtYyB04buxIGRvIApjaGlfcmVzdWx0MyRwYXJhbWV0ZXIKIyBHacOhIHRy4buLIHAKY2hpX3Jlc3VsdDMkcC52YWx1ZQpgYGAKCioqR2nhuqMgdGh1eeG6v3QqKgoKLSBHaeG6oyB0aHV54bq/dCBIMDogVGh1IG5o4bqtcCBow6BuZyB0aMOhbmcgKEFubnVhbEluY29tZSkgdsOgIFByb2R1Y3REZXBhcnRtZW50IGzDoCDEkeG7mWMgbOG6rXAsIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hy4KCi0gR2nhuqMgdGh1eeG6v3QgSDE6IFRodSBuaOG6rXAgaMOgbmcgdGjDoW5nIChBbm51YWxJbmNvbWUpIHbDoCBQcm9kdWN0RGVwYXJ0bWVudCBjw7MgbGnDqm4gaOG7hyB24bubaSBuaGF1LgoKKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKgoKLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkOiBYLXNxdWFyZWQgPSAxNzAuMTYKCi0gQuG6rWMgdOG7sSBkbzogZGYgPSAxNDcKCi0gR2nDoSB0cuG7iyBwOiBwID0gMC4wOTI3NjQ3CgoqKkvhur90IGx14bqtbjoqKgoKLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSBwX3ZhbHVlID0gMC4wOTI3NiA+IDAuMDUg4oaSIHRhIGtow7RuZyDEkeG7pyDEkWnhu4F1IGtp4buHbiDEkeG7gyBiw6FjIGLhu48gSDAsIHThu6ljIGzDoCBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIDIgYmnhur9uIEFubnVhbEluY29tZSB2w6AgUHJvZHVjdERlcGFydG1lbnQuIAoKIyMjICoqSG9tZW93bmVyIHbDoCBBbm51YWxJbmNvbWUqKgoKKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioKYGBge3J9CnRhYjQgPC0gdGFibGUoZGF0JEhvbWVvd25lciwgZGF0JEFubnVhbEluY29tZSkKdGFiNApwcm9wLnRhYmxlKHRhYjQsIDEpCgpgYGAKCioqVHLhu7FjIHF1YW4gaMOzYSoqCgpgYGB7cn0KZ2dwbG90KGRhdCwgYWVzKHggPSBBbm51YWxJbmNvbWUsIGZpbGwgPSBIb21lb3duZXIpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICBsYWJzKHRpdGxlID0gIlThu7cgbOG7hyBIb21lb3duZXIgdGhlbyBBbm51YWwgSW5jb21lIiwgeSA9ICJU4bu3IGzhu4ciLCB4ID0gIkFubnVhbCBJbmNvbWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCioqTmjhuq1uIHjDqXQqKgoKKipLaeG7g20gxJHhu4tuaCBjaGkgLSBiw6xuaCBwaMawxqFuZyoqCgpgYGB7cn0KY2hpX3Jlc3VsdDQgPC0gY2hpc3EudGVzdCh0YWI0KQpjaGlfcmVzdWx0NAoKIyBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkCmNoaV9yZXN1bHQ0JHN0YXRpc3RpYwojIELhuq1jIHThu7EgZG8gCmNoaV9yZXN1bHQ0JHBhcmFtZXRlcgojIEdpw6EgdHLhu4sgcApjaGlfcmVzdWx0NCRwLnZhbHVlCmBgYAoKKipHaeG6oyB0aHV54bq/dCoqCgotIEdp4bqjIHRodXnhur90IEgwOiBUaHUgbmjhuq1wIGjDoG5nIHRow6FuZyAoQW5udWFsSW5jb21lKSB2w6AgdMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6AgKEhvbWVvd25lcikgbMOgIMSR4buZYyBs4bqtcCwga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHLgoKLSBHaeG6oyB0aHV54bq/dCBIMTogVGh1IG5o4bqtcCBow6BuZyB0aMOhbmcgKEFubnVhbEluY29tZSkgdsOgIHTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgIChIb21lb3duZXIpIGPDsyBsacOqbiBo4buHIHbhu5tpIG5oYXUuCgoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqCgotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLXNxdWFyZWQ6IFgtc3F1YXJlZCA9IDU0Ni4zNwoKLSBC4bqtYyB04buxIGRvOiBkZiA9IDcKCi0gR2nDoSB0cuG7iyBwOiBwIDwyLjJlLTE2CgoqKkvhur90IGx14bqtbjoqKgoKLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSBwX3ZhbHVlIDwgMC4wNSDihpIgdGEgY8OzIMSR4bunIMSRaeG7gXUga2nhu4duIMSR4buDIGLDoWMgYuG7jyBIMCwgdOG7qWMgbMOgICBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgMiBiaeG6v24gdGh1IG5o4bqtcCBow6BuZyB0aMOhbmcgdsOgIHTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgLiAKCiMjIyAqKjQuNSBDaXR5IHbDoCBHZW5kZXIqKgoKKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioKCmBgYHtyfQp0YWI1IDwtIHRhYmxlKGRhdCRHZW5kZXIsIGRhdCRDb3VudHJ5KQp0YWI1CnByb3AudGFibGUodGFiNSwgMSkKYGBgCgoqKlRy4buxYyBxdWFuIGjDs2EqKgoKYGBge3J9CmdncGxvdChkYXQsIGFlcyh4ID0gQ291bnRyeSwgZmlsbCA9IEdlbmRlcikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIGdp4bubaSB0w61uaCB0aGVvIHF14buRYyBnaWEiLCB5ID0gIlThu7cgbOG7hyIsIHggPSAiQ291bnRyeSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTSIgPSAieWVsbG93IiwgIkYiID0gInBpbmsiKSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCioqTmjhuq1uIHjDqXQqKgoKCgoqKktp4buDbSDEkeG7i25oIGNoaSAtIGLDrG5oIHBoxrDGoW5nKioKCmBgYHtyfQpjaGlfcmVzdWx0NSA8LSBjaGlzcS50ZXN0KHRhYjUpCmNoaV9yZXN1bHQ1CgojIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLXNxdWFyZWQKY2hpX3Jlc3VsdDUkc3RhdGlzdGljCiMgQuG6rWMgdOG7sSBkbyAKY2hpX3Jlc3VsdDUkcGFyYW1ldGVyCiMgR2nDoSB0cuG7iyBwCmNoaV9yZXN1bHQ1JHAudmFsdWUKYGBgCgoqKkdp4bqjIHRodXnhur90KioKCi0gR2nhuqMgdGh1eeG6v3QgSDA6IEdp4bubaSB0w61uaCAoR2VuZGVyKSB2w6AgcXXhu5FjIGdpYSAoQ291bnRyeSkgbMOgIDIgYmnhur9uIMSR4buZYyBs4bqtcCwga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHLgoKLSBHaeG6oyB0aHV54bq/dCBIMTogR2nhu5tpIHTDrW5oIChHZW5kZXIpIHbDoCBxdeG7kWMgZ2lhIChDb3VudHJ5KSBsw6AgMiBiaeG6v24gY8OzIG3hu5FpIGxpw6puIGjhu4cgduG7m2kgbmhhdS4KCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioKCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZDogWC1zcXVhcmVkID0gNDguNzI1CgotIELhuq1jIHThu7EgZG86IGRmID0gMgoKLSBHacOhIHRy4buLIHA6IHAgPSAyLjYyOGUtMTEKCioqS+G6v3QgbHXhuq1uOioqCgotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLjA1IHBfdmFsdWUgPSAyLjYyOGUtMTEgPCAwLjA1IOKGkiB0YSBjw7MgxJHhu6cgxJFp4buBdSBraeG7h24gxJHhu4MgYsOhYyBi4buPIEgwLCB04bupYyBsw6AgIGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSAyIGJp4bq/biBsw6AgZ2nhu5tpIHTDrW5oIHbDoCBxdeG7kWMgZ2lhLiAKCiMjICoqUEjhuqZOIDU6IFThu5RORyBL4bq+VCBWw4AgVEjhuqJPIExV4bqsTioqCgotIFRow7RuZyBxdWEgcXXDoSB0csOsbmggbmdoacOqbiBj4bupdSwgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UsIHRy4buxYyBxdWFuIGjDs2EgY8WpbmcgbmjGsCDDoXAgZOG7pW5nIGPDoWMgcGjGsMahbmcgcGjDoXAgdGjhu5FuZyBrw6osIGPDsyB0aOG7gyByw7p0IHJhIG3hu5l0IHPhu5Ega+G6v3QgbHXhuq1uIHF1YW4gdHLhu41uZyB24buBIGjDoG5oIHZpIHRpw6p1IGTDuW5nIGPhu6dhIGtow6FjaCBow6BuZy4gTeG6t2MgZMO5IGPDoWMgeeG6v3UgdOG7kSBuaMOibiBraOG6qXUgaOG7jWMgbmjGsCBnaeG7m2kgdMOtbmgsIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBoYXkgdMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6Ag4bufIGtow7RuZyBjaG8gdGjhuqV5IHPhu7Eg4bqjbmggaMaw4bufbmcgbeG6oW5oIG3hur0gxJHhur9uIGjDoG5oIHZpIG11YSBz4bqvbSwgbmjGsG5nIGNow7puZyB24bqrbiBnw7NwIHBo4bqnbiB04bqhbyBuw6puIG3hu5l0IHPhu5Ega2jDoWMgYmnhu4d0IMSRw6FuZyBsxrB1IMO9IGdp4buvYSBjw6FjIG5ow7NtIGtow6FjaCBow6BuZy4gTmjhu69uZyBraMOhYyBiaeG7h3QgbsOgeSwgZMO5IGtow7RuZyBtYW5nIHTDrW5oIHF1eeG6v3QgxJHhu4tuaCwgduG6q24gY8OzIHRo4buDIHTDoWMgxJHhu5luZyBuaOG6pXQgxJHhu4tuaCDEkeG6v24geHUgaMaw4bubbmcgdGnDqnUgZMO5bmcgdHJvbmcgbeG7mXQgc+G7kSBi4buRaSBj4bqjbmggY+G7pSB0aOG7gy4KCi0gUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgY8WpbmcgY2hvIHRo4bqleSBwaOG6p24gbOG7m24ga2jDoWNoIGjDoG5nIHRodeG7mWMgbmjDs20gdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCwgZGFvIMSR4buZbmcgdOG7qyBraG/huqNuZyAzMC4wMDAgxJHhur9uIDEwMC4wMDAgVVNEIG3hu5dpIG7Eg20uIMSQw6FuZyBjaMO6IMO9LCDEkWEgc+G7kSB0cm9uZyBz4buRIGjhu40gbMOgIG5o4buvbmcgbmfGsOG7nWkgxJHDoyBz4bufIGjhu691IG5ow6AgcmnDqm5nLCDEkWnhu4F1IG7DoHkgY8OzIHRo4buDIHBo4bqjbiDDoW5oIG3hu6ljIMSR4buZIOG7lW4gxJHhu4tuaCB24buBIHTDoGkgY2jDrW5oIHbDoCBuaHUgY+G6p3UgdGnDqnUgZMO5bmcg4bufIG3hu6ljIGPGoSBi4bqjbiBuaMawbmcg4buVbiDEkeG7i25oLgoKLSBYw6l0IHRoZW8gZ2nhu5tpIHTDrW5oLCBow6BuaCB2aSBs4buxYSBjaOG7jW4gbmjDs20gc+G6o24gcGjhuqltIGdp4buvYSBuYW0gdsOgIG7hu68ga2jDtG5nIHRo4buDIGhp4buHbiBz4buxIGtow6FjIGJp4buHdCByw7UgcsOgbmcuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHPhu7EgdMawxqFuZyDEkeG7k25nIG5o4bqldCDEkeG7i25oIHRyb25nIG5odSBj4bqndSB0acOqdSBkw7luZyB0aGnhur90IHnhur91LCDEkeG6t2MgYmnhu4d0IGzDoCB0cm9uZyBjw6FjIG3hurd0IGjDoG5nIG5oxrAgdGjhu7FjIHBo4bqpbSB2w6AgxJHhu5MgdeG7kW5nIOKAkyBuaOG7r25nIHPhuqNuIHBo4bqpbSBjaGnhur9tIHThu7cgdHLhu41uZyB0acOqdSB0aOG7pSBjYW8g4bufIGPhuqMgaGFpIGdp4bubaS4gS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogY8OgbmcgY+G7p25nIGPhu5Egbmjhuq1uIMSR4buLbmggbsOgeSBraGkgY2hvIHRo4bqleSBy4bqxbmcgZ2nhu5tpIHTDrW5oIGtow7RuZyBwaOG6o2kgbMOgIG3hu5l0IHnhur91IHThu5EgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiB0cm9uZyB2aeG7h2Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGzhu7FhIGNo4buNbiBuaMOzbSBz4bqjbiBwaOG6qW0uIFThu6sgxJHDsyBjw7MgdGjhu4Mgc3V5IHJhIHLhurFuZywgdHJvbmcgbeG7mXQgc+G7kSBuZ8OgbmggaMOgbmcgbmjGsCB0acOqdSBkw7luZyBuaGFuaCwgdmnhu4djIHBow6JuIGtow7pjIHRo4buLIHRyxrDhu51uZyB0aGVvIGdp4bubaSB0w61uaCBjw7MgdGjhu4Mga2jDtG5nIGPDsm4gcXXDoSBj4bqnbiB0aGnhur90LCB0cuG7qyBraGkgxJHGsOG7o2Mga+G6v3QgaOG7o3AgduG7m2kgY8OhYyB54bq/dSB04buRIGtow6FjIG5oxrAgxJHhu5kgdHXhu5VpLCB0aHUgbmjhuq1wIGhv4bq3YyBraHUgduG7sWMgxJHhu4thIGzDvS4KCi0gxJDDoW5nIGNow7ogw70sIG5ow7NtIHPhuqNuIHBo4bqpbSAiRm9vZCIgbMOgIGzhu7FhIGNo4buNbiBwaOG7lSBiaeG6v24gbmjhuqV0LCB24bubaSB04bu3IGzhu4cgbmfGsOG7nWkgdGnDqnUgZMO5bmcgbOG7sWEgY2jhu41uIHbGsOG7o3QgbmfGsOG7oW5nIDcwJSDhu58gY+G6oyBoYWkgZ2nhu5tpIOKAkyBwaOG6o24gw6FuaCByw7UgdmFpIHRyw7IgdGhp4bq/dCB54bq/dSBj4bunYSBuaMOzbSBow6BuZyBuw6B5IHRyb25nIMSR4budaSBz4buRbmcgaMOgbmcgbmfDoHkuCgotIEtoaSBzbyBzw6FuaCBow6BuaCB2aSBtdWEgc+G6r20gdGhlbyBxdeG7kWMgZ2lhLCBk4buvIGxp4buHdSBjaOG7iSByYSBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgduG7gSBnaeG7m2kgdMOtbmggdHJvbmcgdGnDqnUgZMO5bmcgaOG6p3UgbmjGsCBraMO0bmcgdOG7k24gdOG6oWkgdOG6oWkgaGFpIHF14buRYyBnaWEgVVNBIHbDoCBDYW5hZGEuIFR1eSBuaGnDqm4sIMSRaeG7gXUgbsOgeSBraMO0bmcgxJHDum5nIHbhu5tpIE1leGljbywgbsahaSB04bu3IGzhu4cga2jDoWNoIGjDoG5nIG7hu68gY2hp4bq/bSDGsHUgdGjhur8gcsO1IHLhu4d0LCBraG/huqNuZyA1NSUgdOG7lW5nIHPhu5Ega2jDoWNoIGjDoG5nLiBT4buxIGNow6puaCBs4buHY2ggbsOgeSBn4bujaSDDvSBy4bqxbmcgeeG6v3UgdOG7kSDEkeG7i2EgbMO9IGPDsyB0aOG7gyB0xrDGoW5nIHTDoWMgduG7m2kgeeG6v3UgdOG7kSBnaeG7m2kgdMOtbmggxJHhu4MgdOG6oW8gbsOqbiBraMOhYyBiaeG7h3QgdHJvbmcgaMOgbmggdmkgdGnDqnUgZMO5bmcu