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

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

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