About
This worksheet looks at simulating, both arithmetics and geometric, Brownian motion for stock prices, pricing options, and calculating Greeks using numerical differentiation.
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: Simulating Brownian Motion
This task follows the two examples in the book R Example 5.1/p 148 for simulating an arithmetic Brownian motion and R Example 5.2/p152 for simulating a geometric motion. Two new packages will be required for this worksheet. They are included in the code chunk below.
#Install package quantmod
if(!require("quantmod",quietly = TRUE))
install.packages("quantmod",dependencies = TRUE, repos = "https://cloud.r-project.org")
#Install package sde for Stochastic Differential Equation
if(!require("sde",quietly = TRUE))
install.packages("sde",dependencies = TRUE, repos = "https://cloud.r-project.org")
#Install package fOptions for pricing and evaluating basic options
if(!require("fOptions",quietly = TRUE))
install.packages("fOptions",dependencies = TRUE, repos = "https://cloud.r-project.org")
##### 1A) Follow example in book to simulate and plot example of an arithmetic Brownian motion. Consider three values for n (number of points): \(2^2, 2^5, 2^{12}\). Explain behavior as n increases.
##inputs:
alpha=0; sigma=1; T=1; n=2^(2);X0=0.1;
#############Generate 1 trajectory
dt=T/n
t=seq(0,T,by=dt)
x=c(X0,alpha*dt+sigma*sqrt(dt)*rnorm(n,mean=0,sd=1))
Xt=cumsum(x)
plot(t,Xt,type='l',xlab="time")

##inputs:
alpha=0; sigma=1; T=1; n=2^(5);X0=0.1;
#############Generate 1 trajectory
dt=T/n
t=seq(0,T,by=dt)
x=c(X0,alpha*dt+sigma*sqrt(dt)*rnorm(n,mean=0,sd=1))
Xt=cumsum(x)
plot(t,Xt,type='l',xlab="time")

##inputs:
alpha=0; sigma=1; T=1; n=2^(12);X0=0.1;
#############Generate 1 trajectory
dt=T/n
t=seq(0,T,by=dt)
x=c(X0,alpha*dt+sigma*sqrt(dt)*rnorm(n,mean=0,sd=1))
Xt=cumsum(x)
plot(t,Xt,type='l',xlab="time")

dt represents the time interval ,dt=T/n ,n is the steps in the time interval ,the higher the n, the closer to Brownian motion. Increasing the value of n, so that the time steps T/n become smaller, will improve the quality of the approximate sample path to a true Brownian path.
##### 1B) Write the mathematical equation representing the values along the y-axis in the above plot. Separately express what the value of each variable in the equation is. 
##### 1C) Follow example in book to simulate a geometric Brownian motion.
library(sde)
mu=0.16; sigma=0.2; P0=40; T = 1/12 ##1 month
nt=50; n=2^(8)
#############Generate nt trajectories
dt=T/n; t=seq(0,T,by=dt)
X=matrix(rep(0,length(t)*nt), nrow=nt)
for (i in 1:nt) {X[i,]= GBM(x=P0,r=mu,sigma=sigma,T=T,N=n)}
##Plot
ymax=max(X); ymin=min(X) #bounds for simulated prices
plot(t,X[1,],t='l',ylim=c(ymin, ymax), col=1,
ylab="Price P(t)",xlab="time t")
for(i in 2:nt){lines(t,X[i,], t='l',ylim=c(ymin, ymax),col=i)}

##### 1D) Write the mathematical equation representing the values along the y-axis in the above plot. Separately express what the value of each variable in the equation is.
##### 1E) How is the geometric Brownian simulation different from the arithmetic simulation? Elaborate. An obvious limitation of the arithmetic Brownian motion, if used as a model for the price of a stock, is the possibility of negative prices . This can be fixed by considering prices log normally distributed instead. when we use the log normally distributed data, then we generate the geometric Browian motion , which can keep the price result all above zero.
Task 2: Option Pricing, Greeks, and Numerical Differentiation
Follows the example in the book R Example 5.3/p 156 and R Example 5.5/p 157
##### 2A) Calculate the Call and Put price of the given European Option. Explain what the variables r and b in the function call GBSOption represent.
library(fOptions)
GBSOption(TypeFlag = "c", S = 60, X = 65, Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)
Title:
Black Scholes Option Valuation
Call:
GBSOption(TypeFlag = "c", S = 60, X = 65, Time = 1/4, r = 0.08,
b = 0.08, sigma = 0.3)
Parameters:
Value:
TypeFlag c
S 60
X 65
Time 0.25
r 0.08
b 0.08
sigma 0.3
Option Price:
2.133372
Description:
Mon Dec 10 00:05:50 2018
library(fOptions)
GBSOption(TypeFlag = "p", S = 60, X = 65, Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)
Title:
Black Scholes Option Valuation
Call:
GBSOption(TypeFlag = "p", S = 60, X = 65, Time = 1/4, r = 0.08,
b = 0.08, sigma = 0.3)
Parameters:
Value:
TypeFlag p
S 60
X 65
Time 0.25
r 0.08
b 0.08
sigma 0.3
Option Price:
5.846286
Description:
Mon Dec 10 00:06:37 2018
the price for call option is 2.133372, and the price for put option is 5.846286 . r is the annualized rate of interest, a numeric value b is the annualized cost-of-carry rate ##### 2B) Calculate the particular Greeks Delta, Gamma, and Vega for the above corresponding Call option.
library(fOptions)
GBSGreeks(Selection="delta",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.30)
[1] 0.3724829
GBSGreeks(Selection="gamma",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.30)
[1] 0.04204276
GBSGreeks(Selection="theta",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.30)
[1] -8.428174
GBSGreeks(Selection="vega",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.30)
[1] 11.35154
GBSGreeks(Selection="rho",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.30)
[1] 5.0539
these figures are the results of delta, gamma,theta,vega and rho repectively. ##### 2C) Calculate the Delta, Gamma, and Vega for same option using instead numerical differentiation. Write the mathematical equations corresponding to each numerical differentiation.
library(fOptions)
GBSCharacteristics(TypeFlag="c",S=60,X=65,Time=1/4,r=0.08, b=0.08,sigma=0.30)
$`premium`
[1] 2.133372
$delta
[1] 0.3724829
$theta
[1] -8.428174
$vega
[1] 11.35154
$rho
[1] 5.0539
$lambda
[1] 10.47589
$gamma
[1] 0.04204276
##### 2D) Compare results from 2B and 2C. Share observations.
it seems that there is no significant difference between the results calculated from 2b and 2c.
*http://computationalfinance.lsi.upc.edu
LS0tDQp0aXRsZTogIkZJTkM2MjEgV2ludGVyIDIwMTgtMTkgTGFiIFdvcmtzaGVldCAwNCINCmF1dGhvcjogIllvdXIgTmFtZSBIZXJlIg0KZGF0ZTogIkFkZCBEYXRlIEhlcmUiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0Kc3VidGl0bGU6IFN0b2NoYXN0aWMgTW9kZWxpbmcgJiBOdW1lcmljYWwgRGlmZmVyZW50aWF0aW9uIChmaW5jNjIxLWxhYjA0KQ0KLS0tDQoNCiMjIyBBYm91dA0KDQpUaGlzIHdvcmtzaGVldCBsb29rcyBhdCBzaW11bGF0aW5nLCBib3RoIGFyaXRobWV0aWNzIGFuZCBnZW9tZXRyaWMsIEJyb3duaWFuIG1vdGlvbiBmb3Igc3RvY2sgcHJpY2VzLCBwcmljaW5nIG9wdGlvbnMsIGFuZCBjYWxjdWxhdGluZyBHcmVla3MgdXNpbmcgbnVtZXJpY2FsIGRpZmZlcmVudGlhdGlvbi4gIA0KDQojIyMgU2V0dXANCg0KUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIA0KDQojIyMgTm90ZQ0KDQpBbHdheXMgcmVhZCBjYXJlZnVsbHkgdGhlIGluc3RydWN0aW9ucyBvbiBTYWthaS4gIEZvciBjbGFyaXR5LCB0YXNrcy9xdWVzdGlvbnMgdG8gYmUgY29tcGxldGVkL2Fuc3dlcmVkIGFyZSBoaWdobGlnaHRlZCBpbiByZWQgY29sb3IgKHZpc2libGUgaW4gcHJldmlldykgYW5kIG51bWJlcmVkIGFjY29yZGluZyB0byB0aGVpciBwYXJ0aWN1bGFyIHBsYWNlbWVudCBpbiB0aGUgdGFzayBzZWN0aW9uLiAgUXVpdGUgb2Z0ZW4geW91IHdpbGwgbmVlZCB0byBhZGQgeW91ciBvd24gY29kZSBjaHVuay4NCg0KRXhlY3V0ZSBhbGwgY29kZSBjaHVua3MsIHByZXZpZXcsIHB1Ymxpc2gsIGFuZCBzdWJtaXQgbGluayBvbiBTYWthaSBmb2xsd29pbmcgdGhlIG5hbWluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUgdG8gYWRkIGNvbW1lbnRzIHRvIHlvdXIgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4gVXNlIG93biBsYW5ndWFnZSENCg0KLS0tLS0tLS0tLS0tLS0NCg0KIyMjIFRhc2sgMTogU2ltdWxhdGluZyBCcm93bmlhbiBNb3Rpb24NCg0KVGhpcyB0YXNrIGZvbGxvd3MgdGhlIHR3byBleGFtcGxlcyBpbiB0aGUgYm9vayBgUiBFeGFtcGxlIDUuMS9wIDE0OGAgZm9yIHNpbXVsYXRpbmcgYW4gYXJpdGhtZXRpYyBCcm93bmlhbiBtb3Rpb24gYW5kIGBSIEV4YW1wbGUgNS4yL3AxNTJgIGZvciBzaW11bGF0aW5nIGEgZ2VvbWV0cmljIG1vdGlvbi4gVHdvIG5ldyBwYWNrYWdlcyB3aWxsIGJlIHJlcXVpcmVkIGZvciB0aGlzIHdvcmtzaGVldC4gIFRoZXkgYXJlIGluY2x1ZGVkIGluIHRoZSBjb2RlIGNodW5rIGJlbG93Lg0KDQpgYGB7cn0NCiNJbnN0YWxsIHBhY2thZ2UgcXVhbnRtb2QgDQppZighcmVxdWlyZSgicXVhbnRtb2QiLHF1aWV0bHkgPSBUUlVFKSkNCiAgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpDQpgYGANCg0KYGBge3J9DQojSW5zdGFsbCBwYWNrYWdlIHNkZSBmb3IgU3RvY2hhc3RpYyBEaWZmZXJlbnRpYWwgRXF1YXRpb24NCmlmKCFyZXF1aXJlKCJzZGUiLHF1aWV0bHkgPSBUUlVFKSkNCiAgaW5zdGFsbC5wYWNrYWdlcygic2RlIixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQ0KYGBgDQoNCmBgYHtyfQ0KI0luc3RhbGwgcGFja2FnZSBmT3B0aW9ucyBmb3IgcHJpY2luZyBhbmQgZXZhbHVhdGluZyBiYXNpYyBvcHRpb25zDQppZighcmVxdWlyZSgiZk9wdGlvbnMiLHF1aWV0bHkgPSBUUlVFKSkNCiAgaW5zdGFsbC5wYWNrYWdlcygiZk9wdGlvbnMiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpDQpgYGANCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFBKSBGb2xsb3cgZXhhbXBsZSBpbiBib29rIHRvIHNpbXVsYXRlIGFuZCBwbG90IGV4YW1wbGUgb2YgYW4gYXJpdGhtZXRpYyBCcm93bmlhbiBtb3Rpb24uIENvbnNpZGVyIHRocmVlIHZhbHVlcyBmb3IgbiAobnVtYmVyIG9mIHBvaW50cyk6ICQyXjIsIDJeNSwgMl57MTJ9JC4gRXhwbGFpbiBiZWhhdmlvciBhcyBuIGluY3JlYXNlcy4NCjwvc3Bhbj4NCmBgYHtyfQ0KIyNpbnB1dHM6DQogYWxwaGE9MDsgc2lnbWE9MTsgVD0xOyBuPTJeKDIpO1gwPTAuMTsNCiAjIyMjIyMjIyMjIyMjR2VuZXJhdGUgMSB0cmFqZWN0b3J5DQogZHQ9VC9uDQp0PXNlcSgwLFQsYnk9ZHQpDQogeD1jKFgwLGFscGhhKmR0K3NpZ21hKnNxcnQoZHQpKnJub3JtKG4sbWVhbj0wLHNkPTEpKQ0KIFh0PWN1bXN1bSh4KQ0KIHBsb3QodCxYdCx0eXBlPSdsJyx4bGFiPSJ0aW1lIikNCmBgYA0KYGBge3J9DQojI2lucHV0czoNCiBhbHBoYT0wOyBzaWdtYT0xOyBUPTE7IG49Ml4oNSk7WDA9MC4xOw0KICMjIyMjIyMjIyMjIyNHZW5lcmF0ZSAxIHRyYWplY3RvcnkNCiBkdD1UL24NCnQ9c2VxKDAsVCxieT1kdCkNCiB4PWMoWDAsYWxwaGEqZHQrc2lnbWEqc3FydChkdCkqcm5vcm0obixtZWFuPTAsc2Q9MSkpDQogWHQ9Y3Vtc3VtKHgpDQogcGxvdCh0LFh0LHR5cGU9J2wnLHhsYWI9InRpbWUiKQ0KYGBgDQpgYGB7cn0NCiMjaW5wdXRzOg0KIGFscGhhPTA7IHNpZ21hPTE7IFQ9MTsgbj0yXigxMik7WDA9MC4xOw0KICMjIyMjIyMjIyMjIyNHZW5lcmF0ZSAxIHRyYWplY3RvcnkNCiBkdD1UL24NCnQ9c2VxKDAsVCxieT1kdCkNCiB4PWMoWDAsYWxwaGEqZHQrc2lnbWEqc3FydChkdCkqcm5vcm0obixtZWFuPTAsc2Q9MSkpDQogWHQ9Y3Vtc3VtKHgpDQogcGxvdCh0LFh0LHR5cGU9J2wnLHhsYWI9InRpbWUiKQ0KYGBgDQpkdCByZXByZXNlbnRzIHRoZSB0aW1lIGludGVydmFsICxkdD1UL24gLG4gaXMgdGhlIHN0ZXBzIGluIHRoZSB0aW1lIGludGVydmFsICx0aGUgaGlnaGVyIHRoZSBuLCB0aGUgY2xvc2VyIHRvIEJyb3duaWFuIG1vdGlvbi4gSW5jcmVhc2luZyB0aGUgdmFsdWUgb2Ygbiwgc28gdGhhdCB0aGUgdGltZSBzdGVwcyBUL24gYmVjb21lIHNtYWxsZXIsIHdpbGwgaW1wcm92ZQ0KdGhlIHF1YWxpdHkgb2YgdGhlIGFwcHJveGltYXRlIHNhbXBsZSBwYXRoIHRvIGEgdHJ1ZSBCcm93bmlhbiBwYXRoLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFCKSBXcml0ZSB0aGUgbWF0aGVtYXRpY2FsIGVxdWF0aW9uIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIGFsb25nIHRoZSB5LWF4aXMgaW4gdGhlIGFib3ZlIHBsb3QuIFNlcGFyYXRlbHkgZXhwcmVzcyB3aGF0IHRoZSB2YWx1ZSBvZiBlYWNoIHZhcmlhYmxlIGluIHRoZSBlcXVhdGlvbiBpcy4NCjwvc3Bhbj4NCiFbQ2FwdGlvbiBIZXJlXShob21ld29yazQxYi5qcGcpDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUMpIEZvbGxvdyBleGFtcGxlIGluIGJvb2sgdG8gc2ltdWxhdGUgYSBnZW9tZXRyaWMgQnJvd25pYW4gbW90aW9uLiANCjwvc3Bhbj4NCmBgYHtyfQ0KbGlicmFyeShzZGUpDQptdT0wLjE2OyBzaWdtYT0wLjI7IFAwPTQwOyBUID0gMS8xMiAjIzEgbW9udGgNCiBudD01MDsgbj0yXig4KQ0KIyMjIyMjIyMjIyMjI0dlbmVyYXRlIG50IHRyYWplY3Rvcmllcw0KIGR0PVQvbjsgdD1zZXEoMCxULGJ5PWR0KQ0KIFg9bWF0cml4KHJlcCgwLGxlbmd0aCh0KSpudCksIG5yb3c9bnQpDQogZm9yIChpIGluIDE6bnQpIHtYW2ksXT0gR0JNKHg9UDAscj1tdSxzaWdtYT1zaWdtYSxUPVQsTj1uKX0NCiMjUGxvdA0KIHltYXg9bWF4KFgpOyB5bWluPW1pbihYKSAjYm91bmRzIGZvciBzaW11bGF0ZWQgcHJpY2VzDQogcGxvdCh0LFhbMSxdLHQ9J2wnLHlsaW09Yyh5bWluLCB5bWF4KSwgY29sPTEsDQogeWxhYj0iUHJpY2UgUCh0KSIseGxhYj0idGltZSB0IikNCiBmb3IoaSBpbiAyOm50KXtsaW5lcyh0LFhbaSxdLCB0PSdsJyx5bGltPWMoeW1pbiwgeW1heCksY29sPWkpfQ0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUQpIFdyaXRlIHRoZSBtYXRoZW1hdGljYWwgZXF1YXRpb24gcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgYWxvbmcgdGhlIHktYXhpcyBpbiB0aGUgYWJvdmUgcGxvdC4gU2VwYXJhdGVseSBleHByZXNzIHdoYXQgdGhlIHZhbHVlIG9mIGVhY2ggdmFyaWFibGUgaW4gdGhlIGVxdWF0aW9uIGlzLg0KPC9zcGFuPg0KIVtDYXB0aW9uIEhlcmVdKGhvbWV3b3JrNDFkLmpwZykNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUUpIEhvdyBpcyB0aGUgZ2VvbWV0cmljIEJyb3duaWFuIHNpbXVsYXRpb24gZGlmZmVyZW50IGZyb20gdGhlIGFyaXRobWV0aWMgc2ltdWxhdGlvbj8gRWxhYm9yYXRlLg0KPC9zcGFuPg0KQW4gb2J2aW91cyBsaW1pdGF0aW9uIG9mIHRoZSBhcml0aG1ldGljIEJyb3duaWFuIG1vdGlvbiwgaWYgdXNlZCBhcyBhIG1vZGVsIGZvciB0aGUgcHJpY2Ugb2YgYSBzdG9jaywgaXMgdGhlIHBvc3NpYmlsaXR5IG9mIG5lZ2F0aXZlIHByaWNlcyAuDQpUaGlzIGNhbiBiZSBmaXhlZCBieSBjb25zaWRlcmluZyBwcmljZXMgbG9nIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGluc3RlYWQuIHdoZW4gd2UgdXNlIHRoZSBsb2cgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgZGF0YSwgdGhlbiB3ZSBnZW5lcmF0ZSB0aGUgZ2VvbWV0cmljIEJyb3dpYW4gbW90aW9uICwgd2hpY2ggY2FuIGtlZXAgdGhlIHByaWNlIHJlc3VsdCBhbGwgYWJvdmUgemVyby4NCg0KIyMjIFRhc2sgMjogT3B0aW9uIFByaWNpbmcsIEdyZWVrcywgYW5kIE51bWVyaWNhbCBEaWZmZXJlbnRpYXRpb24NCg0KRm9sbG93cyB0aGUgZXhhbXBsZSBpbiB0aGUgYm9vayAgYFIgRXhhbXBsZSA1LjMvcCAxNTYgYCBhbmQgYFIgRXhhbXBsZSA1LjUvcCAxNTdgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMkEpIENhbGN1bGF0ZSB0aGUgQ2FsbCBhbmQgUHV0IHByaWNlIG9mIHRoZSBnaXZlbiBFdXJvcGVhbiBPcHRpb24uICBFeHBsYWluIHdoYXQgdGhlIHZhcmlhYmxlcyBgcmAgYW5kIGBiYCBpbiB0aGUgZnVuY3Rpb24gY2FsbCBgR0JTT3B0aW9uYCByZXByZXNlbnQuICAgIA0KPC9zcGFuPg0KYGBge3J9DQogbGlicmFyeShmT3B0aW9ucykNCiBHQlNPcHRpb24oVHlwZUZsYWcgPSAiYyIsIFMgPSA2MCwgWCA9IDY1LCBUaW1lID0gMS80LCByID0gMC4wOCwgYiA9IDAuMDgsIHNpZ21hID0gMC4zMCkNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGZPcHRpb25zKQ0KIEdCU09wdGlvbihUeXBlRmxhZyA9ICJwIiwgUyA9IDYwLCBYID0gNjUsIFRpbWUgPSAxLzQsIHIgPSAwLjA4LCBiID0gMC4wOCwgc2lnbWEgPSAwLjMwKQ0KYGBgDQp0aGUgcHJpY2UgZm9yIGNhbGwgb3B0aW9uIGlzIDIuMTMzMzcyLCBhbmQgdGhlIHByaWNlIGZvciBwdXQgb3B0aW9uIGlzIDUuODQ2Mjg2IC4NCnIgaXMgdGhlIGFubnVhbGl6ZWQgcmF0ZSBvZiBpbnRlcmVzdCwgYSBudW1lcmljIHZhbHVlICBiIGlzIHRoZSBhbm51YWxpemVkIGNvc3Qtb2YtY2FycnkgcmF0ZQ0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQikgQ2FsY3VsYXRlIHRoZSBwYXJ0aWN1bGFyIEdyZWVrcyBEZWx0YSwgR2FtbWEsIGFuZCBWZWdhIGZvciB0aGUgYWJvdmUgY29ycmVzcG9uZGluZyBDYWxsIG9wdGlvbi4NCjwvc3Bhbj4NCmBgYHtyfQ0KIGxpYnJhcnkoZk9wdGlvbnMpDQogR0JTR3JlZWtzKFNlbGVjdGlvbj0iZGVsdGEiLFR5cGVGbGFnPSJjIixTPTYwLFg9NjUsVGltZT0xLzQscj0wLjA4LGI9MC4wOCxzaWdtYT0wLjMwKQ0KR0JTR3JlZWtzKFNlbGVjdGlvbj0iZ2FtbWEiLFR5cGVGbGFnPSJjIixTPTYwLFg9NjUsVGltZT0xLzQscj0wLjA4LGI9MC4wOCxzaWdtYT0wLjMwKQ0KR0JTR3JlZWtzKFNlbGVjdGlvbj0idGhldGEiLFR5cGVGbGFnPSJjIixTPTYwLFg9NjUsVGltZT0xLzQscj0wLjA4LGI9MC4wOCxzaWdtYT0wLjMwKQ0KIEdCU0dyZWVrcyhTZWxlY3Rpb249InZlZ2EiLFR5cGVGbGFnPSJjIixTPTYwLFg9NjUsVGltZT0xLzQscj0wLjA4LGI9MC4wOCxzaWdtYT0wLjMwKQ0KR0JTR3JlZWtzKFNlbGVjdGlvbj0icmhvIixUeXBlRmxhZz0iYyIsUz02MCxYPTY1LFRpbWU9MS80LHI9MC4wOCxiPTAuMDgsc2lnbWE9MC4zMCkNCg0KYGBgDQp0aGVzZSBmaWd1cmVzIGFyZSB0aGUgcmVzdWx0cyBvZiBkZWx0YSwgZ2FtbWEsdGhldGEsdmVnYSBhbmQgcmhvIHJlcGVjdGl2ZWx5Lg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQykgQ2FsY3VsYXRlIHRoZSBEZWx0YSwgR2FtbWEsIGFuZCBWZWdhIGZvciBzYW1lIG9wdGlvbiB1c2luZyBpbnN0ZWFkIG51bWVyaWNhbCBkaWZmZXJlbnRpYXRpb24uIFdyaXRlIHRoZSBtYXRoZW1hdGljYWwgZXF1YXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBudW1lcmljYWwgZGlmZmVyZW50aWF0aW9uLg0KPC9zcGFuPg0KYGBge3J9DQogbGlicmFyeShmT3B0aW9ucykNCiBHQlNDaGFyYWN0ZXJpc3RpY3MoVHlwZUZsYWc9ImMiLFM9NjAsWD02NSxUaW1lPTEvNCxyPTAuMDgsIGI9MC4wOCxzaWdtYT0wLjMwKQ0KYGBgDQohW0NhcHRpb24gSGVyZV0oaG9tZXdvcms0MmMuanBnKQ0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyRCkgQ29tcGFyZSByZXN1bHRzIGZyb20gMkIgYW5kIDJDLiBTaGFyZSBvYnNlcnZhdGlvbnMuDQpgYGB7cn0NCg0KYGBgDQoNCml0IHNlZW1zIHRoYXQgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZXN1bHRzIGNhbGN1bGF0ZWQgZnJvbSAyYiBhbmQgMmMuDQoNCg0KDQoqW2h0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSBdKGh0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSkNCg==