Giới thệu sơ lược về bộ dữ liệu

trang<-  read.csv("C:/Users/Ngo Trang/Documents/student_spending-1.csv", header = T)
dim(trang)
## [1] 1000   18

Data “student_spending-1.csv” là data dạng csv bao gồm 1000 quan sát và 18 biến miêu tả về các tác động đến sinh viên .Cụ thể các biến là :

  • STT : số thứ tự
  • age : Độ tuổi của sinh viên
  • gender : Giới tính của sinh viên
  • year_in_school : Số năm theo học của sinh viên tại trường đại học
  • major : Nghành sinh viên theo học tại trường đại học
  • monthly_income : Thu nhập hằng tháng của sinh viên
  • financial_aid : Số tiền viện trợ của sinh viên nhận được
  • tuition : Số tiền học phí của sinh viên
  • housing : Tiền nhà ở của sinh viên
  • food : Tiền ăn của sinh viên
  • trasportation : Tiền di chuyển , đi lại của sinh viên
  • books_supplies : Tiền sách và vật tư của sinh viên
  • entertainment : Tiền dành cho việc giải trí của sinh viên
  • personal_care : Tiền dành cho việc chăm sóc cá nhân của sinh viên
  • technology : Tiền dành cho công nghệ của sinh viên
  • health_wellness : Tiền dùng để chăm sóc sức khỏe sinh viên
  • miscellaneous : các chi phí phát sinh
  • preferred_payment_method : Phương thức thanh toán yêu thích của sinh viên
library(tidyverse)
## ── 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.4.4     ✔ 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(scales)
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor

Các đồ thị cụ thể

Đồ thị dạng Bar-Chart

trang %>% group_by(gender) %>% summarise(n = n()) %>%
  ggplot(aes(gender,n)) +
    geom_col(fill='green') +
    geom_text(aes(label = n),vjust = 2, color = 'red') +
    labs(x = 'Giới tính', y = 'Số lượng')

GIẢI THÍCH : Câu lệnh trên cho chúng ta một đồ thị dang Bar-chart có :

  • Trục hoành được chia theo biến “gender”(giới tính) bao gồm “Female”,“Male”,“Non-binary”
  • Trục tung là số lượng của sinh viên theo từng giới tính
  • Số lượng sinh viên theo giới tính lần lượt là :
  • Female(Nữ giới) : 323 sinh viên
  • Male(Nam giới) : 356 sinh viên
  • Non-binary(phi giới tính ) : 321 sinh viên

trang %>% group_by(major) %>% summarise(n = n()) %>%
  ggplot(aes(major,n)) +
    geom_col(fill='green') +
    geom_text(aes(label = percent(n/length(trang$food))),vjust = 2, color = 'red') +
    labs(x = 'Chuyên nghành', y = 'Số lượng')

GIẢI THÍCH : Câu lệnh trên cho chúng ta bốn đồ thị dang Bar-chart có :

  • Trục hoành được chia theo biến “major”( chuyên nghành) bao gồm “Psychology”,“Economics”,“Computer Science”,“Engineering”,“Biology”
  • Trục tung biểu diễn số lượng của sinh viên theo từng nghành học
  • phần trăm số sinh viên học theo từng nghành so với tổng số sinh viên được điều tra cụ thể như sau:
  • Biology : 22.8 %
  • Computer Science : 19.2 %
  • Economics : 20.4 %
  • Engineering : 19.2 %
  • Psychology : 18.4 %

trang %>% group_by(gender,year_in_school) %>% summarise(n=n()) %>%
  ggplot(aes(x = gender,y = n)) +
    geom_col(position = 'dodge') +
    facet_wrap(~year_in_school) +
    geom_text(aes(label = n),vjust = 2, color = 'green') +
    labs(x = 'Giới tính', y = 'Số lượng')
## `summarise()` has grouped output by 'gender'. You can override using the
## `.groups` argument.

GIẢI THÍCH : Câu lệnh trên cho chúng ta bốn đồ thị dang Bar-chart có :

  • 4 đồ thị tương ứng với số năm theo học của sinh viên tại trường đại học bao gồm “Freshman”,“Junior”,“Senior”,“Sophomore”
  • Trục hoành được chia theo biến gender(giới tính) bao gồm “Female”,“Male”,“Non-binary”
  • Trục tung là số lượng sinh viên
  • Số liệu cụ thể trên mỗi cột cho ta biết số lượng sinh viên được phân theo giới tính của từng năm học là bao nhiên sinh viên

trang %>% group_by(major) %>% summarise(m= median(tuition)) %>%
  ggplot(aes(x = major,y = m)) +
    geom_col(position = 'dodge') +
    geom_text(aes(label = round(m,2)), vjust = 2, color = 'green') +
    labs(x = 'Chuyên nghành', y = 'Median(học phí)')

GIẢI THÍCH : Câu lệnh trên cho chúng ta một đồ thị dang Bar-chart có :

  • Trục hoành được chia theo biến “major”( chuyên nghành) bao gồm “Psychology”,“Economics”,“Computer Science”,“Engineering”,“Biology”
  • Trục tung là trung vị số tiền học phí của sinh viên
  • Từ đồ thị ta thấy được :
  • Tại nghành học Biology : Có 50 % số sinh viên sẽ đóng học phí trên mức 4585.5 và 50% số sinh viên còn lại đóng học phí dưới mức 4585.5
  • Tại nghành học Computer Science : Có 50 % số sinh viên sẽ đóng học phí trên mức 4639.5 và 50% số sinh viên còn lại đóng học phí dưới mức 4639.5
  • Tại nghành học Economics : Có 50 % số sinh viên sẽ đóng học phí trên mức 4527 và 50% số sinh viên còn lại đóng học phí dưới mức 4527
  • Tại nghành học Psychology : Có 50 % số sinh viên sẽ đóng học phí trên mức 4661.5 và 50% số sinh viên còn lại đóng học phí dưới mức 4661.5

trang %>% group_by(age,gender) %>% summarise(m = mean(housing)) %>%
  ggplot(aes(x = age,y = m)) +
    geom_col(position = 'dodge') +
    facet_wrap(~gender) +
    geom_text(aes(label = round(m))) +
    labs(x = 'Tuổi', y = 'Mean(Tiền nhà)')
## `summarise()` has grouped output by 'age'. You can override using the `.groups`
## argument.

GIẢI THÍCH : Câu lệnh trên cho chúng ta ba đồ thị dang Bar-chart có :

  • 3 đồ thị tương ứng với 3 trạng thái giới tính sinh viên của biến “gender”
  • Trục hoành được chia theo biến “age” bao gồm : 18,20,22,24
  • Trục tung là giá trị trung bình tiền nhà hằng tháng của sinh viên
  • Từ đồ thị ta có thể biết được ứng với từng loại giới tính và từng độ tuổi khác nhau thì số tiền nhà cụ thể sinh viên phải trả

trang <- trang  %>% group_by(year_in_school, gender) %>% summarise(n = n())
## `summarise()` has grouped output by 'year_in_school'. You can override using
## the `.groups` argument.
trang %>% ggplot(aes(x = year_in_school, y = n)) +
  geom_col(data = trang %>% filter(gender == 'Male'), fill = 'orange') +
  geom_col(data = trang %>% filter(gender == 'Non-binary'), fill = 'green')

GIẢI THÍCH : Câu lệnh trên cho chúng ta một đồ thị dạng Bar-chart có :

  • Đồ thị được vẽ nên dựa trên 2 biến” year_in_school,gender”
  • Trục hoành là số năm theo học của sinh viên tại trường đại học được chia theo biến “year_in_school” bao gồm “Freshman”,“Junior”,“Senior”,“Sophomore”
  • Trục tung là số lượng sinh viên
  • Đồ thị so sánh số lượng sinh viên theo giới tính Male(biểu diễn bởi màu cam) và Non-binary (biểu diễn bởi màu xanh) theo biến”year_in_school”(số năm sinh viên theo học tại trường)

Đồ thị dạng Histogrm

Đồ thị dạng Density

Đồ thị dạng Pie-Chart

trang %>% group_by(year_in_school) %>% summarise(n = n()) %>%
  ggplot(aes(x = '', y = n,fill = year_in_school)) +
    geom_col() +
    geom_text(aes(label = n),position = position_stack(vjust = 1))

GIẢI THÍCH : Câu lệnh trên cho chúng ta một đồ thị dạng Pie-chart được trải phẳng có :

  • Đồ thị được vẽ nên bởi biến “year_in_school” bao gồm các tiêu chí “Freshman”,“Junior”,“Senior”,“Sophomore” + Freshman được biểu diễn bởi màu đỏ gồm 256 sinh viên
  • Junior được biểu diễn bởi màu xanh dương gồm 247 sinh viên
  • Senior được biểu diễn bởi màu xanh da trời gồm 254 sinh viên
  • Sophomore được biểu diễn bởi màu tím gồm 246 sinh viên

trang %>% group_by(gender) %>% summarise(n = n()) %>%
  ggplot(aes(x = '', y = n,fill = gender)) +
    geom_col() +
    coord_polar('y')

GIẢI THÍCH : Câu lệnh trên cho chúng ta một đồ thị dạng Pie-chart có :

  • Đồ thị được vẽ nên bởi biến “gender”(giới tính”) bao gồm các tiêu chí :“Female”,“Male”,“Non-binary”
  • Female : được biểu diễn bởi màu đỏ
  • Male : được biểu diễn bởi màu xanh dương
  • Non-binary : được biểu diễn bởi màu xanh nước biển

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAibnR0cmFuZyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogaHRtbF9kb2N1bWVudDoNCiAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgdG9jX2Zsb2F0OiB0cnVlDQogICB0b2M6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQoNCiMgKipHaeG7m2kgdGjhu4d1IHPGoSBsxrDhu6NjIHbhu4EgYuG7mSBk4buvIGxp4buHdSAqKg0KDQpgYGB7cn0NCnRyYW5nPC0gIHJlYWQuY3N2KCJDOi9Vc2Vycy9OZ28gVHJhbmcvRG9jdW1lbnRzL3N0dWRlbnRfc3BlbmRpbmctMS5jc3YiLCBoZWFkZXIgPSBUKQ0KZGltKHRyYW5nKQ0KDQpgYGANCiANCioqRGF0YSAic3R1ZGVudF9zcGVuZGluZy0xLmNzdiIgbMOgIGRhdGEgZOG6oW5nIGNzdiBiYW8gZ+G7k20gMTAwMCBxdWFuIHPDoXQgdsOgIDE4IGJp4bq/biBtacOqdSB04bqjIHbhu4EgY8OhYyB0w6FjIMSR4buZbmcgxJHhur9uIHNpbmggdmnDqm4gLkPhu6UgdGjhu4MgY8OhYyBiaeG6v24gbMOgIDoqKg0KDQotIFNUVCA6IHPhu5EgdGjhu6kgdOG7sSANCi0gYWdlIDogxJDhu5kgdHXhu5VpIGPhu6dhIHNpbmggdmnDqm4gDQotIGdlbmRlciA6IEdp4bubaSB0w61uaCBj4bunYSBzaW5oIHZpw6puIA0KLSB5ZWFyX2luX3NjaG9vbCA6IFPhu5EgbsSDbSB0aGVvIGjhu41jIGPhu6dhIHNpbmggdmnDqm4gdOG6oWkgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyANCi0gbWFqb3IgOiBOZ2jDoG5oIHNpbmggdmnDqm4gdGhlbyBo4buNYyB04bqhaSB0csaw4budbmcgxJHhuqFpIGjhu41jIA0KLSBtb250aGx5X2luY29tZSA6IFRodSBuaOG6rXAgaOG6sW5nIHRow6FuZyBj4bunYSBzaW5oIHZpw6puIA0KLSBmaW5hbmNpYWxfYWlkIDogU+G7kSB0aeG7gW4gdmnhu4duIHRy4bujIGPhu6dhIHNpbmggdmnDqm4gbmjhuq1uIMSRxrDhu6NjIA0KLSB0dWl0aW9uIDogU+G7kSB0aeG7gW4gaOG7jWMgcGjDrSBj4bunYSBzaW5oIHZpw6puIA0KLSBob3VzaW5nIDogVGnhu4FuIG5ow6Ag4bufIGPhu6dhIHNpbmggdmnDqm4gDQotIGZvb2QgOiBUaeG7gW4gxINuIGPhu6dhIHNpbmggdmnDqm4gDQotIHRyYXNwb3J0YXRpb24gOiBUaeG7gW4gZGkgY2h1eeG7g24gLCDEkWkgbOG6oWkgY+G7p2Egc2luaCB2acOqbiANCi0gYm9va3Nfc3VwcGxpZXMgOiBUaeG7gW4gc8OhY2ggdsOgIHbhuq10IHTGsCBj4bunYSBzaW5oIHZpw6puIA0KLSBlbnRlcnRhaW5tZW50IDogVGnhu4FuIGTDoG5oIGNobyB2aeG7h2MgZ2nhuqNpIHRyw60gY+G7p2Egc2luaCB2acOqbg0KLSBwZXJzb25hbF9jYXJlIDogVGnhu4FuIGTDoG5oIGNobyB2aeG7h2MgY2jEg20gc8OzYyBjw6EgbmjDom4gY+G7p2Egc2luaCB2acOqbiANCi0gdGVjaG5vbG9neSA6IFRp4buBbiBkw6BuaCBjaG8gY8O0bmcgbmdo4buHIGPhu6dhIHNpbmggdmnDqm4gDQotIGhlYWx0aF93ZWxsbmVzcyA6IFRp4buBbiBkw7luZyDEkeG7gyBjaMSDbSBzw7NjIHPhu6ljIGto4buPZSBzaW5oIHZpw6puIA0KLSBtaXNjZWxsYW5lb3VzIDogY8OhYyBjaGkgcGjDrSBwaMOhdCBzaW5oIA0KLSBwcmVmZXJyZWRfcGF5bWVudF9tZXRob2QgOiBQaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gecOqdSB0aMOtY2ggY+G7p2Egc2luaCB2acOqbiANCg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzY2FsZXMpDQpgYGANCg0KIyAqKkPDoWMgxJHhu5MgdGjhu4sgY+G7pSB0aOG7gyoqDQoNCiMjICoqxJDhu5MgdGjhu4sgZOG6oW5nIEJhci1DaGFydCoqDQojIyMgDQpgYGB7cn0NCnRyYW5nICU+JSBncm91cF9ieShnZW5kZXIpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoZ2VuZGVyLG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICAgIGxhYnMoeCA9ICdHaeG7m2kgdMOtbmgnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCg0KDQoqKkdJ4bqiSSBUSMONQ0gqKiA6IEPDonUgbOG7h25oIHRyw6puIGNobyBjaMO6bmcgdGEgbeG7mXQgxJHhu5MgdGjhu4sgZGFuZyBCYXItY2hhcnQgY8OzIDoNCg0KLSBUcuG7pWMgaG/DoG5oIMSRxrDhu6NjIGNoaWEgdGhlbyBiaeG6v24gImdlbmRlciIoZ2nhu5tpIHTDrW5oKSBiYW8gZ+G7k20gIkZlbWFsZSIsIk1hbGUiLCJOb24tYmluYXJ5Ig0KLSBUcuG7pWMgdHVuZyBsw6Agc+G7kSBsxrDhu6NuZyBj4bunYSBzaW5oIHZpw6puIHRoZW8gdOG7q25nIGdp4bubaSB0w61uaCANCi0gU+G7kSBsxrDhu6NuZyBzaW5oIHZpw6puIHRoZW8gZ2nhu5tpIHTDrW5oIGzhuqduIGzGsOG7o3QgbMOgIDoNCiArIEZlbWFsZShO4buvIGdp4bubaSkgOiAzMjMgc2luaCB2acOqbiANCiArIE1hbGUoTmFtIGdp4bubaSkgIDogMzU2IHNpbmggdmnDqm4gDQogKyBOb24tYmluYXJ5KHBoaSBnaeG7m2kgdMOtbmggKSA6IDMyMSBzaW5oIHZpw6puIA0KIA0KIyMjDQogDQpgYGB7cn0NCnRyYW5nICU+JSBncm91cF9ieShtYWpvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhtYWpvcixuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J2dyZWVuJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKHRyYW5nJGZvb2QpKSksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArDQogICAgbGFicyh4ID0gJ0NodXnDqm4gbmdow6BuaCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKipHSeG6okkgVEjDjUNIKiogOiBDw6J1IGzhu4duaCB0csOqbiBjaG8gY2jDum5nIHRhIGLhu5FuIMSR4buTIHRo4buLIGRhbmcgQmFyLWNoYXJ0IGPDsyA6DQoNCi0gVHLhu6VjIGhvw6BuaCDEkcaw4bujYyBjaGlhIHRoZW8gYmnhur9uICJtYWpvciIoIGNodXnDqm4gbmdow6BuaCkgYmFvIGfhu5NtICJQc3ljaG9sb2d5IiwiRWNvbm9taWNzIiwiQ29tcHV0ZXINClNjaWVuY2UiLCJFbmdpbmVlcmluZyIsIkJpb2xvZ3kiDQotIFRy4bulYyB0dW5nIGJp4buDdSBkaeG7hW4gc+G7kSBsxrDhu6NuZyBj4bunYSBzaW5oIHZpw6puIHRoZW8gdOG7q25nIG5naMOgbmggaOG7jWMgDQotIHBo4bqnbiB0csSDbSBz4buRIHNpbmggdmnDqm4gaOG7jWMgdGhlbyB04burbmcgbmdow6BuaCBzbyB24bubaSB04buVbmcgc+G7kSBzaW5oIHZpw6puIMSRxrDhu6NjIMSRaeG7gXUgdHJhIGPhu6UgdGjhu4MgbmjGsCBzYXU6DQorIEJpb2xvZ3kgOiAyMi44ICUNCisgQ29tcHV0ZXIgU2NpZW5jZSA6IDE5LjIgJQ0KKyBFY29ub21pY3MgOiAyMC40ICUNCisgRW5naW5lZXJpbmcgOiAxOS4yICUNCisgUHN5Y2hvbG9neSA6IDE4LjQgJQ0KDQoNCg0KIyMjDQoNCiANCmBgYHtyfQ0KdHJhbmcgJT4lIGdyb3VwX2J5KGdlbmRlcix5ZWFyX2luX3NjaG9vbCkgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGdlbmRlcix5ID0gbikpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsNCiAgICBmYWNldF93cmFwKH55ZWFyX2luX3NjaG9vbCkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ2dyZWVuJykgKw0KICAgIGxhYnMoeCA9ICdHaeG7m2kgdMOtbmgnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCg0KDQoqKkdJ4bqiSSBUSMONQ0gqKiA6IEPDonUgbOG7h25oIHRyw6puIGNobyBjaMO6bmcgdGEgYuG7kW4gxJHhu5MgdGjhu4sgZGFuZyBCYXItY2hhcnQgY8OzIDoNCg0KLSA0IMSR4buTIHRo4buLIHTGsMahbmcg4bupbmcgduG7m2kgc+G7kSBuxINtIHRoZW8gaOG7jWMgY+G7p2Egc2luaCB2acOqbiB04bqhaSB0csaw4budbmcgxJHhuqFpIGjhu41jIGJhbyBn4buTbSAiRnJlc2htYW4iLCJKdW5pb3IiLCJTZW5pb3IiLCJTb3Bob21vcmUiDQotIFRy4bulYyBob8OgbmggxJHGsOG7o2MgY2hpYSB0aGVvIGJp4bq/biBnZW5kZXIoZ2nhu5tpIHTDrW5oKSBiYW8gZ+G7k20gIkZlbWFsZSIsIk1hbGUiLCJOb24tYmluYXJ5Ig0KLSBUcuG7pWMgdHVuZyBsw6Agc+G7kSBsxrDhu6NuZyBzaW5oIHZpw6puIA0KLSBT4buRIGxp4buHdSBj4bulIHRo4buDIHRyw6puIG3hu5dpIGPhu5l0IGNobyB0YSBiaeG6v3Qgc+G7kSBsxrDhu6NuZyBzaW5oIHZpw6puIMSRxrDhu6NjIHBow6JuIHRoZW8gZ2nhu5tpIHTDrW5oIGPhu6dhIHThu6tuZyBuxINtIGjhu41jIGzDoCBiYW8gbmhpw6puIHNpbmggdmnDqm4gDQoNCg0KDQojIyMNCg0KDQoNCmBgYHtyfQ0KdHJhbmcgJT4lIGdyb3VwX2J5KG1ham9yKSAlPiUgc3VtbWFyaXNlKG09IG1lZGlhbih0dWl0aW9uKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IG1ham9yLHkgPSBtKSkgKw0KICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDIpKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpICsNCiAgICBsYWJzKHggPSAnQ2h1ecOqbiBuZ2jDoG5oJywgeSA9ICdNZWRpYW4oaOG7jWMgcGjDrSknKQ0KDQpgYGANCg0KDQoqKkdJ4bqiSSBUSMONQ0gqKiA6IEPDonUgbOG7h25oIHRyw6puIGNobyBjaMO6bmcgdGEgbeG7mXQgxJHhu5MgdGjhu4sgZGFuZyBCYXItY2hhcnQgY8OzIDoNCg0KLSBUcuG7pWMgaG/DoG5oIMSRxrDhu6NjIGNoaWEgdGhlbyBiaeG6v24gIm1ham9yIiggY2h1ecOqbiBuZ2jDoG5oKSBiYW8gZ+G7k20gIlBzeWNob2xvZ3kiLCJFY29ub21pY3MiLCJDb21wdXRlcg0KU2NpZW5jZSIsIkVuZ2luZWVyaW5nIiwiQmlvbG9neSINCi0gVHLhu6VjIHR1bmcgbMOgIHRydW5nIHbhu4sgc+G7kSB0aeG7gW4gaOG7jWMgcGjDrSBj4bunYSBzaW5oIHZpw6puIA0KLSBU4burIMSR4buTIHRo4buLIHRhIHRo4bqleSDEkcaw4bujYyA6DQorIFThuqFpIG5naMOgbmggaOG7jWMgQmlvbG9neSA6IEPDsyA1MCAlIHPhu5Egc2luaCB2acOqbiBz4bq9IMSRw7NuZyBo4buNYyBwaMOtIHRyw6puIG3hu6ljIDQ1ODUuNSB2w6AgNTAlIHPhu5Egc2luaCB2acOqbiBjw7JuIGzhuqFpIMSRw7NuZyBo4buNYyBwaMOtIGTGsOG7m2kgbeG7qWMgNDU4NS41IA0KKyBU4bqhaSBuZ2jDoG5oIGjhu41jIENvbXB1dGVyIFNjaWVuY2UgOiBDw7MgNTAgJSBz4buRIHNpbmggdmnDqm4gc+G6vSDEkcOzbmcgaOG7jWMgcGjDrSB0csOqbiBt4bupYyA0NjM5LjUgdsOgIDUwJSBz4buRIHNpbmggdmnDqm4gY8OybiBs4bqhaSDEkcOzbmcgaOG7jWMgcGjDrSBkxrDhu5tpIG3hu6ljIDQ2MzkuNQ0KKyBU4bqhaSBuZ2jDoG5oIGjhu41jIEVjb25vbWljcyA6IEPDsyA1MCAlIHPhu5Egc2luaCB2acOqbiBz4bq9IMSRw7NuZyBo4buNYyBwaMOtIHRyw6puIG3hu6ljIDQ1MjcgdsOgIDUwJSBz4buRIHNpbmggdmnDqm4gY8OybiAgbOG6oWkgxJHDs25nIGjhu41jIHBow60gZMaw4bubaSBt4bupYyA0NTI3DQorIFThuqFpIG5naMOgbmggaOG7jWMgUHN5Y2hvbG9neSA6IEPDsyA1MCAlIHPhu5Egc2luaCB2acOqbiBz4bq9IMSRw7NuZyBo4buNYyBwaMOtIHRyw6puIG3hu6ljIDQ2NjEuNSB2w6AgNTAlIHPhu5Egc2luaCB2acOqbiBjw7JuIA0KbOG6oWkgxJHDs25nIGjhu41jIHBow60gZMaw4bubaSBt4bupYyA0NjYxLjUNCg0KDQoNCiMjIw0KDQoNCg0KYGBge3J9DQp0cmFuZyAlPiUgZ3JvdXBfYnkoYWdlLGdlbmRlcikgJT4lIHN1bW1hcmlzZShtID0gbWVhbihob3VzaW5nKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGFnZSx5ID0gbSkpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsNCiAgICBmYWNldF93cmFwKH5nZW5kZXIpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSkpKSArDQogICAgbGFicyh4ID0gJ1R14buVaScsIHkgPSAnTWVhbihUaeG7gW4gbmjDoCknKQ0KYGBgDQoNCg0KDQoqKkdJ4bqiSSBUSMONQ0gqKiA6IEPDonUgbOG7h25oIHRyw6puIGNobyBjaMO6bmcgdGEgYmEgxJHhu5MgdGjhu4sgZGFuZyBCYXItY2hhcnQgY8OzIDoNCg0KLSAzIMSR4buTIHRo4buLIHTGsMahbmcg4bupbmcgduG7m2kgMyB0cuG6oW5nIHRow6FpIGdp4bubaSB0w61uaCBzaW5oIHZpw6puIGPhu6dhIGJp4bq/biAiZ2VuZGVyIg0KLSBUcuG7pWMgaG/DoG5oIMSRxrDhu6NjIGNoaWEgdGhlbyBiaeG6v24gImFnZSIgYmFvIGfhu5NtIDogMTgsMjAsMjIsMjQNCi0gVHLhu6VjIHR1bmcgbMOgIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggdGnhu4FuIG5ow6AgaOG6sW5nIHRow6FuZyBj4bunYSBzaW5oIHZpw6puIA0KLSBU4burIMSR4buTIHRo4buLIHRhIGPDsyB0aOG7gyBiaeG6v3QgxJHGsOG7o2Mg4bupbmcgduG7m2kgdOG7q25nIGxv4bqhaSBnaeG7m2kgdMOtbmggdsOgIHThu6tuZyDEkeG7mSB0deG7lWkga2jDoWMgbmhhdSB0aMOsIHPhu5EgdGnhu4FuIG5ow6AgY+G7pSB0aOG7gyBzaW5oIHZpw6puIHBo4bqjaSB0cuG6oyANCg0KDQoNCiMjIw0KDQpgYGB7cn0NCnRyYW5nIDwtIHRyYW5nICAlPiUgZ3JvdXBfYnkoeWVhcl9pbl9zY2hvb2wsIGdlbmRlcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KdHJhbmcgJT4lIGdncGxvdChhZXMoeCA9IHllYXJfaW5fc2Nob29sLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IHRyYW5nICU+JSBmaWx0ZXIoZ2VuZGVyID09ICdNYWxlJyksIGZpbGwgPSAnb3JhbmdlJykgKw0KICBnZW9tX2NvbChkYXRhID0gdHJhbmcgJT4lIGZpbHRlcihnZW5kZXIgPT0gJ05vbi1iaW5hcnknKSwgZmlsbCA9ICdncmVlbicpDQpgYGANCg0KKipHSeG6okkgVEjDjUNIKiogOiBDw6J1IGzhu4duaCB0csOqbiBjaG8gY2jDum5nIHRhIG3hu5l0IMSR4buTIHRo4buLIGThuqFuZyBCYXItY2hhcnQgY8OzIDoNCg0KLSDEkOG7kyB0aOG7iyDEkcaw4bujYyB24bq9IG7Dqm4gZOG7sWEgdHLDqm4gMiBiaeG6v24iIHllYXJfaW5fc2Nob29sLGdlbmRlciIgDQotIFRy4bulYyBob8OgbmggbMOgIHPhu5EgbsSDbSB0aGVvIGjhu41jIGPhu6dhIHNpbmggdmnDqm4gdOG6oWkgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyDEkcaw4bujYyBjaGlhIHRoZW8gYmnhur9uICJ5ZWFyX2luX3NjaG9vbCIgYmFvIGfhu5NtICJGcmVzaG1hbiIsIkp1bmlvciIsIlNlbmlvciIsIlNvcGhvbW9yZSINCi0gVHLhu6VjIHR1bmcgbMOgIHPhu5EgbMaw4bujbmcgc2luaCB2acOqbiANCi0gxJDhu5MgdGjhu4sgc28gc8Ohbmggc+G7kSBsxrDhu6NuZyBzaW5oIHZpw6puIHRoZW8gZ2nhu5tpIHTDrW5oIE1hbGUoYmnhu4N1IGRp4buFbiBi4bufaSBtw6B1IGNhbSkgdsOgIE5vbi1iaW5hcnkgKGJp4buDdSBkaeG7hW4gYuG7n2kgbcOgdSB4YW5oKSB0aGVvIGJp4bq/biJ5ZWFyX2luX3NjaG9vbCIoc+G7kSBuxINtIHNpbmggdmnDqm4gdGhlbyBo4buNYyB04bqhaSB0csaw4budbmcpDQoNCiMjIw0KDQoNCg0KDQoNCiMjICoqxJDhu5MgdGjhu4sgZOG6oW5nIEhpc3RvZ3JtKioNCg0KIA0KDQoNCg0KDQojIyAqKsSQ4buTIHRo4buLIGThuqFuZyBEZW5zaXR5KioNCg0KDQoNCiMjICoqxJDhu5MgdGjhu4sgZOG6oW5nIFBpZS1DaGFydCoqDQoNCiMjIw0KDQpgYGB7cn0NCnRyYW5nICU+JSBncm91cF9ieSh5ZWFyX2luX3NjaG9vbCkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSB5ZWFyX2luX3NjaG9vbCkpICsNCiAgICBnZW9tX2NvbCgpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbikscG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDEpKQ0KYGBgDQoNCg0KKipHSeG6okkgVEjDjUNIKiogOiBDw6J1IGzhu4duaCB0csOqbiBjaG8gY2jDum5nIHRhIG3hu5l0IMSR4buTIHRo4buLIGThuqFuZyBQaWUtY2hhcnQgxJHGsOG7o2MgdHLhuqNpIHBo4bqzbmcgY8OzIDoNCg0KLSDEkOG7kyB0aOG7iyDEkcaw4bujYyB24bq9IG7Dqm4gYuG7n2kgYmnhur9uICJ5ZWFyX2luX3NjaG9vbCIgYmFvIGfhu5NtIGPDoWMgdGnDqnUgY2jDrSAiRnJlc2htYW4iLCJKdW5pb3IiLCJTZW5pb3IiLCJTb3Bob21vcmUiICsgRnJlc2htYW4gxJHGsOG7o2MgYmnhu4N1IGRp4buFbiBi4bufaSBtw6B1IMSR4buPIGfhu5NtIDI1NiBzaW5oIHZpw6puIA0KKyBKdW5pb3IgxJHGsOG7o2MgYmnhu4N1IGRp4buFbiBi4bufaSBtw6B1IHhhbmggZMawxqFuZyBn4buTbSAyNDcgc2luaCB2acOqbiANCisgU2VuaW9yIMSRxrDhu6NjIGJp4buDdSBkaeG7hW4gYuG7n2kgbcOgdSB4YW5oIGRhIHRy4budaSBn4buTbSAyNTQgc2luaCB2acOqbiANCisgU29waG9tb3JlIMSRxrDhu6NjIGJp4buDdSBkaeG7hW4gYuG7n2kgbcOgdSB0w61tIGfhu5NtIDI0NiBzaW5oIHZpw6puIA0KDQoNCiMjIw0KDQpgYGB7cn0NCnRyYW5nICU+JSBncm91cF9ieShnZW5kZXIpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9ICcnLCB5ID0gbixmaWxsID0gZ2VuZGVyKSkgKw0KICAgIGdlb21fY29sKCkgKw0KICAgIGNvb3JkX3BvbGFyKCd5JykNCmBgYA0KDQoNCg0KKipHSeG6okkgVEjDjUNIKiogOiBDw6J1IGzhu4duaCB0csOqbiBjaG8gY2jDum5nIHRhIG3hu5l0IMSR4buTIHRo4buLIGThuqFuZyBQaWUtY2hhcnQgY8OzIDoNCg0KLSDEkOG7kyB0aOG7iyDEkcaw4bujYyB24bq9IG7Dqm4gYuG7n2kgYmnhur9uICJnZW5kZXIiKGdp4bubaSB0w61uaCIpIGJhbyBn4buTbSBjw6FjIHRpw6p1IGNow60gOiJGZW1hbGUiLCJNYWxlIiwiTm9uLWJpbmFyeSINCisgRmVtYWxlIDogxJHGsOG7o2MgYmnhu4N1IGRp4buFbiBi4bufaSBtw6B1IMSR4buPIA0KKyBNYWxlIDogxJHGsOG7o2MgYmnhu4N1IGRp4buFbiBi4bufaSBtw6B1IHhhbmggZMawxqFuZyANCisgTm9uLWJpbmFyeSA6IMSRxrDhu6NjIGJp4buDdSBkaeG7hW4gYuG7n2kgbcOgdSB4YW5oIG7GsOG7m2MgYmnhu4NuICANCg0KDQojIyMNCg0KDQoNCg0KDQoNCg0KDQo=