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")

##### 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.
# M <- cbind(A,B,C) # create a matrix where each column is an array/vector of numerical values 
# cov(M) # compute the covariance matrix
# cor(M, method="pearson") # compute the correlation matrix based on the Pearson method
getSymbols("AAPL",src="yahoo",from="2017-01-01") ##data starts from 2017
[1] "AAPL"
aplRd = periodReturn(AAPL,period="daily",type="log") 
getSymbols("BMW",src="yahoo",from="2017-01-01") ##data starts from 2017
[1] "BMW"
BMWR = periodReturn(BMW,period="daily",type="log") 
getSymbols("GE",src="yahoo",from="2017-01-01") ##data starts from 2017
[1] "GE"
GERd = periodReturn(GE,period="daily",type="log") 
getSymbols("ALV",src="yahoo",from="2017-01-01") ##data starts from 2017
[1] "ALV"
ALVRd = periodReturn(ALV,period="daily",type="log") 
M <- cbind(aplRd,BMWR,GERd,ALVRd) # create a matrix where each column is an array/vector of numerical values 
 cov(M) # compute the covariance matrix
                daily.returns daily.returns.1 daily.returns.2 daily.returns.3
daily.returns    2.038605e-04   -0.0067542886    3.656482e-05    5.090495e-05
daily.returns.1 -6.754289e-03   47.4019972096   -1.875207e-03   -4.127276e-04
daily.returns.2  3.656482e-05   -0.0018752075    3.521758e-04    6.271018e-05
daily.returns.3  5.090495e-05   -0.0004127276    6.271018e-05    2.795811e-04
 cor(M) # compute the covariance matrix
                daily.returns daily.returns.1 daily.returns.2 daily.returns.3
daily.returns      1.00000000    -0.068709179      0.13646372     0.213225736
daily.returns.1   -0.06870918     1.000000000     -0.01451347    -0.003585183
daily.returns.2    0.13646372    -0.014513470      1.00000000     0.199850139
daily.returns.3    0.21322574    -0.003585183      0.19985014     1.000000000

the correlation of daily growth among these companies seems all insignificant, since the ABS of the correlation coefficient are all very small, and all of them is very close to zero.

##### 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.

getSymbols("AAPL",src="yahoo",from="2017-01-01") ##data starts from 2017
[1] "AAPL"
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
  input string 1 is invalid in this locale
aplRd = periodReturn(AAPL,period="daily",type="log") 
 aapl=AAPL[’2009-04/2009-05’]; m=length(aapl\$AAPL.Close);
Error: unexpected input in " aapl=AAPL[?
getSymbols("AAPL",src="yahoo",from="2017-01-01") ##data starts from 2017
[1] "AAPL"
aplRd = periodReturn(AAPL,period="daily",type="log") 
getSymbols("BMW",src="yahoo",from="2017-01-01") ##data starts from 2017
[1] "BMW"
BMWR = periodReturn(BMW,period="daily",type="log") 
getSymbols("GE",src="yahoo",from="2017-01-01") ##data starts from 2017
[1] "GE"
GERd = periodReturn(GE,period="daily",type="log") 
getSymbols("ALV",src="yahoo",from="2017-01-01") ##data starts from 2017
[1] "ALV"
ALVRd = periodReturn(ALV,period="daily",type="log") 
M <- cbind(aplRd,BMWR,GERd,ALVRd)
cor(M,method="pearson")
                daily.returns daily.returns.1 daily.returns.2 daily.returns.3
daily.returns      1.00000000      0.05461879      0.14606093       0.2234036
daily.returns.1    0.05461879      1.00000000      0.02970579       0.0233627
daily.returns.2    0.14606093      0.02970579      1.00000000       0.2100875
daily.returns.3    0.22340363      0.02336270      0.21008749       1.0000000
acf(na.omit(M),main="acf of ALV",ylim=c(-0.2,0.2))

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.

 getFX("CNY/USD") #download CNY/USD rates from oanda.com
[1] "CNYUSD"
plot(CNYUSD)

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

 getFX("CNY/USD") #download CNY/USD rates from oanda.com
[1] "CNYUSD"
plot(CNYUSD)

 acf(CNYUSD)

 pacf(CNYUSD)

From the graph, the CNY/USD rate declined significantly during the june & july, and retained stable from then on, fluctuating bwtween the range of 0.144 to 0.147.

##### 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.

# 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")

The PACF function in R provides a functional representation of the various orders strength. The ACF graph indicates a exponential decay of the time lag ,this means more weight on the rate recently, when the time lag is big ,the weight is low.The sum is such that the further away in the past contribute less to the sum. ### Task 3: Granger Causality Test

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

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
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

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

grangertest(chicken ~ egg, order = 3, data = ChickEgg)
grangertest(egg ~ chicken, order = 3, data = ChickEgg)

the first causality which tests chicken causes eggs has a p-value of 0.0030<0.05, so reject H0, it means that chicken does cause eggs. the second causality which tests eggs cause chicken has a p-value of 0.6238 >0.05 ,so accept the H0, it mesns, eggs does not cause chicken.

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.

##### 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. Caption Here

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. Caption Here

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

LS0tDQp0aXRsZTogIkZJTkM2MjEgV2ludGVyIDIwMTgtMTkgTGFiIFdvcmtzaGVldCAwMyINCmF1dGhvcjogIllvdXIgTmFtZSBIZXJlIg0KZGF0ZTogIkFkZCBEYXRlIEhlcmUiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0Kc3VidGl0bGU6IFZhcmlhbmNlLCBDb3ZhcmlhbmNlLCBDb3JyZWxhdGlvbiAmIENhdXNhbGl0eSAoZmluYzYyMS1sYWIwMykNCi0tLQ0KDQojIyMgQWJvdXQNCg0KSW4gdGhpcyB3b3Jrc2hlZXQgd2UgbG9vayBhdCBkaWZmZXJlbnQgdmFyaWFuY2UsIGNvdmFyaWFuY2UsIHZvbGF0aWxpdHksIGFuZCBjYXVzYWxpdHkgY2FsY3VsYXRpb25zLiBXZSBmaW5pc2ggd2l0aCBhIHNob3J0IG1hdGVtYXRpY2FsIHByb29mIChubyBSIHJlcXVpcmVkKS4gIA0KDQojIyMgU2V0dXANCg0KUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIA0KDQojIyMgTm90ZQ0KDQpGb3IgY2xhcml0eSwgdGFza3MvcXVlc3Rpb25zIHRvIGJlIGNvbXBsZXRlZC9hbnN3ZXJlZCBhcmUgaGlnaGxpZ2h0ZWQgaW4gcmVkIGNvbG9yIChjb2xvciB2aXNpYmxlIG9ubHkgaW4gcHJldmlldyBtb2RlKSBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBUeXBlIHlvdXIgYW5zd2VycyBvdXRzaWRlIHRoZSByZWQgY29sb3IgdGFncyENCg0KUXVpdGUgb2Z0ZW4geW91IHdpbGwgbmVlZCB0byBhZGQgeW91ciBvd24gY29kZSBjaHVuay4gRXhlY3V0ZSBzZXF1ZW50aWFsbHkgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTWFrZSBzdXJlIHRvIGFkZCBjb21tZW50cyB0byB5b3VyIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuIFVzZSBvd24gbGFuZ3VhZ2UhDQoNCioqQW55IHNpZ24gb2YgcGxhZ2lhcmlzbSwgd2lsbCByZXN1bHQgaW4gZGlzc21pc3NhbCBvZiB3b3JrISoqDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIyBUYXNrIDE6IFZhcmlhbmNlLCBDb3ZhcmlhbmNlLCBhbmQgVm9sYXRpbGl0eQ0KDQpUaGlzIHRhc2sgZm9sbG93cyB0aGUgdHdvIGV4YW1wbGVzIGluIHRoZSBib29rIGBSIEV4YW1wbGUgMi41L3AuIDU4YCBhbmQgYFIgRXhhbXBsZSAyLjYvcC4gNjZgIA0KDQpgYGB7cn0NCiMgUmVxdWlyZSB3aWxsIGxvYWQgdGhlIHBhY2thZ2Ugb25seSBpZiBub3QgaW5zdGFsbGVkIA0KIyBEZXBlbmRlbmNpZXMgPSBUUlVFIG1ha2VzIHN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGwNCmlmKCFyZXF1aXJlKCJxdWFudG1vZCIscXVpZXRseSA9IFRSVUUpKQ0KICBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikNCmBgYA0KDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUEpIENhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gYW5kIGNvdmFyaWFuY2UgbWF0cml4IG9mIHRoZSBhZGp1c3RlZCBkYWlseSBsb2cgcmV0dXJucyBmb3IgZm91ciBkaWZmZXJlbnQgc3RvY2tzIG9mIHlvdXIgY2hvaWNlLiBFeHBsYWluIHlvdXIgb2JzZXJ2YXRpb25zIGluIHRlcm1zIG9mIHBvdGVudGlhbCByZWxhdGlvbnNoaXBzLg0KPC9zcGFuPg0KDQoNCmBgYHtyfQ0KIyBPbmNlIHlvdSBoYXZlIG9idGFpbmVkIHRoZSBhZGp1c3RlZCBkYWlseSBsb2cgcmV0dXJucyBmb3IgeW91ciBzdG9ja3MsIG9taXR0aW5nIHRoZSB0aW1lIGluZGV4LCB5b3Ugd2lsbCBuZWVkIHRvIGNvbWJpbmUgdGhlbSB0byBjcmVhdGUgYSBtYXRyaXguIEJlbG93IGlzIGFuIGV4YW1wbGUuICBGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgSGVscCBjb21tYW5kIGluIFIgb24gY2JpbmQsIGNvdiwgYW5kIGNvci4NCiMgTSA8LSBjYmluZChBLEIsQykgIyBjcmVhdGUgYSBtYXRyaXggd2hlcmUgZWFjaCBjb2x1bW4gaXMgYW4gYXJyYXkvdmVjdG9yIG9mIG51bWVyaWNhbCB2YWx1ZXMgDQojIGNvdihNKSAjIGNvbXB1dGUgdGhlIGNvdmFyaWFuY2UgbWF0cml4DQojIGNvcihNLCBtZXRob2Q9InBlYXJzb24iKSAjIGNvbXB1dGUgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBiYXNlZCBvbiB0aGUgUGVhcnNvbiBtZXRob2QNCmBgYA0KYGBge3J9DQpnZXRTeW1ib2xzKCJBQVBMIixzcmM9InlhaG9vIixmcm9tPSIyMDE3LTAxLTAxIikgIyNkYXRhIHN0YXJ0cyBmcm9tIDIwMTcNCmFwbFJkID0gcGVyaW9kUmV0dXJuKEFBUEwscGVyaW9kPSJkYWlseSIsdHlwZT0ibG9nIikgDQpnZXRTeW1ib2xzKCJCTVciLHNyYz0ieWFob28iLGZyb209IjIwMTctMDEtMDEiKSAjI2RhdGEgc3RhcnRzIGZyb20gMjAxNw0KQk1XUiA9IHBlcmlvZFJldHVybihCTVcscGVyaW9kPSJkYWlseSIsdHlwZT0ibG9nIikgDQpnZXRTeW1ib2xzKCJHRSIsc3JjPSJ5YWhvbyIsZnJvbT0iMjAxNy0wMS0wMSIpICMjZGF0YSBzdGFydHMgZnJvbSAyMDE3DQpHRVJkID0gcGVyaW9kUmV0dXJuKEdFLHBlcmlvZD0iZGFpbHkiLHR5cGU9ImxvZyIpIA0KZ2V0U3ltYm9scygiQUxWIixzcmM9InlhaG9vIixmcm9tPSIyMDE3LTAxLTAxIikgIyNkYXRhIHN0YXJ0cyBmcm9tIDIwMTcNCkFMVlJkID0gcGVyaW9kUmV0dXJuKEFMVixwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKSANCk0gPC0gY2JpbmQoYXBsUmQsQk1XUixHRVJkLEFMVlJkKSAjIGNyZWF0ZSBhIG1hdHJpeCB3aGVyZSBlYWNoIGNvbHVtbiBpcyBhbiBhcnJheS92ZWN0b3Igb2YgbnVtZXJpY2FsIHZhbHVlcyANCiBjb3YoTSkgIyBjb21wdXRlIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeA0KIGNvcihNKSAjIGNvbXB1dGUgdGhlIGNvdmFyaWFuY2UgbWF0cml4DQpgYGANCnRoZSBjb3JyZWxhdGlvbiBvZiBkYWlseSBncm93dGggYW1vbmcgdGhlc2UgY29tcGFuaWVzIHNlZW1zIGFsbCBpbnNpZ25pZmljYW50LCBzaW5jZSB0aGUgQUJTIG9mIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBhcmUgYWxsIHZlcnkgc21hbGwsIGFuZCBhbGwgb2YgdGhlbSBpcyB2ZXJ5IGNsb3NlIHRvIHplcm8uIA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFCKSBDYWxjdWxhdGUgdGhlIHRocmVlIHR5cGVzIG9mIHZvbGF0aWxpdHkgZm9yIGEgcGFydGljdWxhciBzdG9jayBvZiB5b3VyIGNob2ljZS4gQ29uc2lkZXIgYSB0aW1lIHdpbmRvdyBleHRlbmRpbmcgb25lIHllYXIgYmFjayBmcm9tIG1vc3QgcmVjZW50IG9idGFpbmFibGUgY2xvc2luZyBkYXkgcHJpY2UuIE9yZGVyIHRoZSB0aHJlZSBlc3RpbWF0ZXMgZnJvbSBsb3cgdG8gaGlnaCB2b2xhdGlsaXR5IGFuZCBleHBsYWluIGhvdyB0aGUgb3JkZXJpbmcgbWFrZXMgc2Vuc2UuDQo8L3NwYW4+DQpgYGB7cn0NCmdldFN5bWJvbHMoIkFBUEwiLHNyYz0ieWFob28iLGZyb209IjIwMTctMDEtMDEiKSAjI2RhdGEgc3RhcnRzIGZyb20gMjAxNw0KYXBsUmQgPSBwZXJpb2RSZXR1cm4oQUFQTCxwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKSANCiBhYXBsPUFBUExboa8yMDE3LTA0LzIwMTgtMTGhr107IG09bGVuZ3RoKGFhcGxcJEFBUEwuQ2xvc2UpOw0KIG9obGMgPC1hYXBsWyxjKCJBQVBMLk9wZW4iLCJBQVBMLkhpZ2giLCJBQVBMLkxvdyIsIkFBUEwuQ2xvc2UiKV0+IHZDbG9zZSA8LSB2b2xhdGlsaXR5KG9obGMsIG49IG0sY2FsYz0iY2xvc2UiLE49MjUyKQ0KdlBhcmtpbnNvbiA8LSB2b2xhdGlsaXR5KG9obGMsIG49IG0sY2FsYz0icGFya2luc29uIixOPTI1MikNCnZHSyA8LSB2b2xhdGlsaXR5KG9obGMsIG49IG0sY2FsYz0iZ2FybWFuIixOPTI1MikNCnZDbG9zZVttXTsgdlBhcmtpbnNvblttXTsgdkdLW21dOw0KDQpgYGB7cn0NCiMgRm9yIHRoaXMgdGFzayBtYWtlIHN1cmUgeW91IHVuZGVyc3RhbmQgd2VsbCB3aGF0IHRoZSB2YXJpYWJsZXMgbixtIHJlcHJlc2VudCBpbiB0aGUgYm9vaydzIHJlZmVyZW5jZWQgZXhhbXBsZS4NCmBgYA0KDQoNCiMjIyBUYXNrIDI6IEF1dG8tQ29ycmVsYXRpb24gYW5kIEF1dG8tUmVncmVzc2lvbg0KDQpGb2xsb3cgdGhlIGV4YW1wbGUgaW4gdGhlIGJvb2sgIGBSIEV4YW1wbGUgMy4yL3AuIDc0YCBhbmQgYFIgRXhhbXBsZSA0LjEvcC4gMTE1YA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJBKSBDYWxjdWxhdGUgdGhlIEFDRiBmb3IgYSBzdG9jayBvZiB5b3VyIGNob2ljZS4gQ29uc2lkZXIgYm90aCB0aGUgbG9nIHJldHVybiBhbmQgc3F1YXJlZCBsb2cgcmV0dXJuLiBJbnRlcnByZXQgeW91ciByZXN1bHRzIGluIHRlcm1zIG9mIHBvc3NpYmxlIGV4aXN0ZW5jZSBvZiBhdXRvY29ycmVsYXRpb24uICANCjwvc3Bhbj4NCmBgYHtyfQ0KZ2V0U3ltYm9scygiQUFQTCIsc3JjPSJ5YWhvbyIsZnJvbT0iMjAxNy0wMS0wMSIpICMjZGF0YSBzdGFydHMgZnJvbSAyMDE3DQphcGxSZCA9IHBlcmlvZFJldHVybihBQVBMLHBlcmlvZD0iZGFpbHkiLHR5cGU9ImxvZyIpIA0KZ2V0U3ltYm9scygiQk1XIixzcmM9InlhaG9vIixmcm9tPSIyMDE3LTAxLTAxIikgIyNkYXRhIHN0YXJ0cyBmcm9tIDIwMTcNCkJNV1IgPSBwZXJpb2RSZXR1cm4oQk1XLHBlcmlvZD0iZGFpbHkiLHR5cGU9ImxvZyIpIA0KZ2V0U3ltYm9scygiR0UiLHNyYz0ieWFob28iLGZyb209IjIwMTctMDEtMDEiKSAjI2RhdGEgc3RhcnRzIGZyb20gMjAxNw0KR0VSZCA9IHBlcmlvZFJldHVybihHRSxwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKSANCmdldFN5bWJvbHMoIkFMViIsc3JjPSJ5YWhvbyIsZnJvbT0iMjAxNy0wMS0wMSIpICMjZGF0YSBzdGFydHMgZnJvbSAyMDE3DQpBTFZSZCA9IHBlcmlvZFJldHVybihBTFYscGVyaW9kPSJkYWlseSIsdHlwZT0ibG9nIikgDQpNIDwtIGNiaW5kKGFwbFJkLEJNV1IsR0VSZCxBTFZSZCkNCmNvcihNLG1ldGhvZD0icGVhcnNvbiIpDQphY2YobmEub21pdChNKSxtYWluPSJhY2Ygb2YgQUxWIix5bGltPWMoLTAuMiwwLjIpKQ0KDQpgYGANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQikgUGxvdCB0aGUgZXhjaGFuZ2UgcmF0ZSBmb3IgVVNEIHZlcnN1cyBhbm90aGVyIGN1cnJlbmN5IG9mIHlvdXIgY2hvaWNlLiBJbnRlcnByZXQgeW91ciByZXN1bHRzIGluIHRlcm1zIG9mIGJlaGF2aW9yLg0KPC9zcGFuPg0KYGBge3J9DQogZ2V0RlgoIkNOWS9VU0QiKSAjZG93bmxvYWQgQ05ZL1VTRCByYXRlcyBmcm9tIG9hbmRhLmNvbQ0KcGxvdChDTllVU0QpDQoNCmBgYA0KRnJvbSB0aGUgZ3JhcGgsIHRoZSBDTlkvVVNEIHJhdGUgZGVjbGluZWQgc2lnbmlmaWNhbnRseSBkdXJpbmcgdGhlIGp1bmUgJiBqdWx5LCBhbmQgcmV0YWluZWQgc3RhYmxlIGZyb20gdGhlbiBvbiwgZmx1Y3R1YXRpbmcgYnd0d2VlbiB0aGUgcmFuZ2Ugb2YgMC4xNDQgdG8gMC4xNDcuDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMkMpIFRlc3QgZm9yIHRoZSBwb3NzaWJsZSBleGlzdGVuY2Ugb2YgYW4gdW5kZXJseWluZyBBUigxKSDigD8gTWFya292IHByb2Nlc3MgaW4geW91ciBleGNoYW5nZSByYXRlIGN1cnJlbmN5IHBhaXIuIFRvIHRoaXMgZW5kLCBwbG90IHRoZSBBQ0YgYW5kIHRoZSBwYXJ0aWFsIEFDRiAoUEFDRikuIEludGVycHJldCB5b3VyIHJlc3VsdHMuICBDbGVhcmx5IHJlZmVyIHRvIHRoZSBsYWdzLCBhbmQgdGhlaXIgaW1wYWN0cyBpbiBkZXRlcm1pbmluZyB0aGUgb3JkZXIuDQo8L3NwYW4+DQpgYGB7cn0NCiBnZXRGWCgiQ05ZL1VTRCIpICNkb3dubG9hZCBDTlkvVVNEIHJhdGVzIGZyb20gb2FuZGEuY29tDQpwbG90KENOWVVTRCkNCiBhY2YoQ05ZVVNEKQ0KIHBhY2YoQ05ZVVNEKQ0KYGBgDQpUaGUgUEFDRiBmdW5jdGlvbiBpbiBSIHByb3ZpZGVzIGEgZnVuY3Rpb25hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFyaW91cyBvcmRlcnMgc3RyZW5ndGguIFRoZSBBQ0YgZ3JhcGggaW5kaWNhdGVzIGEgZXhwb25lbnRpYWwgZGVjYXkgb2YgdGhlIHRpbWUgbGFnICx0aGlzIG1lYW5zIG1vcmUgd2VpZ2h0IG9uIHRoZSByYXRlIHJlY2VudGx5LCB3aGVuIHRoZSB0aW1lIGxhZyBpcyBiaWcgLHRoZSB3ZWlnaHQgaXMgbG93LlRoZSBzdW0gaXMgc3VjaCB0aGF0IHRoZSBmdXJ0aGVyIGF3YXkgaW4gdGhlIHBhc3QgY29udHJpYnV0ZSBsZXNzIHRvIHRoZSBzdW0uDQojIyMgVGFzayAzOiBHcmFuZ2VyIENhdXNhbGl0eSBUZXN0DQoNClRvIGNvbmR1Y3QgdGhpcyB0ZXN0IHRoZSBwYWNrYWdlIGBsbXRlc3RgIHdpbGwgYmUgcmVxdWlyZWQsIGFzIGFscmVhZHkgZG9uZSBpbiB0aGUgY29kZSBjaHVuayBiZWxvdy4NCg0KYGBge3J9DQojIFJlcXVpcmUgd2lsbCBsb2FkIHRoZSBwYWNrYWdlIG9ubHkgaWYgbm90IGluc3RhbGxlZCANCiMgRGVwZW5kZW5jaWVzID0gVFJVRSBtYWtlcyBzdXJlIHRoYXQgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsDQppZighcmVxdWlyZSgibG10ZXN0IixxdWlldGx5ID0gVFJVRSkpDQogIGluc3RhbGwucGFja2FnZXMoImxtdGVzdCIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikNCg0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgM0EpIEluY2x1ZGUgYmVsb3cgdGhlIGNvZGUgY2h1bmsgdG8gc29sdmUgZm9yIDMuNS43IFIgTGFiL3AuIDEwNi4gIFdyaXRlIHlvdXIgY29uY2x1c2lvbnMuDQo8L3NwYW4+DQpgYGB7cn0NCmdyYW5nZXJ0ZXN0KGNoaWNrZW4gfiBlZ2csIG9yZGVyID0gMywgZGF0YSA9IENoaWNrRWdnKQ0KZ3JhbmdlcnRlc3QoZWdnIH4gY2hpY2tlbiwgb3JkZXIgPSAzLCBkYXRhID0gQ2hpY2tFZ2cpDQpgYGANCnRoZSBmaXJzdCBjYXVzYWxpdHkgd2hpY2ggdGVzdHMgY2hpY2tlbiBjYXVzZXMgZWdncyBoYXMgYSBwLXZhbHVlIG9mIDAuMDAzMDwwLjA1LCBzbyByZWplY3QgSDAsIGl0IG1lYW5zIHRoYXQgY2hpY2tlbiBkb2VzIGNhdXNlIGVnZ3MuDQp0aGUgc2Vjb25kIGNhdXNhbGl0eSB3aGljaCB0ZXN0cyBlZ2dzIGNhdXNlIGNoaWNrZW4gaGFzIGEgcC12YWx1ZSBvZiAwLjYyMzggPjAuMDUgLHNvIGFjY2VwdCB0aGUgSDAsIGl0IG1lc25zLCBlZ2dzIGRvZXMgbm90IGNhdXNlIGNoaWNrZW4uDQoNCiMgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0YSB1c2VkIGluIHRlc3RpbmcgZm9yIGNhdXNhbGl0eSBjYW4gYmUgb2J0YWluZWQgYnkgdHlwaW5nIHRoZSBuYW1lIG9mIHRoZSBkYXRhIHNldCBgQ2hpY2tFZ2dgIGluIHRoZSBSIEhlbHAgbWVudS4NCg0KDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgM0IpIEJyaWVmbHkgZGVzY3JpYmUgdGhlIGRhdGEgaW4gdGVybXMgb2YgdGltZSByYW5nZSBhbmQgdmFyaWFibGVzLiBTaW1pbGFyIHRvIHRoZSBsaW5lYXIgYXV0b2VncmVzc2l2ZSBtb2RlbCBkZXNjcmliZWQgaW4gY2xhc3MsIHdyaXRlIHRoZSBtYXRoZW1hdGljYWwgcmVncmVzc2lvbiBtb2RlbCBzb2x2ZWQgaW4gZWFjaCBHcmFuZ2VyIHRlc3QsIGluY2x1ZGluZyB0aGUgcHJvcGVyIG9yZGVyLiBVc2UgbmFtaW5nIGNvbnZlbnRpb25zLCBhbmQgbm90YXRpb25zIG1vcmUgcmVmbGVjdGl2ZSBvZiB0aGUgZGF0YSBzZXQgY29uc2lkZXJlZCBmb3IgIGBDaGlja0VnZ2AuDQo8L3NwYW4+DQohW0NhcHRpb24gSGVyZV0oaG9tZXdvcmszYmIuanBnKQ0KDQoNCiMjIyBUYXNrIDQ6IE1hdGhlbWF0aWNhbCBQcm9vZg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDRBKSBQcm92ZSB0aGUgdHdvIHJlc3VsdHMgaW4gRXEgKDIuMzIpL3AuIDUzLiAgTm8gUi1jb2RpbmcgaXMgbmVlZGVkIGhlcmUuICBDbGVhcmx5IHNob3cgeW91ciBzdGVwcy4gSGludDogVXNlIHRoZSBkZWZpbml0aW9uIG9mICRFKFhebikkIGZvciBYLWxvZyBub3JtYWxseSBkaXN0cmlidXRlZC4gICBPYnNlcnZlIGFsc28gdGhhdCAkVmFyKFgpID0gRShYXjIpLUVeMihYKSQgZm9yIGFueSByYW5kb20gdmFyaWFibGUgWC4NCjwvc3Bhbj4NCiFbQ2FwdGlvbiBIZXJlXShob21ld29yazQuanBnKQ0KDQoNCg0KDQoqW2h0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSBdKGh0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSkNCg==