About

In this worksheet we look at different variance, covariance, volatility, and causality calculations. We finish with a short matematical proof (no R required).

Setup

Remember to always set your working directory to the source file location. Go to ‘Session’, scroll down to ‘Set Working Directory’, and click ‘To Source File Location’. Read carefully the below and follow the instructions to complete the tasks and answer any questions. Submit your work to RPubs as detailed in previous notes.

Note

For clarity, tasks/questions to be completed/answered are highlighted in red color (color visible only in preview mode) and numbered according to their particular placement in the task section. Type your answers outside the red color tags!

Quite often you will need to add your own code chunk. Execute sequentially all code chunks, preview, publish, and submit link on Sakai following the naming convention. Make sure to add comments to your code where appropriate. Use own language!

Any sign of plagiarism, will result in dissmissal of work!


Task 1: Variance, Covariance, and Volatility

This task follows the two examples in the book R Example 2.5/p. 58 and R Example 2.6/p. 66

# Require will load the package only if not installed 
# Dependencies = TRUE makes sure that dependencies are install
if(!require("quantmod",quietly = TRUE))
  install.packages("quantmod",dependencies = TRUE, repos = "https://cloud.r-project.org")

Attaching package: <U+393C><U+3E31>zoo<U+393C><U+3E32>

The following objects are masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    as.Date, as.Date.numeric

Version 0.4-0 included new data defaults. See ?getSymbols.
Learn from a quantmod author: https://www.datacamp.com/courses/importing-and-managing-financial-data-in-r

##### 1A) Calculate the correlation and covariance matrix of the adjusted daily log returns for four different stocks of your choice. Explain your observations in terms of potential relationships.

# Once you have obtained the adjusted daily log returns for your stocks, omitting the time index, you will need to combine them to create a matrix. Below is an example.  For more details see the Help command in R on cbind, cov, and cor.
getSymbols('AAPL',src='yahoo', from="2007-01-01", to="2017-12-30")
[1] "AAPL"
aplRd = periodReturn(AAPL,period="daily",type="log")
AAPLRd=as.numeric(aplRd)
getSymbols('GE',src='yahoo', from="2007-01-01", to="2017-12-30")
[1] "GE"
aplRd = periodReturn(GE,period="daily",type="log")
GERd=as.numeric(aplRd)
getSymbols('MCD',src='yahoo', from="2007-01-01", to="2017-12-30")
[1] "MCD"
aplRd = periodReturn(MCD,period="daily",type="log")
MCDRd=as.numeric(aplRd)
getSymbols('KO',src='yahoo', from="2007-01-01", to="2017-12-30")
[1] "KO"
aplRd = periodReturn(KO,period="daily",type="log")
KORd=as.numeric(aplRd)
# M <- cbind(A,B,C) # create a matrix where each column is an array/vector of numerical values 
M <- cbind(AAPLRd,GERd,MCDRd,KORd)
# cov(M) # compute the covariance matrix
cov(M)
             AAPLRd         GERd        MCDRd         KORd
AAPLRd 4.043223e-04 1.700594e-04 8.576271e-05 7.507611e-05
GERd   1.700594e-04 3.735289e-04 9.831640e-05 9.052457e-05
MCDRd  8.576271e-05 9.831640e-05 1.374065e-04 6.487736e-05
KORd   7.507611e-05 9.052457e-05 6.487736e-05 1.306746e-04
# cor(M, method="pearson") # compute the correlation matrix based on the Pearson method
cor(M, method="pearson")
          AAPLRd      GERd     MCDRd      KORd
AAPLRd 1.0000000 0.4375975 0.3638572 0.3266196
GERd   0.4375975 1.0000000 0.4339705 0.4097403
MCDRd  0.3638572 0.4339705 1.0000000 0.4841655
KORd   0.3266196 0.4097403 0.4841655 1.0000000

From the tables we can see: the potential linear relationship between AAPL and GE daily log return distribution is 43.76%; the potential linear relationship between AAPL and MCD daily log return distribution is 36.39%; the potential linear relationship between AAPL and KO daily log return distribution is 32.66%; the potential linear relationship between GE and MCD daily log return distribution is 43.40%; the potential linear relationship between GE and KO daily log return distribution is 40.97%; the potential linear relationship between MCD and KO daily log return distribution is 48.42%. From the results above, we can conclude that all these four stocks have strong linear relationship between their daily log return distribution.

##### 1B) Calculate the three types of volatility for a particular stock of your choice. Consider a time window extending one year back from most recent obtainable closing day price. Order the three estimates from low to high volatility and explain how the ordering makes sense.

# For this task make sure you understand well what the variables n,m represent in the book's referenced example.
getSymbols('AAPL',src='yahoo', from="2007-01-01", to="2018-12-30")
[1] "AAPL"
aapl=AAPL['2017-12-04/2018-12-04']; m=length(aapl$AAPL.Close);
ohlc <-aapl[,c("AAPL.Open","AAPL.High","AAPL.Low","AAPL.Close")]
vClose <- volatility(ohlc, n= m,calc="close",N=252)
vParkinson <- volatility(ohlc, n= m,calc="parkinson",N=252)
vGK <- volatility(ohlc, n= m,calc="garman",N=252)
vClose[m]; vParkinson[m]; vGK[m];
                [,1]
2018-12-04 0.2692029
                [,1]
2018-12-04 0.2036672
                [,1]
2018-12-04 0.2035915

The order of these three estimators from low to high volatility is 0.2035915 for the Garman and Klass, 0.2036672 for the Parkinson and 0.2692029 for the Close-to-Close. We know that Garman and Klass volatility uses open, close, high and low prices for the given stock; Parkinson volatility uses both high and low prices for the given stock; Close-to-Close volatility only uses the close prices for the given stock. The ordering of three types of estimators shows that when we include more types of stock prices in the function to calculate the daily log return volatility, the result may be smaller, which means that the distribution of daily log return is more centralized.

Task 2: Auto-Correlation and Auto-Regression

Follow the example in the book R Example 3.2/p. 74 and R Example 4.1/p. 115

##### 2A) Calculate the ACF for a stock of your choice. Consider both the log return and squared log return. Interpret your results in terms of possible existence of autocorrelation.

acf(AAPLRd,main="acf of AAPL",ylim=c(-0.2,0.2))

acf(AAPLRd^2,main="",ylim=c(-0.2,0.2))

The horizontal dashed lines mark the two standard error limits of the sample ACFs in the plot of ACF of AAPL daily log return. We observe significant correlations at lags 2, 4, 12, 16, 18, 24; that is, the autocorrelations at these lags are over the 5 % level. Since some ACFs are above the limits, we can conclude that some of them are significantly different from zero at 95% confidence level; hence the daily log returns of AAPL in this time frame presents some autocorrelations with its past values, at least at lag 4.

From the output of ACF of AAPL square of daily log returns, we observe significant correlations at all lags; that is, the autocorrelations at all these lags are over the 5 % level. Since a good estimate of the variance of the daily log return {rt} of a stock is the sum of the squares of {rt}, this experimental result indicates that there is strong linear dependence of the variance of AAPL daily log return with its past values at all lags.

##### 2B) Plot the exchange rate for USD versus another currency of your choice. Interpret your results in terms of behavior.

getFX("GBP/USD") #download EUR/USD rates from oanda.com
[1] "GBPUSD"
plot(GBPUSD)

From the plot of exchange rate of USE versus GBP in the past six months, we can see that the value of GBP is following a declining trend. Although it did appreciate on September, but it continued to depreciate again on November. Besides, the plot shows that the range of the change of the exchange rate of GBP is quiet small from the past 6 months, only from $1.26 to $1.34.

##### 2C) Test for the possible existence of an underlying AR(1) – Markov process in your exchange rate currency pair. To this end, plot the ACF and the partial ACF (PACF). Interpret your results. Clearly refer to the lags, and their impacts in determining the order.

acf(GBPUSD)

pacf(GBPUSD)

From the plot of ACF, we can see a slow exponential decay for successive lags, hence revealing that the series GBP/USD does behaves as an AR(1) process. Besides, the plot of the Partial ACF (PACF) function confirms that the order of the underlying autoregressive process is 1 since we observe significant partial autocorrelation at lag 1, which is the order of AR.

Task 3: Granger Causality Test

To conduct this test the package lmtest will be required, as already done in the code chunk below.

# Require will load the package only if not installed 
# Dependencies = TRUE makes sure that dependencies are install
if(!require("lmtest",quietly = TRUE))
  install.packages("lmtest",dependencies = TRUE, repos = "https://cloud.r-project.org")

##### 3A) Include below the code chunk to solve for 3.5.7 R Lab/p. 106. Write your conclusions.

# More information about the data used in testing for causality can be obtained by typing the name of the data set `ChickEgg` in the R Help menu.
data(ChickEgg)
grangertest(egg~chicken, order=3, data=ChickEgg)
Granger causality test

Model 1: egg ~ Lags(egg, 1:3) + Lags(chicken, 1:3)
Model 2: egg ~ Lags(egg, 1:3)
  Res.Df Df      F Pr(>F)
1     44                 
2     47 -3 0.5916 0.6238
grangertest(chicken~egg, order=3, data=ChickEgg)
Granger causality test

Model 1: chicken ~ Lags(chicken, 1:3) + Lags(egg, 1:3)
Model 2: chicken ~ Lags(chicken, 1:3)
  Res.Df Df     F   Pr(>F)   
1     44                     
2     47 -3 5.405 0.002966 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The first equation is to test whether chicken causes egg, and the second equation is to test whether egg causes chicken. From the results of test 1, the F-statistic for the test 1 is 0.5916, and the p-value of F-statistic is 0.6238, which is greater than 0.05. So we cannot reject the null at 5% significant level, which means that chicken does not cause egg.

From the results of test2, the F-statistic for the test 1 is 5.405, and the p-value of F-statistic is 0.002966, which is less than 0.01. So we can reject the null at 1% significant level, which means that chicken does cause egg.

##### 3B) Briefly describe the data in terms of time range and variables. Similar to the linear autoegressive model described in class, write the mathematical regression model solved in each Granger test, including the proper order. Use naming conventions, and notations more reflective of the data set considered for ChickEgg.

The data “ChickEgg” contains an annual time series from 1930 to 1983 with 2 variables: chicken and egg. Chicken is the population of all US chickens per year, and egg is the US egg production in millions of dozens per year. Let E denotes variable egg, C denotes the variable chicken, we can get: The mathematical regression models solved in testing whether chicken causes egg are as below:

For model1 which is the unrestricted model for F-test: \(E_{t}\) =a0+a1\(E_{t-1}\) +a2\(E_{t-2}\) +a3\(E_{t-3}\) +b1\(C_{t-1}\) +b2\(C_{t-2}\)+b3\(C_{t-3}\)+\(\varepsilon_{t}\)

For model2 which is the restricted model for F-test: \(E_{t}\) =a0+a1\(E_{t-1}\) +a2\(E_{t-2}\) +a3\(E_{t-3}\)+\(\varepsilon_{t}\)

The mathematical regression models solved in testing whether egg causes chicken are as below:

For model1 which is the unrestricted model for F-test: \(C_{t}\) =a0+a1\(C_{t-1}\) +a2\(C_{t-2}\) +a3\(C_{t-3}\) +b1\(E_{t-1}\) +b2\(E_{t-2}\)+b3\(E_{t-3}\)+\(\varepsilon_{t}\)

For model2 which is the restricted model for F-test: \(C_{t}\) =a0+a1\(C_{t-1}\) +a2\(C_{t-2}\) +a3\(C_{t-3}\) +\(\varepsilon_{t}\)

Task 4: Mathematical Proof

##### 4A) Prove the two results in Eq (2.32)/p. 53. No R-coding is needed here. Clearly show your steps. Hint: Use the definition of \(E(X^n)\) for X-log normally distributed. Observe also that \(Var(X) = E(X^2)-E^2(X)\) for any random variable X.

This is the solution of the provement

This is the solution of the provement

*http://computationalfinance.lsi.upc.edu

LS0tDQp0aXRsZTogIkZJTkM2MjEgV2ludGVyIDIwMTgtMTkgTGFiIFdvcmtzaGVldCAwMyINCmF1dGhvcjogIll1ZSBIdWFuZyINCmRhdGU6ICIxMi01LTIwMTgiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0Kc3VidGl0bGU6IFZhcmlhbmNlLCBDb3ZhcmlhbmNlLCBDb3JyZWxhdGlvbiAmIENhdXNhbGl0eSAoZmluYzYyMS1sYWIwMykNCi0tLQ0KDQojIyMgQWJvdXQNCg0KSW4gdGhpcyB3b3Jrc2hlZXQgd2UgbG9vayBhdCBkaWZmZXJlbnQgdmFyaWFuY2UsIGNvdmFyaWFuY2UsIHZvbGF0aWxpdHksIGFuZCBjYXVzYWxpdHkgY2FsY3VsYXRpb25zLiBXZSBmaW5pc2ggd2l0aCBhIHNob3J0IG1hdGVtYXRpY2FsIHByb29mIChubyBSIHJlcXVpcmVkKS4gIA0KDQojIyMgU2V0dXANCg0KUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIA0KDQojIyMgTm90ZQ0KDQpGb3IgY2xhcml0eSwgdGFza3MvcXVlc3Rpb25zIHRvIGJlIGNvbXBsZXRlZC9hbnN3ZXJlZCBhcmUgaGlnaGxpZ2h0ZWQgaW4gcmVkIGNvbG9yIChjb2xvciB2aXNpYmxlIG9ubHkgaW4gcHJldmlldyBtb2RlKSBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBUeXBlIHlvdXIgYW5zd2VycyBvdXRzaWRlIHRoZSByZWQgY29sb3IgdGFncyENCg0KUXVpdGUgb2Z0ZW4geW91IHdpbGwgbmVlZCB0byBhZGQgeW91ciBvd24gY29kZSBjaHVuay4gRXhlY3V0ZSBzZXF1ZW50aWFsbHkgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTWFrZSBzdXJlIHRvIGFkZCBjb21tZW50cyB0byB5b3VyIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuIFVzZSBvd24gbGFuZ3VhZ2UhDQoNCioqQW55IHNpZ24gb2YgcGxhZ2lhcmlzbSwgd2lsbCByZXN1bHQgaW4gZGlzc21pc3NhbCBvZiB3b3JrISoqDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIyBUYXNrIDE6IFZhcmlhbmNlLCBDb3ZhcmlhbmNlLCBhbmQgVm9sYXRpbGl0eQ0KDQpUaGlzIHRhc2sgZm9sbG93cyB0aGUgdHdvIGV4YW1wbGVzIGluIHRoZSBib29rIGBSIEV4YW1wbGUgMi41L3AuIDU4YCBhbmQgYFIgRXhhbXBsZSAyLjYvcC4gNjZgIA0KDQpgYGB7cn0NCiMgUmVxdWlyZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2Ugb25seSBpZiBub3QgaW5zdGFsbGVkIA0KIyBEZXBlbmRlbmNpZXMgPSBUUlVFIG1ha2VzIHN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGwNCmlmKCFyZXF1aXJlKCJxdWFudG1vZCIscXVpZXRseSA9IFRSVUUpKQ0KICBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikNCmBgYA0KDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUEpIENhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gYW5kIGNvdmFyaWFuY2UgbWF0cml4IG9mIHRoZSBhZGp1c3RlZCBkYWlseSBsb2cgcmV0dXJucyBmb3IgZm91ciBkaWZmZXJlbnQgc3RvY2tzIG9mIHlvdXIgY2hvaWNlLiBFeHBsYWluIHlvdXIgb2JzZXJ2YXRpb25zIGluIHRlcm1zIG9mIHBvdGVudGlhbCByZWxhdGlvbnNoaXBzLg0KPC9zcGFuPg0KDQpgYGB7cn0NCiMgT25jZSB5b3UgaGF2ZSBvYnRhaW5lZCB0aGUgYWRqdXN0ZWQgZGFpbHkgbG9nIHJldHVybnMgZm9yIHlvdXIgc3RvY2tzLCBvbWl0dGluZyB0aGUgdGltZSBpbmRleCwgeW91IHdpbGwgbmVlZCB0byBjb21iaW5lIHRoZW0gdG8gY3JlYXRlIGEgbWF0cml4LiBCZWxvdyBpcyBhbiBleGFtcGxlLiAgRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIEhlbHAgY29tbWFuZCBpbiBSIG9uIGNiaW5kLCBjb3YsIGFuZCBjb3IuDQpnZXRTeW1ib2xzKCdBQVBMJyxzcmM9J3lhaG9vJywgZnJvbT0iMjAwNy0wMS0wMSIsIHRvPSIyMDE3LTEyLTMwIikNCmFwbFJkID0gcGVyaW9kUmV0dXJuKEFBUEwscGVyaW9kPSJkYWlseSIsdHlwZT0ibG9nIikNCkFBUExSZD1hcy5udW1lcmljKGFwbFJkKQ0KZ2V0U3ltYm9scygnR0UnLHNyYz0neWFob28nLCBmcm9tPSIyMDA3LTAxLTAxIiwgdG89IjIwMTctMTItMzAiKQ0KYXBsUmQgPSBwZXJpb2RSZXR1cm4oR0UscGVyaW9kPSJkYWlseSIsdHlwZT0ibG9nIikNCkdFUmQ9YXMubnVtZXJpYyhhcGxSZCkNCmdldFN5bWJvbHMoJ01DRCcsc3JjPSd5YWhvbycsIGZyb209IjIwMDctMDEtMDEiLCB0bz0iMjAxNy0xMi0zMCIpDQphcGxSZCA9IHBlcmlvZFJldHVybihNQ0QscGVyaW9kPSJkYWlseSIsdHlwZT0ibG9nIikNCk1DRFJkPWFzLm51bWVyaWMoYXBsUmQpDQpnZXRTeW1ib2xzKCdLTycsc3JjPSd5YWhvbycsIGZyb209IjIwMDctMDEtMDEiLCB0bz0iMjAxNy0xMi0zMCIpDQphcGxSZCA9IHBlcmlvZFJldHVybihLTyxwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKQ0KS09SZD1hcy5udW1lcmljKGFwbFJkKQ0KIyBNIDwtIGNiaW5kKEEsQixDKSAjIGNyZWF0ZSBhIG1hdHJpeCB3aGVyZSBlYWNoIGNvbHVtbiBpcyBhbiBhcnJheS92ZWN0b3Igb2YgbnVtZXJpY2FsIHZhbHVlcyANCk0gPC0gY2JpbmQoQUFQTFJkLEdFUmQsTUNEUmQsS09SZCkNCiMgY292KE0pICMgY29tcHV0ZSB0aGUgY292YXJpYW5jZSBtYXRyaXgNCmNvdihNKQ0KIyBjb3IoTSwgbWV0aG9kPSJwZWFyc29uIikgIyBjb21wdXRlIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXggYmFzZWQgb24gdGhlIFBlYXJzb24gbWV0aG9kDQpjb3IoTSwgbWV0aG9kPSJwZWFyc29uIikNCmBgYA0KRnJvbSB0aGUgdGFibGVzIHdlIGNhbiBzZWU6IHRoZSBwb3RlbnRpYWwgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEFBUEwgYW5kIEdFIGRhaWx5IGxvZyByZXR1cm4gZGlzdHJpYnV0aW9uIGlzIDQzLjc2JTsgdGhlIHBvdGVudGlhbCBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gQUFQTCBhbmQgTUNEIGRhaWx5IGxvZyByZXR1cm4gZGlzdHJpYnV0aW9uIGlzIDM2LjM5JTsgdGhlIHBvdGVudGlhbCBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gQUFQTCBhbmQgS08gZGFpbHkgbG9nIHJldHVybiBkaXN0cmlidXRpb24gaXMgMzIuNjYlOyB0aGUgcG90ZW50aWFsIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBHRSBhbmQgTUNEIGRhaWx5IGxvZyByZXR1cm4gZGlzdHJpYnV0aW9uIGlzIDQzLjQwJTsgdGhlIHBvdGVudGlhbCBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gR0UgYW5kIEtPIGRhaWx5IGxvZyByZXR1cm4gZGlzdHJpYnV0aW9uIGlzIDQwLjk3JTsgdGhlIHBvdGVudGlhbCBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gTUNEIGFuZCBLTyBkYWlseSBsb2cgcmV0dXJuIGRpc3RyaWJ1dGlvbiBpcyA0OC40MiUuIEZyb20gdGhlIHJlc3VsdHMgYWJvdmUsIHdlIGNhbiBjb25jbHVkZSB0aGF0IGFsbCB0aGVzZSBmb3VyIHN0b2NrcyBoYXZlIHN0cm9uZyBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlaXIgZGFpbHkgbG9nIHJldHVybiBkaXN0cmlidXRpb24uDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUIpIENhbGN1bGF0ZSB0aGUgdGhyZWUgdHlwZXMgb2Ygdm9sYXRpbGl0eSBmb3IgYSBwYXJ0aWN1bGFyIHN0b2NrIG9mIHlvdXIgY2hvaWNlLiBDb25zaWRlciBhIHRpbWUgd2luZG93IGV4dGVuZGluZyBvbmUgeWVhciBiYWNrIGZyb20gbW9zdCByZWNlbnQgb2J0YWluYWJsZSBjbG9zaW5nIGRheSBwcmljZS4gT3JkZXIgdGhlIHRocmVlIGVzdGltYXRlcyBmcm9tIGxvdyB0byBoaWdoIHZvbGF0aWxpdHkgYW5kIGV4cGxhaW4gaG93IHRoZSBvcmRlcmluZyBtYWtlcyBzZW5zZS4NCjwvc3Bhbj4NCg0KYGBge3J9DQojIEZvciB0aGlzIHRhc2sgbWFrZSBzdXJlIHlvdSB1bmRlcnN0YW5kIHdlbGwgd2hhdCB0aGUgdmFyaWFibGVzIG4sbSByZXByZXNlbnQgaW4gdGhlIGJvb2sncyByZWZlcmVuY2VkIGV4YW1wbGUuDQpnZXRTeW1ib2xzKCdBQVBMJyxzcmM9J3lhaG9vJywgZnJvbT0iMjAwNy0wMS0wMSIsIHRvPSIyMDE4LTEyLTMwIikNCmFhcGw9QUFQTFsnMjAxNy0xMi0wNC8yMDE4LTEyLTA0J107IG09bGVuZ3RoKGFhcGwkQUFQTC5DbG9zZSk7DQpvaGxjIDwtYWFwbFssYygiQUFQTC5PcGVuIiwiQUFQTC5IaWdoIiwiQUFQTC5Mb3ciLCJBQVBMLkNsb3NlIildDQp2Q2xvc2UgPC0gdm9sYXRpbGl0eShvaGxjLCBuPSBtLGNhbGM9ImNsb3NlIixOPTI1MikNCnZQYXJraW5zb24gPC0gdm9sYXRpbGl0eShvaGxjLCBuPSBtLGNhbGM9InBhcmtpbnNvbiIsTj0yNTIpDQp2R0sgPC0gdm9sYXRpbGl0eShvaGxjLCBuPSBtLGNhbGM9Imdhcm1hbiIsTj0yNTIpDQp2Q2xvc2VbbV07IHZQYXJraW5zb25bbV07IHZHS1ttXTsNCg0KYGBgDQpUaGUgb3JkZXIgb2YgdGhlc2UgdGhyZWUgZXN0aW1hdG9ycyBmcm9tIGxvdyB0byBoaWdoIHZvbGF0aWxpdHkgaXMgMC4yMDM1OTE1IGZvciB0aGUgR2FybWFuIGFuZCBLbGFzcywgMC4yMDM2NjcyIGZvciB0aGUgUGFya2luc29uIGFuZCAwLjI2OTIwMjkgZm9yIHRoZSBDbG9zZS10by1DbG9zZS4gV2Uga25vdyB0aGF0IEdhcm1hbiBhbmQgS2xhc3Mgdm9sYXRpbGl0eSB1c2VzIG9wZW4sIGNsb3NlLCBoaWdoIGFuZCBsb3cgcHJpY2VzIGZvciB0aGUgZ2l2ZW4gc3RvY2s7IFBhcmtpbnNvbiB2b2xhdGlsaXR5IHVzZXMgYm90aCBoaWdoIGFuZCBsb3cgcHJpY2VzIGZvciB0aGUgZ2l2ZW4gc3RvY2s7IENsb3NlLXRvLUNsb3NlIHZvbGF0aWxpdHkgb25seSB1c2VzIHRoZSBjbG9zZSBwcmljZXMgZm9yIHRoZSBnaXZlbiBzdG9jay4gVGhlIG9yZGVyaW5nIG9mIHRocmVlIHR5cGVzIG9mIGVzdGltYXRvcnMgc2hvd3MgdGhhdCB3aGVuIHdlIGluY2x1ZGUgbW9yZSB0eXBlcyBvZiBzdG9jayBwcmljZXMgaW4gdGhlIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgZGFpbHkgbG9nIHJldHVybiB2b2xhdGlsaXR5LCB0aGUgcmVzdWx0IG1heSBiZSBzbWFsbGVyLCB3aGljaCBtZWFucyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2YgZGFpbHkgbG9nIHJldHVybiBpcyBtb3JlIGNlbnRyYWxpemVkLiANCg0KIyMjIFRhc2sgMjogQXV0by1Db3JyZWxhdGlvbiBhbmQgQXV0by1SZWdyZXNzaW9uDQoNCkZvbGxvdyB0aGUgZXhhbXBsZSBpbiB0aGUgYm9vayAgYFIgRXhhbXBsZSAzLjIvcC4gNzRgIGFuZCBgUiBFeGFtcGxlIDQuMS9wLiAxMTVgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMkEpIENhbGN1bGF0ZSB0aGUgQUNGIGZvciBhIHN0b2NrIG9mIHlvdXIgY2hvaWNlLiBDb25zaWRlciBib3RoIHRoZSBsb2cgcmV0dXJuIGFuZCBzcXVhcmVkIGxvZyByZXR1cm4uIEludGVycHJldCB5b3VyIHJlc3VsdHMgaW4gdGVybXMgb2YgcG9zc2libGUgZXhpc3RlbmNlIG9mIGF1dG9jb3JyZWxhdGlvbi4gIA0KPC9zcGFuPg0KDQpgYGB7cn0NCmFjZihBQVBMUmQsbWFpbj0iYWNmIG9mIEFBUEwiLHlsaW09YygtMC4yLDAuMikpDQphY2YoQUFQTFJkXjIsbWFpbj0iIix5bGltPWMoLTAuMiwwLjIpKQ0KDQpgYGANClRoZSBob3Jpem9udGFsIGRhc2hlZCBsaW5lcyBtYXJrIHRoZSB0d28gc3RhbmRhcmQgZXJyb3IgbGltaXRzIG9mIHRoZSBzYW1wbGUgQUNGcyBpbiB0aGUgcGxvdCBvZiBBQ0Ygb2YgQUFQTCBkYWlseSBsb2cgcmV0dXJuLiBXZSBvYnNlcnZlIHNpZ25pZmljYW50IGNvcnJlbGF0aW9ucyBhdCBsYWdzIDIsIDQsIDEyLCAxNiwgMTgsIDI0OyB0aGF0IGlzLCB0aGUgYXV0b2NvcnJlbGF0aW9ucyBhdCB0aGVzZSBsYWdzIGFyZSBvdmVyIHRoZSA1ICUgbGV2ZWwuIFNpbmNlIHNvbWUgQUNGcyBhcmUgYWJvdmUgdGhlIGxpbWl0cywgd2UgY2FuIGNvbmNsdWRlIHRoYXQgc29tZSBvZiB0aGVtIGFyZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIHplcm8gYXQgOTUlIGNvbmZpZGVuY2UgbGV2ZWw7IGhlbmNlIHRoZSBkYWlseSBsb2cgcmV0dXJucyBvZiBBQVBMIGluIHRoaXMgdGltZSBmcmFtZSBwcmVzZW50cyBzb21lIGF1dG9jb3JyZWxhdGlvbnMgd2l0aCBpdHMgcGFzdCB2YWx1ZXMsIGF0IGxlYXN0IGF0IGxhZyA0Lg0KDQpGcm9tIHRoZSBvdXRwdXQgb2YgQUNGIG9mIEFBUEwgc3F1YXJlIG9mIGRhaWx5IGxvZyByZXR1cm5zLCB3ZSBvYnNlcnZlIHNpZ25pZmljYW50IGNvcnJlbGF0aW9ucyBhdCBhbGwgbGFnczsgdGhhdCBpcywgdGhlIGF1dG9jb3JyZWxhdGlvbnMgYXQgYWxsIHRoZXNlIGxhZ3MgYXJlIG92ZXIgdGhlIDUgJSBsZXZlbC4gU2luY2UgYSBnb29kIGVzdGltYXRlIG9mIHRoZSB2YXJpYW5jZSBvZiB0aGUgZGFpbHkgbG9nIHJldHVybiB7cnR9IG9mIGEgc3RvY2sgaXMgdGhlIHN1bSBvZiB0aGUgc3F1YXJlcyBvZiB7cnR9LCB0aGlzIGV4cGVyaW1lbnRhbCByZXN1bHQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgc3Ryb25nIGxpbmVhciBkZXBlbmRlbmNlIG9mIHRoZSB2YXJpYW5jZSBvZiBBQVBMIGRhaWx5IGxvZyByZXR1cm4gd2l0aCBpdHMgcGFzdCB2YWx1ZXMgYXQgYWxsIGxhZ3MuDQoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQikgUGxvdCB0aGUgZXhjaGFuZ2UgcmF0ZSBmb3IgVVNEIHZlcnN1cyBhbm90aGVyIGN1cnJlbmN5IG9mIHlvdXIgY2hvaWNlLiBJbnRlcnByZXQgeW91ciByZXN1bHRzIGluIHRlcm1zIG9mIGJlaGF2aW9yLg0KPC9zcGFuPg0KDQpgYGB7cn0NCmdldEZYKCJHQlAvVVNEIikgI2Rvd25sb2FkIEVVUi9VU0QgcmF0ZXMgZnJvbSBvYW5kYS5jb20NCnBsb3QoR0JQVVNEKQ0KDQpgYGANCkZyb20gdGhlIHBsb3Qgb2YgZXhjaGFuZ2UgcmF0ZSBvZiBVU0UgdmVyc3VzIEdCUCBpbiB0aGUgcGFzdCBzaXggbW9udGhzLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIHZhbHVlIG9mIEdCUCBpcyBmb2xsb3dpbmcgYSBkZWNsaW5pbmcgdHJlbmQuIEFsdGhvdWdoIGl0IGRpZCBhcHByZWNpYXRlIG9uIFNlcHRlbWJlciwgYnV0IGl0IGNvbnRpbnVlZCB0byBkZXByZWNpYXRlIGFnYWluIG9uIE5vdmVtYmVyLiBCZXNpZGVzLCB0aGUgcGxvdCBzaG93cyB0aGF0IHRoZSByYW5nZSBvZiB0aGUgY2hhbmdlIG9mIHRoZSBleGNoYW5nZSByYXRlIG9mIEdCUCBpcyBxdWlldCBzbWFsbCBmcm9tIHRoZSBwYXN0IDYgbW9udGhzLCBvbmx5IGZyb20gJDEuMjYgdG8gJDEuMzQuCQ0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJDKSBUZXN0IGZvciB0aGUgcG9zc2libGUgZXhpc3RlbmNlIG9mIGFuIHVuZGVybHlpbmcgQVIoMSkg4oCTIE1hcmtvdiBwcm9jZXNzIGluIHlvdXIgZXhjaGFuZ2UgcmF0ZSBjdXJyZW5jeSBwYWlyLiBUbyB0aGlzIGVuZCwgcGxvdCB0aGUgQUNGIGFuZCB0aGUgcGFydGlhbCBBQ0YgKFBBQ0YpLiBJbnRlcnByZXQgeW91ciByZXN1bHRzLiAgQ2xlYXJseSByZWZlciB0byB0aGUgbGFncywgYW5kIHRoZWlyIGltcGFjdHMgaW4gZGV0ZXJtaW5pbmcgdGhlIG9yZGVyLg0KPC9zcGFuPg0KDQpgYGB7cn0NCmFjZihHQlBVU0QpDQpwYWNmKEdCUFVTRCkNCmBgYA0KRnJvbSB0aGUgcGxvdCBvZiBBQ0YsIHdlIGNhbiBzZWUgYSBzbG93IGV4cG9uZW50aWFsIGRlY2F5IGZvciBzdWNjZXNzaXZlIGxhZ3MsIGhlbmNlIHJldmVhbGluZyB0aGF0IHRoZSBzZXJpZXMgR0JQL1VTRCBkb2VzIGJlaGF2ZXMgYXMgYW4gQVIoMSkgcHJvY2Vzcy4gQmVzaWRlcywgdGhlIHBsb3Qgb2YgdGhlIFBhcnRpYWwgQUNGIChQQUNGKSBmdW5jdGlvbiBjb25maXJtcyB0aGF0IHRoZSBvcmRlciBvZiB0aGUgdW5kZXJseWluZyBhdXRvcmVncmVzc2l2ZSBwcm9jZXNzIGlzIDEgc2luY2Ugd2Ugb2JzZXJ2ZSBzaWduaWZpY2FudCBwYXJ0aWFsIGF1dG9jb3JyZWxhdGlvbiBhdCBsYWcgMSwgd2hpY2ggaXMgdGhlIG9yZGVyIG9mIEFSLg0KDQojIyMgVGFzayAzOiBHcmFuZ2VyIENhdXNhbGl0eSBUZXN0DQoNClRvIGNvbmR1Y3QgdGhpcyB0ZXN0IHRoZSBwYWNrYWdlIGBsbXRlc3RgIHdpbGwgYmUgcmVxdWlyZWQsIGFzIGFscmVhZHkgZG9uZSBpbiB0aGUgY29kZSBjaHVuayBiZWxvdy4NCg0KYGBge3J9DQojIFJlcXVpcmUgd2lsbCBsb2FkIHRoZSBwYWNrYWdlIG9ubHkgaWYgbm90IGluc3RhbGxlZCANCiMgRGVwZW5kZW5jaWVzID0gVFJVRSBtYWtlcyBzdXJlIHRoYXQgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsDQppZighcmVxdWlyZSgibG10ZXN0IixxdWlldGx5ID0gVFJVRSkpDQogIGluc3RhbGwucGFja2FnZXMoImxtdGVzdCIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikNCmBgYA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDNBKSBJbmNsdWRlIGJlbG93IHRoZSBjb2RlIGNodW5rIHRvIHNvbHZlIGZvciAzLjUuNyBSIExhYi9wLiAxMDYuICBXcml0ZSB5b3VyIGNvbmNsdXNpb25zLg0KPC9zcGFuPg0KDQpgYGB7cn0NCiMgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0YSB1c2VkIGluIHRlc3RpbmcgZm9yIGNhdXNhbGl0eSBjYW4gYmUgb2J0YWluZWQgYnkgdHlwaW5nIHRoZSBuYW1lIG9mIHRoZSBkYXRhIHNldCBgQ2hpY2tFZ2dgIGluIHRoZSBSIEhlbHAgbWVudS4NCmRhdGEoQ2hpY2tFZ2cpDQpncmFuZ2VydGVzdChlZ2d+Y2hpY2tlbiwgb3JkZXI9MywgZGF0YT1DaGlja0VnZykNCmdyYW5nZXJ0ZXN0KGNoaWNrZW5+ZWdnLCBvcmRlcj0zLCBkYXRhPUNoaWNrRWdnKQ0KYGBgDQpUaGUgZmlyc3QgZXF1YXRpb24gaXMgdG8gdGVzdCB3aGV0aGVyIGNoaWNrZW4gY2F1c2VzIGVnZywgYW5kIHRoZSBzZWNvbmQgZXF1YXRpb24gaXMgdG8gdGVzdCB3aGV0aGVyIGVnZyBjYXVzZXMgY2hpY2tlbi4gRnJvbSB0aGUgcmVzdWx0cyBvZiB0ZXN0IDEsIHRoZSBGLXN0YXRpc3RpYyBmb3IgdGhlIHRlc3QgMSBpcyAwLjU5MTYsIGFuZCB0aGUgcC12YWx1ZSBvZiBGLXN0YXRpc3RpYyBpcyAwLjYyMzgsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiAwLjA1LiBTbyB3ZSBjYW5ub3QgcmVqZWN0IHRoZSBudWxsIGF0IDUlIHNpZ25pZmljYW50IGxldmVsLCB3aGljaCBtZWFucyB0aGF0IGNoaWNrZW4gZG9lcyBub3QgY2F1c2UgZWdnLiANCg0KRnJvbSB0aGUgcmVzdWx0cyBvZiB0ZXN0MiwgdGhlIEYtc3RhdGlzdGljIGZvciB0aGUgdGVzdCAxIGlzIDUuNDA1LCBhbmQgdGhlIHAtdmFsdWUgb2YgRi1zdGF0aXN0aWMgaXMgMC4wMDI5NjYsIHdoaWNoIGlzIGxlc3MgdGhhbiAwLjAxLiBTbyB3ZSBjYW4gcmVqZWN0IHRoZSBudWxsIGF0IDElIHNpZ25pZmljYW50IGxldmVsLCB3aGljaCBtZWFucyB0aGF0IGNoaWNrZW4gZG9lcyBjYXVzZSBlZ2cuDQoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAzQikgQnJpZWZseSBkZXNjcmliZSB0aGUgZGF0YSBpbiB0ZXJtcyBvZiB0aW1lIHJhbmdlIGFuZCB2YXJpYWJsZXMuIFNpbWlsYXIgdG8gdGhlIGxpbmVhciBhdXRvZWdyZXNzaXZlIG1vZGVsIGRlc2NyaWJlZCBpbiBjbGFzcywgd3JpdGUgdGhlIG1hdGhlbWF0aWNhbCByZWdyZXNzaW9uIG1vZGVsIHNvbHZlZCBpbiBlYWNoIEdyYW5nZXIgdGVzdCwgaW5jbHVkaW5nIHRoZSBwcm9wZXIgb3JkZXIuIFVzZSBuYW1pbmcgY29udmVudGlvbnMsIGFuZCBub3RhdGlvbnMgbW9yZSByZWZsZWN0aXZlIG9mIHRoZSBkYXRhIHNldCBjb25zaWRlcmVkIGZvciAgYENoaWNrRWdnYC4NCjwvc3Bhbj4NCg0KVGhlIGRhdGEgIkNoaWNrRWdnIiBjb250YWlucyBhbiBhbm51YWwgdGltZSBzZXJpZXMgZnJvbSAxOTMwIHRvIDE5ODMgd2l0aCAyIHZhcmlhYmxlczogY2hpY2tlbiBhbmQgZWdnLiBDaGlja2VuIGlzIHRoZSBwb3B1bGF0aW9uIG9mIGFsbCBVUyBjaGlja2VucyBwZXIgeWVhciwgYW5kIGVnZyBpcyB0aGUgVVMgZWdnIHByb2R1Y3Rpb24gaW4gbWlsbGlvbnMgb2YgZG96ZW5zIHBlciB5ZWFyLiBMZXQgRSBkZW5vdGVzIHZhcmlhYmxlIGVnZywgQyBkZW5vdGVzIHRoZSB2YXJpYWJsZSBjaGlja2VuLCB3ZSBjYW4gZ2V0Og0KVGhlIG1hdGhlbWF0aWNhbCByZWdyZXNzaW9uIG1vZGVscyBzb2x2ZWQgaW4gdGVzdGluZyB3aGV0aGVyIGNoaWNrZW4gY2F1c2VzIGVnZyBhcmUgYXMgYmVsb3c6DQoNCkZvciBtb2RlbDEgd2hpY2ggaXMgdGhlIHVucmVzdHJpY3RlZCBtb2RlbCBmb3IgRi10ZXN0OiAkRV97dH0kID1hMCthMSRFX3t0LTF9JCArYTIkRV97dC0yfSQgK2EzJEVfe3QtM30kICtiMSRDX3t0LTF9JCArYjIkQ197dC0yfSQrYjMkQ197dC0zfSQrJFx2YXJlcHNpbG9uX3t0fSQNCg0KRm9yIG1vZGVsMiB3aGljaCBpcyB0aGUgcmVzdHJpY3RlZCBtb2RlbCBmb3IgRi10ZXN0OiAkRV97dH0kID1hMCthMSRFX3t0LTF9JCArYTIkRV97dC0yfSQgK2EzJEVfe3QtM30kKyRcdmFyZXBzaWxvbl97dH0kDQoNClRoZSBtYXRoZW1hdGljYWwgcmVncmVzc2lvbiBtb2RlbHMgc29sdmVkIGluIHRlc3Rpbmcgd2hldGhlciBlZ2cgY2F1c2VzIGNoaWNrZW4gYXJlIGFzIGJlbG93OiANCg0KRm9yIG1vZGVsMSB3aGljaCBpcyB0aGUgdW5yZXN0cmljdGVkIG1vZGVsIGZvciBGLXRlc3Q6ICRDX3t0fSQgPWEwK2ExJENfe3QtMX0kICthMiRDX3t0LTJ9JCArYTMkQ197dC0zfSQgK2IxJEVfe3QtMX0kICtiMiRFX3t0LTJ9JCtiMyRFX3t0LTN9JCskXHZhcmVwc2lsb25fe3R9JA0KDQpGb3IgbW9kZWwyIHdoaWNoIGlzIHRoZSByZXN0cmljdGVkIG1vZGVsIGZvciBGLXRlc3Q6ICRDX3t0fSQgPWEwK2ExJENfe3QtMX0kICthMiRDX3t0LTJ9JCArYTMkQ197dC0zfSQgKyRcdmFyZXBzaWxvbl97dH0kDQoNCg0KIyMjIFRhc2sgNDogTWF0aGVtYXRpY2FsIFByb29mDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgNEEpIFByb3ZlIHRoZSB0d28gcmVzdWx0cyBpbiBFcSAoMi4zMikvcC4gNTMuICBObyBSLWNvZGluZyBpcyBuZWVkZWQgaGVyZS4gIENsZWFybHkgc2hvdyB5b3VyIHN0ZXBzLiBIaW50OiBVc2UgdGhlIGRlZmluaXRpb24gb2YgJEUoWF5uKSQgZm9yIFgtbG9nIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiAgIE9ic2VydmUgYWxzbyB0aGF0ICRWYXIoWCkgPSBFKFheMiktRV4yKFgpJCBmb3IgYW55IHJhbmRvbSB2YXJpYWJsZSBYLg0KPC9zcGFuPg0KDQohW1RoaXMgaXMgdGhlIHNvbHV0aW9uIG9mIHRoZSBwcm92ZW1lbnRdKGltYWdlMS5qcGcpDQoNCg0KDQoqW2h0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSBdKGh0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSkNCg==