Install Packages

#install.packages("tidyverse")
#install.packages("psych")

Library Packages

#library(tidyverse)
#library(readr)
#library(dplyr)
#library(scales)
#library(ggplot2)
#library(psych)

Read dataset

US_Scores <- read_csv('school_scores.csv',show_col_types = TRUE)
Rows: 577 Columns: 99── Column specification ─────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (2): State.Code, State.Name
dbl (97): Year, Total.Math, Total.Test-takers, Total.Verbal, Academic Subjects.Arts/Music.Average GPA...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(US_Scores)

Create a summary of the dataset to view all columns and components

summary(US_Scores)
      Year       State.Code         State.Name          Total.Math    Total.Test-takers  Total.Verbal  
 Min.   :2005   Length:577         Length:577         Min.   :383.0   Min.   :   134    Min.   :401.0  
 1st Qu.:2007   Class :character   Class :character   1st Qu.:504.0   1st Qu.:  2536    1st Qu.:496.0  
 Median :2010   Mode  :character   Mode  :character   Median :527.0   Median :  6468    Median :522.0  
 Mean   :2010                                         Mean   :535.7   Mean   : 27914    Mean   :531.3  
 3rd Qu.:2013                                         3rd Qu.:571.0   3rd Qu.: 35799    3rd Qu.:572.0  
 Max.   :2015                                         Max.   :619.0   Max.   :241553    Max.   :612.0  
 Academic Subjects.Arts/Music.Average GPA Academic Subjects.Arts/Music.Average Years
 Min.   :3.430                            Min.   :1.200                             
 1st Qu.:3.760                            1st Qu.:2.100                             
 Median :3.850                            Median :2.300                             
 Mean   :3.823                            Mean   :2.289                             
 3rd Qu.:3.900                            3rd Qu.:2.500                             
 Max.   :3.960                            Max.   :3.100                             
 Academic Subjects.English.Average GPA Academic Subjects.English.Average Years
 Min.   :3.030                         Min.   :3.500                          
 1st Qu.:3.350                         1st Qu.:3.900                          
 Median :3.510                         Median :3.900                          
 Mean   :3.501                         Mean   :3.929                          
 3rd Qu.:3.670                         3rd Qu.:4.000                          
 Max.   :3.880                         Max.   :4.100                          
 Academic Subjects.Foreign Languages.Average GPA Academic Subjects.Foreign Languages.Average Years
 Min.   :3.030                                   Min.   :1.800                                    
 1st Qu.:3.300                                   1st Qu.:2.600                                    
 Median :3.460                                   Median :2.800                                    
 Mean   :3.453                                   Mean   :2.851                                    
 3rd Qu.:3.630                                   3rd Qu.:3.100                                    
 Max.   :3.790                                   Max.   :3.600                                    
 Academic Subjects.Mathematics.Average GPA Academic Subjects.Mathematics.Average Years
 Min.   :2.85                              Min.   :3.200                              
 1st Qu.:3.12                              1st Qu.:3.800                              
 Median :3.30                              Median :3.900                              
 Mean   :3.31                              Mean   :3.939                              
 3rd Qu.:3.51                              3rd Qu.:4.100                              
 Max.   :3.76                              Max.   :4.400                              
 Academic Subjects.Natural Sciences.Average GPA Academic Subjects.Natural Sciences.Average Years
 Min.   :2.870                                  Min.   :2.800                                   
 1st Qu.:3.250                                  1st Qu.:3.500                                   
 Median :3.420                                  Median :3.600                                   
 Mean   :3.418                                  Mean   :3.632                                   
 3rd Qu.:3.600                                  3rd Qu.:3.800                                   
 Max.   :3.820                                  Max.   :4.200                                   
 Academic Subjects.Social Sciences/History.Average GPA
 Min.   :3.050                                        
 1st Qu.:3.380                                        
 Median :3.530                                        
 Mean   :3.522                                        
 3rd Qu.:3.680                                        
 Max.   :3.880                                        
 Academic Subjects.Social Sciences/History.Average Years Family Income.Between 20-40k.Math
 Min.   :3.000                                           Min.   :  0.0                    
 1st Qu.:3.500                                           1st Qu.:471.0                    
 Median :3.600                                           Median :495.0                    
 Mean   :3.619                                           Mean   :500.2                    
 3rd Qu.:3.700                                           3rd Qu.:533.0                    
 Max.   :4.000                                           Max.   :643.0                    
 Family Income.Between 20-40k.Test-takers Family Income.Between 20-40k.Verbal
 Min.   :    5                            Min.   :387.0                      
 1st Qu.:  214                            1st Qu.:466.0                      
 Median :  580                            Median :496.0                      
 Mean   : 3234                            Mean   :501.3                      
 3rd Qu.: 3179                            3rd Qu.:536.0                      
 Max.   :35446                            Max.   :634.0                      
 Family Income.Between 40-60k.Math Family Income.Between 40-60k.Test-takers
 Min.   :381.0                     Min.   :   10                           
 1st Qu.:493.0                     1st Qu.:  236                           
 Median :519.0                     Median :  636                           
 Mean   :522.8                     Mean   : 2847                           
 3rd Qu.:554.0                     3rd Qu.: 3386                           
 Max.   :629.0                     Max.   :28124                           
 Family Income.Between 40-60k.Verbal Family Income.Between 60-80k.Math
 Min.   :414.0                       Min.   :249.0                    
 1st Qu.:489.0                       1st Qu.:506.0                    
 Median :517.0                       Median :531.0                    
 Mean   :523.1                       Mean   :533.6                    
 3rd Qu.:558.0                       3rd Qu.:564.0                    
 Max.   :628.0                       Max.   :630.0                    
 Family Income.Between 60-80k.Test-takers Family Income.Between 60-80k.Verbal
 Min.   :    8                            Min.   :232.0                      
 1st Qu.:  199                            1st Qu.:501.0                      
 Median :  523                            Median :527.0                      
 Mean   : 2270                            Mean   :533.8                      
 3rd Qu.: 2791                            3rd Qu.:571.0                      
 Max.   :17937                            Max.   :645.0                      
 Family Income.Between 80-100k.Math Family Income.Between 80-100k.Test-takers
 Min.   :398.0                      Min.   :    5                            
 1st Qu.:519.0                      1st Qu.:  164                            
 Median :539.0                      Median :  441                            
 Mean   :547.1                      Mean   : 1804                            
 3rd Qu.:575.0                      3rd Qu.: 2130                            
 Max.   :646.0                      Max.   :15358                            
 Family Income.Between 80-100k.Verbal Family Income.Less than 20k.Math
 Min.   :433.0                        Min.   :  0.0                   
 1st Qu.:514.0                        1st Qu.:438.0                   
 Median :536.0                        Median :465.0                   
 Mean   :544.6                        Mean   :461.7                   
 3rd Qu.:580.0                        3rd Qu.:510.0                   
 Max.   :651.0                        Max.   :589.0                   
 Family Income.Less than 20k.Test-takers Family Income.Less than 20k.Verbal
 Min.   :    1                           Min.   :  0.0                     
 1st Qu.:  124                           1st Qu.:429.0                     
 Median :  347                           Median :464.0                     
 Mean   : 2433                           Mean   :458.4                     
 3rd Qu.: 2129                           3rd Qu.:501.0                     
 Max.   :42551                           Max.   :579.0                     
 Family Income.More than 100k.Math Family Income.More than 100k.Test-takers
 Min.   :  0.0                     Min.   :    2                           
 1st Qu.:548.0                     1st Qu.:  427                           
 Median :565.0                     Median : 1000                           
 Mean   :565.8                     Mean   : 4141                           
 3rd Qu.:587.0                     3rd Qu.: 4405                           
 Max.   :637.0                     Max.   :46127                           
 Family Income.More than 100k.Verbal GPA.A minus.Math GPA.A minus.Test-takers GPA.A minus.Verbal
 Min.   :  0.0                       Min.   :  0      Min.   :    0           Min.   :  0.0     
 1st Qu.:538.0                       1st Qu.:532      1st Qu.:  460           1st Qu.:526.0     
 Median :555.0                       Median :552      Median : 1217           Median :547.0     
 Mean   :560.5                       Mean   :550      Mean   : 4955           Mean   :543.7     
 3rd Qu.:590.0                       3rd Qu.:569      3rd Qu.: 6372           3rd Qu.:566.0     
 Max.   :637.0                       Max.   :619      Max.   :45869           Max.   :609.0     
 GPA.A plus.Math GPA.A plus.Test-takers GPA.A plus.Verbal   GPA.A.Math  GPA.A.Test-takers
 Min.   :  0.0   Min.   :    0          Min.   :  0.0     Min.   :  0   Min.   :    0    
 1st Qu.:607.0   1st Qu.:  274          1st Qu.:595.0     1st Qu.:565   1st Qu.:  680    
 Median :624.0   Median :  524          Median :616.0     Median :588   Median : 1390    
 Mean   :621.7   Mean   : 1592          Mean   :613.1     Mean   :585   Mean   : 4925    
 3rd Qu.:644.0   3rd Qu.: 1792          3rd Qu.:637.0     3rd Qu.:605   3rd Qu.: 6112    
 Max.   :683.0   Max.   :12184          Max.   :672.0     Max.   :655   Max.   :42656    
  GPA.A.Verbal     GPA.B.Math    GPA.B.Test-takers  GPA.B.Verbal   GPA.C.Math    GPA.C.Test-takers
 Min.   :  0.0   Min.   :  0.0   Min.   :     0    Min.   :  0   Min.   :  0.0   Min.   :    0    
 1st Qu.:556.0   1st Qu.:472.0   1st Qu.:   676    1st Qu.:470   1st Qu.:413.0   1st Qu.:   93    
 Median :580.0   Median :492.0   Median :  2282    Median :493   Median :436.0   Median :  445    
 Mean   :576.8   Mean   :490.5   Mean   : 11729    Mean   :491   Mean   :426.2   Mean   : 2620    
 3rd Qu.:600.0   3rd Qu.:511.0   3rd Qu.: 14745    3rd Qu.:517   3rd Qu.:457.0   3rd Qu.: 3060    
 Max.   :637.0   Max.   :564.0   Max.   :104693    Max.   :562   Max.   :553.0   Max.   :22802    
  GPA.C.Verbal   GPA.D or lower.Math GPA.D or lower.Test-takers GPA.D or lower.Verbal
 Min.   :  0.0   Min.   :  0.0       Min.   :   0.00            Min.   :  0.0        
 1st Qu.:415.0   1st Qu.:  0.0       1st Qu.:   2.00            1st Qu.:  0.0        
 Median :440.0   Median :389.0       Median :  12.00            Median :394.0        
 Mean   :431.6   Mean   :266.6       Mean   :  90.76            Mean   :272.4        
 3rd Qu.:464.0   3rd Qu.:428.0       3rd Qu.:  90.00            3rd Qu.:432.0        
 Max.   :548.0   Max.   :648.0       Max.   :2061.00            Max.   :632.0        
 GPA.No response.Math GPA.No response.Test-takers GPA.No response.Verbal Gender.Female.Math
 Min.   :  0          Min.   :    0               Min.   :  0.0          Min.   :368.0     
 1st Qu.:  0          1st Qu.:  107               1st Qu.:  0.0          1st Qu.:488.0     
 Median :446          Median :  399               Median :462.0          Median :510.0     
 Mean   :304          Mean   : 1953               Mean   :315.6          Mean   :518.4     
 3rd Qu.:496          3rd Qu.: 2206               3rd Qu.:510.0          3rd Qu.:551.0     
 Max.   :589          Max.   :26744               Max.   :616.0          Max.   :611.0     
 Gender.Female.Test-takers Gender.Female.Verbal Gender.Male.Math Gender.Male.Test-takers
 Min.   :    73            Min.   :399.0        Min.   :394.0    Min.   :    61         
 1st Qu.:  1357            1st Qu.:493.0        1st Qu.:521.0    1st Qu.:  1177         
 Median :  3428            Median :519.0        Median :546.0    Median :  2979         
 Mean   : 15012            Mean   :528.3        Mean   :553.9    Mean   : 12911         
 3rd Qu.: 18698            3rd Qu.:569.0        3rd Qu.:592.0    3rd Qu.: 16718         
 Max.   :133217            Max.   :611.0        Max.   :640.0    Max.   :108336         
 Gender.Male.Verbal Score Ranges.Between 200 to 300.Math.Females
 Min.   :403.0      Min.   :   0.0                              
 1st Qu.:499.0      1st Qu.:  12.0                              
 Median :525.0      Median : 102.0                              
 Mean   :534.9      Mean   : 441.3                              
 3rd Qu.:577.0      3rd Qu.: 518.0                              
 Max.   :635.0      Max.   :4294.0                              
 Score Ranges.Between 200 to 300.Math.Males Score Ranges.Between 200 to 300.Math.Total
 Min.   :   0.0                             Min.   :   0.0                            
 1st Qu.:   8.0                             1st Qu.:  20.0                            
 Median :  60.0                             Median : 162.0                            
 Mean   : 308.4                             Mean   : 705.2                            
 3rd Qu.: 468.0                             3rd Qu.: 628.0                            
 Max.   :3034.0                             Max.   :6772.0                            
 Score Ranges.Between 200 to 300.Verbal.Females Score Ranges.Between 200 to 300.Verbal.Males
 Min.   :   0.0                                 Min.   :    0.0                             
 1st Qu.:  12.0                                 1st Qu.:   14.0                             
 Median :  46.0                                 Median :   83.0                             
 Mean   : 387.7                                 Mean   :  651.1                             
 3rd Qu.: 357.0                                 3rd Qu.:  570.0                             
 Max.   :5111.0                                 Max.   :20348.0                             
 Score Ranges.Between 200 to 300.Verbal.Total Score Ranges.Between 300 to 400.Math.Females
 Min.   :    0.0                              Min.   :    1                               
 1st Qu.:   26.0                              1st Qu.:   95                               
 Median :   74.0                              Median :  599                               
 Mean   :  752.7                              Mean   : 2181                               
 3rd Qu.:  790.0                              3rd Qu.: 1972                               
 Max.   :10603.0                              Max.   :24977                               
 Score Ranges.Between 300 to 400.Math.Males Score Ranges.Between 300 to 400.Math.Total
 Min.   :    1                              Min.   :    0                             
 1st Qu.:   57                              1st Qu.:  149                             
 Median :  144                              Median :  937                             
 Mean   : 1279                              Mean   : 3450                             
 3rd Qu.: 1389                              3rd Qu.: 3288                             
 Max.   :13740                              Max.   :38161                             
 Score Ranges.Between 300 to 400.Verbal.Females Score Ranges.Between 300 to 400.Verbal.Males
 Min.   :    1                                  Min.   :    1                               
 1st Qu.:   52                                  1st Qu.:   74                               
 Median :  206                                  Median :  368                               
 Mean   : 2018                                  Mean   : 1957                               
 3rd Qu.: 1827                                  3rd Qu.: 2081                               
 Max.   :22544                                  Max.   :26188                               
 Score Ranges.Between 300 to 400.Verbal.Total Score Ranges.Between 400 to 500.Math.Females
 Min.   :    2                                Min.   :    0                               
 1st Qu.:  110                                1st Qu.:  333                               
 Median :  394                                Median :  670                               
 Mean   : 3670                                Mean   : 4598                               
 3rd Qu.: 3530                                3rd Qu.: 5262                               
 Max.   :41262                                Max.   :43758                               
 Score Ranges.Between 400 to 500.Math.Males Score Ranges.Between 400 to 500.Math.Total
 Min.   :    0                              Min.   :    0                             
 1st Qu.:  125                              1st Qu.:  493                             
 Median :  442                              Median : 1096                             
 Mean   : 3143                              Mean   : 7738                             
 3rd Qu.: 3412                              3rd Qu.: 8698                             
 Max.   :29254                              Max.   :73012                             
 Score Ranges.Between 400 to 500.Verbal.Females Score Ranges.Between 400 to 500.Verbal.Males
 Min.   :    1                                  Min.   :     2                              
 1st Qu.:  198                                  1st Qu.:   223                              
 Median :  595                                  Median :   892                              
 Mean   : 4539                                  Mean   :  5541                              
 3rd Qu.: 5082                                  3rd Qu.:  5351                              
 Max.   :45918                                  Max.   :164622                              
 Score Ranges.Between 400 to 500.Verbal.Total Score Ranges.Between 500 to 600.Math.Females
 Min.   :    0                                Min.   :    4                               
 1st Qu.:  354                                1st Qu.:  369                               
 Median : 1063                                Median : 1006                               
 Mean   : 8190                                Mean   : 4333                               
 3rd Qu.: 9280                                3rd Qu.: 5593                               
 Max.   :80535                                Max.   :35778                               
 Score Ranges.Between 500 to 600.Math.Males Score Ranges.Between 500 to 600.Math.Total
 Min.   :    3                              Min.   :    6                             
 1st Qu.:  292                              1st Qu.:  651                             
 Median :  798                              Median : 1830                             
 Mean   : 3790                              Mean   : 8125                             
 3rd Qu.: 5163                              3rd Qu.:10753                             
 Max.   :31702                              Max.   :67480                             
 Score Ranges.Between 500 to 600.Verbal.Females Score Ranges.Between 500 to 600.Verbal.Males
 Min.   :    4                                  Min.   :    4                               
 1st Qu.:  356                                  1st Qu.:  318                               
 Median :  995                                  Median :  871                               
 Mean   : 4351                                  Mean   : 3760                               
 3rd Qu.: 5835                                  3rd Qu.: 5341                               
 Max.   :37455                                  Max.   :31449                               
 Score Ranges.Between 500 to 600.Verbal.Total Score Ranges.Between 600 to 700.Math.Females
 Min.   :    1                                Min.   :   10                               
 1st Qu.:  663                                1st Qu.:  284                               
 Median : 1888                                Median :  699                               
 Mean   : 8113                                Mean   : 2888                               
 3rd Qu.:11266                                3rd Qu.: 3242                               
 Max.   :68869                                Max.   :66431                               
 Score Ranges.Between 600 to 700.Math.Males Score Ranges.Between 600 to 700.Math.Total
 Min.   :   15                              Min.   :    26                            
 1st Qu.:  328                              1st Qu.:   609                            
 Median :  732                              Median :  1462                            
 Mean   : 3167                              Mean   :  6056                            
 3rd Qu.: 4178                              3rd Qu.:  7308                            
 Max.   :49941                              Max.   :116372                            
 Score Ranges.Between 600 to 700.Verbal.Females Score Ranges.Between 600 to 700.Verbal.Males
 Min.   :   13                                  Min.   :   10                               
 1st Qu.:  319                                  1st Qu.:  302                               
 Median :  718                                  Median :  672                               
 Mean   : 2914                                  Mean   : 2678                               
 3rd Qu.: 3329                                  3rd Qu.: 3215                               
 Max.   :71360                                  Max.   :56513                               
 Score Ranges.Between 600 to 700.Verbal.Total Score Ranges.Between 700 to 800.Math.Females
 Min.   :    23                               Min.   :    2.0                             
 1st Qu.:   617                               1st Qu.:   83.0                             
 Median :  1383                               Median :  223.0                             
 Mean   :  5592                               Mean   :  792.6                             
 3rd Qu.:  6521                               3rd Qu.:  821.0                             
 Max.   :127873                               Max.   :24126.0                             
 Score Ranges.Between 700 to 800.Math.Males Score Ranges.Between 700 to 800.Math.Total
 Min.   :    1                              Min.   :    1                             
 1st Qu.:  163                              1st Qu.:  251                             
 Median :  406                              Median :  645                             
 Mean   : 1307                              Mean   : 2099                             
 3rd Qu.: 1475                              3rd Qu.: 2301                             
 Max.   :30815                              Max.   :54941                             
 Score Ranges.Between 700 to 800.Verbal.Females Score Ranges.Between 700 to 800.Verbal.Males
 Min.   :    2.0                                Min.   :    2.0                             
 1st Qu.:  123.0                                1st Qu.:  121.0                             
 Median :  295.0                                Median :  295.0                             
 Mean   :  849.8                                Mean   :  847.3                             
 3rd Qu.:  987.0                                3rd Qu.:  970.0                             
 Max.   :21826.0                                Max.   :20460.0                             
 Score Ranges.Between 700 to 800.Verbal.Total
 Min.   :    4                               
 1st Qu.:  246                               
 Median :  605                               
 Mean   : 1697                               
 3rd Qu.: 1971                               
 Max.   :42286                               

Create a subset of various states for analysis

# The states chosen for this subset are from various regions of the country

Five_State_Scores <- subset(US_Scores, State.Name == "North Dakota" |
                                      State.Name == "California" |
                                      State.Name == "Florida" | 
                                      State.Name == "Texas" |
                                      State.Name == "New York")
Five_State_Scores

Data Visualization of math SAT test scores

ggplot( data = Five_State_Scores, mapping = aes(x = Year, y = Total.Math, linetype = State.Name)) +
        geom_point() +
        geom_smooth(mapping = aes(color = State.Name)) +
        scale_x_continuous(breaks = pretty_breaks()) +
        labs(title = "ND, FL, CA, TX, NY Math Scores",
             y = "Math Test Scores")

Data Visualization of verbal SAT test scores

ggplot( data = Five_State_Scores, mapping = aes(x = Year, y = Total.Verbal, linetype = State.Name)) +
        geom_smooth(mapping = aes(color = State.Name)) +
        geom_point() +
        scale_x_continuous(breaks = pretty_breaks()) +
        labs(title = "ND, FL, CA, TX, NY Verbal Scores",
             y = "Verbal Test Scores")

Examining the top 5 states

# Get the top 5 states by count
top_states <- head(sort(table(US_Scores$State.Code), decreasing = TRUE), 5)

# Subset the data to only include the top 5 platforms
top_states_5 <- subset(US_Scores, State.Code %in% names(top_states))

# Create the ggplot with the data
ggplot(data = top_states_5, mapping = aes(x = Year, y = `Academic Subjects.Mathematics.Average Years`, color = State.Code)) +
  geom_smooth() +
  geom_line() +
  scale_x_continuous(breaks = pretty_breaks()) +
  labs(title = "1.1 - Average Math GPA Scores by State & Year (Top 5)",
       x = "Year",
       y = "Math GPA (Average)",
       color = "State Code") +
  theme_minimal()

Grouping data by Year to then calculate the average test-takers scores for each gender

US_Scores$YearGroup <- cut(US_Scores$Year, 
                            breaks = seq(2005, 2016, by = 1),  # Adjusted the upper limit to 2015
                            labels = c("2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015"))

Creating the average test scores for both Male and Female test scores

topscores <- US_Scores %>%
  group_by(YearGroup) %>%
  summarize(
    Avg_Female_TestTakers = mean(`Gender.Female.Test-takers`),
    Avg_Male_TestTakers = mean(`Gender.Male.Test-takers`)
  ) %>%
  ungroup()

Creating a bar chart for data visualization

ggplot(topscores, aes(x = YearGroup)) +
  geom_bar(aes(y = Avg_Female_TestTakers, fill = "Female"), stat = "identity", position = "dodge", width = 0.7) +
  geom_bar(aes(y = Avg_Male_TestTakers, fill = "Male"), stat = "identity", position = "dodge", width = 0.7) +
  labs(title = "Average Test-Takers", x = "Year Group", y = "Average Test-Takers") +
  scale_fill_manual(values = c("Female" = "red", "Male" = "blue")) +
  theme_minimal() +
  geom_text(aes(x = YearGroup, y = round(Avg_Female_TestTakers), label = round(Avg_Female_TestTakers)), 
            position = position_dodge(width = 0.7), vjust = 1.65, size = 3) +
  geom_text(aes(x = YearGroup, y = round(Avg_Male_TestTakers), label = round(Avg_Male_TestTakers)), 
            position = position_dodge(width = 0.7), vjust = -0.65, size = 3) +
  scale_x_discrete(labels = c("2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015"))

LS0tCnRpdGxlOiAiVS5TLiBFZHVjYXRpb24gRWZmaWNpZW5jeSBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCiMgSW5zdGFsbCBQYWNrYWdlcwpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCiNpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpCmBgYAojIExpYnJhcnkgUGFja2FnZXMKYGBge3J9CiNsaWJyYXJ5KHRpZHl2ZXJzZSkKI2xpYnJhcnkocmVhZHIpCiNsaWJyYXJ5KGRwbHlyKQojbGlicmFyeShzY2FsZXMpCiNsaWJyYXJ5KGdncGxvdDIpCiNsaWJyYXJ5KHBzeWNoKQpgYGAKIyBSZWFkIGRhdGFzZXQKYGBge3J9ClVTX1Njb3JlcyA8LSByZWFkX2Nzdignc2Nob29sX3Njb3Jlcy5jc3YnLHNob3dfY29sX3R5cGVzID0gVFJVRSkKaGVhZChVU19TY29yZXMpCmBgYAojIENyZWF0ZSBhIHN1bW1hcnkgb2YgdGhlIGRhdGFzZXQgdG8gdmlldyBhbGwgY29sdW1ucyBhbmQgY29tcG9uZW50cwpgYGB7cn0Kc3VtbWFyeShVU19TY29yZXMpCmBgYAoKIyBDcmVhdGUgYSBzdWJzZXQgb2YgdmFyaW91cyBzdGF0ZXMgZm9yIGFuYWx5c2lzCmBgYHtyfQojIFRoZSBzdGF0ZXMgY2hvc2VuIGZvciB0aGlzIHN1YnNldCBhcmUgZnJvbSB2YXJpb3VzIHJlZ2lvbnMgb2YgdGhlIGNvdW50cnkKCkZpdmVfU3RhdGVfU2NvcmVzIDwtIHN1YnNldChVU19TY29yZXMsIFN0YXRlLk5hbWUgPT0gIk5vcnRoIERha290YSIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlLk5hbWUgPT0gIkNhbGlmb3JuaWEiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZS5OYW1lID09ICJGbG9yaWRhIiB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlLk5hbWUgPT0gIlRleGFzIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUuTmFtZSA9PSAiTmV3IFlvcmsiKQpGaXZlX1N0YXRlX1Njb3JlcwpgYGAKIyBEYXRhIFZpc3VhbGl6YXRpb24gb2YgbWF0aCBTQVQgdGVzdCBzY29yZXMKYGBge3J9CmdncGxvdCggZGF0YSA9IEZpdmVfU3RhdGVfU2NvcmVzLCBtYXBwaW5nID0gYWVzKHggPSBZZWFyLCB5ID0gVG90YWwuTWF0aCwgbGluZXR5cGUgPSBTdGF0ZS5OYW1lKSkgKwogICAgICAgIGdlb21fcG9pbnQoKSArCiAgICAgICAgZ2VvbV9zbW9vdGgobWFwcGluZyA9IGFlcyhjb2xvciA9IFN0YXRlLk5hbWUpKSArCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHByZXR0eV9icmVha3MoKSkgKwogICAgICAgIGxhYnModGl0bGUgPSAiTkQsIEZMLCBDQSwgVFgsIE5ZIE1hdGggU2NvcmVzIiwKICAgICAgICAgICAgIHkgPSAiTWF0aCBUZXN0IFNjb3JlcyIpCmBgYAojIERhdGEgVmlzdWFsaXphdGlvbiBvZiB2ZXJiYWwgU0FUIHRlc3Qgc2NvcmVzCmBgYHtyfQpnZ3Bsb3QoIGRhdGEgPSBGaXZlX1N0YXRlX1Njb3JlcywgbWFwcGluZyA9IGFlcyh4ID0gWWVhciwgeSA9IFRvdGFsLlZlcmJhbCwgbGluZXR5cGUgPSBTdGF0ZS5OYW1lKSkgKwogICAgICAgIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoY29sb3IgPSBTdGF0ZS5OYW1lKSkgKwogICAgICAgIGdlb21fcG9pbnQoKSArCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHByZXR0eV9icmVha3MoKSkgKwogICAgICAgIGxhYnModGl0bGUgPSAiTkQsIEZMLCBDQSwgVFgsIE5ZIFZlcmJhbCBTY29yZXMiLAogICAgICAgICAgICAgeSA9ICJWZXJiYWwgVGVzdCBTY29yZXMiKQpgYGAKIyBFeGFtaW5pbmcgdGhlIHRvcCA1IHN0YXRlcwpgYGB7cn0KIyBHZXQgdGhlIHRvcCA1IHN0YXRlcyBieSBjb3VudAp0b3Bfc3RhdGVzIDwtIGhlYWQoc29ydCh0YWJsZShVU19TY29yZXMkU3RhdGUuQ29kZSksIGRlY3JlYXNpbmcgPSBUUlVFKSwgNSkKCiMgU3Vic2V0IHRoZSBkYXRhIHRvIG9ubHkgaW5jbHVkZSB0aGUgdG9wIDUgcGxhdGZvcm1zCnRvcF9zdGF0ZXNfNSA8LSBzdWJzZXQoVVNfU2NvcmVzLCBTdGF0ZS5Db2RlICVpbiUgbmFtZXModG9wX3N0YXRlcykpCgojIENyZWF0ZSB0aGUgZ2dwbG90IHdpdGggdGhlIGRhdGEKZ2dwbG90KGRhdGEgPSB0b3Bfc3RhdGVzXzUsIG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsIHkgPSBgQWNhZGVtaWMgU3ViamVjdHMuTWF0aGVtYXRpY3MuQXZlcmFnZSBZZWFyc2AsIGNvbG9yID0gU3RhdGUuQ29kZSkpICsKICBnZW9tX3Ntb290aCgpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHByZXR0eV9icmVha3MoKSkgKwogIGxhYnModGl0bGUgPSAiMS4xIC0gQXZlcmFnZSBNYXRoIEdQQSBTY29yZXMgYnkgU3RhdGUgJiBZZWFyIChUb3AgNSkiLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTWF0aCBHUEEgKEF2ZXJhZ2UpIiwKICAgICAgIGNvbG9yID0gIlN0YXRlIENvZGUiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAojIEdyb3VwaW5nIGRhdGEgYnkgWWVhciB0byB0aGVuIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB0ZXN0LXRha2VycyBzY29yZXMgZm9yIGVhY2ggZ2VuZGVyCmBgYHtyfQpVU19TY29yZXMkWWVhckdyb3VwIDwtIGN1dChVU19TY29yZXMkWWVhciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMjAwNSwgMjAxNiwgYnkgPSAxKSwgICMgQWRqdXN0ZWQgdGhlIHVwcGVyIGxpbWl0IHRvIDIwMTUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjIwMDUiLCAiMjAwNiIsICIyMDA3IiwgIjIwMDgiLCAiMjAwOSIsICIyMDEwIiwgIjIwMTEiLCAiMjAxMiIsICIyMDEzIiwgIjIwMTQiLCAiMjAxNSIpKQpgYGAKIyBDcmVhdGluZyB0aGUgYXZlcmFnZSB0ZXN0IHNjb3JlcyBmb3IgYm90aCBNYWxlIGFuZCBGZW1hbGUgdGVzdCBzY29yZXMKYGBge3J9CnRvcHNjb3JlcyA8LSBVU19TY29yZXMgJT4lCiAgZ3JvdXBfYnkoWWVhckdyb3VwKSAlPiUKICBzdW1tYXJpemUoCiAgICBBdmdfRmVtYWxlX1Rlc3RUYWtlcnMgPSBtZWFuKGBHZW5kZXIuRmVtYWxlLlRlc3QtdGFrZXJzYCksCiAgICBBdmdfTWFsZV9UZXN0VGFrZXJzID0gbWVhbihgR2VuZGVyLk1hbGUuVGVzdC10YWtlcnNgKQogICkgJT4lCiAgdW5ncm91cCgpCmBgYAoKIyBDcmVhdGluZyBhIGJhciBjaGFydCBmb3IgZGF0YSB2aXN1YWxpemF0aW9uCmBgYHtyfQpnZ3Bsb3QodG9wc2NvcmVzLCBhZXMoeCA9IFllYXJHcm91cCkpICsKICBnZW9tX2JhcihhZXMoeSA9IEF2Z19GZW1hbGVfVGVzdFRha2VycywgZmlsbCA9ICJGZW1hbGUiKSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgd2lkdGggPSAwLjcpICsKICBnZW9tX2JhcihhZXMoeSA9IEF2Z19NYWxlX1Rlc3RUYWtlcnMsIGZpbGwgPSAiTWFsZSIpLCBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiLCB3aWR0aCA9IDAuNykgKwogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBUZXN0LVRha2VycyIsIHggPSAiWWVhciBHcm91cCIsIHkgPSAiQXZlcmFnZSBUZXN0LVRha2VycyIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJGZW1hbGUiID0gInJlZCIsICJNYWxlIiA9ICJibHVlIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGdlb21fdGV4dChhZXMoeCA9IFllYXJHcm91cCwgeSA9IHJvdW5kKEF2Z19GZW1hbGVfVGVzdFRha2VycyksIGxhYmVsID0gcm91bmQoQXZnX0ZlbWFsZV9UZXN0VGFrZXJzKSksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC43KSwgdmp1c3QgPSAxLjY1LCBzaXplID0gMykgKwogIGdlb21fdGV4dChhZXMoeCA9IFllYXJHcm91cCwgeSA9IHJvdW5kKEF2Z19NYWxlX1Rlc3RUYWtlcnMpLCBsYWJlbCA9IHJvdW5kKEF2Z19NYWxlX1Rlc3RUYWtlcnMpKSwgCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjcpLCB2anVzdCA9IC0wLjY1LCBzaXplID0gMykgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiMjAwNSIsICIyMDA2IiwgIjIwMDciLCAiMjAwOCIsICIyMDA5IiwgIjIwMTAiLCAiMjAxMSIsICIyMDEyIiwgIjIwMTMiLCAiMjAxNCIsICIyMDE1IikpCmBgYA==