Part 1: Reshape the Data Into Long Format

  1. Starting with the wide version of the STAR data (with one row per person), reshape the dataset into long format, where one row represents each observation (multiple rows per person). Use the reshape long command in Stata or pivot_longer function in the dplyr function in R, creating a new variable called grade or year (your choice). Paste the results of codebook, compact (in Stata) or glimpse in R below once you have reshaped the data. (See below)

Part 2: Test for Nonlinear Growth Parameters

  1. Create a new variable, grade_0, which goes from 0-5 instead of 3-8 like our current grade variable does (just like last week). (See below)

  2. Run and interpret three models, all with science scores (science) as the DV, and all with scores clustered within students (stdntid): 1) a null growth model, 2) a growth model with linear and quadratic growth, and 3) a growth model with linear, quadratic, and cubic growth. Include a random slope for grade_0 in all models (R folks - you can disregard this. The software is being too difficult! :)). Use AIC and BIC to choose which model has the best fit. Does this dataset show evidence of nonlinear growth in science scores?

The AIC for the null growth model, growth model with linear and quadratic growth, and growth model for liear, quadratic, and cubic are as follows, respectively: 90959.4, 88570, 87223 The BIC for the null growth model, growth model with linear and quadratic growth, and growth model for liear, quadratic, and cubic are as follows, respectively: 90987.7, 88605, 87266. The data shows evidence of nonlinear growth in science scores.

Part 3: Use a Repeated Measures (Heterogeneous Variance) Structure

  1. Using your preferred model from #3 above, test a heterogeneous level-1 variance structure using the residuals()option in Stata, or the lme function in the nlme package for R users. R users - do not include a random slope for grade_0 at the student level (this was causing convergence issues). Does the use of this structure improve the model fit? No, the BIC is 89951. This is not an improvement from the previous models.

  2. In your own words, how is the repeated measures structure different from the one we typically use in MLM? Why might it be important to use? Repeated Measures is a heterogeneous variance structure. The purpose of the repeated measures to to capture nonlinearity in the dataset. By doing so, it will allow you to develop a better model for predicting.

Load in Our MVP Packages

library(tidyverse)
library(lme4)
library(haven)

Part 1: Loading in the Data, Reshaping Data from Long to Wide, Create New Variables

Load in the Data


starwide <- haven::read_dta("STAR_wide.dta")

glimpse(starwide)
Rows: 1,471
Columns: 11
$ stdntid    <dbl> 10023, 10042, 10056, 10082, 10097, 101...
$ race       <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2...
$ gender     <dbl+lbl> 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 2, 1...
$ ac_mot     <dbl> 50, 50, 52, 49, 51, 50, 51, 57, 40, 48...
$ ever_lunch <dbl+lbl> 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1...
$ science3   <dbl> 632, 618, 618, 649, 577, 655, 662, 627...
$ science4   <dbl> 756, 710, 719, 722, 688, 719, 767, 709...
$ science5   <dbl> 729, 738, 760, 729, 681, 738, 749, 754...
$ science6   <dbl> 762, 740, 776, 753, 720, 710, 782, 755...
$ science7   <dbl> 778, 734, 782, 809, 698, 766, 763, 729...
$ science8   <dbl> 783, 771, 772, 806, 745, 774, 804, 793...

Using pivot_longer to reshape from wide to long….

starwide.long <- starwide %>%
  pivot_longer(.,
              cols = starts_with("science"),
              names_to = "year",
              values_to = "science",
              names_prefix = "science",
              )
starwide.long.clean <- starwide.long %>%
  mutate(.,
         race.fac = as_factor(race),
         gender.fac = as_factor(gender),
         ever_lunch.fac = as_factor(ever_lunch),
         grade_0 = as.numeric(year)-3,
        grade_sq = grade_0^2,
         grade_cube = grade_0^3)%>%
 na.omit()

glimpse(starwide.long.clean)
Rows: 8,826
Columns: 13
$ stdntid        <dbl> 10023, 10023, 10023, 10023, 10023...
$ race           <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
$ gender         <dbl+lbl> 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,...
$ ac_mot         <dbl> 50, 50, 50, 50, 50, 50, 50, 50, 5...
$ ever_lunch     <dbl+lbl> 2, 2, 2, 2, 2, 2, 1, 1, 1, 1,...
$ year           <chr> "3", "4", "5", "6", "7", "8", "3"...
$ science        <dbl> 632, 756, 729, 762, 778, 783, 618...
$ race.fac       <fct> WHITE, WHITE, WHITE, WHITE, WHITE...
$ gender.fac     <fct> MALE, MALE, MALE, MALE, MALE, MAL...
$ ever_lunch.fac <fct> NON-FREE LUNCH, NON-FREE LUNCH, N...
$ grade_0        <dbl> 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, ...
$ grade_sq       <dbl> 0, 1, 4, 9, 16, 25, 0, 1, 4, 9, 1...
$ grade_cube     <dbl> 0, 1, 8, 27, 64, 125, 0, 1, 8, 27...

Part 2: Nonlinear Growth Models

Now, run a GROWTH null model for science scores (with year included)

model.null.growth <- lmer(science ~ grade_0 + (1|stdntid), REML=FALSE, data = starwide.long.clean)
summary(model.null.growth)
Linear mixed model fit by maximum likelihood  ['lmerMod']
Formula: science ~ grade_0 + (1 | stdntid)
   Data: starwide.long.clean

     AIC      BIC   logLik deviance df.resid 
 90959.4  90987.7 -45475.7  90951.4     8822 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.0254 -0.6361  0.0105  0.6367  4.0226 

Random effects:
 Groups   Name        Variance Std.Dev.
 stdntid  (Intercept) 1072     32.74   
 Residual             1300     36.05   
Number of obs: 8826, groups:  stdntid, 1471

Fixed effects:
            Estimate Std. Error t value
(Intercept) 669.3920     1.0916   613.2
grade_0      24.2729     0.2247   108.0

Correlation of Fixed Effects:
        (Intr)
grade_0 -0.515

Calculate GROWTH ICC

null.growth.icc <- 1073/(1073 + 1300)
null.growth.icc
[1] 0.4521702

Add nonlinear growth terms (square)

model.square <- lmer(science ~ grade_0 + grade_sq + (1|stdntid), data = starwide.long.clean)
summary(model.square)
Linear mixed model fit by REML ['lmerMod']
Formula: science ~ grade_0 + grade_sq + (1 | stdntid)
   Data: starwide.long.clean

REML criterion at convergence: 88562.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.6561 -0.5428 -0.0099  0.5538  4.5436 

Random effects:
 Groups   Name        Variance Std.Dev.
 stdntid  (Intercept) 1133.2   33.66   
 Residual              939.1   30.65   
Number of obs: 8826, groups:  stdntid, 1471

Fixed effects:
            Estimate Std. Error t value
(Intercept) 646.2231     1.1379  567.92
grade_0      59.0262     0.6812   86.65
grade_sq     -6.9507     0.1308  -53.15

Correlation of Fixed Effects:
         (Intr) grad_0
grade_0  -0.485       
grade_sq  0.383 -0.960

Add nonlinear growth terms (cubic)

model.cube <- lmer(science ~ grade_0 + grade_cube + (1|stdntid), data = starwide.long.clean)
summary(model.cube)
Linear mixed model fit by REML ['lmerMod']
Formula: science ~ grade_0 + grade_cube + (1 | stdntid)
   Data: starwide.long.clean

REML criterion at convergence: 89219.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.4401 -0.5735 -0.0205  0.5745  4.4795 

Random effects:
 Groups   Name        Variance Std.Dev.
 stdntid  (Intercept) 1119     33.45   
 Residual             1026     32.04   
Number of obs: 8826, groups:  stdntid, 1471

Fixed effects:
             Estimate Std. Error t value
(Intercept) 651.90787    1.13224  575.77
grade_0      43.18746    0.47165   91.57
grade_cube   -0.79473    0.01795  -44.27

Correlation of Fixed Effects:
           (Intr) grad_0
grade_0    -0.503       
grade_cube  0.349 -0.906

Add nonlinear growth terms (square AND cubic)

model.both <- lmer(science ~ grade_0 + grade_sq + grade_cube + (1|stdntid), REML = FALSE, data = starwide.long.clean)
summary(model.both)
Linear mixed model fit by maximum likelihood  ['lmerMod']
Formula: 
science ~ grade_0 + grade_sq + grade_cube + (1 | stdntid)
   Data: starwide.long.clean

     AIC      BIC   logLik deviance df.resid 
 87223.4  87265.9 -43605.7  87211.4     8820 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2663 -0.4985  0.0027  0.5236  4.4394 

Random effects:
 Groups   Name        Variance Std.Dev.
 stdntid  (Intercept) 1158.5   34.04   
 Residual              781.6   27.96   
Number of obs: 8826, groups:  stdntid, 1471

Fixed effects:
             Estimate Std. Error t value
(Intercept) 635.77161    1.13923  558.07
grade_0     106.75456    1.38750   76.94
grade_sq    -33.07934    0.68954  -47.97
grade_cube    3.48382    0.09055   38.47

Correlation of Fixed Effects:
           (Intr) grad_0 grd_sq
grade_0    -0.411              
grade_sq    0.295 -0.955       
grade_cube -0.238  0.894 -0.985

Should we keep that cubic term time (year)? Use anova to test…

anova(model.square, model.both)
refitting model(s) with ML (instead of REML)
Data: starwide.long.clean
Models:
model.square: science ~ grade_0 + grade_sq + (1 | stdntid)
model.both: science ~ grade_0 + grade_sq + grade_cube + (1 | stdntid)
             npar   AIC   BIC logLik deviance  Chisq Df
model.square    5 88570 88605 -44280    88560          
model.both      6 87223 87266 -43606    87211 1348.6  1
             Pr(>Chisq)    
model.square               
model.both    < 2.2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Heterogeneous Variance Repeated Measures Model

model.null.growth.het <- lme(science ~ grade_0, 
                             random =  ~ 1|stdntid, 
                             data = starwide.long.clean, 
                             method = "ML", 
                             weights = varIdent(form = ~ 1 | grade_0)
)
summary(model.null.growth.het)
Linear mixed-effects model fit by maximum likelihood
 Data: starwide.long.clean 

Random effects:
 Formula: ~1 | stdntid
        (Intercept) Residual
StdDev:    34.32642 67.40924

Variance function:
 Structure: Different standard deviations per stratum
 Formula: ~1 | grade_0 
 Parameter estimates:
        0         1         2         3         4         5 
1.0000000 0.4987552 0.4549923 0.4852018 0.3421510 0.3497103 
Fixed effects: science ~ grade_0 
 Correlation: 
        (Intr)
grade_0 -0.593

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-4.91503937 -0.71613675 -0.05974243  0.51662541  4.30180514 

Number of Observations: 8826
Number of Groups: 1471 
LS0tDQp0aXRsZTogJ01vZHVsZSA4LCBQYXJ0IDI6IEFkdmFuY2VkIEdyb3d0aCBNb2RlbHMnDQphdXRob3I6ICdKYWtlIFJleW5vbGRzIC0gT2N0b2JlciAyMCwgMjAyMCcNCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpQYXJ0IDE6IFJlc2hhcGUgdGhlIERhdGEgSW50byBMb25nIEZvcm1hdA0KDQoxLiBTdGFydGluZyB3aXRoIHRoZSB3aWRlIHZlcnNpb24gb2YgdGhlIFNUQVIgZGF0YSAod2l0aCBvbmUgcm93IHBlciBwZXJzb24pLCByZXNoYXBlIHRoZSBkYXRhc2V0IGludG8gbG9uZyBmb3JtYXQsIHdoZXJlIG9uZSByb3cgcmVwcmVzZW50cyBlYWNoIG9ic2VydmF0aW9uIChtdWx0aXBsZSByb3dzIHBlciBwZXJzb24pLiBVc2UgdGhlIHJlc2hhcGUgbG9uZyBjb21tYW5kIGluIFN0YXRhIG9yIHBpdm90X2xvbmdlciBmdW5jdGlvbiBpbiB0aGUgZHBseXIgZnVuY3Rpb24gaW4gUiwgY3JlYXRpbmcgYSBuZXcgdmFyaWFibGUgY2FsbGVkIGdyYWRlIG9yIHllYXIgKHlvdXIgY2hvaWNlKS4gUGFzdGUgdGhlIHJlc3VsdHMgb2YgY29kZWJvb2ssIGNvbXBhY3QgKGluIFN0YXRhKSBvciBnbGltcHNlIGluIFIgYmVsb3cgb25jZSB5b3UgaGF2ZSByZXNoYXBlZCB0aGUgZGF0YS4NCihTZWUgYmVsb3cpDQoNClBhcnQgMjogVGVzdCBmb3IgTm9ubGluZWFyIEdyb3d0aCBQYXJhbWV0ZXJzDQoNCjIuIENyZWF0ZSBhIG5ldyB2YXJpYWJsZSwgZ3JhZGVfMCwgd2hpY2ggZ29lcyBmcm9tIDAtNSBpbnN0ZWFkIG9mIDMtOCBsaWtlIG91ciBjdXJyZW50IGdyYWRlIHZhcmlhYmxlIGRvZXMgKGp1c3QgbGlrZSBsYXN0IHdlZWspLg0KKFNlZSBiZWxvdykNCg0KMy4gUnVuIGFuZCBpbnRlcnByZXQgdGhyZWUgbW9kZWxzLCBhbGwgd2l0aCBzY2llbmNlIHNjb3JlcyAoc2NpZW5jZSkgYXMgdGhlIERWLCBhbmQgYWxsIHdpdGggc2NvcmVzIGNsdXN0ZXJlZCB3aXRoaW4gc3R1ZGVudHMgKHN0ZG50aWQpOiAxKSBhIG51bGwgZ3Jvd3RoIG1vZGVsLCAyKSBhIGdyb3d0aCBtb2RlbCB3aXRoIGxpbmVhciBhbmQgcXVhZHJhdGljIGdyb3d0aCwgYW5kIDMpIGEgZ3Jvd3RoIG1vZGVsIHdpdGggbGluZWFyLCBxdWFkcmF0aWMsIGFuZCBjdWJpYyBncm93dGguIEluY2x1ZGUgYSByYW5kb20gc2xvcGUgZm9yIGdyYWRlXzAgaW4gYWxsIG1vZGVscyAoUiBmb2xrcyAtIHlvdSBjYW4gZGlzcmVnYXJkIHRoaXMuIFRoZSBzb2Z0d2FyZSBpcyBiZWluZyB0b28gZGlmZmljdWx0ISA6KSkuIFVzZSBBSUMgYW5kIEJJQyB0byBjaG9vc2Ugd2hpY2ggbW9kZWwgaGFzIHRoZSBiZXN0IGZpdC4gRG9lcyB0aGlzIGRhdGFzZXQgc2hvdyBldmlkZW5jZSBvZiBub25saW5lYXIgZ3Jvd3RoIGluIHNjaWVuY2Ugc2NvcmVzPw0KDQpUaGUgQUlDIGZvciB0aGUgbnVsbCBncm93dGggbW9kZWwsIGdyb3d0aCBtb2RlbCB3aXRoIGxpbmVhciBhbmQgcXVhZHJhdGljIGdyb3d0aCwgYW5kIGdyb3d0aCBtb2RlbCBmb3IgbGllYXIsIHF1YWRyYXRpYywgYW5kIGN1YmljIGFyZSBhcyBmb2xsb3dzLCByZXNwZWN0aXZlbHk6IDkwOTU5LjQsIDg4NTcwLCA4NzIyMyAgVGhlIEJJQyBmb3IgdGhlIG51bGwgZ3Jvd3RoIG1vZGVsLCBncm93dGggbW9kZWwgd2l0aCBsaW5lYXIgYW5kIHF1YWRyYXRpYyBncm93dGgsIGFuZCBncm93dGggbW9kZWwgZm9yIGxpZWFyLCBxdWFkcmF0aWMsIGFuZCBjdWJpYyBhcmUgYXMgZm9sbG93cywgcmVzcGVjdGl2ZWx5OiAgOTA5ODcuNywgODg2MDUsIDg3MjY2LiBUaGUgZGF0YSBzaG93cyBldmlkZW5jZSBvZiBub25saW5lYXIgZ3Jvd3RoIGluIHNjaWVuY2Ugc2NvcmVzLg0KDQpQYXJ0IDM6IFVzZSBhIFJlcGVhdGVkIE1lYXN1cmVzIChIZXRlcm9nZW5lb3VzIFZhcmlhbmNlKSBTdHJ1Y3R1cmUNCg0KNC4gVXNpbmcgeW91ciBwcmVmZXJyZWQgbW9kZWwgZnJvbSAjMyBhYm92ZSwgdGVzdCBhIGhldGVyb2dlbmVvdXMgbGV2ZWwtMSB2YXJpYW5jZSBzdHJ1Y3R1cmUgdXNpbmcgdGhlIHJlc2lkdWFscygpb3B0aW9uIGluIFN0YXRhLCBvciB0aGUgbG1lIGZ1bmN0aW9uIGluIHRoZSBubG1lIHBhY2thZ2UgZm9yIFIgdXNlcnMuIFIgdXNlcnMgLSBkbyBub3QgaW5jbHVkZSBhIHJhbmRvbSBzbG9wZSBmb3IgZ3JhZGVfMCBhdCB0aGUgc3R1ZGVudCBsZXZlbCAodGhpcyB3YXMgY2F1c2luZyBjb252ZXJnZW5jZSBpc3N1ZXMpLiBEb2VzIHRoZSB1c2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgaW1wcm92ZSB0aGUgbW9kZWwgZml0PyBObywgdGhlIEJJQyBpcyA4OTk1MS4gVGhpcyBpcyBub3QgYW4gaW1wcm92ZW1lbnQgZnJvbSB0aGUgcHJldmlvdXMgbW9kZWxzLiANCg0KNS4gSW4geW91ciBvd24gd29yZHMsIGhvdyBpcyB0aGUgcmVwZWF0ZWQgbWVhc3VyZXMgc3RydWN0dXJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2UgdHlwaWNhbGx5IHVzZSBpbiBNTE0/IFdoeSBtaWdodCBpdCBiZSBpbXBvcnRhbnQgdG8gdXNlPw0KUmVwZWF0ZWQgTWVhc3VyZXMgaXMgYSBoZXRlcm9nZW5lb3VzIHZhcmlhbmNlIHN0cnVjdHVyZS4gVGhlIHB1cnBvc2Ugb2YgdGhlIHJlcGVhdGVkIG1lYXN1cmVzIHRvIHRvIGNhcHR1cmUgbm9ubGluZWFyaXR5IGluIHRoZSBkYXRhc2V0LiBCeSBkb2luZyBzbywgaXQgd2lsbCBhbGxvdyB5b3UgdG8gZGV2ZWxvcCBhIGJldHRlciBtb2RlbCBmb3IgcHJlZGljdGluZy4gDQoNCg0KIyBMb2FkIGluIE91ciBNVlAgUGFja2FnZXMNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGxtZTQpDQpsaWJyYXJ5KGhhdmVuKQ0KYGBgDQoNCiMgUGFydCAxOiBMb2FkaW5nIGluIHRoZSBEYXRhLCBSZXNoYXBpbmcgRGF0YSBmcm9tIExvbmcgdG8gV2lkZSwgQ3JlYXRlIE5ldyBWYXJpYWJsZXMNCiMjIExvYWQgaW4gdGhlIERhdGENCmBgYHtyfQ0KDQpzdGFyd2lkZSA8LSBoYXZlbjo6cmVhZF9kdGEoIlNUQVJfd2lkZS5kdGEiKQ0KDQpnbGltcHNlKHN0YXJ3aWRlKQ0KYGBgDQojIyBVc2luZyBgcGl2b3RfbG9uZ2VyYCB0byByZXNoYXBlIGZyb20gd2lkZSB0byBsb25nLi4uLg0KYGBge3J9DQpzdGFyd2lkZS5sb25nIDwtIHN0YXJ3aWRlICU+JQ0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgY29scyA9IHN0YXJ0c193aXRoKCJzY2llbmNlIiksDQogICAgICAgICAgICAgIG5hbWVzX3RvID0gInllYXIiLA0KICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAic2NpZW5jZSIsDQogICAgICAgICAgICAgIG5hbWVzX3ByZWZpeCA9ICJzY2llbmNlIiwNCiAgICAgICAgICAgICAgKQ0Kc3RhcndpZGUubG9uZy5jbGVhbiA8LSBzdGFyd2lkZS5sb25nICU+JQ0KICBtdXRhdGUoLiwNCiAgICAgICAgIHJhY2UuZmFjID0gYXNfZmFjdG9yKHJhY2UpLA0KICAgICAgICAgZ2VuZGVyLmZhYyA9IGFzX2ZhY3RvcihnZW5kZXIpLA0KICAgICAgICAgZXZlcl9sdW5jaC5mYWMgPSBhc19mYWN0b3IoZXZlcl9sdW5jaCksDQogICAgICAgICBncmFkZV8wID0gYXMubnVtZXJpYyh5ZWFyKS0zLA0KICAgICAgICBncmFkZV9zcSA9IGdyYWRlXzBeMiwNCiAgICAgICAgIGdyYWRlX2N1YmUgPSBncmFkZV8wXjMpJT4lDQogbmEub21pdCgpDQoNCmdsaW1wc2Uoc3RhcndpZGUubG9uZy5jbGVhbikNCmBgYA0KIyBQYXJ0IDI6IE5vbmxpbmVhciBHcm93dGggTW9kZWxzDQojIyBOb3csIHJ1biBhIEdST1dUSCBudWxsIG1vZGVsIGZvciBzY2llbmNlIHNjb3JlcyAod2l0aCB5ZWFyIGluY2x1ZGVkKQ0KYGBge3J9DQptb2RlbC5udWxsLmdyb3d0aCA8LSBsbWVyKHNjaWVuY2UgfiBncmFkZV8wICsgKDF8c3RkbnRpZCksIFJFTUw9RkFMU0UsIGRhdGEgPSBzdGFyd2lkZS5sb25nLmNsZWFuKQ0Kc3VtbWFyeShtb2RlbC5udWxsLmdyb3d0aCkNCmBgYA0KDQojIyMgQ2FsY3VsYXRlIEdST1dUSCBJQ0MNCmBgYHtyfQ0KbnVsbC5ncm93dGguaWNjIDwtIDEwNzMvKDEwNzMgKyAxMzAwKQ0KbnVsbC5ncm93dGguaWNjDQpgYGANCg0KIyMgQWRkIG5vbmxpbmVhciBncm93dGggdGVybXMgKHNxdWFyZSkNCmBgYHtyfQ0KbW9kZWwuc3F1YXJlIDwtIGxtZXIoc2NpZW5jZSB+IGdyYWRlXzAgKyBncmFkZV9zcSArICgxfHN0ZG50aWQpLCBkYXRhID0gc3RhcndpZGUubG9uZy5jbGVhbikNCnN1bW1hcnkobW9kZWwuc3F1YXJlKQ0KYGBgDQoNCiMjIEFkZCBub25saW5lYXIgZ3Jvd3RoIHRlcm1zIChjdWJpYykNCmBgYHtyfQ0KbW9kZWwuY3ViZSA8LSBsbWVyKHNjaWVuY2UgfiBncmFkZV8wICsgZ3JhZGVfY3ViZSArICgxfHN0ZG50aWQpLCBkYXRhID0gc3RhcndpZGUubG9uZy5jbGVhbikNCnN1bW1hcnkobW9kZWwuY3ViZSkNCmBgYA0KDQojIyBBZGQgbm9ubGluZWFyIGdyb3d0aCB0ZXJtcyAoc3F1YXJlIEFORCBjdWJpYykNCmBgYHtyfQ0KbW9kZWwuYm90aCA8LSBsbWVyKHNjaWVuY2UgfiBncmFkZV8wICsgZ3JhZGVfc3EgKyBncmFkZV9jdWJlICsgKDF8c3RkbnRpZCksIFJFTUwgPSBGQUxTRSwgZGF0YSA9IHN0YXJ3aWRlLmxvbmcuY2xlYW4pDQpzdW1tYXJ5KG1vZGVsLmJvdGgpDQpgYGANCg0KIyMgU2hvdWxkIHdlIGtlZXAgdGhhdCBjdWJpYyB0ZXJtIHRpbWUgKHllYXIpPyBVc2UgYGFub3ZhYCB0byB0ZXN0Li4uDQpgYGB7cn0NCmFub3ZhKG1vZGVsLnNxdWFyZSwgbW9kZWwuYm90aCkNCmBgYA0KDQojIEhldGVyb2dlbmVvdXMgVmFyaWFuY2UgUmVwZWF0ZWQgTWVhc3VyZXMgTW9kZWwNCmBgYHtyfQ0KbW9kZWwubnVsbC5ncm93dGguaGV0IDwtIGxtZShzY2llbmNlIH4gZ3JhZGVfMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9ICB+IDF8c3RkbnRpZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdGFyd2lkZS5sb25nLmNsZWFuLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIk1MIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSB2YXJJZGVudChmb3JtID0gfiAxIHwgZ3JhZGVfMCkNCikNCnN1bW1hcnkobW9kZWwubnVsbC5ncm93dGguaGV0KQ0KYGBg