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

Attaching package: <U+393C><U+3E31>zoo<U+393C><U+3E32>

The following objects are masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    as.Date, as.Date.numeric

Version 0.4-0 included new data defaults. See ?getSymbols.
Learn from a quantmod author: https://www.datacamp.com/courses/importing-and-managing-financial-data-in-r
#Install package sde for Stochastic Differential Equation
if(!require("sde",quietly = TRUE))
  install.packages("sde",dependencies = TRUE, repos = "https://cloud.r-project.org")
there is no package called <U+393C><U+3E31>sde<U+393C><U+3E32>Installing package into <U+393C><U+3E31>C:/Users/rtrsa/OneDrive/Documents/R/win-library/3.5<U+393C><U+3E32>
(as <U+393C><U+3E31>lib<U+393C><U+3E32> is unspecified)
also installing the dependency <U+393C><U+3E31>fda<U+393C><U+3E32>

trying URL 'https://cloud.r-project.org/bin/windows/contrib/3.5/fda_2.4.8.zip'
Content type 'application/zip' length 2519390 bytes (2.4 MB)
downloaded 2.4 MB

trying URL 'https://cloud.r-project.org/bin/windows/contrib/3.5/sde_2.0.15.zip'
Content type 'application/zip' length 427142 bytes (417 KB)
downloaded 417 KB
package ‘fda’ successfully unpacked and MD5 sums checked
package ‘sde’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\rtrsa\AppData\Local\Temp\RtmpGkwoj7\downloaded_packages
#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")
there is no package called <U+393C><U+3E31>fOptions<U+393C><U+3E32>Installing package into <U+393C><U+3E31>C:/Users/rtrsa/OneDrive/Documents/R/win-library/3.5<U+393C><U+3E32>
(as <U+393C><U+3E31>lib<U+393C><U+3E32> is unspecified)
also installing the dependency <U+393C><U+3E31>RUnit<U+393C><U+3E32>

trying URL 'https://cloud.r-project.org/bin/windows/contrib/3.5/RUnit_0.4.32.zip'
Content type 'application/zip' length 296065 bytes (289 KB)
downloaded 289 KB

trying URL 'https://cloud.r-project.org/bin/windows/contrib/3.5/fOptions_3042.86.zip'
Content type 'application/zip' length 313110 bytes (305 KB)
downloaded 305 KB
package ‘RUnit’ successfully unpacked and MD5 sums checked
package ‘fOptions’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\rtrsa\AppData\Local\Temp\RtmpGkwoj7\downloaded_packages

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

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.

##inputs:
alpha=0; sigma=1; T=1; n=2^(2); X0=0.1;
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")

alpha=0; sigma=1; T=1; n=2^(5); X0=0.1;
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")

alpha=0; sigma=1; T=1; n=2^(12); X0=0.1;
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")

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

\(X_{i}\) = \(X_{i-1}\) + \(\alpha\) \(\frac{T}{n}\) + \(\sigma\) \(\epsilon\) \(\sqrt{T/n}\)

where, alpha=0; sigma=1; T=1; first value of n=2^(2); X0=0.1 values of n = \(2^2, 2^5, 2^{12}\) dT=T/n

##### 1C) Follow example in book to simulate a geometric Brownian motion.

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.

\(P_{t}\) = \(P_{0}\)exp(\(\mu\) - \(\sigma^{2}\)/2) + \(\sigma\) \(\epsilon\) \(\sqrt{deltaT}\)

mu=0.16; sigma=0.2; P0=40; T = 1/12

##### 1E) How is the geometric Brownian simulation different from the arithmetic simulation? Elaborate.

The arithematic Brownian motion suffers from certain limitations like, it can give negative values to prices with positive probabilities. This problem is fixed by the geometric Brownian motion which considers prices log normally distributed instead. We want to model P(t) as \(e^{X(t)}\) , with X(t) an arithematic Brownian motion. This gives X(t)=lnP(t), and so the price is now being considered log normally distributed.

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.

r is the annualized rate of interest, b is the annualized cost of carry rate.

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:
 Wed Dec 12 12:56:25 2018 
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:
 Wed Dec 12 12:56:26 2018 

##### 2B) Calculate the particular Greeks Delta, Gamma, and Vega for the above corresponding Call option.

GBSGreeks(Selection= "Delta", TypeFlag= "c",S= 60, X=65, Time= 1/4, r=0.08, sigma= 0.30, b=0.08)
[1] 0.3724829
GBSGreeks(Selection= "Gamma", TypeFlag= "c",S= 60, X=65, Time= 1/4, r=0.08, sigma= 0.30, b=0.08)
[1] 0.04204276
GBSGreeks(Selection= "Vega", TypeFlag= "c",S= 60, X=65, Time= 1/4, r=0.08, sigma= 0.30, b=0.08)
[1] 11.35154

##### 2C) Calculate the Delta, Gamma, and Vega for same option using instead numerical differentiation. Write the mathematical equations corresponding to each numerical differentiation.

Delta<- (2.5269-1.781)/2 = 0.372616

Vega<- (2.167452-2.099344)/(0.303-0.297)= 11.3513

Gamma<- (0.4148489-0.3309353)/2= 0.0419568


GBSOption(TypeFlag = "c", S = 59, X = 65,
Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)

GBSOption(TypeFlag = "c", S = 60, X = 65,
Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)

GBSOption(TypeFlag = "c", S = 61, X = 65,
Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)


GBSOption(TypeFlag = "c", S = 60, X = 65,
Time = 1/4, r = 0.08, b = 0.08, sigma = 0.297)

GBSOption(TypeFlag = "c", S = 60, X = 65,
Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)

GBSOption(TypeFlag = "c", S = 60, X = 65,
Time = 1/4, r = 0.08, b = 0.08, sigma = 0.303)





GBSGreeks(Selection= "Delta", TypeFlag= "c",S= 59, X=65, Time= 1/4, r=0.08, sigma= 0.30, b=0.08)
GBSGreeks(Selection= "Delta", TypeFlag= "c",S= 60, X=65, Time= 1/4, r=0.08, sigma= 0.30, b=0.08)
GBSGreeks(Selection= "Delta", TypeFlag= "c",S= 61, X=65, Time= 1/4, r=0.08, sigma= 0.30, b=0.08)

##### 2D) Compare results from 2B and 2C. Share observations.

There is a minuscle difference between the two, the numericaly calculated Delta, Vega and Gamma are a few points less. This variation is because within the R code certain assumptions are made regarding the distribution and other parameters and hence the difference.

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

LS0tDQp0aXRsZTogIkZJTkM2MjEgV2ludGVyIDIwMTgtMTkgTGFiIFdvcmtzaGVldCAwNCINCmF1dGhvcjogIlNhbmdhbWl0cmEgQWdyYXdhbCINCmRhdGU6ICIxMi8xMi8yMDE4Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQNCnN1YnRpdGxlOiBTdG9jaGFzdGljIE1vZGVsaW5nICYgTnVtZXJpY2FsIERpZmZlcmVudGlhdGlvbiAoZmluYzYyMS1sYWIwNCkNCi0tLQ0KDQojIyMgQWJvdXQNCg0KVGhpcyB3b3Jrc2hlZXQgbG9va3MgYXQgc2ltdWxhdGluZywgYm90aCBhcml0aG1ldGljcyBhbmQgZ2VvbWV0cmljLCBCcm93bmlhbiBtb3Rpb24gZm9yIHN0b2NrIHByaWNlcywgcHJpY2luZyBvcHRpb25zLCBhbmQgY2FsY3VsYXRpbmcgR3JlZWtzIHVzaW5nIG51bWVyaWNhbCBkaWZmZXJlbnRpYXRpb24uICANCg0KIyMjIFNldHVwDQoNClJlbWVtYmVyIHRvIGFsd2F5cyBzZXQgeW91ciB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24uIEdvIHRvICdTZXNzaW9uJywgc2Nyb2xsIGRvd24gdG8gJ1NldCBXb3JraW5nIERpcmVjdG9yeScsIGFuZCBjbGljayAnVG8gU291cmNlIEZpbGUgTG9jYXRpb24nLiBSZWFkIGNhcmVmdWxseSB0aGUgYmVsb3cgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGNvbXBsZXRlIHRoZSB0YXNrcyBhbmQgYW5zd2VyIGFueSBxdWVzdGlvbnMuICBTdWJtaXQgeW91ciB3b3JrIHRvIFJQdWJzIGFzIGRldGFpbGVkIGluIHByZXZpb3VzIG5vdGVzLiANCg0KIyMjIE5vdGUNCg0KQWx3YXlzIHJlYWQgY2FyZWZ1bGx5IHRoZSBpbnN0cnVjdGlvbnMgb24gU2FrYWkuICBGb3IgY2xhcml0eSwgdGFza3MvcXVlc3Rpb25zIHRvIGJlIGNvbXBsZXRlZC9hbnN3ZXJlZCBhcmUgaGlnaGxpZ2h0ZWQgaW4gcmVkIGNvbG9yICh2aXNpYmxlIGluIHByZXZpZXcpIGFuZCBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgcGFydGljdWxhciBwbGFjZW1lbnQgaW4gdGhlIHRhc2sgc2VjdGlvbi4gIFF1aXRlIG9mdGVuIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHlvdXIgb3duIGNvZGUgY2h1bmsuDQoNCkV4ZWN1dGUgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkgZm9sbHdvaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTWFrZSBzdXJlIHRvIGFkZCBjb21tZW50cyB0byB5b3VyIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuIFVzZSBvd24gbGFuZ3VhZ2UhDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIyBUYXNrIDE6IFNpbXVsYXRpbmcgQnJvd25pYW4gTW90aW9uDQoNClRoaXMgdGFzayBmb2xsb3dzIHRoZSB0d28gZXhhbXBsZXMgaW4gdGhlIGJvb2sgYFIgRXhhbXBsZSA1LjEvcCAxNDhgIGZvciBzaW11bGF0aW5nIGFuIGFyaXRobWV0aWMgQnJvd25pYW4gbW90aW9uIGFuZCBgUiBFeGFtcGxlIDUuMi9wMTUyYCBmb3Igc2ltdWxhdGluZyBhIGdlb21ldHJpYyBtb3Rpb24uIFR3byBuZXcgcGFja2FnZXMgd2lsbCBiZSByZXF1aXJlZCBmb3IgdGhpcyB3b3Jrc2hlZXQuICBUaGV5IGFyZSBpbmNsdWRlZCBpbiB0aGUgY29kZSBjaHVuayBiZWxvdy4NCg0KYGBge3J9DQojSW5zdGFsbCBwYWNrYWdlIHF1YW50bW9kIA0KaWYoIXJlcXVpcmUoInF1YW50bW9kIixxdWlldGx5ID0gVFJVRSkpDQogIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQ0KYGBgDQoNCmBgYHtyfQ0KI0luc3RhbGwgcGFja2FnZSBzZGUgZm9yIFN0b2NoYXN0aWMgRGlmZmVyZW50aWFsIEVxdWF0aW9uDQppZighcmVxdWlyZSgic2RlIixxdWlldGx5ID0gVFJVRSkpDQogIGluc3RhbGwucGFja2FnZXMoInNkZSIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikNCmBgYA0KDQpgYGB7cn0NCiNJbnN0YWxsIHBhY2thZ2UgZk9wdGlvbnMgZm9yIHByaWNpbmcgYW5kIGV2YWx1YXRpbmcgYmFzaWMgb3B0aW9ucw0KaWYoIXJlcXVpcmUoImZPcHRpb25zIixxdWlldGx5ID0gVFJVRSkpDQogIGluc3RhbGwucGFja2FnZXMoImZPcHRpb25zIixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQ0KYGBgDQoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxQSkgRm9sbG93IGV4YW1wbGUgaW4gYm9vayB0byBzaW11bGF0ZSBhbmQgcGxvdCBleGFtcGxlIG9mIGFuIGFyaXRobWV0aWMgQnJvd25pYW4gbW90aW9uLiBDb25zaWRlciB0aHJlZSB2YWx1ZXMgZm9yIG4gKG51bWJlciBvZiBwb2ludHMpOg0KDQokMl4yLCAyXjUsIDJeezEyfSQuIEV4cGxhaW4gYmVoYXZpb3IgYXMgbiBpbmNyZWFzZXMuDQo8L3NwYW4+DQoNCkluY3JlYXNpbmcgdGhlIHZhbHVlIG9mIG4sIHNvIHRoYXQgdGhlIHRpbWUgc3RlcHMgVC9uIGJlY29tZSBzbWFsbGVyLCB3aWxsIGltcHJvdmUgdGhlIHF1YWxpdHkgb2YgdGhlIGFwcHJveGltYXRlIHNhbXBsZSBwYXRoIHRvIGEgdHJ1ZSBCcm93bmlhbiBwYXRoLg0KDQoNCmBgYHtyfQ0KIyNpbnB1dHM6DQphbHBoYT0wOyBzaWdtYT0xOyBUPTE7IG49Ml4oMik7IFgwPTAuMTsNCg0KZHQ9VC9uDQp0PXNlcSgwLFQsYnk9ZHQpDQp4PWMoWDAsYWxwaGEqZHQrc2lnbWEqc3FydChkdCkqcm5vcm0obixtZWFuPTAsc2Q9MSkpDQpYdD1jdW1zdW0oeCkNCnBsb3QodCxYdCx0eXBlPSdsJyx4bGFiPSJ0aW1lIikNCg0KYWxwaGE9MDsgc2lnbWE9MTsgVD0xOyBuPTJeKDUpOyBYMD0wLjE7DQoNCmR0PVQvbg0KdD1zZXEoMCxULGJ5PWR0KQ0KeD1jKFgwLGFscGhhKmR0K3NpZ21hKnNxcnQoZHQpKnJub3JtKG4sbWVhbj0wLHNkPTEpKQ0KWHQ9Y3Vtc3VtKHgpDQpwbG90KHQsWHQsdHlwZT0nbCcseGxhYj0idGltZSIpDQoNCmFscGhhPTA7IHNpZ21hPTE7IFQ9MTsgbj0yXigxMik7IFgwPTAuMTsNCg0KDQpkdD1UL24NCnQ9c2VxKDAsVCxieT1kdCkNCng9YyhYMCxhbHBoYSpkdCtzaWdtYSpzcXJ0KGR0KSpybm9ybShuLG1lYW49MCxzZD0xKSkNClh0PWN1bXN1bSh4KQ0KcGxvdCh0LFh0LHR5cGU9J2wnLHhsYWI9InRpbWUiKQ0KYGBgDQoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxQikgV3JpdGUgdGhlIG1hdGhlbWF0aWNhbCBlcXVhdGlvbiByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBhbG9uZyB0aGUgeS1heGlzIGluIHRoZSBhYm92ZSBwbG90LiBTZXBhcmF0ZWx5IGV4cHJlc3Mgd2hhdCB0aGUgdmFsdWUgb2YgZWFjaCB2YXJpYWJsZSBpbiB0aGUgZXF1YXRpb24gaXMuDQo8L3NwYW4+DQoNCg0KDQokWF97aX0kID0gJFhfe2ktMX0kICsgJFxhbHBoYSQgJFxmcmFje1R9e259JCArICRcc2lnbWEkICRcZXBzaWxvbiQgJFxzcXJ0e1Qvbn0kIA0KDQp3aGVyZSwgYWxwaGE9MDsgc2lnbWE9MTsgVD0xOyBmaXJzdCB2YWx1ZSBvZiBuPTJeKDIpOyBYMD0wLjENCnZhbHVlcyBvZiBuID0gJDJeMiwgMl41LCAyXnsxMn0kIA0KZFQ9VC9uDQoNCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFDKSBGb2xsb3cgZXhhbXBsZSBpbiBib29rIHRvIHNpbXVsYXRlIGEgZ2VvbWV0cmljIEJyb3duaWFuIG1vdGlvbi4gDQo8L3NwYW4+DQoNCmBgYHtyfQ0KbXU9MC4xNjsgc2lnbWE9MC4yOyBQMD00MDsgVCA9IDEvMTIgIyMxIG1vbnRoDQpudD01MDsgbj0yXig4KQ0KIyMjIyMjIyMjIyMjI0dlbmVyYXRlIG50IHRyYWplY3Rvcmllcw0KZHQ9VC9uOyB0PXNlcSgwLFQsYnk9ZHQpDQpYPW1hdHJpeChyZXAoMCxsZW5ndGgodCkqbnQpLCBucm93PW50KQ0KZm9yIChpIGluIDE6bnQpIHtYW2ksXT0gR0JNKHg9UDAscj1tdSxzaWdtYT1zaWdtYSxUPVQsTj1uKX0NCiMjUGxvdA0KeW1heD1tYXgoWCk7IHltaW49bWluKFgpICNib3VuZHMgZm9yIHNpbXVsYXRlZCBwcmljZXMNCnBsb3QodCxYWzEsXSx0PSdsJyx5bGltPWMoeW1pbiwgeW1heCksIGNvbD0xLA0KICAgIHlsYWI9IlByaWNlIFAodCkiLHhsYWI9InRpbWUgdCIpDQpmb3IoaSBpbiAyOm50KXtsaW5lcyh0LFhbaSxdLCB0PSdsJyx5bGltPWMoeW1pbiwgeW1heCksY29sPWkpfQ0KIw0KDQpgYGANCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFEKSBXcml0ZSB0aGUgbWF0aGVtYXRpY2FsIGVxdWF0aW9uIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIGFsb25nIHRoZSB5LWF4aXMgaW4gdGhlIGFib3ZlIHBsb3QuIFNlcGFyYXRlbHkgZXhwcmVzcyB3aGF0IHRoZSB2YWx1ZSBvZiBlYWNoIHZhcmlhYmxlIGluIHRoZSBlcXVhdGlvbiBpcy4NCjwvc3Bhbj4NCg0KJFBfe3R9JCA9ICRQX3swfSRleHAoJFxtdSQgLSAkXHNpZ21hXnsyfSQvMikgKyAkXHNpZ21hJCAkXGVwc2lsb24kICRcc3FydHtkZWx0YVR9JCANCg0KbXU9MC4xNjsgc2lnbWE9MC4yOyBQMD00MDsgVCA9IDEvMTINCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxRSkgSG93IGlzIHRoZSBnZW9tZXRyaWMgQnJvd25pYW4gc2ltdWxhdGlvbiBkaWZmZXJlbnQgZnJvbSB0aGUgYXJpdGhtZXRpYyBzaW11bGF0aW9uPyBFbGFib3JhdGUuDQo8L3NwYW4+DQoNCg0KVGhlIGFyaXRoZW1hdGljIEJyb3duaWFuIG1vdGlvbiBzdWZmZXJzIGZyb20gY2VydGFpbiBsaW1pdGF0aW9ucyBsaWtlLCBpdCBjYW4gZ2l2ZSBuZWdhdGl2ZSB2YWx1ZXMgdG8gcHJpY2VzIHdpdGggcG9zaXRpdmUgcHJvYmFiaWxpdGllcy4gVGhpcyBwcm9ibGVtIGlzIGZpeGVkIGJ5IHRoZSBnZW9tZXRyaWMgQnJvd25pYW4gbW90aW9uIHdoaWNoIGNvbnNpZGVycyBwcmljZXMgbG9nIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGluc3RlYWQuIFdlIHdhbnQgdG8gbW9kZWwgUCh0KSBhcyAkZV57WCh0KX0kICwgd2l0aCBYKHQpIGFuIGFyaXRoZW1hdGljIEJyb3duaWFuIG1vdGlvbi4gVGhpcyBnaXZlcyBYKHQpPWxuUCh0KSwgYW5kIHNvIHRoZSBwcmljZSBpcyBub3cgYmVpbmcgY29uc2lkZXJlZCBsb2cgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuDQoNCiANCiMjIyBUYXNrIDI6IE9wdGlvbiBQcmljaW5nLCBHcmVla3MsIGFuZCBOdW1lcmljYWwgRGlmZmVyZW50aWF0aW9uDQoNCkZvbGxvd3MgdGhlIGV4YW1wbGUgaW4gdGhlIGJvb2sgIGBSIEV4YW1wbGUgNS4zL3AgMTU2IGAgYW5kIGBSIEV4YW1wbGUgNS41L3AgMTU3YA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJBKSBDYWxjdWxhdGUgdGhlIENhbGwgYW5kIFB1dCBwcmljZSBvZiB0aGUgZ2l2ZW4gRXVyb3BlYW4gT3B0aW9uLiAgRXhwbGFpbiB3aGF0IHRoZSB2YXJpYWJsZXMgYHJgIGFuZCBgYmAgaW4gdGhlIGZ1bmN0aW9uIGNhbGwgYEdCU09wdGlvbmAgcmVwcmVzZW50LiAgICANCjwvc3Bhbj4NCg0KciBpcyB0aGUgYW5udWFsaXplZCByYXRlIG9mIGludGVyZXN0LCBiIGlzIHRoZSBhbm51YWxpemVkIGNvc3Qgb2YgY2FycnkgcmF0ZS4NCg0KYGBge3J9DQpHQlNPcHRpb24oVHlwZUZsYWcgPSAiYyIsIFMgPSA2MCwgWCA9IDY1LA0KVGltZSA9IDEvNCwgciA9IDAuMDgsIGIgPSAwLjA4LCBzaWdtYSA9IDAuMzApDQoNCkdCU09wdGlvbihUeXBlRmxhZyA9ICJwIiwgUyA9IDYwLCBYID0gNjUsDQpUaW1lID0gMS80LCByID0gMC4wOCwgYiA9IDAuMDgsIHNpZ21hID0gMC4zMCkNCg0KYGBgDQoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQikgQ2FsY3VsYXRlIHRoZSBwYXJ0aWN1bGFyIEdyZWVrcyBEZWx0YSwgR2FtbWEsIGFuZCBWZWdhIGZvciB0aGUgYWJvdmUgY29ycmVzcG9uZGluZyBDYWxsIG9wdGlvbi4NCjwvc3Bhbj4NCg0KYGBge3J9DQpHQlNHcmVla3MoU2VsZWN0aW9uPSAiRGVsdGEiLCBUeXBlRmxhZz0gImMiLFM9IDYwLCBYPTY1LCBUaW1lPSAxLzQsIHI9MC4wOCwgc2lnbWE9IDAuMzAsIGI9MC4wOCkNCkdCU0dyZWVrcyhTZWxlY3Rpb249ICJHYW1tYSIsIFR5cGVGbGFnPSAiYyIsUz0gNjAsIFg9NjUsIFRpbWU9IDEvNCwgcj0wLjA4LCBzaWdtYT0gMC4zMCwgYj0wLjA4KQ0KR0JTR3JlZWtzKFNlbGVjdGlvbj0gIlZlZ2EiLCBUeXBlRmxhZz0gImMiLFM9IDYwLCBYPTY1LCBUaW1lPSAxLzQsIHI9MC4wOCwgc2lnbWE9IDAuMzAsIGI9MC4wOCkNCg0KYGBgDQoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQykgQ2FsY3VsYXRlIHRoZSBEZWx0YSwgR2FtbWEsIGFuZCBWZWdhIGZvciBzYW1lIG9wdGlvbiB1c2luZyBpbnN0ZWFkIG51bWVyaWNhbCBkaWZmZXJlbnRpYXRpb24uIFdyaXRlIHRoZSBtYXRoZW1hdGljYWwgZXF1YXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBudW1lcmljYWwgZGlmZmVyZW50aWF0aW9uLg0KPC9zcGFuPg0KDQpEZWx0YTwtICgyLjUyNjktMS43ODEpLzIgPSAwLjM3MjYxNg0KDQoNClZlZ2E8LSAoMi4xNjc0NTItMi4wOTkzNDQpLygwLjMwMy0wLjI5Nyk9IDExLjM1MTMNCg0KDQpHYW1tYTwtICgwLjQxNDg0ODktMC4zMzA5MzUzKS8yPSAwLjA0MTk1NjgNCg0KDQoNCg0KDQoNCg0KDQoNCg0KYGBge3J9DQoNCkdCU09wdGlvbihUeXBlRmxhZyA9ICJjIiwgUyA9IDU5LCBYID0gNjUsDQpUaW1lID0gMS80LCByID0gMC4wOCwgYiA9IDAuMDgsIHNpZ21hID0gMC4zMCkNCg0KR0JTT3B0aW9uKFR5cGVGbGFnID0gImMiLCBTID0gNjAsIFggPSA2NSwNClRpbWUgPSAxLzQsIHIgPSAwLjA4LCBiID0gMC4wOCwgc2lnbWEgPSAwLjMwKQ0KDQpHQlNPcHRpb24oVHlwZUZsYWcgPSAiYyIsIFMgPSA2MSwgWCA9IDY1LA0KVGltZSA9IDEvNCwgciA9IDAuMDgsIGIgPSAwLjA4LCBzaWdtYSA9IDAuMzApDQoNCg0KR0JTT3B0aW9uKFR5cGVGbGFnID0gImMiLCBTID0gNjAsIFggPSA2NSwNClRpbWUgPSAxLzQsIHIgPSAwLjA4LCBiID0gMC4wOCwgc2lnbWEgPSAwLjI5NykNCg0KR0JTT3B0aW9uKFR5cGVGbGFnID0gImMiLCBTID0gNjAsIFggPSA2NSwNClRpbWUgPSAxLzQsIHIgPSAwLjA4LCBiID0gMC4wOCwgc2lnbWEgPSAwLjMwKQ0KDQpHQlNPcHRpb24oVHlwZUZsYWcgPSAiYyIsIFMgPSA2MCwgWCA9IDY1LA0KVGltZSA9IDEvNCwgciA9IDAuMDgsIGIgPSAwLjA4LCBzaWdtYSA9IDAuMzAzKQ0KDQoNCg0KDQoNCkdCU0dyZWVrcyhTZWxlY3Rpb249ICJEZWx0YSIsIFR5cGVGbGFnPSAiYyIsUz0gNTksIFg9NjUsIFRpbWU9IDEvNCwgcj0wLjA4LCBzaWdtYT0gMC4zMCwgYj0wLjA4KQ0KR0JTR3JlZWtzKFNlbGVjdGlvbj0gIkRlbHRhIiwgVHlwZUZsYWc9ICJjIixTPSA2MCwgWD02NSwgVGltZT0gMS80LCByPTAuMDgsIHNpZ21hPSAwLjMwLCBiPTAuMDgpDQpHQlNHcmVla3MoU2VsZWN0aW9uPSAiRGVsdGEiLCBUeXBlRmxhZz0gImMiLFM9IDYxLCBYPTY1LCBUaW1lPSAxLzQsIHI9MC4wOCwgc2lnbWE9IDAuMzAsIGI9MC4wOCkNCg0KDQoNCg0KYGBgDQoNCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJEKSBDb21wYXJlIHJlc3VsdHMgZnJvbSAyQiBhbmQgMkMuIFNoYXJlIG9ic2VydmF0aW9ucy4NCg0KVGhlcmUgaXMgYSBtaW51c2NsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3bywgdGhlIG51bWVyaWNhbHkgY2FsY3VsYXRlZCBEZWx0YSwgVmVnYSBhbmQgR2FtbWEgYXJlIGEgZmV3IHBvaW50cyBsZXNzLiBUaGlzIHZhcmlhdGlvbiBpcyBiZWNhdXNlIHdpdGhpbiB0aGUgUiBjb2RlIGNlcnRhaW4gYXNzdW1wdGlvbnMgYXJlIG1hZGUgcmVnYXJkaW5nIHRoZSBkaXN0cmlidXRpb24gYW5kIG90aGVyIHBhcmFtZXRlcnMgYW5kIGhlbmNlIHRoZSBkaWZmZXJlbmNlLiANCg0KKltodHRwOi8vY29tcHV0YXRpb25hbGZpbmFuY2UubHNpLnVwYy5lZHUgXShodHRwOi8vY29tcHV0YXRpb25hbGZpbmFuY2UubHNpLnVwYy5lZHUpDQo=