About
This worksheet looks at VaR calculations for the two cases of single and multiple equity asset. This is the last lab worksheet, other than the extra credit assignment.
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
Always read carefully the instructions on Sakai. For clarity, tasks/questions to be completed/answered are highlighted in red color (visible in preview) and numbered according to their particular placement in the task section. Quite often you will need to add your own code chunk.
Execute all code chunks, preview, publish, and submit link on Sakai follwoing the naming convention. Make sure to add comments to your code where appropriate. Use own language!
Task 1: VaR Calculations: Single Equity Asset
#Install package quantmod
install.packages("quantmod")
Error in install.packages : Updating loaded packages
library("quantmod")
Consider the time series of a stock of your choice (other than AAPL and your colleague!) and for the time-period from Jan 1, 2015 to present.
We will first generate the historical time series of daily log returns, and calculate the mean and standard deviation of the time series.
##### 1A) Calculate the historical daily log returns, mean and standard deviation
getSymbols("JD",src="yahoo",from="2015-01-01",to=Sys.Date())
[1] "JD"
# jd stock jd log-return
jdreturn<-dailyReturn(JD$JD.Adjusted,type="log")
# jd log-return mean
jdm<-mean(jdreturn)
jdm
[1] 5.499947e-05
# jd log-return standard diviation
jdsd<-sd(jdreturn)
jdsd
[1] 0.02547218
Given a time series we can generate a histogram and mark the quantile value that corresponds to the 95% confidence level. The quantile value in this case is the critical value for which 95% of the data is on the right (higher) of the critical value as represented by the histogram. The remaining 5% will be on the left. To find the quantile value you will need to use the function quantile() with the proper arguments. For example quantile(xts,probs=0.01) applies to a time series xts and return the critical value correspondng to 99% confidence level.
##### 1B) Plot a histogram and mark the quantile value that corresponds to 95% confidence level. A mark can be added to a plot by using the function abline().
# plot jd log return
hist(jdreturn,breaks = 200,manin="jd log-return histogram",xlab = "jd log-return",ylab = "frequency")
# get quantile of jd log-return.
q1<-quantile(jdreturn,probs=0.05)
q1
5%
-0.04192548
# mark 95% confidence level
abline( v = q2,col="red")

Given the above, we can calculate a VaR value for a given investment and a time horizon.
##### 1C) Assume $1000 investment in the stock, calculate the 95% VaR for 3 days’ time horizon. Explain the meaning of VaR in practical terms.
# 95% vaR for 1 day based on log-return
vaR<-1000*q1
# 95% VaR for 3 days based on log-return
VaR_3<-vaR*sqrt(3)
VaR_3
5%
-72.61706
The meaning of VaR is,in practical, that there is 5% chance once in every 3 days that my daily loss will be equle or exceed the -72.61706.
##### 1D) How does the VaR calculated in 1C changes if we assumed simple returns instead of the log returns.
# simple return var 1 day wish 95% confidence level
VaR_simple<-(exp(q1)-1)*1000
# simple return var 3 day with 95% confidence level
VaRsimple_3<-VaR_simple*sqrt(3)
VaRsimple_3
5%
-71.11586
because \(VaR_c(r_t)=-F^{-1}(1-c)\) in interm of \(r_t=ln(1+R_t)\), we can use quantile result above as power of \(ln\) and minus one, \(VaR_c(R_t)=e(-F^{-1}(1-c))-1\). Finally, \(VaR(R_t)=1000*(e(-F^{-1}(1-c))-1)=-71.11586\).
Calculations so far have been on the histogram of log returns. We can instead, looking at the histogram, assume a normal distribution of the log returns. The normal return assumption will have a mean and standard deviation equal to those calculated from the histogram, and properly scaled by the horizon time. Note that the mean is linearly scaled with time and volatility with square-root of time.
##### 1E) Repeat the calculation in 1D assuming instead a normal distribution. How the two results compare and why so?
# calculate log-return distribution
getSymbols("JD",src="yahoo",from="2015-01-01",to=Sys.Date())
[1] "JD"
jdreturn_R<-dailyReturn(JD$JD.Adjusted,type="log")
# log-return mean
jdm_R<-mean(jdreturn_R)
# log-return standard deviation
jdsd_R<-sd(jdreturn_R)
# quantile of normal distribution
a<-qnorm(0.05,0,1)
# simple return VaR 1 day with 95% confidence level
VaR_1<-exp(a*jdsd_R+jdm_R)*1000-1000
# simple return VaR 3 day with 95% confidence level
VaR_3d<-VaR_R*sqrt(3)
VaR_3d
[1] -70.98507
# simple return VaR 3 day with 95% confidence level,using directly z-scores
va3<-(exp(a*sqrt(3)*jdsd_R+3*jdm_R)-1)*1000
va3
[1] -69.84541
the result in 1E is bigger than the result in 1D,because the result of 1E is based on normal distribution but the result of 1D is based on factual distribution of stock.
##### 1F) Write down the mathematical representation corresponding to the VaR calculation in 1E. Explain what each variable in the equation represents, and provide the corresponding numerical value.
In the equation \(VaR=(e^{x}-1)*1000\), simple return Var is 1 day VaR with 95% confidence level.in the last equation,\(x=zscore*\sigma+u=-0.04184674\). zscore is -1.645 which is associated with 95% confidence level, \(\sigma=0.02547218\) is log-return standard deviation, and \(u=0.0000549999\) is log-return mean. next, i use log-return mean and standard deviation to calculate simple return VaR,which is represented by \(VaR=(e^{x}-1)*1000=-40.98325\). Finally, \(VaR_{3}=VaR*\sqrt{3}=-70.98507\) is to calculate simple return VaR 3 day with 95% confidence level.
Task 2: VaR Calculations: Multiple Equity Assets
Consider the times series of the three stocks DIS, TWTR, and NFLX for the time-period from Jan 1,2015 to present. Assume an investment of $100,000 equally distributed among all three stocks.
To calculate the portfolio VaR we will follow the methodolgy described by the variance-covariance. First the covariance matrix needs to be computed. We then calculate the variance or volatility of the portolio as expressed in the varaince-covariance method taking into the weights associated with each asset in the portfolio. Fiinally we compute the mean or expected return of the portfolio taking also into account the weights. Given the expected return and volatility we should be able to compute the VaR of the portfolio. The assumption is we have a normal distribution of log returns.
First we calculate the overall portfolio VaR.
##### 2A) Calculate the portfolio 99% VaR for 1 day, and 3 days. Specify whether using log-returns or simple returns.
symbols<-c("DIS","TWTR","NFLX")
getSymbols(symbols,src = "yahoo",from="2015-01-01",to=Sys.Date())
[1] "DIS" "TWTR" "NFLX"
dreturn_dis<-dailyReturn(DIS$DIS.Adjusted,type = "log")
dreturn_twtr<-dailyReturn(TWTR$TWTR.Adjusted,type = "log")
dreturn_nflx<-dailyReturn(NFLX$NFLX.Adjusted,type = "log")
# create porfolio time series
M<-cbind(dreturn_dis,dreturn_twtr,dreturn_nflx)
# calculate correlation
cor(M)
daily.returns daily.returns.1 daily.returns.2
daily.returns 1.0000000 0.2154637 0.2851774
daily.returns.1 0.2154637 1.0000000 0.2680482
daily.returns.2 0.2851774 0.2680482 1.0000000
# calculate covariance
cov(M)
daily.returns daily.returns.1 daily.returns.2
daily.returns 1.457160e-04 8.731851e-05 9.320778e-05
daily.returns.1 8.731851e-05 1.127086e-03 2.436548e-04
daily.returns.2 9.320778e-05 2.436548e-04 7.331061e-04
# weights of stock in portfolio
W<-rep(1/3,3)
# calculate variance of portfolio, %*% reference is used to conduct transpose matrix calculation.
var_p<-W%*%cov(M)%*%W
# portifolio standard deviation
sigma<-sqrt(var_p)
sigma
[,1]
[1,] 0.01780846
# portfolio mean
mu_p<-colMeans(M)%*%W
mu_p
[,1]
[1,] 0.0006943819
# the portfolio 99% VaR for 1 day
VaR1<-(-2.326*sigma+mu_p)*100000
VaR1
[,1]
[1,] -4072.809
# the portfolio 99% VaR for 3 day
VaR3<-VaR1*sqrt(3)
VaR3
[,1]
[1,] -7054.313
We then describe the mathetical formulation useds in the code to perform the calculations
##### 2B) Write down the mathematical representations used in the code to calculate the VaR. Label properly each variable, what it represents, and the numerical value corresponding to in the code. \(\sigma_p^2=w_1^2\sigma_1^2+w_2^2\sigma_2^2+2w_1w_2\sigma_{12}+w_1^2w_3^2\sigma_1^2\sigma_3^2+2w_1w_3\sigma_{13}+w_2^2w_3^2\sigma_2^2\sigma_3^2+2w_2w_3\sigma_{23}\), and \(\sigma{12}=cov(r_1,r_2)\),\(\sigma_{13}=cov(r_1,r_3)\),and \(\sigma_{23}=cov(r_2,r_3)\). in equation above,\(w_1=w_2=w_3=1/3\).
because \(z=(x-u)/\sigma\), \(x=z* \sigma+u\) with 99% confidence leve for 1 day. z value of 99% confidence leve is -2.326, and \(\sigma=0.01780846\),and \(u=0.0006943819\) that is average daily log-return. \(Var_1=(-2.326*0.015767+0.0002856453)*100000=-4072.809\) is VaR of 99% confidence leve for 1 days and VaR of 99% confidence leve for 3 days,\(Var_3=Var_1*\sqrt{3}=-7054.313\).
We now calculated individual VaR corresponding to each asst in the portfolio
##### 2C) Calculate the three-individual asset 99% VaR for 1 day.
# VaR DIS
dism<-mean(dreturn_dis)
sdm<-sd(dreturn_dis)
VaR_dis<-qnorm(0.01,mean =dism,sd=sdm,lower.tail = TRUE)*100000*1/3
VaR_dis
[1] -928.2354
# VaR TWTR
twtrm<-mean(dreturn_twtr)
sdtwtr<-sd(dreturn_twtr)
VaR_twtr<-qnorm(0.01,mean = twtrm,sd=sdtwtr,lower.tail = TRUE)*100000*1/3
VaR_twtr
[1] -2605.346
# VaR nflx
# mean of nflx based on log-return
nflxm<-mean(dreturn_nflx)
# standard deviation of nflx based on log-return
nflxsd<-sd(dreturn_nflx)
# 99% VaR of nflx for 1 day
VaR_nflx<-qnorm(0.01,mean = fbm,sd=sdfb,lower.tail = TRUE)*100000*1/3
VaR_nflx
[1] -1397.445
Finally we compare the overall VaR to the individual VaR calculations
##### 2D) Compare the overall portfolio VaR to the sum of the individual asset VaR for the 1 day case. Share observations.
VaR_sp=sum(VaR_fb,VaR_twtr,VaR_dis)
VaR_sp
[1] -4931.026
VaR1
[,1]
[1,] -4072.809
the totality of individual asset 99% VaR for 1 day is bigger than portfolio 99% VaR for 1 day.
*http://computationalfinance.lsi.upc.edu
LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDA3IgphdXRob3I6ICJZdSBKaWEiCmRhdGU6ICIyMDE5LTAyLTYiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApzdWJ0aXRsZTogVmFyIENhbGN1bGF0aW9ucyAoZmluYzYyMS1sYWIwNykKLS0tCgojIyMgQWJvdXQKClRoaXMgd29ya3NoZWV0IGxvb2tzIGF0IFZhUiBjYWxjdWxhdGlvbnMgZm9yIHRoZSB0d28gY2FzZXMgb2Ygc2luZ2xlIGFuZCBtdWx0aXBsZSBlcXVpdHkgYXNzZXQuIFRoaXMgaXMgdGhlIGxhc3QgbGFiIHdvcmtzaGVldCwgb3RoZXIgdGhhbiB0aGUgZXh0cmEgY3JlZGl0IGFzc2lnbm1lbnQuCgojIyMgU2V0dXAKClJlbWVtYmVyIHRvIGFsd2F5cyBzZXQgeW91ciB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24uIEdvIHRvICdTZXNzaW9uJywgc2Nyb2xsIGRvd24gdG8gJ1NldCBXb3JraW5nIERpcmVjdG9yeScsIGFuZCBjbGljayAnVG8gU291cmNlIEZpbGUgTG9jYXRpb24nLiBSZWFkIGNhcmVmdWxseSB0aGUgYmVsb3cgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGNvbXBsZXRlIHRoZSB0YXNrcyBhbmQgYW5zd2VyIGFueSBxdWVzdGlvbnMuICBTdWJtaXQgeW91ciB3b3JrIHRvIFJQdWJzIGFzIGRldGFpbGVkIGluIHByZXZpb3VzIG5vdGVzLiAKCiMjIyBOb3RlCgpBbHdheXMgcmVhZCBjYXJlZnVsbHkgdGhlIGluc3RydWN0aW9ucyBvbiBTYWthaS4gIEZvciBjbGFyaXR5LCB0YXNrcy9xdWVzdGlvbnMgdG8gYmUgY29tcGxldGVkL2Fuc3dlcmVkIGFyZSBoaWdobGlnaHRlZCBpbiByZWQgY29sb3IgKHZpc2libGUgaW4gcHJldmlldykgYW5kIG51bWJlcmVkIGFjY29yZGluZyB0byB0aGVpciBwYXJ0aWN1bGFyIHBsYWNlbWVudCBpbiB0aGUgdGFzayBzZWN0aW9uLiAgUXVpdGUgb2Z0ZW4geW91IHdpbGwgbmVlZCB0byBhZGQgeW91ciBvd24gY29kZSBjaHVuay4KCkV4ZWN1dGUgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkgZm9sbHdvaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTWFrZSBzdXJlIHRvIGFkZCBjb21tZW50cyB0byB5b3VyIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuIFVzZSBvd24gbGFuZ3VhZ2UhCgotLS0tLS0tLS0tLS0tLQoKIyMjIFRhc2sgMTogVmFSIENhbGN1bGF0aW9uczogU2luZ2xlIEVxdWl0eSBBc3NldAoKCmBgYHtyfQojSW5zdGFsbCBwYWNrYWdlIHF1YW50bW9kIAppbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIpCmxpYnJhcnkoInF1YW50bW9kIikKYGBgCgpDb25zaWRlciB0aGUgdGltZSBzZXJpZXMgb2YgYSBzdG9jayBvZiB5b3VyIGNob2ljZSAob3RoZXIgdGhhbiBBQVBMIGFuZCB5b3VyIGNvbGxlYWd1ZSEpIGFuZCBmb3IgdGhlIHRpbWUtcGVyaW9kIGZyb20gSmFuIDEsIDIwMTUgdG8gcHJlc2VudC4gCgpXZSB3aWxsIGZpcnN0IGdlbmVyYXRlIHRoZSBoaXN0b3JpY2FsIHRpbWUgc2VyaWVzIG9mIGRhaWx5IGxvZyByZXR1cm5zLCBhbmQgY2FsY3VsYXRlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHRpbWUgc2VyaWVzLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFBKSBDYWxjdWxhdGUgdGhlIGhpc3RvcmljYWwgZGFpbHkgbG9nIHJldHVybnMsIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbgo8L3NwYW4+CgpgYGB7cn0KZ2V0U3ltYm9scygiSkQiLHNyYz0ieWFob28iLGZyb209IjIwMTUtMDEtMDEiLHRvPVN5cy5EYXRlKCkpCiMgamQgc3RvY2sgamQgbG9nLXJldHVybgpqZHJldHVybjwtZGFpbHlSZXR1cm4oSkQkSkQuQWRqdXN0ZWQsdHlwZT0ibG9nIikKIyBqZCBsb2ctcmV0dXJuIG1lYW4KamRtPC1tZWFuKGpkcmV0dXJuKQpqZG0KIyBqZCBsb2ctcmV0dXJuIHN0YW5kYXJkIGRpdmlhdGlvbgpqZHNkPC1zZChqZHJldHVybikKamRzZAoKYGBgCgpHaXZlbiBhIHRpbWUgc2VyaWVzIHdlIGNhbiBnZW5lcmF0ZSBhIGhpc3RvZ3JhbSBhbmQgbWFyayB0aGUgcXVhbnRpbGUgdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgOTUlIGNvbmZpZGVuY2UgbGV2ZWwuIFRoZSBxdWFudGlsZSB2YWx1ZSBpbiB0aGlzIGNhc2UgaXMgdGhlIGNyaXRpY2FsIHZhbHVlIGZvciB3aGljaCA5NSUgb2YgdGhlIGRhdGEgaXMgb24gdGhlIHJpZ2h0IChoaWdoZXIpIG9mIHRoZSBjcml0aWNhbCB2YWx1ZSBhcyByZXByZXNlbnRlZCBieSB0aGUgaGlzdG9ncmFtLiBUaGUgcmVtYWluaW5nIDUlIHdpbGwgYmUgb24gdGhlIGxlZnQuIFRvIGZpbmQgdGhlIHF1YW50aWxlIHZhbHVlIHlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZSBmdW5jdGlvbiBgcXVhbnRpbGUoKWAgd2l0aCB0aGUgcHJvcGVyIGFyZ3VtZW50cy4gRm9yIGV4YW1wbGUgYHF1YW50aWxlKHh0cyxwcm9icz0wLjAxKWAgIGFwcGxpZXMgdG8gYSB0aW1lIHNlcmllcyBgeHRzYCBhbmQgcmV0dXJuIHRoZSBjcml0aWNhbCB2YWx1ZSBjb3JyZXNwb25kbmcgdG8gYDk5JWAgY29uZmlkZW5jZSBsZXZlbC4KCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUIpIFBsb3QgYSBoaXN0b2dyYW0gYW5kIG1hcmsgdGhlIHF1YW50aWxlIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gOTUlIGNvbmZpZGVuY2UgbGV2ZWwuIEEgbWFyayBjYW4gYmUgYWRkZWQgdG8gYSBwbG90IGJ5IHVzaW5nIHRoZSBmdW5jdGlvbiBgYWJsaW5lKClgLgo8L3NwYW4+CgpgYGB7cn0KIyBwbG90IGpkIGxvZyByZXR1cm4KaGlzdChqZHJldHVybixicmVha3MgPSAyMDAsbWFuaW49ImpkIGxvZy1yZXR1cm4gaGlzdG9ncmFtIix4bGFiID0gImpkIGxvZy1yZXR1cm4iLHlsYWIgPSAiZnJlcXVlbmN5IikKIyBnZXQgcXVhbnRpbGUgb2YgamQgbG9nLXJldHVybi4KcTE8LXF1YW50aWxlKGpkcmV0dXJuLHByb2JzPTAuMDUpIApxMQojIG1hcmsgOTUlIGNvbmZpZGVuY2UgbGV2ZWwKYWJsaW5lKCB2ID0gcTIsY29sPSJyZWQiKQoKYGBgCgpHaXZlbiB0aGUgYWJvdmUsIHdlIGNhbiBjYWxjdWxhdGUgYSBWYVIgdmFsdWUgZm9yIGEgZ2l2ZW4gaW52ZXN0bWVudCBhbmQgYSB0aW1lIGhvcml6b24uCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUMpIEFzc3VtZSAkMTAwMCBpbnZlc3RtZW50IGluIHRoZSBzdG9jaywgY2FsY3VsYXRlIHRoZSA5NSUgVmFSIGZvciAzIGRheXPigJkgdGltZSBob3Jpem9uLiAgRXhwbGFpbiB0aGUgbWVhbmluZyBvZiBWYVIgaW4gcHJhY3RpY2FsIHRlcm1zLgo8L3NwYW4+CgpgYGB7cn0KIyA5NSUgdmFSIGZvciAxIGRheSBiYXNlZCBvbiBsb2ctcmV0dXJuCnZhUjwtMTAwMCpxMQojIDk1JSBWYVIgZm9yIDMgZGF5cyBiYXNlZCBvbiBsb2ctcmV0dXJuClZhUl8zPC12YVIqc3FydCgzKQpWYVJfMwoKYGBgClRoZSBtZWFuaW5nIG9mIFZhUiBpcyxpbiBwcmFjdGljYWwsIHRoYXQgdGhlcmUgaXMgNSUgY2hhbmNlIG9uY2UgaW4gZXZlcnkgMyBkYXlzIHRoYXQgbXkgZGFpbHkgbG9zcyB3aWxsIGJlIGVxdWxlIG9yIGV4Y2VlZCB0aGUgLTcyLjYxNzA2LgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFEKSBIb3cgZG9lcyB0aGUgVmFSIGNhbGN1bGF0ZWQgaW4gMUMgY2hhbmdlcyBpZiB3ZSBhc3N1bWVkIHNpbXBsZSByZXR1cm5zIGluc3RlYWQgb2YgdGhlIGxvZyByZXR1cm5zLgo8L3NwYW4+CgpgYGB7cn0KIyBzaW1wbGUgcmV0dXJuIHZhciAxIGRheSB3aXNoIDk1JSBjb25maWRlbmNlIGxldmVsClZhUl9zaW1wbGU8LShleHAocTEpLTEpKjEwMDAKIyBzaW1wbGUgcmV0dXJuIHZhciAzIGRheSB3aXRoIDk1JSBjb25maWRlbmNlIGxldmVsClZhUnNpbXBsZV8zPC1WYVJfc2ltcGxlKnNxcnQoMykKVmFSc2ltcGxlXzMKCmBgYAoKYmVjYXVzZSAkVmFSX2Mocl90KT0tRl57LTF9KDEtYykkIGluIGludGVybSBvZiAkcl90PWxuKDErUl90KSQsIHdlIGNhbiB1c2UgcXVhbnRpbGUgcmVzdWx0IGFib3ZlIGFzIHBvd2VyIG9mICRsbiQgYW5kIG1pbnVzIG9uZSwgJFZhUl9jKFJfdCk9ZSgtRl57LTF9KDEtYykpLTEkLiBGaW5hbGx5LAokVmFSKFJfdCk9MTAwMCooZSgtRl57LTF9KDEtYykpLTEpPS03MS4xMTU4NiQuCgoKQ2FsY3VsYXRpb25zIHNvIGZhciBoYXZlIGJlZW4gb24gdGhlIGhpc3RvZ3JhbSBvZiBsb2cgcmV0dXJucy4gV2UgY2FuIGluc3RlYWQsIGxvb2tpbmcgYXQgdGhlIGhpc3RvZ3JhbSwgYXNzdW1lIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbG9nIHJldHVybnMuIFRoZSBub3JtYWwgcmV0dXJuIGFzc3VtcHRpb24gd2lsbCBoYXZlIGEgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGVxdWFsIHRvIHRob3NlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaGlzdG9ncmFtLCBhbmQgcHJvcGVybHkgc2NhbGVkIGJ5IHRoZSBob3Jpem9uIHRpbWUuICBOb3RlIHRoYXQgdGhlIG1lYW4gaXMgbGluZWFybHkgc2NhbGVkIHdpdGggdGltZSBhbmQgdm9sYXRpbGl0eSB3aXRoIHNxdWFyZS1yb290IG9mIHRpbWUuCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUUpIFJlcGVhdCB0aGUgY2FsY3VsYXRpb24gaW4gMUQgYXNzdW1pbmcgaW5zdGVhZCBhIG5vcm1hbCBkaXN0cmlidXRpb24uIEhvdyB0aGUgdHdvIHJlc3VsdHMgY29tcGFyZSBhbmQgd2h5IHNvPwo8L3NwYW4+CgpgYGB7cn0KIyBjYWxjdWxhdGUgbG9nLXJldHVybiBkaXN0cmlidXRpb24KZ2V0U3ltYm9scygiSkQiLHNyYz0ieWFob28iLGZyb209IjIwMTUtMDEtMDEiLHRvPVN5cy5EYXRlKCkpCmpkcmV0dXJuX1I8LWRhaWx5UmV0dXJuKEpEJEpELkFkanVzdGVkLHR5cGU9ImxvZyIpCiMgbG9nLXJldHVybiBtZWFuCmpkbV9SPC1tZWFuKGpkcmV0dXJuX1IpCiMgbG9nLXJldHVybiBzdGFuZGFyZCBkZXZpYXRpb24KamRzZF9SPC1zZChqZHJldHVybl9SKQojIHF1YW50aWxlIG9mIG5vcm1hbCBkaXN0cmlidXRpb24KYTwtcW5vcm0oMC4wNSwwLDEpCiMgc2ltcGxlIHJldHVybiBWYVIgMSBkYXkgd2l0aCA5NSUgY29uZmlkZW5jZSBsZXZlbCAKVmFSXzE8LWV4cChhKmpkc2RfUitqZG1fUikqMTAwMC0xMDAwCiMgc2ltcGxlIHJldHVybiBWYVIgMyBkYXkgd2l0aCA5NSUgY29uZmlkZW5jZSBsZXZlbCAKVmFSXzNkPC1WYVJfUipzcXJ0KDMpClZhUl8zZAojIHNpbXBsZSByZXR1cm4gVmFSIDMgZGF5IHdpdGggOTUlIGNvbmZpZGVuY2UgbGV2ZWwsdXNpbmcgZGlyZWN0bHkgei1zY29yZXMKdmEzPC0oZXhwKGEqc3FydCgzKSpqZHNkX1IrMypqZG1fUiktMSkqMTAwMAp2YTMKYGBgCgp0aGUgcmVzdWx0IGluIDFFIGlzIGJpZ2dlciB0aGFuIHRoZSByZXN1bHQgaW4gMUQsYmVjYXVzZSB0aGUgcmVzdWx0IG9mIDFFIGlzIGJhc2VkIG9uIG5vcm1hbCBkaXN0cmlidXRpb24gYnV0IHRoZSByZXN1bHQgb2YgMUQgaXMgYmFzZWQgb24gZmFjdHVhbCBkaXN0cmlidXRpb24gb2Ygc3RvY2suIAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFGKSBXcml0ZSBkb3duIHRoZSBtYXRoZW1hdGljYWwgcmVwcmVzZW50YXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgVmFSIGNhbGN1bGF0aW9uIGluIDFFLiBFeHBsYWluIHdoYXQgZWFjaCB2YXJpYWJsZSBpbiB0aGUgZXF1YXRpb24gcmVwcmVzZW50cywgYW5kIHByb3ZpZGUgdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpY2FsIHZhbHVlLgo8L3NwYW4+CgpJbiB0aGUgZXF1YXRpb24gJFZhUj0oZV57eH0tMSkqMTAwMCQsIHNpbXBsZSByZXR1cm4gVmFyIGlzIDEgZGF5IFZhUiB3aXRoIDk1JSBjb25maWRlbmNlIGxldmVsLmluIHRoZSBsYXN0IGVxdWF0aW9uLCR4PXpzY29yZSpcc2lnbWErdT0tMC4wNDE4NDY3NCQuIHpzY29yZSBpcyAtMS42NDUgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIDk1JSBjb25maWRlbmNlIGxldmVsLCAkXHNpZ21hPTAuMDI1NDcyMTgkIGlzIGxvZy1yZXR1cm4gc3RhbmRhcmQgZGV2aWF0aW9uLCBhbmQgJHU9MC4wMDAwNTQ5OTk5JCBpcyBsb2ctcmV0dXJuIG1lYW4uIG5leHQsIGkgdXNlIGxvZy1yZXR1cm4gbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIHRvIGNhbGN1bGF0ZSBzaW1wbGUgcmV0dXJuIFZhUix3aGljaCBpcyByZXByZXNlbnRlZCBieSAkVmFSPShlXnt4fS0xKSoxMDAwPS00MC45ODMyNSQuIEZpbmFsbHksICRWYVJfezN9PVZhUipcc3FydHszfT0tNzAuOTg1MDckIGlzIHRvIGNhbGN1bGF0ZSBzaW1wbGUgcmV0dXJuIFZhUiAzIGRheSB3aXRoIDk1JSBjb25maWRlbmNlIGxldmVsLgoKCiMjIyBUYXNrIDI6IFZhUiBDYWxjdWxhdGlvbnM6IE11bHRpcGxlIEVxdWl0eSBBc3NldHMKCkNvbnNpZGVyIHRoZSB0aW1lcyBzZXJpZXMgb2YgdGhlIHRocmVlIHN0b2NrcyBESVMsIFRXVFIsIGFuZCBORkxYIGZvciB0aGUgdGltZS1wZXJpb2QgZnJvbSBKYW4gMSwyMDE1IHRvIHByZXNlbnQuIEFzc3VtZSBhbiBpbnZlc3RtZW50IG9mICQxMDAsMDAwIGVxdWFsbHkgZGlzdHJpYnV0ZWQgYW1vbmcgYWxsIHRocmVlIHN0b2Nrcy4gCgpUbyBjYWxjdWxhdGUgdGhlIHBvcnRmb2xpbyBWYVIgd2Ugd2lsbCBmb2xsb3cgdGhlIG1ldGhvZG9sZ3kgZGVzY3JpYmVkIGJ5IHRoZSB2YXJpYW5jZS1jb3ZhcmlhbmNlLiBGaXJzdCB0aGUgY292YXJpYW5jZSBtYXRyaXggbmVlZHMgdG8gYmUgY29tcHV0ZWQuICBXZSB0aGVuIGNhbGN1bGF0ZSB0aGUgdmFyaWFuY2Ugb3Igdm9sYXRpbGl0eSBvZiB0aGUgcG9ydG9saW8gYXMgZXhwcmVzc2VkIGluIHRoZSB2YXJhaW5jZS1jb3ZhcmlhbmNlIG1ldGhvZCB0YWtpbmcgaW50byB0aGUgd2VpZ2h0cyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhc3NldCBpbiB0aGUgcG9ydGZvbGlvLiAgRmlpbmFsbHkgd2UgY29tcHV0ZSB0aGUgbWVhbiBvciBleHBlY3RlZCByZXR1cm4gb2YgdGhlIHBvcnRmb2xpbyB0YWtpbmcgYWxzbyBpbnRvIGFjY291bnQgdGhlIHdlaWdodHMuICBHaXZlbiB0aGUgZXhwZWN0ZWQgcmV0dXJuIGFuZCB2b2xhdGlsaXR5IHdlIHNob3VsZCBiZSBhYmxlIHRvIGNvbXB1dGUgdGhlIFZhUiBvZiB0aGUgcG9ydGZvbGlvLiAgVGhlIGFzc3VtcHRpb24gaXMgd2UgaGF2ZSBhIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgbG9nIHJldHVybnMuCgpGaXJzdCB3ZSBjYWxjdWxhdGUgdGhlIG92ZXJhbGwgcG9ydGZvbGlvIFZhUi4KCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQSkgQ2FsY3VsYXRlIHRoZSBwb3J0Zm9saW8gOTklIFZhUiBmb3IgMSBkYXksIGFuZCAzIGRheXMuIFNwZWNpZnkgd2hldGhlciB1c2luZyBsb2ctcmV0dXJucyBvciBzaW1wbGUgcmV0dXJucy4gICAgICAKPC9zcGFuPgoKYGBge3J9CnN5bWJvbHM8LWMoIkRJUyIsIlRXVFIiLCJORkxYIikKZ2V0U3ltYm9scyhzeW1ib2xzLHNyYyA9ICJ5YWhvbyIsZnJvbT0iMjAxNS0wMS0wMSIsdG89U3lzLkRhdGUoKSkKZHJldHVybl9kaXM8LWRhaWx5UmV0dXJuKERJUyRESVMuQWRqdXN0ZWQsdHlwZSA9ICJsb2ciKQpkcmV0dXJuX3R3dHI8LWRhaWx5UmV0dXJuKFRXVFIkVFdUUi5BZGp1c3RlZCx0eXBlID0gImxvZyIpCmRyZXR1cm5fbmZseDwtZGFpbHlSZXR1cm4oTkZMWCRORkxYLkFkanVzdGVkLHR5cGUgPSAibG9nIikKIyBjcmVhdGUgcG9yZm9saW8gdGltZSBzZXJpZXMKTTwtY2JpbmQoZHJldHVybl9kaXMsZHJldHVybl90d3RyLGRyZXR1cm5fbmZseCkgCiMgY2FsY3VsYXRlIGNvcnJlbGF0aW9uCmNvcihNKSAKIyBjYWxjdWxhdGUgY292YXJpYW5jZQpjb3YoTSkgCiMgd2VpZ2h0cyBvZiBzdG9jayBpbiBwb3J0Zm9saW8KVzwtcmVwKDEvMywzKSAKIyBjYWxjdWxhdGUgdmFyaWFuY2Ugb2YgcG9ydGZvbGlvLCAlKiUgcmVmZXJlbmNlIGlzIHVzZWQgdG8gY29uZHVjdCB0cmFuc3Bvc2UgbWF0cml4IGNhbGN1bGF0aW9uLgp2YXJfcDwtVyUqJWNvdihNKSUqJVcgCiMgcG9ydGlmb2xpbyBzdGFuZGFyZCBkZXZpYXRpb24Kc2lnbWE8LXNxcnQodmFyX3ApCnNpZ21hCiMgcG9ydGZvbGlvIG1lYW4KbXVfcDwtY29sTWVhbnMoTSklKiVXCm11X3AKIyB0aGUgcG9ydGZvbGlvIDk5JSBWYVIgZm9yIDEgZGF5ClZhUjE8LSgtMi4zMjYqc2lnbWErbXVfcCkqMTAwMDAwClZhUjEKIyB0aGUgcG9ydGZvbGlvIDk5JSBWYVIgZm9yIDMgZGF5ClZhUjM8LVZhUjEqc3FydCgzKQpWYVIzCmBgYAoKCldlIHRoZW4gZGVzY3JpYmUgdGhlIG1hdGhldGljYWwgZm9ybXVsYXRpb24gdXNlZHMgaW4gdGhlIGNvZGUgdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb25zCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkIpIFdyaXRlIGRvd24gdGhlIG1hdGhlbWF0aWNhbCByZXByZXNlbnRhdGlvbnMgdXNlZCBpbiB0aGUgY29kZSB0byBjYWxjdWxhdGUgdGhlIFZhUi4gIExhYmVsIHByb3Blcmx5IGVhY2ggdmFyaWFibGUsIHdoYXQgaXQgcmVwcmVzZW50cywgYW5kIHRoZSBudW1lcmljYWwgdmFsdWUgY29ycmVzcG9uZGluZyB0byBpbiB0aGUgY29kZS4KPC9zcGFuPgokXHNpZ21hX3BeMj13XzFeMlxzaWdtYV8xXjIrd18yXjJcc2lnbWFfMl4yKzJ3XzF3XzJcc2lnbWFfezEyfSt3XzFeMndfM14yXHNpZ21hXzFeMlxzaWdtYV8zXjIrMndfMXdfM1xzaWdtYV97MTN9K3dfMl4yd18zXjJcc2lnbWFfMl4yXHNpZ21hXzNeMisyd18yd18zXHNpZ21hX3syM30kLCBhbmQgJFxzaWdtYXsxMn09Y292KHJfMSxyXzIpJCwkXHNpZ21hX3sxM309Y292KHJfMSxyXzMpJCxhbmQgJFxzaWdtYV97MjN9PWNvdihyXzIscl8zKSQuCmluIGVxdWF0aW9uIGFib3ZlLCR3XzE9d18yPXdfMz0xLzMkLgoKYmVjYXVzZSAkej0oeC11KS9cc2lnbWEkLCAkeD16KiBcc2lnbWErdSQgd2l0aCA5OSUgY29uZmlkZW5jZSBsZXZlIGZvciAxIGRheS4KeiB2YWx1ZSBvZiA5OSUgY29uZmlkZW5jZSBsZXZlIGlzIC0yLjMyNiwgYW5kICRcc2lnbWE9MC4wMTc4MDg0NiQsYW5kICR1PTAuMDAwNjk0MzgxOSQgdGhhdCBpcyBhdmVyYWdlIGRhaWx5IGxvZy1yZXR1cm4uCiRWYXJfMT0oLTIuMzI2KjAuMDE1NzY3KzAuMDAwMjg1NjQ1MykqMTAwMDAwPS00MDcyLjgwOSQgaXMgVmFSIG9mIDk5JSBjb25maWRlbmNlIGxldmUgZm9yIDEgZGF5cwphbmQgVmFSIG9mIDk5JSBjb25maWRlbmNlIGxldmUgZm9yIDMgZGF5cywkVmFyXzM9VmFyXzEqXHNxcnR7M309LTcwNTQuMzEzJC4KCgpXZSBub3cgY2FsY3VsYXRlZCBpbmRpdmlkdWFsIFZhUiBjb3JyZXNwb25kaW5nIHRvIGVhY2ggYXNzdCBpbiB0aGUgcG9ydGZvbGlvCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkMpIENhbGN1bGF0ZSB0aGUgdGhyZWUtaW5kaXZpZHVhbCBhc3NldCA5OSUgVmFSIGZvciAxIGRheS4gIAo8L3NwYW4+CgpgYGB7cn0KIyBWYVIgRElTIGJhc2VkIG9uIGxvZy1yZXR1cm4KIyBtZWFuIG9mIGRpcwpkaXNtPC1tZWFuKGRyZXR1cm5fZGlzKQojIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBkaXMKc2RtPC1zZChkcmV0dXJuX2RpcykKIyA5OSUgVmFSIGZvciAxIGRheQpWYVJfZGlzPC1xbm9ybSgwLjAxLG1lYW4gPWRpc20sc2Q9c2RtLGxvd2VyLnRhaWwgPSBUUlVFKSoxMDAwMDAqMS8zClZhUl9kaXMKYGBgCgpgYGB7cn0KIyBWYVIgVFdUUiBiYXNlZCBvbiBsb2ctcmV0dXJuCiMgdHd0ciBtZWFuIGJhc2VkIG9uIGxvZy1yZXR1cm4KdHd0cm08LW1lYW4oZHJldHVybl90d3RyKQojdHd0ciBzdGFuZGFyZCBkZXZpYXRpb24gYmFzZWQgb24gbG9nLXJldHVybgpzZHR3dHI8LXNkKGRyZXR1cm5fdHd0cikKIyA5OSUgVmFSIFRXVFIgZm9yIDEgZGF5ClZhUl90d3RyPC1xbm9ybSgwLjAxLG1lYW4gPSB0d3RybSxzZD1zZHR3dHIsbG93ZXIudGFpbCA9IFRSVUUpKjEwMDAwMCoxLzMKVmFSX3R3dHIKYGBgCgpgYGB7cn0KIyBWYVIgbmZseAojIG1lYW4gb2YgbmZseCBiYXNlZCBvbiBsb2ctcmV0dXJuCm5mbHhtPC1tZWFuKGRyZXR1cm5fbmZseCkKIyBzdGFuZGFyZCBkZXZpYXRpb24gb2YgbmZseCBiYXNlZCBvbiBsb2ctcmV0dXJuCm5mbHhzZDwtc2QoZHJldHVybl9uZmx4KQojIDk5JSBWYVIgb2YgbmZseCBmb3IgMSBkYXkKVmFSX25mbHg8LXFub3JtKDAuMDEsbWVhbiA9IGZibSxzZD1zZGZiLGxvd2VyLnRhaWwgPSBUUlVFKSoxMDAwMDAqMS8zClZhUl9uZmx4CmBgYAoKCkZpbmFsbHkgd2UgY29tcGFyZSB0aGUgb3ZlcmFsbCBWYVIgdG8gdGhlIGluZGl2aWR1YWwgVmFSIGNhbGN1bGF0aW9ucwoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJEKSBDb21wYXJlIHRoZSBvdmVyYWxsIHBvcnRmb2xpbyBWYVIgdG8gdGhlIHN1bSBvZiB0aGUgaW5kaXZpZHVhbCBhc3NldCBWYVIgZm9yIHRoZSAxIGRheSBjYXNlLiAgU2hhcmUgb2JzZXJ2YXRpb25zLgo8L3NwYW4+CmBgYHtyfQpWYVJfc3A9c3VtKFZhUl9mYixWYVJfdHd0cixWYVJfZGlzKQpWYVJfc3AKVmFSMQpgYGAKdGhlIHRvdGFsaXR5IG9mIGluZGl2aWR1YWwgYXNzZXQgOTklIFZhUiBmb3IgMSBkYXkgaXMgYmlnZ2VyIHRoYW4gcG9ydGZvbGlvIDk5JSBWYVIgZm9yIDEgZGF5LgoKKltodHRwOi8vY29tcHV0YXRpb25hbGZpbmFuY2UubHNpLnVwYy5lZHUgXShodHRwOi8vY29tcHV0YXRpb25hbGZpbmFuY2UubHNpLnVwYy5lZHUpCg==