packages = c('quantmod')

# Install all Packages with Dependencies
install.packages(packages, dependencies = TRUE)
Error in install.packages : Updating loaded packages
# Load all Packages
lapply(packages, require, character.only = TRUE)
[[1]]
[1] TRUE
# Required Packages
packages = c('tseries', 'forecast')

# Install all Packages with Dependencies
install.packages(packages, dependencies = TRUE)
Error in install.packages : Updating loaded packages
# Load all Packages
lapply(packages, require, character.only = TRUE)
[[1]]
[1] TRUE

[[2]]
[1] TRUE
# Required Packages
packages = c('FinTS', 'rugarch')

# Install all Packages with Dependencies
install.packages(packages, dependencies = TRUE)
Error in install.packages : Updating loaded packages
# Load all Packages
lapply(packages, require, character.only = TRUE)
[[1]]
[1] TRUE

[[2]]
[1] TRUE

# Create an environment to store the data
stock_data <- new.env()

# Define the stock symbol
stock_symbol <- 'ADANIENT.BO'  # ADANIENT.BO is the ticker symbol for Adani Enterprises Ltd on BSE

# Define the start and end dates
start_date <- as.Date('2019-01-01')
end_date <- as.Date('2023-12-31')

# Fetch the stock data
getSymbols(Symbols = stock_symbol, src = 'yahoo', from = start_date, to = end_date, env = stock_data)
Warning: ADANIENT.BO contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them.
[1] "ADANIENT.BO"

# Extract closing prices
adani_prices <- Cl(stock_data[[stock_symbol]])

# Remove missing values
adani_prices <- na.omit(adani_prices)

# View the resulting closing prices
head(adani_prices)
           ADANIENT.BO.Close
2019-01-01            157.20
2019-01-02            154.75
2019-01-03            152.55
2019-01-04            152.35
2019-01-07            151.00
2019-01-08            153.40
plot(adani_prices)


# Check the class of the stock_price object
class(adani_prices)
[1] "xts" "zoo"

# Augmented Dickey-Fuller (ADF) Test for Stationarity with Adani Enterprises Ltd on BSE Data
# *******************************************************************

# Perform Augmented Dickey-Fuller (ADF) Test
adf_result <- adf.test(adani_prices)

# Print the ADF test result
print(adf_result)

    Augmented Dickey-Fuller Test

data:  adani_prices
Dickey-Fuller = -2.4007, Lag order = 10, p-value = 0.4087
alternative hypothesis: stationary
#In this case, since the p-value (0.4087) is greater than a typical significance
#level like 0.05, we fail to reject the null hypothesis.
#Therefore, we do not have enough evidence to conclude that the time series is stationary.
adani_ds = diff(adani_prices);  
adani_ds
           ADANIENT.BO.Close
2019-01-01                NA
2019-01-02        -2.4499969
2019-01-03        -2.1999969
2019-01-04        -0.1999969
2019-01-07        -1.3500061
2019-01-08         2.3999939
2019-01-09        -4.0999908
2019-01-10         1.8000031
2019-01-11         0.2999878
2019-01-14        -3.0999908
       ...                  
2023-12-15        96.1499023
2023-12-18       -11.0000000
2023-12-19       -38.1999512
2023-12-20      -155.5000000
2023-12-21        16.0500488
2023-12-22         5.7998047
2023-12-26        61.4001465
2023-12-27       -26.0000000
2023-12-28       -30.3000488
2023-12-29        36.5000000
  # Adani Enterprises Ltd  (First)return Difference Time-Series
adani_ds=na.omit(adani_ds)
 
adf_test_adani_ds = adf.test(adani_ds); adf_test_adani_ds
Warning: p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  adani_ds
Dickey-Fuller = -9.532, Lag order = 10, p-value = 0.01
alternative hypothesis: stationary
# Ljung-Box Test for Autocorrelation -  Data
# ***********************************************

lb_test_adani_ds = Box.test(adani_ds)# Inference : adani Difference (Stationary)
 lb_test_adani_ds

    Box-Pierce test

data:  adani_ds
X-squared = 16.087, df = 1, p-value = 6.049e-05
#In this case, since the p-value (4.294e-05) is much smaller than a typical significance level like 0.05,
#we reject the null hypothesis. Therefore, we have evidence to suggest that there is significant autocorrelation in the time series. | NULL: No Auto correlation | Alternate: Auto Correlation

#Autocorrelation Function (ACF) | Partial Autocorrelation Function (PACF)
# *****************************************************************************

acf(adani_prices) # ACF of adani Series


pacf(adani_prices) # PACF of adani Series



acf(adani_ds) # ACF of adani Series

pacf(adani_ds) # PACF of adani Difference (Stationary) Series


arma_pq_adani_ds = auto.arima(adani_ds); arma_pq_adani_ds
Series: adani_ds 
ARIMA(1,0,1) with zero mean 

Coefficients:
          ar1     ma1
      -0.4124  0.5489
s.e.   0.1092  0.0989

sigma^2 = 3478:  log likelihood = -6676.7
AIC=13359.4   AICc=13359.42   BIC=13374.71
adani_ds_fpq = forecast(arma_pq_adani_ds, h = 500)
plot(adani_ds_fpq)

lb_test_arma_pq_adani_ds = Box.test(arma_pq_adani_ds$residuals); lb_test_arma_pq_adani_ds

    Box-Pierce test

data:  arma_pq_adani_ds$residuals
X-squared = 0.065799, df = 1, p-value = 0.7976
# Test for Volatility Clustering or Heteroskedasticity: Box Test
adani_ret_sq = arma_pq_adani_ds$residuals^2 # Residual Variance (Since Mean Returns is approx. 0)
plot(adani_ret_sq)

adani_ret_sq_box_test = Box.test(adani_ret_sq,lag = 1 ) # H0: Return Variance Series is Not Serially Correlated
adani_ret_sq_box_test # Inference : Return Variance Series is Autocorrelated (Has Volatility Clustering)

    Box-Pierce test

data:  adani_ret_sq
X-squared = 73.953, df = 1, p-value < 2.2e-16
# Test for Volatility Clustering or Heteroskedasticity: ARCH Test
adani_ret_arch_test = ArchTest(arma_pq_adani_ds$residuals^2,lag = 1) # H0: No ARCH Effects
adani_ret_arch_test # Inference : Return Series is Heteroskedastic (Has Volatility Clustering)

    ARCH LM-test; Null hypothesis: no ARCH effects

data:  arma_pq_adani_ds$residuals^2
Chi-squared = 8.8783, df = 1, p-value = 0.002886
# GARCH Model
garch_model1 = ugarchspec(variance.model = list(model = 'sGARCH', garchOrder = c(1,1)), mean.model = list(armaOrder = c(1,1), include.mean = TRUE))
adani_ret_garch1 = ugarchfit(garch_model1, data = arma_pq_adani_ds$residuals^2); adani_ret_garch1

*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*

Conditional Variance Dynamics   
-----------------------------------
GARCH Model : sGARCH(1,1)
Mean Model  : ARFIMA(1,0,1)
Distribution    : norm 

Optimal Parameters
------------------------------------
         Estimate  Std. Error  t value Pr(>|t|)
mu     3.4699e+03  6.1907e+02    5.605        0
ar1    8.9790e-01  2.2387e-02   40.108        0
ma1    3.2756e-01  4.2282e-02    7.747        0
omega  6.2943e+05  4.8466e+04   12.987        0
alpha1 9.3997e-02  4.4700e-03   21.031        0
beta1  9.0500e-01  2.5030e-03  361.602        0

Robust Standard Errors:
         Estimate  Std. Error  t value Pr(>|t|)
mu     3.4699e+03  2.5313e+03  1.37078 0.170442
ar1    8.9790e-01  2.4815e-02 36.18427 0.000000
ma1    3.2756e-01  4.1287e-01  0.79337 0.427563
omega  6.2943e+05  1.4553e+05  4.32516 0.000015
alpha1 9.3997e-02  1.8087e-02  5.19680 0.000000
beta1  9.0500e-01  1.8557e-02 48.77013 0.000000

LogLikelihood : -12321.53 

Information Criteria
------------------------------------
                   
Akaike       20.292
Bayes        20.317
Shibata      20.292
Hannan-Quinn 20.302

Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                        statistic p-value
Lag[1]                      187.7       0
Lag[2*(p+q)+(p+q)-1][5]     196.1       0
Lag[4*(p+q)+(p+q)-1][9]     198.8       0
d.o.f=2
H0 : No serial correlation

Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                        statistic p-value
Lag[1]                      5.377 0.02040
Lag[2*(p+q)+(p+q)-1][5]     6.411 0.07187
Lag[4*(p+q)+(p+q)-1][9]     7.113 0.18986
d.o.f=2

Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[3]     1.146 0.500 2.000  0.2844
ARCH Lag[5]     2.040 1.440 1.667  0.4625
ARCH Lag[7]     2.206 2.315 1.543  0.6736

Nyblom stability test
------------------------------------
Joint Statistic:  -147.6846
Individual Statistics:               
mu     18.93294
ar1     0.07298
ma1     0.11990
omega  39.02396
alpha1  0.24817
beta1   0.30111

Asymptotic Critical Values (10% 5% 1%)
Joint Statistic:         1.49 1.68 2.12
Individual Statistic:    0.35 0.47 0.75

Sign Bias Test
------------------------------------


Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20      5113            0
2    30      4851            0
3    40      6251            0
4    50      5244            0


Elapsed time : 0.336184 
# GARCH Forecast
adani_ret_garch_forecast1 = ugarchforecast(adani_ret_garch1, n.ahead = 500); adani_ret_garch_forecast1

*------------------------------------*
*       GARCH Model Forecast         *
*------------------------------------*
Model: sGARCH
Horizon: 500
Roll Steps: 0
Out of Sample: 0

0-roll forecast [T0=1215-01-01]:
      Series Sigma
T+1     1630 32706
T+2     1818 32700
T+3     1987 32693
T+4     2138 32686
T+5     2274 32679
T+6     2396 32673
T+7     2506 32666
T+8     2604 32659
T+9     2693 32653
T+10    2772 32646
T+11    2843 32639
T+12    2907 32633
T+13    2965 32626
T+14    3016 32619
T+15    3063 32613
T+16    3104 32606
T+17    3141 32599
T+18    3175 32593
T+19    3205 32586
T+20    3232 32579
T+21    3256 32573
T+22    3278 32566
T+23    3298 32559
T+24    3315 32553
T+25    3331 32546
T+26    3345 32540
T+27    3358 32533
T+28    3369 32526
T+29    3380 32520
T+30    3389 32513
T+31    3397 32507
T+32    3405 32500
T+33    3411 32493
T+34    3417 32487
T+35    3423 32480
T+36    3427 32474
T+37    3432 32467
T+38    3436 32461
T+39    3439 32454
T+40    3442 32448
T+41    3445 32441
T+42    3448 32435
T+43    3450 32428
T+44    3452 32422
T+45    3454 32415
T+46    3455 32409
T+47    3457 32402
T+48    3458 32396
T+49    3459 32389
T+50    3461 32383
T+51    3461 32376
T+52    3462 32370
T+53    3463 32363
T+54    3464 32357
T+55    3464 32350
T+56    3465 32344
T+57    3465 32337
T+58    3466 32331
T+59    3466 32325
T+60    3467 32318
T+61    3467 32312
T+62    3467 32305
T+63    3468 32299
T+64    3468 32292
T+65    3468 32286
T+66    3468 32280
T+67    3468 32273
T+68    3469 32267
T+69    3469 32261
T+70    3469 32254
T+71    3469 32248
T+72    3469 32241
T+73    3469 32235
T+74    3469 32229
T+75    3469 32222
T+76    3469 32216
T+77    3469 32210
T+78    3469 32203
T+79    3469 32197
T+80    3470 32191
T+81    3470 32184
T+82    3470 32178
T+83    3470 32172
T+84    3470 32165
T+85    3470 32159
T+86    3470 32153
T+87    3470 32147
T+88    3470 32140
T+89    3470 32134
T+90    3470 32128
T+91    3470 32121
T+92    3470 32115
T+93    3470 32109
T+94    3470 32103
T+95    3470 32096
T+96    3470 32090
T+97    3470 32084
T+98    3470 32078
T+99    3470 32071
T+100   3470 32065
T+101   3470 32059
T+102   3470 32053
T+103   3470 32047
T+104   3470 32040
T+105   3470 32034
T+106   3470 32028
T+107   3470 32022
T+108   3470 32016
T+109   3470 32009
T+110   3470 32003
T+111   3470 31997
T+112   3470 31991
T+113   3470 31985
T+114   3470 31979
T+115   3470 31973
T+116   3470 31966
T+117   3470 31960
T+118   3470 31954
T+119   3470 31948
T+120   3470 31942
T+121   3470 31936
T+122   3470 31930
T+123   3470 31923
T+124   3470 31917
T+125   3470 31911
T+126   3470 31905
T+127   3470 31899
T+128   3470 31893
T+129   3470 31887
T+130   3470 31881
T+131   3470 31875
T+132   3470 31869
T+133   3470 31863
T+134   3470 31857
T+135   3470 31851
T+136   3470 31845
T+137   3470 31838
T+138   3470 31832
T+139   3470 31826
T+140   3470 31820
T+141   3470 31814
T+142   3470 31808
T+143   3470 31802
T+144   3470 31796
T+145   3470 31790
T+146   3470 31784
T+147   3470 31778
T+148   3470 31772
T+149   3470 31766
T+150   3470 31760
T+151   3470 31754
T+152   3470 31748
T+153   3470 31743
T+154   3470 31737
T+155   3470 31731
T+156   3470 31725
T+157   3470 31719
T+158   3470 31713
T+159   3470 31707
T+160   3470 31701
T+161   3470 31695
T+162   3470 31689
T+163   3470 31683
T+164   3470 31677
T+165   3470 31671
T+166   3470 31665
T+167   3470 31660
T+168   3470 31654
T+169   3470 31648
T+170   3470 31642
T+171   3470 31636
T+172   3470 31630
T+173   3470 31624
T+174   3470 31618
T+175   3470 31613
T+176   3470 31607
T+177   3470 31601
T+178   3470 31595
T+179   3470 31589
T+180   3470 31583
T+181   3470 31578
T+182   3470 31572
T+183   3470 31566
T+184   3470 31560
T+185   3470 31554
T+186   3470 31548
T+187   3470 31543
T+188   3470 31537
T+189   3470 31531
T+190   3470 31525
T+191   3470 31520
T+192   3470 31514
T+193   3470 31508
T+194   3470 31502
T+195   3470 31496
T+196   3470 31491
T+197   3470 31485
T+198   3470 31479
T+199   3470 31473
T+200   3470 31468
T+201   3470 31462
T+202   3470 31456
T+203   3470 31451
T+204   3470 31445
T+205   3470 31439
T+206   3470 31433
T+207   3470 31428
T+208   3470 31422
T+209   3470 31416
T+210   3470 31411
T+211   3470 31405
T+212   3470 31399
T+213   3470 31394
T+214   3470 31388
T+215   3470 31382
T+216   3470 31377
T+217   3470 31371
T+218   3470 31365
T+219   3470 31360
T+220   3470 31354
T+221   3470 31348
T+222   3470 31343
T+223   3470 31337
T+224   3470 31331
T+225   3470 31326
T+226   3470 31320
T+227   3470 31315
T+228   3470 31309
T+229   3470 31303
T+230   3470 31298
T+231   3470 31292
T+232   3470 31287
T+233   3470 31281
T+234   3470 31275
T+235   3470 31270
T+236   3470 31264
T+237   3470 31259
T+238   3470 31253
T+239   3470 31248
T+240   3470 31242
T+241   3470 31236
T+242   3470 31231
T+243   3470 31225
T+244   3470 31220
T+245   3470 31214
T+246   3470 31209
T+247   3470 31203
T+248   3470 31198
T+249   3470 31192
T+250   3470 31187
T+251   3470 31181
T+252   3470 31176
T+253   3470 31170
T+254   3470 31165
T+255   3470 31159
T+256   3470 31154
T+257   3470 31148
T+258   3470 31143
T+259   3470 31137
T+260   3470 31132
T+261   3470 31126
T+262   3470 31121
T+263   3470 31116
T+264   3470 31110
T+265   3470 31105
T+266   3470 31099
T+267   3470 31094
T+268   3470 31088
T+269   3470 31083
T+270   3470 31078
T+271   3470 31072
T+272   3470 31067
T+273   3470 31061
T+274   3470 31056
T+275   3470 31051
T+276   3470 31045
T+277   3470 31040
T+278   3470 31034
T+279   3470 31029
T+280   3470 31024
T+281   3470 31018
T+282   3470 31013
T+283   3470 31008
T+284   3470 31002
T+285   3470 30997
T+286   3470 30991
T+287   3470 30986
T+288   3470 30981
T+289   3470 30975
T+290   3470 30970
T+291   3470 30965
T+292   3470 30959
T+293   3470 30954
T+294   3470 30949
T+295   3470 30944
T+296   3470 30938
T+297   3470 30933
T+298   3470 30928
T+299   3470 30922
T+300   3470 30917
T+301   3470 30912
T+302   3470 30907
T+303   3470 30901
T+304   3470 30896
T+305   3470 30891
T+306   3470 30885
T+307   3470 30880
T+308   3470 30875
T+309   3470 30870
T+310   3470 30864
T+311   3470 30859
T+312   3470 30854
T+313   3470 30849
T+314   3470 30844
T+315   3470 30838
T+316   3470 30833
T+317   3470 30828
T+318   3470 30823
T+319   3470 30818
T+320   3470 30812
T+321   3470 30807
T+322   3470 30802
T+323   3470 30797
T+324   3470 30792
T+325   3470 30786
T+326   3470 30781
T+327   3470 30776
T+328   3470 30771
T+329   3470 30766
T+330   3470 30761
T+331   3470 30755
T+332   3470 30750
T+333   3470 30745
T+334   3470 30740
T+335   3470 30735
T+336   3470 30730
T+337   3470 30725
T+338   3470 30720
T+339   3470 30714
T+340   3470 30709
T+341   3470 30704
T+342   3470 30699
T+343   3470 30694
T+344   3470 30689
T+345   3470 30684
T+346   3470 30679
T+347   3470 30674
T+348   3470 30669
T+349   3470 30663
T+350   3470 30658
T+351   3470 30653
T+352   3470 30648
T+353   3470 30643
T+354   3470 30638
T+355   3470 30633
T+356   3470 30628
T+357   3470 30623
T+358   3470 30618
T+359   3470 30613
T+360   3470 30608
T+361   3470 30603
T+362   3470 30598
T+363   3470 30593
T+364   3470 30588
T+365   3470 30583
T+366   3470 30578
T+367   3470 30573
T+368   3470 30568
T+369   3470 30563
T+370   3470 30558
T+371   3470 30553
T+372   3470 30548
T+373   3470 30543
T+374   3470 30538
T+375   3470 30533
T+376   3470 30528
T+377   3470 30523
T+378   3470 30518
T+379   3470 30513
T+380   3470 30508
T+381   3470 30503
T+382   3470 30498
T+383   3470 30493
T+384   3470 30489
T+385   3470 30484
T+386   3470 30479
T+387   3470 30474
T+388   3470 30469
T+389   3470 30464
T+390   3470 30459
T+391   3470 30454
T+392   3470 30449
T+393   3470 30444
T+394   3470 30440
T+395   3470 30435
T+396   3470 30430
T+397   3470 30425
T+398   3470 30420
T+399   3470 30415
T+400   3470 30410
T+401   3470 30405
T+402   3470 30401
T+403   3470 30396
T+404   3470 30391
T+405   3470 30386
T+406   3470 30381
T+407   3470 30376
T+408   3470 30372
T+409   3470 30367
T+410   3470 30362
T+411   3470 30357
T+412   3470 30352
T+413   3470 30347
T+414   3470 30343
T+415   3470 30338
T+416   3470 30333
T+417   3470 30328
T+418   3470 30324
T+419   3470 30319
T+420   3470 30314
T+421   3470 30309
T+422   3470 30304
T+423   3470 30300
T+424   3470 30295
T+425   3470 30290
T+426   3470 30285
T+427   3470 30281
T+428   3470 30276
T+429   3470 30271
T+430   3470 30266
T+431   3470 30262
T+432   3470 30257
T+433   3470 30252
T+434   3470 30247
T+435   3470 30243
T+436   3470 30238
T+437   3470 30233
T+438   3470 30229
T+439   3470 30224
T+440   3470 30219
T+441   3470 30215
T+442   3470 30210
T+443   3470 30205
T+444   3470 30200
T+445   3470 30196
T+446   3470 30191
T+447   3470 30186
T+448   3470 30182
T+449   3470 30177
T+450   3470 30172
T+451   3470 30168
T+452   3470 30163
T+453   3470 30158
T+454   3470 30154
T+455   3470 30149
T+456   3470 30145
T+457   3470 30140
T+458   3470 30135
T+459   3470 30131
T+460   3470 30126
T+461   3470 30121
T+462   3470 30117
T+463   3470 30112
T+464   3470 30108
T+465   3470 30103
T+466   3470 30098
T+467   3470 30094
T+468   3470 30089
T+469   3470 30085
T+470   3470 30080
T+471   3470 30075
T+472   3470 30071
T+473   3470 30066
T+474   3470 30062
T+475   3470 30057
T+476   3470 30053
T+477   3470 30048
T+478   3470 30044
T+479   3470 30039
T+480   3470 30034
T+481   3470 30030
T+482   3470 30025
T+483   3470 30021
T+484   3470 30016
T+485   3470 30012
T+486   3470 30007
T+487   3470 30003
T+488   3470 29998
T+489   3470 29994
T+490   3470 29989
T+491   3470 29985
T+492   3470 29980
T+493   3470 29976
T+494   3470 29971
T+495   3470 29967
T+496   3470 29962
T+497   3470 29958
T+498   3470 29953
T+499   3470 29949
T+500   3470 29944
plot(adani_ret_garch_forecast1, which = 1)

# Plot the specified aspect of the GARCH forecast
plot(adani_ret_garch_forecast1, which = 3)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KIHBhY2thZ2VzID0gYygncXVhbnRtb2QnKQ0KDQojIEluc3RhbGwgYWxsIFBhY2thZ2VzIHdpdGggRGVwZW5kZW5jaWVzDQppbnN0YWxsLnBhY2thZ2VzKHBhY2thZ2VzLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KDQojIExvYWQgYWxsIFBhY2thZ2VzDQpsYXBwbHkocGFja2FnZXMsIHJlcXVpcmUsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCmBgYA0KDQogDQpgYGB7cn0NCiMgUmVxdWlyZWQgUGFja2FnZXMNCnBhY2thZ2VzID0gYygndHNlcmllcycsICdmb3JlY2FzdCcpDQoNCiMgSW5zdGFsbCBhbGwgUGFja2FnZXMgd2l0aCBEZXBlbmRlbmNpZXMNCmluc3RhbGwucGFja2FnZXMocGFja2FnZXMsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQoNCiMgTG9hZCBhbGwgUGFja2FnZXMNCmxhcHBseShwYWNrYWdlcywgcmVxdWlyZSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KDQpgYGANCmBgYHtyfQ0KIyBSZXF1aXJlZCBQYWNrYWdlcw0KcGFja2FnZXMgPSBjKCdGaW5UUycsICdydWdhcmNoJykNCg0KIyBJbnN0YWxsIGFsbCBQYWNrYWdlcyB3aXRoIERlcGVuZGVuY2llcw0KaW5zdGFsbC5wYWNrYWdlcyhwYWNrYWdlcywgZGVwZW5kZW5jaWVzID0gVFJVRSkNCg0KIyBMb2FkIGFsbCBQYWNrYWdlcw0KbGFwcGx5KHBhY2thZ2VzLCByZXF1aXJlLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQoNCg0KDQpgYGANCg0KDQpgYGB7cn0NCg0KIyBDcmVhdGUgYW4gZW52aXJvbm1lbnQgdG8gc3RvcmUgdGhlIGRhdGENCnN0b2NrX2RhdGEgPC0gbmV3LmVudigpDQoNCiMgRGVmaW5lIHRoZSBzdG9jayBzeW1ib2wNCnN0b2NrX3N5bWJvbCA8LSAnQURBTklFTlQuQk8nICAjIEFEQU5JRU5ULkJPIGlzIHRoZSB0aWNrZXIgc3ltYm9sIGZvciBBZGFuaSBFbnRlcnByaXNlcyBMdGQgb24gQlNFDQoNCiMgRGVmaW5lIHRoZSBzdGFydCBhbmQgZW5kIGRhdGVzDQpzdGFydF9kYXRlIDwtIGFzLkRhdGUoJzIwMTktMDEtMDEnKQ0KZW5kX2RhdGUgPC0gYXMuRGF0ZSgnMjAyMy0xMi0zMScpDQoNCiMgRmV0Y2ggdGhlIHN0b2NrIGRhdGENCmdldFN5bWJvbHMoU3ltYm9scyA9IHN0b2NrX3N5bWJvbCwgc3JjID0gJ3lhaG9vJywgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUsIGVudiA9IHN0b2NrX2RhdGEpDQpgYGANCg0KDQpgYGB7cn0NCg0KIyBFeHRyYWN0IGNsb3NpbmcgcHJpY2VzDQphZGFuaV9wcmljZXMgPC0gQ2woc3RvY2tfZGF0YVtbc3RvY2tfc3ltYm9sXV0pDQoNCiMgUmVtb3ZlIG1pc3NpbmcgdmFsdWVzDQphZGFuaV9wcmljZXMgPC0gbmEub21pdChhZGFuaV9wcmljZXMpDQoNCiMgVmlldyB0aGUgcmVzdWx0aW5nIGNsb3NpbmcgcHJpY2VzDQpoZWFkKGFkYW5pX3ByaWNlcykNCiANCmBgYA0KDQoNCmBgYHtyfQ0KDQojIENoZWNrIHRoZSBjbGFzcyBvZiB0aGUgc3RvY2tfcHJpY2Ugb2JqZWN0DQpjbGFzcyhhZGFuaV9wcmljZXMpDQpgYGANCg0KDQpgYGB7cn0NCg0KIyBBdWdtZW50ZWQgRGlja2V5LUZ1bGxlciAoQURGKSBUZXN0IGZvciBTdGF0aW9uYXJpdHkgd2l0aCBBZGFuaSBFbnRlcnByaXNlcyBMdGQgb24gQlNFIERhdGENCiMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQojIFBlcmZvcm0gQXVnbWVudGVkIERpY2tleS1GdWxsZXIgKEFERikgVGVzdA0KYWRmX3Jlc3VsdCA8LSBhZGYudGVzdChhZGFuaV9wcmljZXMpDQoNCiMgUHJpbnQgdGhlIEFERiB0ZXN0IHJlc3VsdA0KcHJpbnQoYWRmX3Jlc3VsdCkNCg0KI0luIHRoaXMgY2FzZSwgc2luY2UgdGhlIHAtdmFsdWUgKDAuNDA4NykgaXMgZ3JlYXRlciB0aGFuIGEgdHlwaWNhbCBzaWduaWZpY2FuY2UNCiNsZXZlbCBsaWtlIDAuMDUsIHdlIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuDQojVGhlcmVmb3JlLCB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggZXZpZGVuY2UgdG8gY29uY2x1ZGUgdGhhdCB0aGUgdGltZSBzZXJpZXMgaXMgc3RhdGlvbmFyeS4NCmBgYA0KDQoNCmBgYHtyfQ0KYWRhbmlfZHMgPSBkaWZmKGFkYW5pX3ByaWNlcyk7ICANCmFkYW5pX2RzDQogICMgQWRhbmkgRW50ZXJwcmlzZXMgTHRkICAoRmlyc3QpcmV0dXJuIERpZmZlcmVuY2UgVGltZS1TZXJpZXMNCmBgYA0KICANCg0KYGBge3J9DQphZGFuaV9kcz1uYS5vbWl0KGFkYW5pX2RzKQ0KIA0KYWRmX3Rlc3RfYWRhbmlfZHMgPSBhZGYudGVzdChhZGFuaV9kcyk7IGFkZl90ZXN0X2FkYW5pX2RzDQpgYGANCg0KDQpgYGB7cn0NCiMgTGp1bmctQm94IFRlc3QgZm9yIEF1dG9jb3JyZWxhdGlvbiAtICBEYXRhDQojICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCmxiX3Rlc3RfYWRhbmlfZHMgPSBCb3gudGVzdChhZGFuaV9kcykjIEluZmVyZW5jZSA6IGFkYW5pIERpZmZlcmVuY2UgKFN0YXRpb25hcnkpDQogbGJfdGVzdF9hZGFuaV9kcw0KI0luIHRoaXMgY2FzZSwgc2luY2UgdGhlIHAtdmFsdWUgKDQuMjk0ZS0wNSkgaXMgbXVjaCBzbWFsbGVyIHRoYW4gYSB0eXBpY2FsIHNpZ25pZmljYW5jZSBsZXZlbCBsaWtlIDAuMDUsDQojd2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuIFRoZXJlZm9yZSwgd2UgaGF2ZSBldmlkZW5jZSB0byBzdWdnZXN0IHRoYXQgdGhlcmUgaXMgc2lnbmlmaWNhbnQgYXV0b2NvcnJlbGF0aW9uIGluIHRoZSB0aW1lIHNlcmllcy4gfCBOVUxMOiBObyBBdXRvIGNvcnJlbGF0aW9uIHwgQWx0ZXJuYXRlOiBBdXRvIENvcnJlbGF0aW9uDQpgYGANCg0KDQpgYGB7cn0NCg0KI0F1dG9jb3JyZWxhdGlvbiBGdW5jdGlvbiAoQUNGKSB8IFBhcnRpYWwgQXV0b2NvcnJlbGF0aW9uIEZ1bmN0aW9uIChQQUNGKQ0KIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQphY2YoYWRhbmlfcHJpY2VzKSAjIEFDRiBvZiBhZGFuaSBTZXJpZXMNCmBgYA0KDQoNCmBgYHtyfQ0KDQpwYWNmKGFkYW5pX3ByaWNlcykgIyBQQUNGIG9mIGFkYW5pIFNlcmllcw0KYGBgDQoNCg0KYGBge3J9DQoNCg0KYWNmKGFkYW5pX2RzKSAjIEFDRiBvZiBhZGFuaSBTZXJpZXMNCmBgYA0KDQoNCmBgYHtyfQ0KcGFjZihhZGFuaV9kcykgIyBQQUNGIG9mIGFkYW5pIERpZmZlcmVuY2UgKFN0YXRpb25hcnkpIFNlcmllcw0KYGBgDQoNCg0KYGBge3J9DQoNCmFybWFfcHFfYWRhbmlfZHMgPSBhdXRvLmFyaW1hKGFkYW5pX2RzKTsgYXJtYV9wcV9hZGFuaV9kcw0KYGBgDQoNCg0KYGBge3J9DQphZGFuaV9kc19mcHEgPSBmb3JlY2FzdChhcm1hX3BxX2FkYW5pX2RzLCBoID0gNTAwKQ0KcGxvdChhZGFuaV9kc19mcHEpDQpgYGANCg0KDQpgYGB7cn0NCmxiX3Rlc3RfYXJtYV9wcV9hZGFuaV9kcyA9IEJveC50ZXN0KGFybWFfcHFfYWRhbmlfZHMkcmVzaWR1YWxzKTsgbGJfdGVzdF9hcm1hX3BxX2FkYW5pX2RzDQpgYGANCg0KDQpgYGB7cn0NCiMgVGVzdCBmb3IgVm9sYXRpbGl0eSBDbHVzdGVyaW5nIG9yIEhldGVyb3NrZWRhc3RpY2l0eTogQm94IFRlc3QNCmFkYW5pX3JldF9zcSA9IGFybWFfcHFfYWRhbmlfZHMkcmVzaWR1YWxzXjIgIyBSZXNpZHVhbCBWYXJpYW5jZSAoU2luY2UgTWVhbiBSZXR1cm5zIGlzIGFwcHJveC4gMCkNCnBsb3QoYWRhbmlfcmV0X3NxKQ0KYGBgDQoNCg0KYGBge3J9DQphZGFuaV9yZXRfc3FfYm94X3Rlc3QgPSBCb3gudGVzdChhZGFuaV9yZXRfc3EsbGFnID0gMSApICMgSDA6IFJldHVybiBWYXJpYW5jZSBTZXJpZXMgaXMgTm90IFNlcmlhbGx5IENvcnJlbGF0ZWQNCmFkYW5pX3JldF9zcV9ib3hfdGVzdCAjIEluZmVyZW5jZSA6IFJldHVybiBWYXJpYW5jZSBTZXJpZXMgaXMgQXV0b2NvcnJlbGF0ZWQgKEhhcyBWb2xhdGlsaXR5IENsdXN0ZXJpbmcpDQpgYGANCg0KDQpgYGB7cn0NCiMgVGVzdCBmb3IgVm9sYXRpbGl0eSBDbHVzdGVyaW5nIG9yIEhldGVyb3NrZWRhc3RpY2l0eTogQVJDSCBUZXN0DQphZGFuaV9yZXRfYXJjaF90ZXN0ID0gQXJjaFRlc3QoYXJtYV9wcV9hZGFuaV9kcyRyZXNpZHVhbHNeMixsYWcgPSAxKSAjIEgwOiBObyBBUkNIIEVmZmVjdHMNCmFkYW5pX3JldF9hcmNoX3Rlc3QgIyBJbmZlcmVuY2UgOiBSZXR1cm4gU2VyaWVzIGlzIEhldGVyb3NrZWRhc3RpYyAoSGFzIFZvbGF0aWxpdHkgQ2x1c3RlcmluZykNCmBgYA0KIA0KIA0KDQoNCmBgYHtyfQ0KIyBHQVJDSCBNb2RlbA0KZ2FyY2hfbW9kZWwxID0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAnc0dBUkNIJywgZ2FyY2hPcmRlciA9IGMoMSwxKSksIG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMSwxKSwgaW5jbHVkZS5tZWFuID0gVFJVRSkpDQphZGFuaV9yZXRfZ2FyY2gxID0gdWdhcmNoZml0KGdhcmNoX21vZGVsMSwgZGF0YSA9IGFybWFfcHFfYWRhbmlfZHMkcmVzaWR1YWxzXjIpOyBhZGFuaV9yZXRfZ2FyY2gxDQpgYGANCg0KDQpgYGB7cn0NCiMgR0FSQ0ggRm9yZWNhc3QNCmFkYW5pX3JldF9nYXJjaF9mb3JlY2FzdDEgPSB1Z2FyY2hmb3JlY2FzdChhZGFuaV9yZXRfZ2FyY2gxLCBuLmFoZWFkID0gNTAwKTsgYWRhbmlfcmV0X2dhcmNoX2ZvcmVjYXN0MQ0KYGBgDQoNCg0KYGBge3J9DQpwbG90KGFkYW5pX3JldF9nYXJjaF9mb3JlY2FzdDEsIHdoaWNoID0gMSkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBQbG90IHRoZSBzcGVjaWZpZWQgYXNwZWN0IG9mIHRoZSBHQVJDSCBmb3JlY2FzdA0KcGxvdChhZGFuaV9yZXRfZ2FyY2hfZm9yZWNhc3QxLCB3aGljaCA9IDMpDQoNCmBgYA0KDQoNCiA=