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
#symbols=c('TSLA','BABA','AMZN','FB',src="yahoo")
symbols=c('TSLA','BABA','AMZN','FB')
getSymbols(symbols,src='yahoo')
[1] "TSLA" "BABA" "AMZN" "FB"
tsladr=periodReturn(TSLA,period="daily",type="log")
babadr=periodReturn(BABA,period="daily",type="log")
fbdr=periodReturn(FB,period="daily",type="log")
amzndr=periodReturn(AMZN,period="daily",type="log")
tsla=as.numeric(tsladr)
baba=as.numeric(babadr)
fb=as.numeric(fbdr)
amzn=as.numeric(amzndr)
M<-cbind(tsla,baba,fb,amzn)
number of rows of result is not a multiple of vector length (arg 1)
cov(M)
tsla baba fb amzn
tsla 1.189734e-03 -7.985977e-06 -1.366790e-05 1.448781e-05
baba -7.985977e-06 4.048232e-04 2.972979e-06 -4.638111e-06
fb -1.366790e-05 2.972979e-06 5.439723e-04 5.046654e-06
amzn 1.448781e-05 -4.638111e-06 5.046654e-06 6.011452e-04
cor(M, method="pearson")
tsla baba fb amzn
tsla 1.00000000 -0.011507220 -0.016989808 0.017131207
baba -0.01150722 1.000000000 0.006335352 -0.009401968
fb -0.01698981 0.006335352 1.000000000 0.008825217
amzn 0.01713121 -0.009401968 0.008825217 1.000000000
##### 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.
symbols=c('TSLA')
getSymbols(symbols,src='yahoo',from="2017-12-28",to="2018-11-28")
[1] "TSLA"
#obtain adjusted closed
tsla=TSLA['2017-9/2018-10']
geAdj=TSLA$TSLA.Adjusted["2017-9/2018-10"]
# m is the length of the sample for the volatility estimate
m=length(geAdj)
ohlc<-tsla[,c("TSLA.Open","TSLA.High","TSLA.Low","TSLA.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)
vGK[m];vparkinson[m];vclose[m]
[,1]
2018-10-31 0.4311069
[,1]
2018-10-31 0.4413705
[,1]
2018-10-31 0.5883708
Volatility of parkinson is to compute fluctuation within one day,based on high price and low price; Volatility of garman is to compute fluctuatation within one day, based on high price and low price, and closed price and open price. The volatility of closed price is fluctuation based on two closed price between two days. The order of three types of volatility shows that fluctuation of the closed prices of tsla is more than other two, which are based on high price and low price, and closed price and open price.
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.
getSymbols("TSLA",src = "yahoo")
[1] "TSLA"
adldr=periodReturn(TSLA$TSLA.Adjusted,period='daily',type="log")*100
adldrs=periodReturn(TSLA$TSLA.Adjusted,period="daily",type="log")^2*100
acf(adldr,main="ACF of TSLA",ylim=c(-0.2,0.2))

acf(adldrs,main="ACF of TSLA",ylim=c(-0.3,0.5))

##### 2B) Plot the exchange rate for USD versus another currency of your choice. Interpret your results in terms of behavior.
getFX("USD/CNY", src="yahoo")
[1] "USDCNY"
plot(USDCNY)

As time goes,the exchange rate of USD versus CNY is climbing. To be specific, the exchange rate of USD versus CNY soared from 7 Jun to 20 August.
##### 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(USDCNY)

In the formula: \[X_t=\sum_{k=1}^{p}∅_kX_{t-k}+W_t\] In the graph of acf, there is gradually exponential decay for successive lags. it means that relationship between the rate of exchange and previous data is strong linear in first order of lag, but after first lag, the linear relationship gradually fades.
plot(pacf(USDCNY))


The graph of pacf confrims that the order of autoregressive process having strong linear relationship is 1.
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.
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
Conclusion: chicken doesn’t cause egg, but egg causes chicken.
##### 3B) Briefly describe the data in terms of time range and variables. Similar to the linear autoregressive 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.
\(Y_t=a_0+a_1Y_1+a_2Y_2+a_3Y_3+b_1 X_1+b_2X_2+b_3X_3\)
In the first Granger causality test, chicken is x and egg is y, when p-value is greater than 0.5, and one accept null hypothesis,which is \(b_1=b_2=b_3=0\), thus chicken doesn’t cause egg.
In the second Granger causality test, egg is x and chicken is y, when p-value is less than 0.5, and one rejects null hypothesis,which is \(b_1=b_2=b_3=0\), thus egg causes chicken.
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. The moments of the variable X are \(E(X^n)=e^{nu+1/2n^2\sigma^2}\),n>0� assuming \({R_{t}}\) is log-normally distributed, since \(r_{t}=ln(R_{t}+1)\) \(e^{r}=R+1\), then \(R=e^{r}-1\),in \(E(X^n)=e^{nu+1/2n^2\sigma^2}\)
when n=1: \(E(R)=u_R=e^{u_r+\sigma^2_r/2}-1\)
when n=2,input in formula , the result \(E(x^2)=E(R^2)-E^2(R)=e^{2u_r+2\sigma^2_r}-(e^{u_r+\sigma^2_r/2})^2=e^{2u_r+\sigma^2_r}(e^{\sigma^2_r}-1)\)
*http://computationalfinance.lsi.upc.edu
LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDAzIgphdXRob3I6ICJZdSBKaWEiCmRhdGU6ICIxMS8yOC8yMDE4IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKc3VidGl0bGU6IFZhcmlhbmNlLCBDb3ZhcmlhbmNlLCBDb3JyZWxhdGlvbiAmIENhdXNhbGl0eSAoZmluYzYyMS1sYWIwMykKLS0tCgojIyMgQWJvdXQKCkluIHRoaXMgd29ya3NoZWV0IHdlIGxvb2sgYXQgZGlmZmVyZW50IHZhcmlhbmNlLCBjb3ZhcmlhbmNlLCB2b2xhdGlsaXR5LCBhbmQgY2F1c2FsaXR5IGNhbGN1bGF0aW9ucy4gV2UgZmluaXNoIHdpdGggYSBzaG9ydCBtYXRlbWF0aWNhbCBwcm9vZiAobm8gUiByZXF1aXJlZCkuICAKCiMjIyBTZXR1cAoKUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIAoKIyMjIE5vdGUKCkZvciBjbGFyaXR5LCB0YXNrcy9xdWVzdGlvbnMgdG8gYmUgY29tcGxldGVkL2Fuc3dlcmVkIGFyZSBoaWdobGlnaHRlZCBpbiByZWQgY29sb3IgKGNvbG9yIHZpc2libGUgb25seSBpbiBwcmV2aWV3IG1vZGUpIGFuZCBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgcGFydGljdWxhciBwbGFjZW1lbnQgaW4gdGhlIHRhc2sgc2VjdGlvbi4gIFR5cGUgeW91ciBhbnN3ZXJzIG91dHNpZGUgdGhlIHJlZCBjb2xvciB0YWdzIQoKUXVpdGUgb2Z0ZW4geW91IHdpbGwgbmVlZCB0byBhZGQgeW91ciBvd24gY29kZSBjaHVuay4gRXhlY3V0ZSBzZXF1ZW50aWFsbHkgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTWFrZSBzdXJlIHRvIGFkZCBjb21tZW50cyB0byB5b3VyIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuIFVzZSBvd24gbGFuZ3VhZ2UhCgoqKkFueSBzaWduIG9mIHBsYWdpYXJpc20sIHdpbGwgcmVzdWx0IGluIGRpc3NtaXNzYWwgb2Ygd29yayEqKgoKLS0tLS0tLS0tLS0tLS0KCiMjIyBUYXNrIDE6IFZhcmlhbmNlLCBDb3ZhcmlhbmNlLCBhbmQgVm9sYXRpbGl0eQoKVGhpcyB0YXNrIGZvbGxvd3MgdGhlIHR3byBleGFtcGxlcyBpbiB0aGUgYm9vayBgUiBFeGFtcGxlIDIuNS9wLiA1OGAgYW5kIGBSIEV4YW1wbGUgMi42L3AuIDY2YCAKCmBgYHtyfQojIFJlcXVpcmUgd2lsbCBsb2FkIHRoZSBwYWNrYWdlIG9ubHkgaWYgbm90IGluc3RhbGxlZCAKIyBEZXBlbmRlbmNpZXMgPSBUUlVFIG1ha2VzIHN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGwKaWYoIXJlcXVpcmUoInF1YW50bW9kIixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpCmBgYAoKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQSkgQ2FsY3VsYXRlIHRoZSBjb3JyZWxhdGlvbiBhbmQgY292YXJpYW5jZSBtYXRyaXggb2YgdGhlIGFkanVzdGVkIGRhaWx5IGxvZyByZXR1cm5zIGZvciBmb3VyIGRpZmZlcmVudCBzdG9ja3Mgb2YgeW91ciBjaG9pY2UuIEV4cGxhaW4geW91ciBvYnNlcnZhdGlvbnMgaW4gdGVybXMgb2YgcG90ZW50aWFsIHJlbGF0aW9uc2hpcHMuCjwvc3Bhbj4KCmBgYHtyfQojIE9uY2UgeW91IGhhdmUgb2J0YWluZWQgdGhlIGFkanVzdGVkIGRhaWx5IGxvZyByZXR1cm5zIGZvciB5b3VyIHN0b2Nrcywgb21pdHRpbmcgdGhlIHRpbWUgaW5kZXgsIHlvdSB3aWxsIG5lZWQgdG8gY29tYmluZSB0aGVtIHRvIGNyZWF0ZSBhIG1hdHJpeC4gQmVsb3cgaXMgYW4gZXhhbXBsZS4gIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBIZWxwIGNvbW1hbmQgaW4gUiBvbiBjYmluZCwgY292LCBhbmQgY29yLgojIE0gPC0gY2JpbmQoQSxCLEMpICMgY3JlYXRlIGEgbWF0cml4IHdoZXJlIGVhY2ggY29sdW1uIGlzIGFuIGFycmF5L3ZlY3RvciBvZiBudW1lcmljYWwgdmFsdWVzIAojIGNvdihNKSAjIGNvbXB1dGUgdGhlIGNvdmFyaWFuY2UgbWF0cml4CiMgY29yKE0sIG1ldGhvZD0icGVhcnNvbiIpICMgY29tcHV0ZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IGJhc2VkIG9uIHRoZSBQZWFyc29uIG1ldGhvZAojc3ltYm9scz1jKCdUU0xBJywnQkFCQScsJ0FNWk4nLCdGQicsc3JjPSJ5YWhvbyIpCnN5bWJvbHM9YygnVFNMQScsJ0JBQkEnLCdBTVpOJywnRkInKQpnZXRTeW1ib2xzKHN5bWJvbHMsc3JjPSd5YWhvbycpCnRzbGFkcj1wZXJpb2RSZXR1cm4oVFNMQSxwZXJpb2Q9ImRhaWx5Iix0eXBlPSJsb2ciKQpiYWJhZHI9cGVyaW9kUmV0dXJuKEJBQkEscGVyaW9kPSJkYWlseSIsdHlwZT0ibG9nIikKZmJkcj1wZXJpb2RSZXR1cm4oRkIscGVyaW9kPSJkYWlseSIsdHlwZT0ibG9nIikKYW16bmRyPXBlcmlvZFJldHVybihBTVpOLHBlcmlvZD0iZGFpbHkiLHR5cGU9ImxvZyIpCnRzbGE9YXMubnVtZXJpYyh0c2xhZHIpCmJhYmE9YXMubnVtZXJpYyhiYWJhZHIpCmZiPWFzLm51bWVyaWMoZmJkcikKYW16bj1hcy5udW1lcmljKGFtem5kcikKTTwtY2JpbmQodHNsYSxiYWJhLGZiLGFtem4pCmNvdihNKQpjb3IoTSwgbWV0aG9kPSJwZWFyc29uIikKCmBgYAoKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQikgQ2FsY3VsYXRlIHRoZSB0aHJlZSB0eXBlcyBvZiB2b2xhdGlsaXR5IGZvciBhIHBhcnRpY3VsYXIgc3RvY2sgb2YgeW91ciBjaG9pY2UuIENvbnNpZGVyIGEgdGltZSB3aW5kb3cgZXh0ZW5kaW5nIG9uZSB5ZWFyIGJhY2sgZnJvbSBtb3N0IHJlY2VudCBvYnRhaW5hYmxlIGNsb3NpbmcgZGF5IHByaWNlLiBPcmRlciB0aGUgdGhyZWUgZXN0aW1hdGVzIGZyb20gbG93IHRvIGhpZ2ggdm9sYXRpbGl0eSBhbmQgZXhwbGFpbiBob3cgdGhlIG9yZGVyaW5nIG1ha2VzIHNlbnNlLgo8L3NwYW4+CgpgYGB7cn0KIyBGb3IgdGhpcyB0YXNrIG1ha2Ugc3VyZSB5b3UgdW5kZXJzdGFuZCB3ZWxsIHdoYXQgdGhlIHZhcmlhYmxlcyBuLG0gcmVwcmVzZW50IGluIHRoZSBib29rJ3MgcmVmZXJlbmNlZCBleGFtcGxlLgpzeW1ib2xzPWMoJ1RTTEEnKQpnZXRTeW1ib2xzKHN5bWJvbHMsc3JjPSd5YWhvbycsZnJvbT0iMjAxNy0xMi0yOCIsdG89IjIwMTgtMTEtMjgiKQogI29idGFpbiBhZGp1c3RlZCBjbG9zZWQKdHNsYT1UU0xBWycyMDE3LTkvMjAxOC0xMCddCmdlQWRqPVRTTEEkVFNMQS5BZGp1c3RlZFsiMjAxNy05LzIwMTgtMTAiXQojIG0gaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2FtcGxlIGZvciB0aGUgdm9sYXRpbGl0eSBlc3RpbWF0ZQptPWxlbmd0aChnZUFkaikgCm9obGM8LXRzbGFbLGMoIlRTTEEuT3BlbiIsIlRTTEEuSGlnaCIsIlRTTEEuTG93IiwiVFNMQS5DbG9zZSIpXQp2Y2xvc2U8LXZvbGF0aWxpdHkob2hsYyxuPW0sY2FsYz0iY2xvc2UiLE49MjUyKQp2cGFya2luc29uPC12b2xhdGlsaXR5KG9obGMsbj1tLGNhbGM9InBhcmtpbnNvbiIsTj0yNTIpCnZHSzwtdm9sYXRpbGl0eShvaGxjLG49bSxjYWxjPSJnYXJtYW4iLE49MjUyKQoKdkdLW21dO3ZwYXJraW5zb25bbV07dmNsb3NlW21dCmBgYAogVm9sYXRpbGl0eSBvZiBwYXJraW5zb24gaXMgdG8gY29tcHV0ZSBmbHVjdHVhdGlvbiB3aXRoaW4gb25lIGRheSxiYXNlZCBvbiBoaWdoIHByaWNlIGFuZCBsb3cgcHJpY2U7CiBWb2xhdGlsaXR5IG9mIGdhcm1hbiBpcyB0byBjb21wdXRlIGZsdWN0dWF0YXRpb24gd2l0aGluIG9uZSBkYXksIGJhc2VkIG9uIGhpZ2ggcHJpY2UgYW5kIGxvdyBwcmljZSwgYW5kIGNsb3NlZCBwcmljZSBhbmQgb3BlbiBwcmljZS4gVGhlIHZvbGF0aWxpdHkgb2YgY2xvc2VkIHByaWNlIGlzIGZsdWN0dWF0aW9uIGJhc2VkIG9uIHR3byBjbG9zZWQgcHJpY2UgYmV0d2VlbiB0d28gZGF5cy4gVGhlIG9yZGVyIG9mIHRocmVlIHR5cGVzIG9mIHZvbGF0aWxpdHkgc2hvd3MgdGhhdCBmbHVjdHVhdGlvbiBvZiB0aGUgY2xvc2VkIHByaWNlcyBvZiB0c2xhIGlzIG1vcmUgdGhhbiBvdGhlciB0d28sIHdoaWNoIGFyZSBiYXNlZCBvbiBoaWdoIHByaWNlIGFuZCBsb3cgcHJpY2UsIGFuZCBjbG9zZWQgcHJpY2UgYW5kIG9wZW4gcHJpY2UuICAKCgoKIyMjIFRhc2sgMjogQXV0by1Db3JyZWxhdGlvbiBhbmQgQXV0by1SZWdyZXNzaW9uCgpGb2xsb3cgdGhlIGV4YW1wbGUgaW4gdGhlIGJvb2sgIGBSIEV4YW1wbGUgMy4yL3AuIDc0YCBhbmQgYFIgRXhhbXBsZSA0LjEvcC4gMTE1YAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJBKSBDYWxjdWxhdGUgdGhlIEFDRiBmb3IgYSBzdG9jayBvZiB5b3VyIGNob2ljZS4gQ29uc2lkZXIgYm90aCB0aGUgbG9nIHJldHVybiBhbmQgc3F1YXJlZCBsb2cgcmV0dXJuLiBJbnRlcnByZXQgeW91ciByZXN1bHRzIGluIHRlcm1zIG9mIHBvc3NpYmxlIGV4aXN0ZW5jZSBvZiBhdXRvY29ycmVsYXRpb24uICAKPC9zcGFuPgoKYGBge3J9CmdldFN5bWJvbHMoIlRTTEEiLHNyYyA9ICJ5YWhvbyIpCmFkbGRyPXBlcmlvZFJldHVybihUU0xBJFRTTEEuQWRqdXN0ZWQscGVyaW9kPSdkYWlseScsdHlwZT0ibG9nIikqMTAwCmFkbGRycz1wZXJpb2RSZXR1cm4oVFNMQSRUU0xBLkFkanVzdGVkLHBlcmlvZD0iZGFpbHkiLHR5cGU9ImxvZyIpXjIqMTAwCmFjZihhZGxkcixtYWluPSJBQ0Ygb2YgVFNMQSIseWxpbT1jKC0wLjIsMC4yKSkKYWNmKGFkbGRycyxtYWluPSJBQ0Ygb2YgVFNMQSIseWxpbT1jKC0wLjMsMC41KSkKCmBgYAoKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQikgUGxvdCB0aGUgZXhjaGFuZ2UgcmF0ZSBmb3IgVVNEIHZlcnN1cyBhbm90aGVyIGN1cnJlbmN5IG9mIHlvdXIgY2hvaWNlLiBJbnRlcnByZXQgeW91ciByZXN1bHRzIGluIHRlcm1zIG9mIGJlaGF2aW9yLgo8L3NwYW4+CgpgYGB7cn0KCmdldEZYKCJVU0QvQ05ZIiwgc3JjPSJ5YWhvbyIpCgpgYGAKCkFzIHRpbWUgZ29lcyx0aGUgZXhjaGFuZ2UgcmF0ZSBvZiBVU0QgdmVyc3VzIENOWSBpcyBjbGltYmluZy4gVG8gYmUgc3BlY2lmaWMsIHRoZSBleGNoYW5nZSByYXRlIG9mIFVTRCB2ZXJzdXMgQ05ZIHNvYXJlZCBmcm9tIDcgSnVuIHRvIDIwIEF1Z3VzdC4gCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkMpIFRlc3QgZm9yIHRoZSBwb3NzaWJsZSBleGlzdGVuY2Ugb2YgYW4gdW5kZXJseWluZyBBUigxKSDigJMgTWFya292IHByb2Nlc3MgaW4geW91ciBleGNoYW5nZSByYXRlIGN1cnJlbmN5IHBhaXIuIFRvIHRoaXMgZW5kLCBwbG90IHRoZSBBQ0YgYW5kIHRoZSBwYXJ0aWFsIEFDRiAoUEFDRikuIEludGVycHJldCB5b3VyIHJlc3VsdHMuICBDbGVhcmx5IHJlZmVyIHRvIHRoZSBsYWdzLCBhbmQgdGhlaXIgaW1wYWN0cyBpbiBkZXRlcm1pbmluZyB0aGUgb3JkZXIuCjwvc3Bhbj4KCmBgYHtyfQphY2YoVVNEQ05ZKQpgYGAKSW4gdGhlIGZvcm11bGE6ICQkWF90PVxzdW1fe2s9MX1ee3B94oiFX2tYX3t0LWt9K1dfdCQkCkluIHRoZSBncmFwaCBvZiBhY2YsIHRoZXJlIGlzIGdyYWR1YWxseSBleHBvbmVudGlhbCBkZWNheSBmb3Igc3VjY2Vzc2l2ZSBsYWdzLiBpdCBtZWFucyB0aGF0IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSByYXRlIG9mIGV4Y2hhbmdlIGFuZCBwcmV2aW91cyBkYXRhIGlzIHN0cm9uZyBsaW5lYXIgaW4gZmlyc3Qgb3JkZXIgb2YgbGFnLCBidXQgYWZ0ZXIgZmlyc3QgbGFnLCB0aGUgbGluZWFyIHJlbGF0aW9uc2hpcCBncmFkdWFsbHkgZmFkZXMuCgpgYGB7cn0KcGFjZihVU0RDTlkpCgpgYGAKClRoZSBncmFwaCBvZiBwYWNmIGNvbmZyaW1zIHRoYXQgdGhlIG9yZGVyIG9mIGF1dG9yZWdyZXNzaXZlIHByb2Nlc3MgaGF2aW5nIHN0cm9uZyBsaW5lYXIgcmVsYXRpb25zaGlwIGlzIDEuCgojIyMgVGFzayAzOiBHcmFuZ2VyIENhdXNhbGl0eSBUZXN0CgpUbyBjb25kdWN0IHRoaXMgdGVzdCB0aGUgcGFja2FnZSBgbG10ZXN0YCB3aWxsIGJlIHJlcXVpcmVkLCBhcyBhbHJlYWR5IGRvbmUgaW4gdGhlIGNvZGUgY2h1bmsgYmVsb3cuCgpgYGB7cn0KIyBSZXF1aXJlIHdpbGwgbG9hZCB0aGUgcGFja2FnZSBvbmx5IGlmIG5vdCBpbnN0YWxsZWQgCiMgRGVwZW5kZW5jaWVzID0gVFJVRSBtYWtlcyBzdXJlIHRoYXQgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsCmlmKCFyZXF1aXJlKCJsbXRlc3QiLHF1aWV0bHkgPSBUUlVFKSkKICBpbnN0YWxsLnBhY2thZ2VzKCJsbXRlc3QiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpCmBgYAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDNBKSBJbmNsdWRlIGJlbG93IHRoZSBjb2RlIGNodW5rIHRvIHNvbHZlIGZvciAzLjUuNyBSIExhYi9wLiAxMDYuICBXcml0ZSB5b3VyIGNvbmNsdXNpb25zLgo8L3NwYW4+CgpgYGB7cn0KIyBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhIHVzZWQgaW4gdGVzdGluZyBmb3IgY2F1c2FsaXR5IGNhbiBiZSBvYnRhaW5lZCBieSB0eXBpbmcgdGhlIG5hbWUgb2YgdGhlIGRhdGEgc2V0IGBDaGlja0VnZ2AgaW4gdGhlIFIgSGVscCBtZW51LgoKZ3JhbmdlcnRlc3QoZWdnfmNoaWNrZW4sb3JkZXI9MyxkYXRhPUNoaWNrRWdnKQoKZ3JhbmdlcnRlc3QoY2hpY2tlbn5lZ2csb3JkZXI9MyxkYXRhPUNoaWNrRWdnKQoKYGBgCgpDb25jbHVzaW9uOiBjaGlja2VuIGRvZXNuJ3QgY2F1c2UgZWdnLCBidXQgZWdnIGNhdXNlcyBjaGlja2VuLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDNCKSBCcmllZmx5IGRlc2NyaWJlIHRoZSBkYXRhIGluIHRlcm1zIG9mIHRpbWUgcmFuZ2UgYW5kIHZhcmlhYmxlcy4gU2ltaWxhciB0byB0aGUgbGluZWFyIGF1dG9yZWdyZXNzaXZlIG1vZGVsIGRlc2NyaWJlZCBpbiBjbGFzcywgd3JpdGUgdGhlIG1hdGhlbWF0aWNhbCByZWdyZXNzaW9uIG1vZGVsIHNvbHZlZCBpbiBlYWNoIEdyYW5nZXIgdGVzdCwgaW5jbHVkaW5nIHRoZSBwcm9wZXIgb3JkZXIuIFVzZSBuYW1pbmcgY29udmVudGlvbnMsIGFuZCBub3RhdGlvbnMgbW9yZSByZWZsZWN0aXZlIG9mIHRoZSBkYXRhIHNldCBjb25zaWRlcmVkIGZvciAgYENoaWNrRWdnYC4KPC9zcGFuPgoKJFlfdD1hXzArYV8xWV8xK2FfMllfMithXzNZXzMrYl8xIFhfMStiXzJYXzIrYl8zWF8zJAoKSW4gdGhlIGZpcnN0IEdyYW5nZXIgY2F1c2FsaXR5IHRlc3QsIGNoaWNrZW4gaXMgeCBhbmQgZWdnIGlzIHksIHdoZW4gcC12YWx1ZSBpcyBncmVhdGVyIHRoYW4gMC41LCBhbmQgb25lIGFjY2VwdCBudWxsIGh5cG90aGVzaXMsd2hpY2ggaXMgJGJfMT1iXzI9Yl8zPTAkLCB0aHVzIGNoaWNrZW4gZG9lc24ndCBjYXVzZSBlZ2cuCgpJbiB0aGUgc2Vjb25kIEdyYW5nZXIgY2F1c2FsaXR5IHRlc3QsIGVnZyBpcyB4IGFuZCBjaGlja2VuIGlzIHksIHdoZW4gcC12YWx1ZSBpcyBsZXNzIHRoYW4gMC41LCBhbmQgb25lIHJlamVjdHMgbnVsbCBoeXBvdGhlc2lzLHdoaWNoIGlzICRiXzE9Yl8yPWJfMz0wJCwgdGh1cyBlZ2cgY2F1c2VzIGNoaWNrZW4uCgoKIyMjIFRhc2sgNDogTWF0aGVtYXRpY2FsIFByb29mCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgNEEpIFByb3ZlIHRoZSB0d28gcmVzdWx0cyBpbiBFcSAoMi4zMikvcC4gNTMuICBObyBSLWNvZGluZyBpcyBuZWVkZWQgaGVyZS4gIENsZWFybHkgc2hvdyB5b3VyIHN0ZXBzLiBIaW50OiBVc2UgdGhlIGRlZmluaXRpb24gb2YgJEUoWF5uKSQgZm9yIFgtbG9nIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiAgIE9ic2VydmUgYWxzbyB0aGF0ICRWYXIoWCkgPSBFKFheMiktRV4yKFgpJCBmb3IgYW55IHJhbmRvbSB2YXJpYWJsZSBYLgo8L3NwYW4+ClRoZSBtb21lbnRzIG9mIHRoZSB2YXJpYWJsZSBYIGFyZQokRShYXm4pPWVee251KzEvMm5eMlxzaWdtYV4yfSQsbj4w77+9CmFzc3VtaW5nICR7Ul97dH19JCBpcyBsb2ctbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIHNpbmNlICRyX3t0fT1sbihSX3t0fSsxKSQKJGVee3J9PVIrMSQsIHRoZW4gJFI9ZV57cn0tMSQsaW4gJEUoWF5uKT1lXntudSsxLzJuXjJcc2lnbWFeMn0kCgp3aGVuIG49MTogJEUoUik9dV9SPWVee3Vfcitcc2lnbWFeMl9yLzJ9LTEkCgp3aGVuIG49MixpbnB1dCBpbiBmb3JtdWxhICwgdGhlIHJlc3VsdCAkRSh4XjIpPUUoUl4yKS1FXjIoUik9ZV57MnVfcisyXHNpZ21hXjJfcn0tKGVee3Vfcitcc2lnbWFeMl9yLzJ9KV4yPWVeezJ1X3IrXHNpZ21hXjJfcn0oZV57XHNpZ21hXjJfcn0tMSkkCgoKCipbaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1IF0oaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1KQo=