About

This worksheet is your warm-up exercises to getting started with some R for finance, based on examples from the book. It is also your getting started with problems solving (no R required) and expressing your methods/answers using proper mathematical symbols and representations.

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: Charting Stock Time Series

This task follows the book’s R Example 1.1/p. 8 also exhibited in the R-Labs section R Labs1 from the book’s website (*). In order to work with R in finance we need to first install the package quantmod that allows us to retrieve financial data and conduct various statistical analysis.

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

install packages quantmod

install.packages(“quantmod”) library(quantmod)

##### 1A) Insert in the code chunk below the rest of the code to calculate and chart the time series for stock GE. Follow the example in the book. Add comments, where appropriate, explaining what the particular line(s) of code is/are executing/solving for.

##retrieve historical price data for General Electric Co. from Yahoo Finance
getSymbols('GE',src='yahoo', from="2000-01-01", to="2009-12-30")
[1] "GE"
##to see headers of file (OHLCV type)
names(GE)
[1] "GE.Open"     "GE.High"     "GE.Low"      "GE.Close"    "GE.Volume"  
[6] "GE.Adjusted"
## to see the data from 1st of January 2000 to 20th of January 2000
GE["2000-01-01/2000-01-20"]
            GE.Open  GE.High   GE.Low GE.Close GE.Volume GE.Adjusted
2000-01-03 51.00000 51.22917 49.72917 50.00000  22069800    27.37866
2000-01-04 49.08333 49.33333 48.00000 48.00000  22121400    26.28352
2000-01-05 47.91667 49.00000 47.52083 47.91667  27292800    26.23787
2000-01-06 47.70833 48.97917 47.54167 48.55727  19873200    26.58866
2000-01-07 49.33333 50.62500 49.00000 50.43750  20141400    27.61822
2000-01-10 50.89583 51.35417 50.37500 50.41667  15226500    27.60681
2000-01-11 50.33333 50.89583 50.20833 50.50000  15123000    27.65244
2000-01-12 50.35417 51.08333 50.18750 50.66667  18342300    27.74371
2000-01-13 51.04167 51.64583 51.00000 51.25000  14953500    28.06313
2000-01-14 51.12500 51.54167 49.85417 50.33333  18480300    27.56119
2000-01-18 49.87500 49.87500 48.91667 49.33333  18296700    27.01362
2000-01-19 48.83333 50.31250 48.75000 49.57290  14849700    27.14478
2000-01-20 49.68750 49.91667 47.54167 48.64583  30759000    26.63714
## to see only the adjusted close prices from that period
geAdj=GE$GE.Adjusted["2000-01-01/2000-01-20"]; geAdj
           GE.Adjusted
2000-01-03    27.37866
2000-01-04    26.28352
2000-01-05    26.23787
2000-01-06    26.58866
2000-01-07    27.61822
2000-01-10    27.60681
2000-01-11    27.65244
2000-01-12    27.74371
2000-01-13    28.06313
2000-01-14    27.56119
2000-01-18    27.01362
2000-01-19    27.14478
2000-01-20    26.63714
##Compute the maximum,minimum and mean value
max(geAdj); min(geAdj);mean(geAdj)
[1] 28.06313
[1] 26.23787
[1] 27.1946
# Create a chart
chartSeries(GE)

## a chart of the date from January 2000 to 20th of January 2000
chartSeries(GE,TA=NULL,subset='2001-01::2001-02')

##save the date in local desk
saveRDS(GE,file="GE.rds")

Task 2: Comparing Performance of Stocks Time Series

This follows the book’s example 1.3.4 R Lab/p. 34 also R Labs 1 from the book’s website (*).

##### 2A) Insert the code chunk to chart instead the performance of Value Line Index VLIC (sort of benchmark), and four other stocks of your choice over a time period dating back one year from present date.

library("quantmod")
symbols=c('^VLIC','TSLA','GOOGL','BIDU','BABA')
getSymbols(symbols,src='yahoo',from="2017-11-13",to="2018-11-13")
[1] "VLIC"  "TSLA"  "GOOGL" "BIDU"  "BABA" 
 #obtain adjusted closed
VLICad = VLIC$VLIC.Adjusted; 
TSLAad= TSLA$TSLA.Adjusted;
GOOGLad=GOOGL$GOOGL.Adjusted; 
BIDUad=BIDU$BIDU.Adjusted;
BABAad = BABA$BABA.Adjusted
 #compute cumulative sum (cumsum) of daily returns (Delt)
 #Remove first term of the series, with [-1,], since cumsum is not defined for it.
vl = cumsum((Delt(VLICad)*100)[-1,])
TS = cumsum((Delt(TSLAad)*100)[-1,])
GO = cumsum((Delt(GOOGLad)*100)[-1,])
BI = cumsum((Delt(BIDUad)*100)[-1,])
BA = cumsum((Delt(BABAad)*100)[-1,])
 
###range of values for the plot
lim = c(min(vl,TS,GO,BI,BA),max(vl,TS,GO,BI,BA))
###the plot
plot(vl,main="",ylim=lim,xlab="dates",ylab="% benefits")

lines(TS,col="green"); lines(GO,col="red")

lines(BI,col="violet"); lines(BA,col="yellow")

legend(x="topleft",cex=0.4,c("VLIC","TSLA","GOOGL","BIDU","BABA"),
   lty=1, col=c("black","green","red","violet","yellow"))

##### 2B) Write the mathematical form/representation, using proper math symbols, to describe the formula being calculated and plotted in the code

\(VLIC_t=VLIC_{t-1}*(\prod_{i = 1}^{n} C_{i,t}/C_{i,t-1})^{1/n}\)

##### 2C) Write a paragraph, in your own words, comparing the stock performances based on your assessment of the companies general business and their valuation vis-a-vis the market overall performance, and pertinent econonomical factors.

TSLA,‘GOOGL’,‘BIDU’,’BABA

During 2017-2018, the price of BIDU is under average performance of market. Due to fraud and fake advertisements, BIDU has to adjust new profits resources. Following negative effects originated from ads, the price of BIDU went down. However, as majority search engine in China, BIDU steady grow up.Plus,Considering the possiblity of company stock repurchased and planing to return to market of china,the price of BIDU will be 200 in long term. For BABA, Jack Ma, the CEO of BABA, is main founder of BABA, and his abrupt decision of retirement is harmful for the company. As largest private company in China, the diversed products flourish profits resources, but the company has to solve issues of counterfeit and inferior quality commodity. Considering unpredictable arrangement of managerment, negative effect from retirement of CEO and products issues, the price of BABA will go down. For GOOGL, the comapny has various products and multiple businesses.One of the products is intelligent car, whihc is tendency in future. The price of GOOGLE will be higher. For TSLA, the company is unpredictable. The company initiate space craft as private organization, and company strive to create electric car, which is sunrise industry. In the electric vehicle industry,cost of lithium battery stay at lowest level in history, and the problem of storage energy is only concern. Once TSLA overcomes the technical matters, the company will be infinite valuable. the price of TSLA is unpredictable.

To add math symbols in R Markdown check the link MathinRmd.html. Many other examples are on Google. Following is an example: \(\sum_{n=1}^{10} n^2\). Other, less preferred options, is to neatly handwrite your equations on a paper or use own preferred tools like Microsoft Word, take a clear image capture of your work and include here. Hard to read work will be dismissed.

Below is an example on how to include an image. It is assumed that the image resides in the same folder as the worksheet. Otherwise the path to the folder where the image resides needs to be included in the name referencing below.

Task 3: Problem(s) Solving

This task does not require use of R code. You will however need to type your work here, using proper mathematical symbols and representations, or include a clear image capture of your work.

##### 3A) Solve for 1.3.8 Problem/p. 36.

use date \(t=0.5\); \(S_0=25\); \(K=20\); \(S_u=40\);\(S_d=15\); \(C_u=S_u-K\); \(C_d=0\); ;\(r=0.05\) to format \(\delta\Delta=(C_u-C_d)/(S_u-S_d)\) and \(\hat{B}=(\delta\Delta*S_d-C_d)/(1+r)\) and \(C=\delta\Delta*S_0-(1+r)^t* \hat{B}\) and \(P=C+k/(1+r)^t*\hat{B}-S_0\) ,the result of C and P: \(C=8.2891\);\(P=2.8072\)

##### 3B) Solve for 1.3.9 Problem/p. 36

We assume that \(\Delta p = \Delta C - 1\) . For \(C + K/(1+r)^t = S_o + P\),
formula1 \(C_u=P_u+S_u-K/(1+r)^t\), formula2 \(C_d=P_d+S_d-K/(1+r)^t\), combinate formula 1 and 2 with \(\Delta C=(C_u-C_d)/(S_u-S_d)\) and \(\Delta p = \Delta C - 1\), we can get \(\Delta p=(P_u-P_d)/(S_u-S_d)\), thus we prove \(\Delta p = \Delta C - 1\)

Solution

Solution

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

LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDAxIgphdXRob3I6ICJZdSBKaWEiCmRhdGU6ICIxMS8xMS8xOCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CnN1YnRpdGxlOiBFeHBsb3JhdGlvbiBvZiBSIGluIEZpbmFuY2UgKGZpbmM2MjEtbGFiMDEpCi0tLQoKIyMjIEFib3V0CgpUaGlzIHdvcmtzaGVldCBpcyB5b3VyIHdhcm0tdXAgZXhlcmNpc2VzIHRvIGdldHRpbmcgc3RhcnRlZCB3aXRoIHNvbWUgUiBmb3IgZmluYW5jZSwgYmFzZWQgb24gIGV4YW1wbGVzIGZyb20gdGhlIGJvb2suIEl0IGlzIGFsc28geW91ciBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCBwcm9ibGVtcyBzb2x2aW5nIChubyBSIHJlcXVpcmVkKSBhbmQgZXhwcmVzc2luZyB5b3VyIG1ldGhvZHMvYW5zd2VycyB1c2luZyBwcm9wZXIgbWF0aGVtYXRpY2FsIHN5bWJvbHMgYW5kIHJlcHJlc2VudGF0aW9ucy4KCiMjIyBTZXR1cAoKUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIAoKIyMjIE5vdGUKCkZvciBjbGFyaXR5LCB0YXNrcy9xdWVzdGlvbnMgdG8gYmUgY29tcGxldGVkL2Fuc3dlcmVkIGFyZSBoaWdobGlnaHRlZCBpbiByZWQgY29sb3IgKGNvbG9yIHZpc2libGUgb25seSBpbiBwcmV2aWV3IG1vZGUpIGFuZCBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgcGFydGljdWxhciBwbGFjZW1lbnQgaW4gdGhlIHRhc2sgc2VjdGlvbi4gIFR5cGUgeW91ciBhbnN3ZXJzIG91dHNpZGUgdGhlIHJlZCBjb2xvciB0YWdzIQoKUXVpdGUgb2Z0ZW4geW91IHdpbGwgbmVlZCB0byBhZGQgeW91ciBvd24gY29kZSBjaHVuay4gRXhlY3V0ZSBzZXF1ZW50aWFsbHkgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkgZm9sbG93aW5nIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTWFrZSBzdXJlIHRvIGFkZCBjb21tZW50cyB0byB5b3VyIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuIFVzZSBvd24gbGFuZ3VhZ2UhCgoqKkFueSBzaWduIG9mIHBsYWdpYXJpc20sIHdpbGwgcmVzdWx0IGluIGRpc3NtaXNzYWwgb2Ygd29yayEqKgoKLS0tLS0tLS0tLS0tLS0KCiMjIyBUYXNrIDE6IENoYXJ0aW5nIFN0b2NrIFRpbWUgU2VyaWVzIAoKVGhpcyB0YXNrIGZvbGxvd3MgdGhlIGJvb2sncyBSIEV4YW1wbGUgMS4xL3AuIDggYWxzbyBleGhpYml0ZWQgaW4gdGhlIFItTGFicyBzZWN0aW9uIFIgTGFiczEgZnJvbSB0aGUgYm9va+KAmXMgd2Vic2l0ZSAoKikuIEluIG9yZGVyIHRvIHdvcmsgd2l0aCBSIGluIGZpbmFuY2Ugd2UgbmVlZCB0byBmaXJzdCBpbnN0YWxsIHRoZSBwYWNrYWdlIGBxdWFudG1vZGAgdGhhdCBhbGxvd3MgdXMgdG8gcmV0cmlldmUgZmluYW5jaWFsIGRhdGEgYW5kIGNvbmR1Y3QgdmFyaW91cyBzdGF0aXN0aWNhbCBhbmFseXNpcy4KCmBgYHtyfQojIFJlcXVpcmUgd2lsbCBsb2FkIHRoZSBwYWNrYWdlIG9ubHkgaWYgbm90IGluc3RhbGxlZCAKIyBEZXBlbmRlbmNpZXMgPSBUUlVFIG1ha2VzIHN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGwKaWYoIXJlcXVpcmUoInF1YW50bW9kIixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpCmBgYAojIGluc3RhbGwgcGFja2FnZXMgcXVhbnRtb2QKPmluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKPmxpYnJhcnkocXVhbnRtb2QpCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUEpIEluc2VydCBpbiB0aGUgY29kZSBjaHVuayBiZWxvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSB0byBjYWxjdWxhdGUgYW5kIGNoYXJ0IHRoZSB0aW1lIHNlcmllcyBmb3Igc3RvY2sgR0UuICBGb2xsb3cgdGhlIGV4YW1wbGUgaW4gdGhlIGJvb2suIEFkZCBjb21tZW50cywgd2hlcmUgYXBwcm9wcmlhdGUsIGV4cGxhaW5pbmcgd2hhdCB0aGUgcGFydGljdWxhciBsaW5lKHMpIG9mIGNvZGUgaXMvYXJlIGV4ZWN1dGluZy9zb2x2aW5nIGZvci4KPC9zcGFuPgoKYGBge3J9CiMjcmV0cmlldmUgaGlzdG9yaWNhbCBwcmljZSBkYXRhIGZvciBHZW5lcmFsIEVsZWN0cmljIENvLiBmcm9tIFlhaG9vIEZpbmFuY2UKZ2V0U3ltYm9scygnR0UnLHNyYz0neWFob28nLCBmcm9tPSIyMDAwLTAxLTAxIiwgdG89IjIwMDktMTItMzAiKQojI3RvIHNlZSBoZWFkZXJzIG9mIGZpbGUgKE9ITENWIHR5cGUpCm5hbWVzKEdFKQojIyB0byBzZWUgdGhlIGRhdGEgZnJvbSAxc3Qgb2YgSmFudWFyeSAyMDAwIHRvIDIwdGggb2YgSmFudWFyeSAyMDAwCkdFWyIyMDAwLTAxLTAxLzIwMDAtMDEtMjAiXQojIyB0byBzZWUgb25seSB0aGUgYWRqdXN0ZWQgY2xvc2UgcHJpY2VzIGZyb20gdGhhdCBwZXJpb2QKZ2VBZGo9R0UkR0UuQWRqdXN0ZWRbIjIwMDAtMDEtMDEvMjAwMC0wMS0yMCJdOyBnZUFkagojI0NvbXB1dGUgdGhlIG1heGltdW0sbWluaW11bSBhbmQgbWVhbiB2YWx1ZQptYXgoZ2VBZGopOyBtaW4oZ2VBZGopO21lYW4oZ2VBZGopCiMgQ3JlYXRlIGEgY2hhcnQKY2hhcnRTZXJpZXMoR0UpCiMjIGEgY2hhcnQgb2YgdGhlIGRhdGUgZnJvbSBKYW51YXJ5IDIwMDAgdG8gMjB0aCBvZiBKYW51YXJ5IDIwMDAKY2hhcnRTZXJpZXMoR0UsVEE9TlVMTCxzdWJzZXQ9JzIwMDEtMDE6OjIwMDEtMDInKQojI3NhdmUgdGhlIGRhdGUgaW4gbG9jYWwgZGVzawpzYXZlUkRTKEdFLGZpbGU9IkdFLnJkcyIpCgpgYGAKCiAgCiAgCiMjIyBUYXNrIDI6IENvbXBhcmluZyBQZXJmb3JtYW5jZSBvZiBTdG9ja3MgVGltZSBTZXJpZXMKClRoaXMgZm9sbG93cyB0aGUgYm9va+KAmXMgZXhhbXBsZSAxLjMuNCBSIExhYi9wLiAzNCBhbHNvIFIgTGFicyAxIGZyb20gdGhlIGJvb2vigJlzIHdlYnNpdGUgKCopLiAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQSkgSW5zZXJ0IHRoZSBjb2RlIGNodW5rIHRvIGNoYXJ0IGluc3RlYWQgdGhlIHBlcmZvcm1hbmNlIG9mIFZhbHVlIExpbmUgSW5kZXggVkxJQyAoc29ydCBvZiBiZW5jaG1hcmspLCBhbmQgZm91ciBvdGhlciBzdG9ja3Mgb2YgeW91ciBjaG9pY2Ugb3ZlciBhIHRpbWUgcGVyaW9kIGRhdGluZyBiYWNrIG9uZSB5ZWFyIGZyb20gcHJlc2VudCBkYXRlLgo8L3NwYW4+CmBgYHtyfQpsaWJyYXJ5KCJxdWFudG1vZCIpCnN5bWJvbHM9YygnXlZMSUMnLCdUU0xBJywnR09PR0wnLCdCSURVJywnQkFCQScpCmdldFN5bWJvbHMoc3ltYm9scyxzcmM9J3lhaG9vJyxmcm9tPSIyMDE3LTExLTEzIix0bz0iMjAxOC0xMS0xMyIpCiAjb2J0YWluIGFkanVzdGVkIGNsb3NlZApWTElDYWQgPSBWTElDJFZMSUMuQWRqdXN0ZWQ7IApUU0xBYWQ9IFRTTEEkVFNMQS5BZGp1c3RlZDsKR09PR0xhZD1HT09HTCRHT09HTC5BZGp1c3RlZDsgCkJJRFVhZD1CSURVJEJJRFUuQWRqdXN0ZWQ7CkJBQkFhZCA9IEJBQkEkQkFCQS5BZGp1c3RlZAogI2NvbXB1dGUgY3VtdWxhdGl2ZSBzdW0gKGN1bXN1bSkgb2YgZGFpbHkgcmV0dXJucyAoRGVsdCkKICNSZW1vdmUgZmlyc3QgdGVybSBvZiB0aGUgc2VyaWVzLCB3aXRoIFstMSxdLCBzaW5jZSBjdW1zdW0gaXMgbm90IGRlZmluZWQgZm9yIGl0Lgp2bCA9IGN1bXN1bSgoRGVsdChWTElDYWQpKjEwMClbLTEsXSkKVFMgPSBjdW1zdW0oKERlbHQoVFNMQWFkKSoxMDApWy0xLF0pCkdPID0gY3Vtc3VtKChEZWx0KEdPT0dMYWQpKjEwMClbLTEsXSkKQkkgPSBjdW1zdW0oKERlbHQoQklEVWFkKSoxMDApWy0xLF0pCkJBID0gY3Vtc3VtKChEZWx0KEJBQkFhZCkqMTAwKVstMSxdKQogCiMjI3JhbmdlIG9mIHZhbHVlcyBmb3IgdGhlIHBsb3QKbGltID0gYyhtaW4odmwsVFMsR08sQkksQkEpLG1heCh2bCxUUyxHTyxCSSxCQSkpCiMjI3RoZSBwbG90CnBsb3QodmwsbWFpbj0iIix5bGltPWxpbSx4bGFiPSJkYXRlcyIseWxhYj0iJSBiZW5lZml0cyIpCmxpbmVzKFRTLGNvbD0iZ3JlZW4iKTsgbGluZXMoR08sY29sPSJyZWQiKQpsaW5lcyhCSSxjb2w9InZpb2xldCIpOyBsaW5lcyhCQSxjb2w9InllbGxvdyIpCmxlZ2VuZCh4PSJ0b3BsZWZ0IixjZXg9MC40LGMoIlZMSUMiLCJUU0xBIiwiR09PR0wiLCJCSURVIiwiQkFCQSIpLAogICBsdHk9MSwgY29sPWMoImJsYWNrIiwiZ3JlZW4iLCJyZWQiLCJ2aW9sZXQiLCJ5ZWxsb3ciKSkKYGBgCgoKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQikgV3JpdGUgdGhlIG1hdGhlbWF0aWNhbCBmb3JtL3JlcHJlc2VudGF0aW9uLCB1c2luZyBwcm9wZXIgbWF0aCBzeW1ib2xzLCB0byBkZXNjcmliZSB0aGUgZm9ybXVsYSBiZWluZyBjYWxjdWxhdGVkIGFuZCBwbG90dGVkIGluIHRoZSBjb2RlICAKPC9zcGFuPgoKJFZMSUNfdD1WTElDX3t0LTF9KihccHJvZF97aSA9IDF9XntufSBDX3tpLHR9L0Nfe2ksdC0xfSleezEvbn0kCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkMpIFdyaXRlIGEgIHBhcmFncmFwaCwgaW4geW91ciBvd24gd29yZHMsIGNvbXBhcmluZyB0aGUgc3RvY2sgcGVyZm9ybWFuY2VzIGJhc2VkIG9uIHlvdXIgYXNzZXNzbWVudCBvZiB0aGUgY29tcGFuaWVzIGdlbmVyYWwgYnVzaW5lc3MgYW5kIHRoZWlyIHZhbHVhdGlvbiB2aXMtYS12aXMgdGhlIG1hcmtldCBvdmVyYWxsIHBlcmZvcm1hbmNlLCBhbmQgcGVydGluZW50IGVjb25vbm9taWNhbCBmYWN0b3JzLgo8L3NwYW4+CgpUU0xBLCdHT09HTCcsJ0JJRFUnLCdCQUJBCgpEdXJpbmcgMjAxNy0yMDE4LCAgdGhlIHByaWNlIG9mIEJJRFUgaXMgdW5kZXIgYXZlcmFnZSBwZXJmb3JtYW5jZSBvZiBtYXJrZXQuIER1ZSB0byBmcmF1ZCBhbmQgZmFrZSBhZHZlcnRpc2VtZW50cywgQklEVSBoYXMgdG8gYWRqdXN0IG5ldyBwcm9maXRzIHJlc291cmNlcy4gRm9sbG93aW5nIG5lZ2F0aXZlIGVmZmVjdHMgb3JpZ2luYXRlZCBmcm9tIGFkcywgdGhlIHByaWNlIG9mIEJJRFUgd2VudCBkb3duLiBIb3dldmVyLCBhcyBtYWpvcml0eSBzZWFyY2ggZW5naW5lIGluIENoaW5hLCBCSURVIHN0ZWFkeSBncm93IHVwLlBsdXMsQ29uc2lkZXJpbmcgdGhlIHBvc3NpYmxpdHkgb2YgY29tcGFueSBzdG9jayByZXB1cmNoYXNlZCBhbmQgcGxhbmluZyB0byByZXR1cm4gdG8gbWFya2V0IG9mIGNoaW5hLHRoZSBwcmljZSBvZiBCSURVIHdpbGwgYmUgMjAwIGluIGxvbmcgdGVybS4gRm9yIEJBQkEsIEphY2sgTWEsIHRoZSBDRU8gb2YgQkFCQSwgaXMgbWFpbiBmb3VuZGVyIG9mIEJBQkEsIGFuZCBoaXMgYWJydXB0IGRlY2lzaW9uIG9mIHJldGlyZW1lbnQgaXMgaGFybWZ1bCBmb3IgdGhlIGNvbXBhbnkuIEFzIGxhcmdlc3QgcHJpdmF0ZSBjb21wYW55IGluIENoaW5hLCB0aGUgZGl2ZXJzZWQgcHJvZHVjdHMgZmxvdXJpc2ggcHJvZml0cyByZXNvdXJjZXMsIGJ1dCB0aGUgY29tcGFueSBoYXMgdG8gc29sdmUgaXNzdWVzIG9mIGNvdW50ZXJmZWl0IGFuZCBpbmZlcmlvciBxdWFsaXR5IGNvbW1vZGl0eS4gQ29uc2lkZXJpbmcgdW5wcmVkaWN0YWJsZSBhcnJhbmdlbWVudCBvZiBtYW5hZ2VybWVudCwgbmVnYXRpdmUgZWZmZWN0IGZyb20gcmV0aXJlbWVudCBvZiBDRU8gYW5kIHByb2R1Y3RzIGlzc3VlcywgdGhlIHByaWNlIG9mIEJBQkEgd2lsbCBnbyBkb3duLiBGb3IgR09PR0wsIHRoZSBjb21hcG55IGhhcyB2YXJpb3VzIHByb2R1Y3RzIGFuZCBtdWx0aXBsZSBidXNpbmVzc2VzLk9uZSBvZiB0aGUgcHJvZHVjdHMgaXMgaW50ZWxsaWdlbnQgY2FyLCB3aGloYyBpcyB0ZW5kZW5jeSBpbiBmdXR1cmUuIFRoZSBwcmljZSBvZiBHT09HTEUgd2lsbCBiZSBoaWdoZXIuIEZvciBUU0xBLCB0aGUgY29tcGFueSBpcyB1bnByZWRpY3RhYmxlLiBUaGUgY29tcGFueSBpbml0aWF0ZSBzcGFjZSBjcmFmdCBhcyBwcml2YXRlIG9yZ2FuaXphdGlvbiwgYW5kIGNvbXBhbnkgc3RyaXZlIHRvIGNyZWF0ZSBlbGVjdHJpYyBjYXIsIHdoaWNoIGlzIHN1bnJpc2UgaW5kdXN0cnkuIEluIHRoZSBlbGVjdHJpYyB2ZWhpY2xlIGluZHVzdHJ5LGNvc3Qgb2YgbGl0aGl1bSBiYXR0ZXJ5IHN0YXkgYXQgbG93ZXN0IGxldmVsIGluIGhpc3RvcnksIGFuZCB0aGUgcHJvYmxlbSBvZiBzdG9yYWdlIGVuZXJneSBpcyBvbmx5IGNvbmNlcm4uIE9uY2UgVFNMQSBvdmVyY29tZXMgdGhlIHRlY2huaWNhbCBtYXR0ZXJzLCB0aGUgY29tcGFueSB3aWxsIGJlIGluZmluaXRlIHZhbHVhYmxlLiB0aGUgcHJpY2Ugb2YgVFNMQSBpcyB1bnByZWRpY3RhYmxlLgoKCgpUbyBhZGQgbWF0aCBzeW1ib2xzIGluIFIgTWFya2Rvd24gY2hlY2sgdGhlIGxpbmsgW01hdGhpblJtZC5odG1sXSggaHR0cHM6Ly93d3cuY2FsdmluLmVkdS9+cnBydWltL2NvdXJzZXMvczM0MS9TMTcvZnJvbS1jbGFzcy9NYXRoaW5SbWQuaHRtbCkuCk1hbnkgb3RoZXIgZXhhbXBsZXMgYXJlIG9uIEdvb2dsZS4gRm9sbG93aW5nIGlzIGFuIGV4YW1wbGU6ICRcc3VtX3tuPTF9XnsxMH0gbl4yJC4gIE90aGVyLCBsZXNzIHByZWZlcnJlZCBvcHRpb25zLCBpcyB0byBuZWF0bHkgaGFuZHdyaXRlIHlvdXIgZXF1YXRpb25zIG9uIGEgcGFwZXIgb3IgdXNlIG93biBwcmVmZXJyZWQgdG9vbHMgbGlrZSBNaWNyb3NvZnQgV29yZCwgdGFrZSBhIGNsZWFyIGltYWdlIGNhcHR1cmUgb2YgeW91ciB3b3JrIGFuZCBpbmNsdWRlIGhlcmUuICBIYXJkIHRvIHJlYWQgd29yayB3aWxsIGJlIGRpc21pc3NlZC4gCgoKCkJlbG93IGlzIGFuIGV4YW1wbGUgb24gaG93IHRvIGluY2x1ZGUgYW4gaW1hZ2UuICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGltYWdlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZm9sZGVyIGFzIHRoZSB3b3Jrc2hlZXQuIE90aGVyd2lzZSB0aGUgcGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHRoZSBpbWFnZSByZXNpZGVzIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBuYW1lIHJlZmVyZW5jaW5nIGJlbG93LgoKCgojIyMgVGFzayAzOiBQcm9ibGVtKHMpIFNvbHZpbmcKClRoaXMgdGFzayBkb2VzIG5vdCByZXF1aXJlIHVzZSBvZiBSIGNvZGUuICBZb3Ugd2lsbCBob3dldmVyIG5lZWQgdG8gdHlwZSB5b3VyIHdvcmsgaGVyZSwgdXNpbmcgcHJvcGVyIG1hdGhlbWF0aWNhbCBzeW1ib2xzIGFuZCByZXByZXNlbnRhdGlvbnMsIG9yIGluY2x1ZGUgYSBjbGVhciBpbWFnZSBjYXB0dXJlIG9mIHlvdXIgd29yay4KCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgM0EpIFNvbHZlIGZvciAxLjMuOCBQcm9ibGVtL3AuIDM2LiAKPC9zcGFuPgoKdXNlIGRhdGUgJHQ9MC41JDsgJFNfMD0yNSQ7ICRLPTIwJDsgJFNfdT00MCQ7JFNfZD0xNSQ7ICRDX3U9U191LUskOyAkQ19kPTAkOyAKOyRyPTAuMDUkIHRvIGZvcm1hdCAKJFxkZWx0YVxEZWx0YT0oQ191LUNfZCkvKFNfdS1TX2QpJCAKYW5kICRcaGF0e0J9PShcZGVsdGFcRGVsdGEqU19kLUNfZCkvKDErcikkCmFuZCAkQz1cZGVsdGFcRGVsdGEqU18wLSgxK3IpXnQqIFxoYXR7Qn0kCmFuZCAkUD1DK2svKDErciledCpcaGF0e0J9LVNfMCQKLHRoZSByZXN1bHQgb2YgQyBhbmQgUDogJEM9OC4yODkxJDskUD0yLjgwNzIkCgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDNCKSBTb2x2ZSBmb3IgMS4zLjkgUHJvYmxlbS9wLiAzNgo8L3NwYW4+CgpXZSBhc3N1bWUgdGhhdCAkXERlbHRhIHAgPSAgXERlbHRhIEMgLSAxJCAuIEZvciAkQyArIEsvKDErciledCA9IFNfbyArIFAkLCAgICAgICAgICAgICAgICAgICAgICAKZm9ybXVsYTEgJENfdT1QX3UrU191LUsvKDErciledCQsIGZvcm11bGEyICRDX2Q9UF9kK1NfZC1LLygxK3IpXnQkLCBjb21iaW5hdGUgZm9ybXVsYSAxIGFuZCAyIHdpdGggJFxEZWx0YSBDPShDX3UtQ19kKS8oU191LVNfZCkkIGFuZCAkXERlbHRhIHAgPSAgXERlbHRhIEMgLSAxJCwgd2UgY2FuIGdldCAkXERlbHRhIHA9KFBfdS1QX2QpLyhTX3UtU19kKSQsIHRodXMgd2UgcHJvdmUgJFxEZWx0YSBwID0gIFxEZWx0YSBDIC0gMSQgCgohW1NvbHV0aW9uXShXZWNoYXRJTUc0OC5qcGVnKQoKKltodHRwOi8vY29tcHV0YXRpb25hbGZpbmFuY2UubHNpLnVwYy5lZHUgXShodHRwOi8vY29tcHV0YXRpb25hbGZpbmFuY2UubHNpLnVwYy5lZHUpCg==