What significance level are we considering in this experiment – 10%, 5% or 1%?

library(mosaic)
#library(forecast)
library(lmtest)
(asymp_crit=qchisq(0.95,1))
[1] 3.841459
#x = seq(1, 5, 0.01 )
library(readr)
xdata <- read_csv("F:/OneDrive/One drive/546-2017/lab/lab5/x.csv")
z = seq(1, 5 , 0.01)
plot( z, dchisq(z, 1),"l")
abline(v = asymp_crit)
eq <- bquote( critical_value == .(asymp_crit))
text(x = asymp_crit+0.6, y = 0.05, eq)

In which line of the code do we assign the null hypothesis to be true?

rho=0.0

What sample size is being considered?

n=10

Which line(s) would we alter if we wanted to consider a sample size of (say) n = 200?

n = 200

the percentage rejection rates for the case where THE NULL HYPOTHESIS IS TRUE - so these are the true sizes (significance levels) of the tests,

set.seed(654321)
nrep=2000
n=10
c1=1 
c2=4
rho=0.0
#x=rnorm(n)+(1:n)/n
x = xdata$x[1:n]
#str(xdata$x)
#y = numeric(20000) 
 
lrtv = numeric(nrep)
waldv = numeric(nrep)
power_lrt=0.0 
power_wald=0.0 
asymp_crit=qchisq(0.95,1)
#'============================='
for (i in 1: nrep ){
    
  e = numeric(n)    
  #genr e=rho*e(-1)+@rnorm 
  #e = arima.sim(model=list(ar=rho),n=n) 
  
  # or
  
  for(j in 2:n){
    e[j] = rho*e[j-1] + rnorm(1) 
  }
  #arima(e, order = c(1, 0, 0)) 
  #acf(e, 10)
  #pacf(e, 10)
  y=c1+c2*x+e 
  
  
  #equation eq1.ls y c x 
  fit1 <- lm(y~ x)
  #summary(fit1)  
  
  #loglr=@logl 
  
  loglr=logLik(fit1)  
  
  #http://stackoverflow.com/questions/7233288/non-stationary-seasonal-ar-part-from-css-error-in-r
  #equation eq2.ls(arma=ml) y c x ar(1) 
  fit2 <- arima(y, xreg=x, order=c(1,0,0),method="ML")
  #summary(fit2)
  #str(coeftest(fit2) )
  
  #scalar loglu=@logl 
  
  loglu=logLik(fit2)
  
  lrtv[i]=-2*(loglr-loglu)
  
  
  #'if lrtv(!i)>asymp_crit then
  if (lrtv[i]>asymp_crit){
  
  
  #if (lrtv[i]>crit_lrt){
    power_lrt=power_lrt+1 
    
  } 
   
  
  
  waldv[i]=coeftest(fit2)[1,3]^2 
  
  
  #'if waldv(!i)>asymp_crit
  
  if (waldv[i]>asymp_crit){
 
  
  #if (waldv[i]>crit_lrt){
    
    power_wald=power_wald+1
    
    } 
}
#'============================='
(power_lrt=power_lrt/nrep*100)
[1] 7.6
(power_wald=power_wald/nrep*100)
[1] 13.3
(crit_lrt=quantile(lrtv,0.95) )
     95% 
4.815507 
hist(lrtv)

(crit_wald=quantile(waldv,0.95))
     95% 
7.825018 
hist(waldv)

Make a function

sizeAdjust = function(  nseed=654321, rho=0.0, nrep = 2000, n = 10, alpha = 0.05){
  
    set.seed(nseed)
    
    #nrep=nrep
    #n=10
    
    c1=1 
    c2=4
    #rho=0.0
    #x=rnorm(n)+(1:n)/n
    x = xdata$x[1:n]
    
    #y = numeric(20000) 
     
    lrtv = numeric(nrep)
    waldv = numeric(nrep)
    
    power_lrt=0.0 
    
    power_wald=0.0 
    asymp_crit=qchisq(1-alpha,1)
    
    #'============================='
    
    
    
    for (i in 1: nrep ){
    
        
      e = numeric(n)    
      #genr e=rho*e(-1)+@rnorm 
      #e = arima.sim(model=list(ar=rho),n=n) 
      
      # or
      
      for(j in 2:n){
        e[j] = rho*e[j-1] + rnorm(1) 
      }
      #arima(e, order = c(1, 0, 0)) 
      #acf(e, 10)
      #pacf(e, 10)
      y=c1+c2*x+e 
      
      
      #equation eq1.ls y c x 
      fit1 <- lm(y~ x)
      #summary(fit1)  
      
      #loglr=@logl 
      
      loglr=logLik(fit1)  
      
      #http://stackoverflow.com/questions/7233288/non-stationary-seasonal-ar-part-from-css-error-in-r
      #equation eq2.ls(arma=ml) y c x ar(1) 
      fit2 <- arima(y, xreg=x, order=c(1,0,0),method="ML")
      #summary(fit2)
      #str(coeftest(fit2) )
      
      #scalar loglu=@logl 
      
      loglu=logLik(fit2)
      
      lrtv[i]=-2*(loglr-loglu)
      
      
      #'if lrtv(!i)>asymp_crit then
      if (lrtv[i]>asymp_crit){
      
      
      #if (lrtv[i]>crit_lrt){
        power_lrt=power_lrt+1 
        
      } 
       
      
      
      waldv[i]=coeftest(fit2)[1,3]^2 
      
      
      #'if waldv(!i)>asymp_crit
      
      if (waldv[i]>asymp_crit){
     
      
      #if (waldv[i]>crit_lrt){
        
        power_wald=power_wald+1
        
        } 
    
    }
       #'============================='
    
    power_lrt=power_lrt/nrep*100
    
    
    power_wald=power_wald/nrep*100
    
    crit_lrt=quantile(lrtv,0.95) 
    crit_wald=quantile(waldv,0.95)
    
    
    return(c(power_lrt, power_wald,crit_lrt,crit_wald ))
}

Computer power

computePower =function( nseed=654321, rho=0.0, nrep = 2000, n = 10, alpha = 0.05, crit_lrt = 4.815507, crit_wald = 7.825018){
  
    set.seed(nseed)
    
    #nrep=nrep
    #n=10
    
    c1=1 
    c2=4
    #rho=0.0
    #x=rnorm(n)+(1:n)/n
    x = xdata$x[1:n]
    
    #y = numeric(20000) 
     
    lrtv = numeric(nrep)
    waldv = numeric(nrep)
    
    power_lrt=0.0 
    
    power_wald=0.0 
    asymp_crit=qchisq(1-alpha,1)
    
    #'============================='
    
    
    
    for (i in 1: nrep ){
    
        
      e = numeric(n)    
      #genr e=rho*e(-1)+@rnorm 
      #e = arima.sim(model=list(ar=rho),n=n) 
      
      # or
      
      for(j in 2:n){
        e[j] = rho*e[j-1] + rnorm(1) 
      }
      #arima(e, order = c(1, 0, 0)) 
      #acf(e, 10)
      #pacf(e, 10)
      y=c1+c2*x+e 
      
      
      #equation eq1.ls y c x 
      fit1 <- lm(y~ x)
      #summary(fit1)  
      
      #loglr=@logl 
      
      loglr=logLik(fit1)  
      
      #http://stackoverflow.com/questions/7233288/non-stationary-seasonal-ar-part-from-css-error-in-r
      #equation eq2.ls(arma=ml) y c x ar(1) 
      fit2 <- arima(y, xreg=x, order=c(1,0,0),method="ML")
      #summary(fit2)
      #str(coeftest(fit2) )
      
      #scalar loglu=@logl 
      
      loglu=logLik(fit2)
      
      lrtv[i]=-2*(loglr-loglu)
      
      
      #'if lrtv(!i)>asymp_crit then
      if (lrtv[i]>crit_lrt){
      
      
      #if (lrtv[i]>crit_lrt){
        power_lrt=power_lrt+1 
        
      } 
       
      
      
      waldv[i]=coeftest(fit2)[1,3]^2 
      
      
      #'if waldv(!i)>asymp_crit
      
      if (waldv[i]>asymp_crit){
     
      
      #if (waldv[i]>crit_lrt){
        
        power_wald=power_wald+1
        
        } 
    
    }
       #'============================='
    
    power_lrt=power_lrt/nrep*100
    
    
    power_wald=power_wald/nrep*100
    
    #crit_lrt=quantile(lrtv,0.95) 
    #crit_wald=quantile(waldv,0.95)
    
    
    return(c(power_lrt, power_wald))
}

Plot power curve

sizeAdjust(nseed=654321, rho=0.0, nrep = 2000, n = 10, alpha = 0.05)
                          95%       95% 
 7.600000 13.300000  4.815507  7.825018 

Change parameters

sizeAdjust(nseed=654321, rho=0.0, nrep = 2000, n = 200, alpha = 0.05)
                       95%      95% 
5.650000 5.700000 4.034827 4.077705 

Change parameters

sizeAdjust(nseed=654321, rho=0.0, nrep = 2000, n = 500, alpha = 0.05)
                       95%      95% 
5.350000 5.400000 3.913753 3.930252 

Change parameters

sizeAdjust(nseed=654321, rho=0.0, nrep = 2000, n = 1000, alpha = 0.05)
                       95%      95% 
4.550000 4.550000 3.635447 3.641662 

Change parameters

computePower(nseed=654321, rho=-0.1,  nrep = 2000, n = 10, alpha = 0.05)
[1]  7.05 16.40

Change parameters

computePower(nseed=654321, rho=-0.3,  nrep = 2000, n = 10, alpha = 0.05)
[1] 15.05 28.75

Change parameters

computePower(nseed=654321, rho=-0.5,  nrep = 2000, n = 10, alpha = 0.05)
[1] 31.75 49.20

Change parameters

computePower(nseed=654321, rho=-0.7,  nrep = 2000, n = 10, alpha = 0.05)
[1] 53.60 69.55

Change parameters

computePower(nseed=654321, rho=0.1,  nrep = 2000, n = 10, alpha = 0.05)
[1]  3.7 11.4

Change parameters

computePower(nseed=654321, rho=0.3,  nrep = 2000, n = 10, alpha = 0.05)
[1]  3.85 12.35

Change parameters

computePower(nseed=654321, rho=0.5,  nrep = 2000, n = 10, alpha = 0.05)
[1]  6.4 18.8

Change parameters

computePower(nseed=654321, rho=0.7,  nrep = 2000, n = 10, alpha = 0.05)
[1] 11.75 29.55
LS0tDQp0aXRsZTogIkVDT041NDYgTEFCNSBTSU1VTEFUSU9OIEZPUiBMUlQgQU5EIFdBTEQgVEVTVCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KDQpXaGF0IHNpZ25pZmljYW5jZSBsZXZlbCBhcmUgd2UgY29uc2lkZXJpbmcgaW4gdGhpcyBleHBlcmltZW50IOKAkyAxMCUsIDUlIG9yIDElPw0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KG1vc2FpYykNCiNsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShsbXRlc3QpDQooYXN5bXBfY3JpdD1xY2hpc3EoMC45NSwxKSkNCg0KDQojeCA9IHNlcSgxLCA1LCAwLjAxICkNCg0KbGlicmFyeShyZWFkcikNCnhkYXRhIDwtIHJlYWRfY3N2KCJGOi9PbmVEcml2ZS9PbmUgZHJpdmUvNTQ2LTIwMTcvbGFiL2xhYjUveC5jc3YiKQ0KDQp6ID0gc2VxKDEsIDUgLCAwLjAxKQ0KcGxvdCggeiwgZGNoaXNxKHosIDEpLCJsIikNCmFibGluZSh2ID0gYXN5bXBfY3JpdCkNCmVxIDwtIGJxdW90ZSggY3JpdGljYWxfdmFsdWUgPT0gLihhc3ltcF9jcml0KSkNCnRleHQoeCA9IGFzeW1wX2NyaXQrMC42LCB5ID0gMC4wNSwgZXEpDQoNCmBgYA0KDQpJbiB3aGljaCBsaW5lIG9mIHRoZSBjb2RlIGRvIHdlIGFzc2lnbiB0aGUgbnVsbCBoeXBvdGhlc2lzIHRvIGJlIHRydWU/DQoNCmBgYHtyfQ0KcmhvPTAuMA0KYGBgDQoNCg0KV2hhdCBzYW1wbGUgc2l6ZSBpcyBiZWluZyBjb25zaWRlcmVkPw0KDQoNCmBgYHtyfQ0Kbj0xMA0KYGBgDQoNCg0KV2hpY2ggbGluZShzKSB3b3VsZCB3ZSBhbHRlciBpZiB3ZSB3YW50ZWQgdG8gY29uc2lkZXIgYSBzYW1wbGUgc2l6ZSBvZiAoc2F5KSBuID0gMjAwPw0KDQoNCmBgYHtyfQ0KbiA9IDIwMA0KYGBgDQoNCnRoZSBwZXJjZW50YWdlIHJlamVjdGlvbiByYXRlcyBmb3IgdGhlIGNhc2Ugd2hlcmUgVEhFIE5VTEwgSFlQT1RIRVNJUyBJUyBUUlVFIC0gc28gdGhlc2UgYXJlIHRoZSB0cnVlIHNpemVzIChzaWduaWZpY2FuY2UgbGV2ZWxzKSBvZiB0aGUgdGVzdHMsDQoNCg0KDQpgYGB7cn0NCnNldC5zZWVkKDY1NDMyMSkNCg0KbnJlcD0yMDAwDQpuPTEwDQoNCmMxPTEgDQpjMj00DQpyaG89MC4wDQojeD1ybm9ybShuKSsoMTpuKS9uDQoNCnggPSB4ZGF0YSR4WzE6bl0NCg0KI3N0cih4ZGF0YSR4KQ0KI3kgPSBudW1lcmljKDIwMDAwKSANCiANCmxydHYgPSBudW1lcmljKG5yZXApDQp3YWxkdiA9IG51bWVyaWMobnJlcCkNCg0KcG93ZXJfbHJ0PTAuMCANCg0KcG93ZXJfd2FsZD0wLjAgDQphc3ltcF9jcml0PXFjaGlzcSgwLjk1LDEpDQoNCiMnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nDQoNCg0KDQpmb3IgKGkgaW4gMTogbnJlcCApew0KDQogICAgDQogIGUgPSBudW1lcmljKG4pICAgIA0KICAjZ2VuciBlPXJobyplKC0xKStAcm5vcm0gDQogICNlID0gYXJpbWEuc2ltKG1vZGVsPWxpc3QoYXI9cmhvKSxuPW4pIA0KICANCiAgIyBvcg0KICANCiAgZm9yKGogaW4gMjpuKXsNCiAgICBlW2pdID0gcmhvKmVbai0xXSArIHJub3JtKDEpIA0KICB9DQogICNhcmltYShlLCBvcmRlciA9IGMoMSwgMCwgMCkpIA0KICAjYWNmKGUsIDEwKQ0KICAjcGFjZihlLCAxMCkNCiAgeT1jMStjMip4K2UgDQogIA0KICANCiAgI2VxdWF0aW9uIGVxMS5scyB5IGMgeCANCiAgZml0MSA8LSBsbSh5fiB4KQ0KICAjc3VtbWFyeShmaXQxKSAgDQogIA0KICAjbG9nbHI9QGxvZ2wgDQogIA0KICBsb2dscj1sb2dMaWsoZml0MSkgIA0KICANCiAgI2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzIzMzI4OC9ub24tc3RhdGlvbmFyeS1zZWFzb25hbC1hci1wYXJ0LWZyb20tY3NzLWVycm9yLWluLXINCiAgI2VxdWF0aW9uIGVxMi5scyhhcm1hPW1sKSB5IGMgeCBhcigxKSANCiAgZml0MiA8LSBhcmltYSh5LCB4cmVnPXgsIG9yZGVyPWMoMSwwLDApLG1ldGhvZD0iTUwiKQ0KICAjc3VtbWFyeShmaXQyKQ0KICAjc3RyKGNvZWZ0ZXN0KGZpdDIpICkNCiAgDQogICNzY2FsYXIgbG9nbHU9QGxvZ2wgDQogIA0KICBsb2dsdT1sb2dMaWsoZml0MikNCiAgDQogIGxydHZbaV09LTIqKGxvZ2xyLWxvZ2x1KQ0KICANCiAgDQogICMnaWYgbHJ0dighaSk+YXN5bXBfY3JpdCB0aGVuDQogIGlmIChscnR2W2ldPmFzeW1wX2NyaXQpew0KICANCiAgDQogICNpZiAobHJ0dltpXT5jcml0X2xydCl7DQogICAgcG93ZXJfbHJ0PXBvd2VyX2xydCsxIA0KICAgIA0KICB9IA0KICAgDQogIA0KICANCiAgd2FsZHZbaV09Y29lZnRlc3QoZml0MilbMSwzXV4yIA0KICANCiAgDQogICMnaWYgd2FsZHYoIWkpPmFzeW1wX2NyaXQNCiAgDQogIGlmICh3YWxkdltpXT5hc3ltcF9jcml0KXsNCiANCiAgDQogICNpZiAod2FsZHZbaV0+Y3JpdF9scnQpew0KICAgIA0KICAgIHBvd2VyX3dhbGQ9cG93ZXJfd2FsZCsxDQogICAgDQogICAgfSANCg0KfQ0KIyc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PScNCg0KKHBvd2VyX2xydD1wb3dlcl9scnQvbnJlcCoxMDApDQoNCg0KKHBvd2VyX3dhbGQ9cG93ZXJfd2FsZC9ucmVwKjEwMCkNCg0KKGNyaXRfbHJ0PXF1YW50aWxlKGxydHYsMC45NSkgKQ0KDQpoaXN0KGxydHYpDQoNCihjcml0X3dhbGQ9cXVhbnRpbGUod2FsZHYsMC45NSkpDQpoaXN0KHdhbGR2KQ0KDQoNCg0KYGBgDQoNCg0KDQoNCiMjIE1ha2UgYSBmdW5jdGlvbiANCg0KDQpgYGB7cn0NCnNpemVBZGp1c3QgPSBmdW5jdGlvbiggIG5zZWVkPTY1NDMyMSwgcmhvPTAuMCwgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KXsNCiAgDQogICAgc2V0LnNlZWQobnNlZWQpDQogICAgDQogICAgI25yZXA9bnJlcA0KICAgICNuPTEwDQogICAgDQogICAgYzE9MSANCiAgICBjMj00DQogICAgI3Jobz0wLjANCiAgICAjeD1ybm9ybShuKSsoMTpuKS9uDQoNCiAgICB4ID0geGRhdGEkeFsxOm5dDQoNCiAgICANCiAgICAjeSA9IG51bWVyaWMoMjAwMDApIA0KICAgICANCiAgICBscnR2ID0gbnVtZXJpYyhucmVwKQ0KICAgIHdhbGR2ID0gbnVtZXJpYyhucmVwKQ0KICAgIA0KICAgIHBvd2VyX2xydD0wLjAgDQogICAgDQogICAgcG93ZXJfd2FsZD0wLjAgDQogICAgYXN5bXBfY3JpdD1xY2hpc3EoMS1hbHBoYSwxKQ0KICAgIA0KICAgICMnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nDQogICAgDQogICAgDQogICAgDQogICAgZm9yIChpIGluIDE6IG5yZXAgKXsNCiAgICANCiAgICAgICAgDQogICAgICBlID0gbnVtZXJpYyhuKSAgICANCiAgICAgICNnZW5yIGU9cmhvKmUoLTEpK0Bybm9ybSANCiAgICAgICNlID0gYXJpbWEuc2ltKG1vZGVsPWxpc3QoYXI9cmhvKSxuPW4pIA0KICAgICAgDQogICAgICAjIG9yDQogICAgICANCiAgICAgIGZvcihqIGluIDI6bil7DQogICAgICAgIGVbal0gPSByaG8qZVtqLTFdICsgcm5vcm0oMSkgDQogICAgICB9DQogICAgICAjYXJpbWEoZSwgb3JkZXIgPSBjKDEsIDAsIDApKSANCiAgICAgICNhY2YoZSwgMTApDQogICAgICAjcGFjZihlLCAxMCkNCiAgICAgIHk9YzErYzIqeCtlIA0KICAgICAgDQogICAgICANCiAgICAgICNlcXVhdGlvbiBlcTEubHMgeSBjIHggDQogICAgICBmaXQxIDwtIGxtKHl+IHgpDQogICAgICAjc3VtbWFyeShmaXQxKSAgDQogICAgICANCiAgICAgICNsb2dscj1AbG9nbCANCiAgICAgIA0KICAgICAgbG9nbHI9bG9nTGlrKGZpdDEpICANCiAgICAgIA0KICAgICAgI2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzIzMzI4OC9ub24tc3RhdGlvbmFyeS1zZWFzb25hbC1hci1wYXJ0LWZyb20tY3NzLWVycm9yLWluLXINCiAgICAgICNlcXVhdGlvbiBlcTIubHMoYXJtYT1tbCkgeSBjIHggYXIoMSkgDQogICAgICBmaXQyIDwtIGFyaW1hKHksIHhyZWc9eCwgb3JkZXI9YygxLDAsMCksbWV0aG9kPSJNTCIpDQogICAgICAjc3VtbWFyeShmaXQyKQ0KICAgICAgI3N0cihjb2VmdGVzdChmaXQyKSApDQogICAgICANCiAgICAgICNzY2FsYXIgbG9nbHU9QGxvZ2wgDQogICAgICANCiAgICAgIGxvZ2x1PWxvZ0xpayhmaXQyKQ0KICAgICAgDQogICAgICBscnR2W2ldPS0yKihsb2dsci1sb2dsdSkNCiAgICAgIA0KICAgICAgDQogICAgICAjJ2lmIGxydHYoIWkpPmFzeW1wX2NyaXQgdGhlbg0KICAgICAgaWYgKGxydHZbaV0+YXN5bXBfY3JpdCl7DQogICAgICANCiAgICAgIA0KICAgICAgI2lmIChscnR2W2ldPmNyaXRfbHJ0KXsNCiAgICAgICAgcG93ZXJfbHJ0PXBvd2VyX2xydCsxIA0KICAgICAgICANCiAgICAgIH0gDQogICAgICAgDQogICAgICANCiAgICAgIA0KICAgICAgd2FsZHZbaV09Y29lZnRlc3QoZml0MilbMSwzXV4yIA0KICAgICAgDQogICAgICANCiAgICAgICMnaWYgd2FsZHYoIWkpPmFzeW1wX2NyaXQNCiAgICAgIA0KICAgICAgaWYgKHdhbGR2W2ldPmFzeW1wX2NyaXQpew0KICAgICANCiAgICAgIA0KICAgICAgI2lmICh3YWxkdltpXT5jcml0X2xydCl7DQogICAgICAgIA0KICAgICAgICBwb3dlcl93YWxkPXBvd2VyX3dhbGQrMQ0KICAgICAgICANCiAgICAgICAgfSANCiAgICANCiAgICB9DQogICAgICAgIyc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PScNCiAgICANCiAgICBwb3dlcl9scnQ9cG93ZXJfbHJ0L25yZXAqMTAwDQogICAgDQogICAgDQogICAgcG93ZXJfd2FsZD1wb3dlcl93YWxkL25yZXAqMTAwDQogICAgDQogICAgY3JpdF9scnQ9cXVhbnRpbGUobHJ0diwwLjk1KSANCg0KICAgIGNyaXRfd2FsZD1xdWFudGlsZSh3YWxkdiwwLjk1KQ0KICAgIA0KICAgIA0KICAgIHJldHVybihjKHBvd2VyX2xydCwgcG93ZXJfd2FsZCxjcml0X2xydCxjcml0X3dhbGQgKSkNCg0KfQ0KDQpgYGANCg0KDQoNCg0KDQoNCiMjIENvbXB1dGVyIHBvd2VyDQoNCg0KYGBge3J9DQoNCg0KY29tcHV0ZVBvd2VyID1mdW5jdGlvbiggbnNlZWQ9NjU0MzIxLCByaG89MC4wLCBucmVwID0gMjAwMCwgbiA9IDEwLCBhbHBoYSA9IDAuMDXvvIwgY3JpdF9scnQgPSA0LjgxNTUwN++8jCBjcml0X3dhbGQgPSA3LjgyNTAxOCl7DQogIA0KICAgIHNldC5zZWVkKG5zZWVkKQ0KICAgIA0KICAgICNucmVwPW5yZXANCiAgICAjbj0xMA0KICAgIA0KICAgIGMxPTEgDQogICAgYzI9NA0KICAgICNyaG89MC4wDQogICAgI3g9cm5vcm0obikrKDE6bikvbg0KDQogICAgeCA9IHhkYXRhJHhbMTpuXQ0KDQogICAgDQogICAgI3kgPSBudW1lcmljKDIwMDAwKSANCiAgICAgDQogICAgbHJ0diA9IG51bWVyaWMobnJlcCkNCiAgICB3YWxkdiA9IG51bWVyaWMobnJlcCkNCiAgICANCiAgICBwb3dlcl9scnQ9MC4wIA0KICAgIA0KICAgIHBvd2VyX3dhbGQ9MC4wIA0KICAgIGFzeW1wX2NyaXQ9cWNoaXNxKDEtYWxwaGEsMSkNCiAgICANCiAgICAjJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jw0KICAgIA0KICAgIA0KICAgIA0KICAgIGZvciAoaSBpbiAxOiBucmVwICl7DQogICAgDQogICAgICAgIA0KICAgICAgZSA9IG51bWVyaWMobikgICAgDQogICAgICAjZ2VuciBlPXJobyplKC0xKStAcm5vcm0gDQogICAgICAjZSA9IGFyaW1hLnNpbShtb2RlbD1saXN0KGFyPXJobyksbj1uKSANCiAgICAgIA0KICAgICAgIyBvcg0KICAgICAgDQogICAgICBmb3IoaiBpbiAyOm4pew0KICAgICAgICBlW2pdID0gcmhvKmVbai0xXSArIHJub3JtKDEpIA0KICAgICAgfQ0KICAgICAgI2FyaW1hKGUsIG9yZGVyID0gYygxLCAwLCAwKSkgDQogICAgICAjYWNmKGUsIDEwKQ0KICAgICAgI3BhY2YoZSwgMTApDQogICAgICB5PWMxK2MyKngrZSANCiAgICAgIA0KICAgICAgDQogICAgICAjZXF1YXRpb24gZXExLmxzIHkgYyB4IA0KICAgICAgZml0MSA8LSBsbSh5fiB4KQ0KICAgICAgI3N1bW1hcnkoZml0MSkgIA0KICAgICAgDQogICAgICAjbG9nbHI9QGxvZ2wgDQogICAgICANCiAgICAgIGxvZ2xyPWxvZ0xpayhmaXQxKSAgDQogICAgICANCiAgICAgICNodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzcyMzMyODgvbm9uLXN0YXRpb25hcnktc2Vhc29uYWwtYXItcGFydC1mcm9tLWNzcy1lcnJvci1pbi1yDQogICAgICAjZXF1YXRpb24gZXEyLmxzKGFybWE9bWwpIHkgYyB4IGFyKDEpIA0KICAgICAgZml0MiA8LSBhcmltYSh5LCB4cmVnPXgsIG9yZGVyPWMoMSwwLDApLG1ldGhvZD0iTUwiKQ0KICAgICAgI3N1bW1hcnkoZml0MikNCiAgICAgICNzdHIoY29lZnRlc3QoZml0MikgKQ0KICAgICAgDQogICAgICAjc2NhbGFyIGxvZ2x1PUBsb2dsIA0KICAgICAgDQogICAgICBsb2dsdT1sb2dMaWsoZml0MikNCiAgICAgIA0KICAgICAgbHJ0dltpXT0tMioobG9nbHItbG9nbHUpDQogICAgICANCiAgICAgIA0KICAgICAgIydpZiBscnR2KCFpKT5hc3ltcF9jcml0IHRoZW4NCiAgICAgIGlmIChscnR2W2ldPmNyaXRfbHJ0KXsNCiAgICAgIA0KICAgICAgDQogICAgICAjaWYgKGxydHZbaV0+Y3JpdF9scnQpew0KICAgICAgICBwb3dlcl9scnQ9cG93ZXJfbHJ0KzEgDQogICAgICAgIA0KICAgICAgfSANCiAgICAgICANCiAgICAgIA0KICAgICAgDQogICAgICB3YWxkdltpXT1jb2VmdGVzdChmaXQyKVsxLDNdXjIgDQogICAgICANCiAgICAgIA0KICAgICAgIydpZiB3YWxkdighaSk+YXN5bXBfY3JpdA0KICAgICAgDQogICAgICBpZiAod2FsZHZbaV0+YXN5bXBfY3JpdCl7DQogICAgIA0KICAgICAgDQogICAgICAjaWYgKHdhbGR2W2ldPmNyaXRfbHJ0KXsNCiAgICAgICAgDQogICAgICAgIHBvd2VyX3dhbGQ9cG93ZXJfd2FsZCsxDQogICAgICAgIA0KICAgICAgICB9IA0KICAgIA0KICAgIH0NCiAgICAgICAjJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jw0KICAgIA0KICAgIHBvd2VyX2xydD1wb3dlcl9scnQvbnJlcCoxMDANCiAgICANCiAgICANCiAgICBwb3dlcl93YWxkPXBvd2VyX3dhbGQvbnJlcCoxMDANCiAgICANCiAgICAjY3JpdF9scnQ9cXVhbnRpbGUobHJ0diwwLjk1KSANCg0KICAgICNjcml0X3dhbGQ9cXVhbnRpbGUod2FsZHYsMC45NSkNCiAgICANCiAgICANCiAgICByZXR1cm4oYyhwb3dlcl9scnQsIHBvd2VyX3dhbGQpKQ0KDQp9DQoNCg0KDQpgYGANCg0KIyMgUGxvdCBwb3dlciBjdXJ2ZQ0KDQoNCg0KYGBge3J9DQpzaXplQWRqdXN0KG5zZWVkPTY1NDMyMSwgcmhvPTAuMCwgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQojIyMgQ2hhbmdlIHBhcmFtZXRlcnMNCg0KYGBge3J9DQpzaXplQWRqdXN0KG5zZWVkPTY1NDMyMSwgcmhvPTAuMCwgbnJlcCA9IDIwMDAsIG4gPSAyMDAsIGFscGhhID0gMC4wNSkNCg0KYGBgDQoNCg0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCnNpemVBZGp1c3QobnNlZWQ9NjU0MzIxLCByaG89MC4wLCBucmVwID0gMjAwMCwgbiA9IDUwMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCnNpemVBZGp1c3QobnNlZWQ9NjU0MzIxLCByaG89MC4wLCBucmVwID0gMjAwMCwgbiA9IDEwMDAsIGFscGhhID0gMC4wNSkNCg0KYGBgDQoNCg0KIyMjIENoYW5nZSBwYXJhbWV0ZXJzDQoNCmBgYHtyfQ0KY29tcHV0ZVBvd2VyKG5zZWVkPTY1NDMyMSwgcmhvPS0wLjEsICBucmVwID0gMjAwMCwgbiA9IDEwLCBhbHBoYSA9IDAuMDUpDQoNCmBgYA0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCmNvbXB1dGVQb3dlcihuc2VlZD02NTQzMjEsIHJobz0tMC4zLCAgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCmNvbXB1dGVQb3dlcihuc2VlZD02NTQzMjEsIHJobz0tMC41LCAgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQojIyMgQ2hhbmdlIHBhcmFtZXRlcnMNCg0KYGBge3J9DQpjb21wdXRlUG93ZXIobnNlZWQ9NjU0MzIxLCByaG89LTAuNywgIG5yZXAgPSAyMDAwLCBuID0gMTAsIGFscGhhID0gMC4wNSkNCg0KYGBgDQoNCg0KDQojIyMgQ2hhbmdlIHBhcmFtZXRlcnMNCg0KYGBge3J9DQpjb21wdXRlUG93ZXIobnNlZWQ9NjU0MzIxLCByaG89MC4xLCAgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQojIyMgQ2hhbmdlIHBhcmFtZXRlcnMNCg0KYGBge3J9DQpjb21wdXRlUG93ZXIobnNlZWQ9NjU0MzIxLCByaG89MC4zLCAgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCmNvbXB1dGVQb3dlcihuc2VlZD02NTQzMjEsIHJobz0wLjUsICBucmVwID0gMjAwMCwgbiA9IDEwLCBhbHBoYSA9IDAuMDUpDQoNCmBgYA0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCmNvbXB1dGVQb3dlcihuc2VlZD02NTQzMjEsIHJobz0wLjcsICBucmVwID0gMjAwMCwgbiA9IDEwLCBhbHBoYSA9IDAuMDUpDQoNCmBgYA==