Financial Econometrics II Alberto Dorantes, Ph.D. Feb 16, 2022

Abstract

In this workshop we practice the following topics: a) Introduction to time-series variables, b) Online financial data collection c) Calculation of historical time-series financial returns.

A Introduction to time-series variables

-In this section we will download time-series variables from Yahoo Finance and explore the time-series datasets, more specifically, we explore the xts-zoo R objects. xts stands for “eXtensible Time Series”, and zoo is an R class for general time-series datasets.-

We start clearing our R environment:

rm(list=ls())
# To avoid scientific notation for numbers: 
options(scipen=999)

A1) Install the quantmod package

-In order to import and manage financial data in R, the quantmod package must be installed. This package contains the getSymbols() function, which creates an xts (extensible time series) object in the environment with the downloaded data from the Internet. In order to install packages in R, go to the Package tab in the bottom-right section of RStudio, select Install and then type quantmod, and the botton Install.

Once you install a package, this package will be in your computer forever. You might re-install a package in case there is a new version of the package.-

:) Packages Downloaded

A2 Load the Quantmod Package

Now, you have installed a package and it is not necessary to install it again in further occasions. It will stay in your computer. However, next time you want to use it, you have to load it using the library() function

library(quantmod)
Loading required package: xts
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric

Loading required package: TTR
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 

:) Packages are Loaded

A3 Downloading time-series financial prices

-The getSymbols() function enables its user to download online and up-to-date financial data, such as stock prices, market indexes, ETF prices, interest rates, exchange rates, etc. getSymbols() allows to download this data from multiple sources: Yahoo Finance, Google Finance, FRED and Oanda. These sources have thousands of finance and economic data series from many market exchanges and other macroeconomic variables around the world.-

We download the main monthly market indexes of Mexico (the IPCyC) and the US (the S&P500) from Yahoo from 2011:

getSymbols(c("^MXX", "^GSPC"), from="2011-01-01", periodicity = "monthly", src = "yahoo")
‘getSymbols’ currently uses auto.assign=TRUE by default, but will
use auto.assign=FALSE in 0.5-0. You will still be able to use
‘loadSymbols’ to automatically load data. getOption("getSymbols.env")
and getOption("getSymbols.auto.assign") will still be checked for
alternate defaults.

This message is shown once per session and may be disabled by setting 
options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
[1] "^MXX"  "^GSPC"

-This function will create 2 xts-zoo R objects with historical data for each market index in a chronological order. These xts-zoo R objects are actually datasets with the index historical values and with a time index. Each R object has at specific class. In this case, the class of these datasets is called xts-zoo. xts stands for extensible time-series. An xts-zoo object is designed to easily manipulate time series data.

For each period, Yahoo Finance keeps track of the open, high, low, close (OHLC) and adjusted prices. Also, it keeps track of volume that was traded (# of shares traded) in every specific period. The adjusted prices are used for stocks, not for market indexes. Adjusted prices consider dividend payments and stock splits. For the case of market indexes, the adjusted prices are always equal to the close prices.

Let’s see some of the benefits of using xts-zoo objects. We can, for example, select columns using any of the following functions, where x represents a generic xts zoo object:

Op(x): Extract the Opening prices of the period. Hi(x): Extract the Highest price of the period. Lo(x): Extract the Lowest price of the period. Cl(x): Extract the closing prices of the period. Vo(x): Extract the volume traded of the period. Ad(x): Extract the Adjusted prices of the period.-

A4 Merging time-series datasets

-We can integrate xts-zoo R objects into one xts-zoo dataset using the merge function. In this case, we will only use the adjusted price, so we can also use the Ad function:-

# We merge the datasets into a new R object called prices:
prices = merge(MXX,GSPC)
# We only keep the adjusted price columns:
prices = Ad(prices)
# We rename the columns with simpler names:
names(prices) = c("MXX","GSPC")

A5 Q Visualizing time-series variables

-For each index we do a graph to visualize how the index moves over time. We can use the chartSeries function from the quantmod package:-

chartSeries(MXX, theme=("white"))

chartSeries(GSPC, theme=("white"))

-Respond to the following QUESTION:

WHAT YOU CAN SAY ABOUT THE TREND OF BOTH MARKET INDEXES? IS IT CONSTANTLY GROWING, OR DECLINING, OR THERE IS NO CLEAR TREND? BRIEFLY EXPLAIN

Generate a new dataset with the natural log of both indexes as follows:-

IT IS QUITE SHOCKING TO SEE THE CONTRACTIONS AND THE GROWTHS IN THE MARKET PAIRING THEM TO THE HISTORY WE’VE LIVED THROUGH. 2019 SHOWED A STRONG CONTRACTION TOWARDS THE LATTER QUARTER DUE TO THE GLOBAL PANDEMIC COVID-19.

“THE STANDARD AND POORS 500 MEASURES THE VALUE OF THE STOCKS OF THE LARGEST 500 CORPORATIONS BY MARKET CAPITALIZATION LISTED ON THE NEW YORK STOCK EXCHANGE AKA. NASDAQ COMPOSITE.THE INTENTION OF STANDARD AND POORS 500 IS TO ASSIGN A PRICE THAT PROVIDES A QUICK LOOK AT THE MARKET AND ITS INTERACTION WITH THE ECONOMY” YAHOO FINANCE.”

ON THE LONG RUN WE CAN SEE A GROWTH TREND EVEN THOUGH SMALL CONTRACTIONS ARE OCCURING THESE DAYS.

lnprices = log(prices)

-Now do a time plot for the log of the US index:-

plot(lnprices$GSPC, main = "Log of the US Index over time")

QUESTION: COMPARED WITH THE PLOT OF THE US INDEX, WHAT DIFFERENCES DO YOU SEE IN THIS PLOT OF THE LOG OF THE US INDEX? BRIEFLY EXPLAIN THIS INDEX BETTER REFLECTS THE IMMEDIATE FUTURE AS THE ECONOMY CONTRACTS. I DONT PRESUME TO WARMONGER BUT TENSIONS IN THE UKRAINE-RUSSIA HAVE RESULTED IN THE PRICE OF BITCOIN AND OTHER CRYPTOCURRENCIES TO DROP.

EXERCISE: Do the plot for the log of the Mexican market index

plot(lnprices$MXX, main = "Log of the MEX Index over time")

B FINANCIAL RETURNS

-A financial simple return for a stock (Rt) is calculated as a percentage change of price from the previous period (t-1) to the present period (t)-

Rt=(Adjpricet−Adjpricet−1)Adjpricet−1=AdjpricetAdjpricet−1−1

-For example, if the adjusted price of a stock at the end of January 2021 was $100.00, and its previous (December 2020) adjusted price was $80.00, then the monthly simple return of the stock in January 2021 will be-

RJan2021=AdpriceJan2021AdpriceDec2020−1=10080−1=0.25

-We can use returns in decimal or in percentage (multiplying by 100). We will keep using decimals.

In Finance it is very recommended to calculate continuously compounded returns (cc returns) and using cc returns instead of simple returns for data analysis, statistics and econometric models. cc returns are also called log returns.

One way to calculate cc returns is by subtracting the log of the current adjusted price (at t) minus the log of the previous adjusted price (at t-1)-

rt=log(Adjpricet)−log(Adjpricet−1)

-This is also called as the difference of the log of the price.

We can also calculate cc returns as the log of the current adjusted price (at t) divided by the previous adjusted price (at t-1)-

rt=log(AdjpricetAdjpricet−1)

-cc returns are usually represented by small r, while simple returns are represented by capital R.-

B2 Q Calculation of financial returns

-It is recommended to always use adjusted prices to calculate financial returns. In this example that we have market indexes, the adjusted price is exactly the same as the closing price since market indexes do not have stock splits nor dividend payments.-

-We can use the lag function to get past (lagged) values of a time-series dataset (or column). With this function we can get the price of the previous period to calculate the simple return. Let’s create a new dataset for the simple monthly returns of both indexes-

R = prices / lag(prices,n=1) - 1 

-We can use the diff function to get the difference of a current value and a lagged value of a dataset (or a column). Let’s create a new dataset for the cc return of both indexes-

r = diff(log(prices))

-Remember that the continuously compounded returns can be calculated as the difference between the log of the price of today minus the log of the price of the previous period.-

-Now do a time graph for the cc returns of the Mexican index-

plot(r$MXX, col = "darkblue",
     main = "cc return for the MXX index")

RESPOND TO THE FOLLOWING QUESTIONS:

  1. DOES THIS SERIES HAVE ABOUT THE SAME MEAN FOR ALL TIME PERIODS? YES, THE MEAN TENDS TOWARDS 0, ALMOST RYTHMICAL DEVIATIONS RESEMBLING A HEARTBEAT FLUCTUATE FROM NEGATIVE TO POSITIVE, LEAVING THE SERIES CLOSE TO 0.

  2. DOES IT HAVE THE SAME STANDARD DEVIATION (VOLATILITY) FOR ALL TIME PERIODS? FROM 2010 TO 2017 VOLATILITY WAS LOW, UP UNTIL 2020, WHEREVOLATILITY SPIKED TOWARDS THE -.20 MARK. A HIGH STANDARD DEVIATION INDICATES THAT THE VALUES ARE SPREAD OUT OVER A WIDER RANGE.

CQ READ AND RESPOND

Read/skim the note: “Introduction to time series”. With your own words:

  1. EXPLAIN WHAT IS A STATIONARY SERIES.

” ‘Time Series’ is a collection of observations indexed by time. The observations each occur at some time t, where t belongs to the set of allowed times, T. Stationarity means that the statistical properties of a process generating a time series do not change over time . It does not mean that the series does not change over time, just that the way it changes does not itself change over time.” (S.PALACHY, 2019)

STATIONARY SERIES THEREFORE ARE PLOTS WHERE THE RATE OF CHANGE IS THE SAME AND EVEN THOUGH THE TIME SERIES GROWS AND CONTRACTS THE STARTING POINT IS THE SAME.

  1. WHICH ARE THE CONDITIONS OF A SERIES TO BE CONSIDERED AS A STATIONARY SERIES?

I FOUND A GREAT EXPLANATION THAT THROUGH ALLUSION COMPARES A STATIONARY SERIES TO A LINEAR FUNCTION INSTEAD OF A CONSTANT FUNCTION SINCE ” the value of a linear function changes as 𝒙 grows, but the way it changes remains constant”.

LS0tCnRpdGxlOiAiV29ya3Nob3AgMSwgRmluYW5jaWFsIEVjb25vbWV0cmljcyBJSSIKQXV0aG9yOiBTdGVmYW4gU2Nod2VpdHplcgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCkZpbmFuY2lhbCBFY29ub21ldHJpY3MgSUkKQWxiZXJ0byBEb3JhbnRlcywgUGguRC4KRmViIDE2LCAyMDIyCgojIEFic3RyYWN0CgpJbiB0aGlzIHdvcmtzaG9wIHdlIHByYWN0aWNlIHRoZSBmb2xsb3dpbmcgdG9waWNzOgphKSBJbnRyb2R1Y3Rpb24gdG8gdGltZS1zZXJpZXMgdmFyaWFibGVzLCAKYikgT25saW5lIGZpbmFuY2lhbCBkYXRhIGNvbGxlY3Rpb24KYykgQ2FsY3VsYXRpb24gb2YgaGlzdG9yaWNhbCB0aW1lLXNlcmllcyBmaW5hbmNpYWwgcmV0dXJucy4KCiMgQSBJbnRyb2R1Y3Rpb24gdG8gdGltZS1zZXJpZXMgdmFyaWFibGVzCgotSW4gdGhpcyBzZWN0aW9uIHdlIHdpbGwgZG93bmxvYWQgdGltZS1zZXJpZXMgdmFyaWFibGVzIGZyb20gWWFob28gRmluYW5jZSBhbmQgZXhwbG9yZSB0aGUgdGltZS1zZXJpZXMgZGF0YXNldHMsIG1vcmUgc3BlY2lmaWNhbGx5LCB3ZSBleHBsb3JlIHRoZSB4dHMtem9vIFIgb2JqZWN0cy4geHRzIHN0YW5kcyBmb3Ig4oCcZVh0ZW5zaWJsZSBUaW1lIFNlcmllc+KAnSwgYW5kIHpvbyBpcyBhbiBSIGNsYXNzIGZvciBnZW5lcmFsIHRpbWUtc2VyaWVzIGRhdGFzZXRzLi0KCldlIHN0YXJ0IGNsZWFyaW5nIG91ciBSIGVudmlyb25tZW50OgoKYGBge3J9CnJtKGxpc3Q9bHMoKSkKIyBUbyBhdm9pZCBzY2llbnRpZmljIG5vdGF0aW9uIGZvciBudW1iZXJzOiAKb3B0aW9ucyhzY2lwZW49OTk5KQpgYGAKCiMgQTEpIEluc3RhbGwgdGhlIHF1YW50bW9kIHBhY2thZ2UKCi1JbiBvcmRlciB0byBpbXBvcnQgYW5kIG1hbmFnZSBmaW5hbmNpYWwgZGF0YSBpbiBSLCB0aGUgcXVhbnRtb2QgcGFja2FnZSBtdXN0IGJlIGluc3RhbGxlZC4gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBnZXRTeW1ib2xzKCkgZnVuY3Rpb24sIHdoaWNoIGNyZWF0ZXMgYW4geHRzIChleHRlbnNpYmxlIHRpbWUgc2VyaWVzKSBvYmplY3QgaW4gdGhlIGVudmlyb25tZW50IHdpdGggdGhlIGRvd25sb2FkZWQgZGF0YSBmcm9tIHRoZSBJbnRlcm5ldC4gSW4gb3JkZXIgdG8gaW5zdGFsbCBwYWNrYWdlcyBpbiBSLCBnbyB0byB0aGUgUGFja2FnZSB0YWIgaW4gdGhlIGJvdHRvbS1yaWdodCBzZWN0aW9uIG9mIFJTdHVkaW8sIHNlbGVjdCBJbnN0YWxsIGFuZCB0aGVuIHR5cGUgcXVhbnRtb2QsIGFuZCB0aGUgYm90dG9uIEluc3RhbGwuCgpPbmNlIHlvdSBpbnN0YWxsIGEgcGFja2FnZSwgdGhpcyBwYWNrYWdlIHdpbGwgYmUgaW4geW91ciBjb21wdXRlciBmb3JldmVyLiBZb3UgbWlnaHQgcmUtaW5zdGFsbCBhIHBhY2thZ2UgaW4gY2FzZSB0aGVyZSBpcyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLi0KCjopIFBhY2thZ2VzIERvd25sb2FkZWQKCiMgQTIgTG9hZCB0aGUgUXVhbnRtb2QgUGFja2FnZQoKTm93LCB5b3UgaGF2ZSBpbnN0YWxsZWQgYSBwYWNrYWdlIGFuZCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGluc3RhbGwgaXQgYWdhaW4gaW4gZnVydGhlciBvY2Nhc2lvbnMuIEl0IHdpbGwgc3RheSBpbiB5b3VyIGNvbXB1dGVyLiBIb3dldmVyLCBuZXh0IHRpbWUgeW91IHdhbnQgdG8gdXNlIGl0LCB5b3UgaGF2ZSB0byBsb2FkIGl0IHVzaW5nIHRoZSBsaWJyYXJ5KCkgZnVuY3Rpb24KCmBgYHtyfQpsaWJyYXJ5KHF1YW50bW9kKQpgYGAKCjopIFBhY2thZ2VzIGFyZSBMb2FkZWQKCiMgQTMgRG93bmxvYWRpbmcgdGltZS1zZXJpZXMgZmluYW5jaWFsIHByaWNlcwoKLVRoZSBnZXRTeW1ib2xzKCkgZnVuY3Rpb24gZW5hYmxlcyBpdHMgdXNlciB0byBkb3dubG9hZCBvbmxpbmUgYW5kIHVwLXRvLWRhdGUgZmluYW5jaWFsIGRhdGEsIHN1Y2ggYXMgc3RvY2sgcHJpY2VzLCBtYXJrZXQgaW5kZXhlcywgRVRGIHByaWNlcywgaW50ZXJlc3QgcmF0ZXMsIGV4Y2hhbmdlIHJhdGVzLCBldGMuIGdldFN5bWJvbHMoKSBhbGxvd3MgdG8gZG93bmxvYWQgdGhpcyBkYXRhIGZyb20gbXVsdGlwbGUgc291cmNlczogWWFob28gRmluYW5jZSwgR29vZ2xlIEZpbmFuY2UsIEZSRUQgYW5kIE9hbmRhLiBUaGVzZSBzb3VyY2VzIGhhdmUgdGhvdXNhbmRzIG9mIGZpbmFuY2UgYW5kIGVjb25vbWljIGRhdGEgc2VyaWVzIGZyb20gbWFueSBtYXJrZXQgZXhjaGFuZ2VzIGFuZCBvdGhlciBtYWNyb2Vjb25vbWljIHZhcmlhYmxlcyBhcm91bmQgdGhlIHdvcmxkLi0KCldlIGRvd25sb2FkIHRoZSBtYWluIG1vbnRobHkgbWFya2V0IGluZGV4ZXMgb2YgTWV4aWNvICh0aGUgSVBDeUMpIGFuZCB0aGUgVVMgKHRoZSBTJlA1MDApIGZyb20gWWFob28gZnJvbSAyMDExOgoKYGBge3J9CmdldFN5bWJvbHMoYygiXk1YWCIsICJeR1NQQyIpLCBmcm9tPSIyMDExLTAxLTAxIiwgcGVyaW9kaWNpdHkgPSAibW9udGhseSIsIHNyYyA9ICJ5YWhvbyIpCmBgYAotVGhpcyBmdW5jdGlvbiB3aWxsIGNyZWF0ZSAyIHh0cy16b28gUiBvYmplY3RzIHdpdGggaGlzdG9yaWNhbCBkYXRhIGZvciBlYWNoIG1hcmtldCBpbmRleCBpbiBhIGNocm9ub2xvZ2ljYWwgb3JkZXIuIFRoZXNlIHh0cy16b28gUiBvYmplY3RzIGFyZSBhY3R1YWxseSBkYXRhc2V0cyB3aXRoIHRoZSBpbmRleCBoaXN0b3JpY2FsIHZhbHVlcyBhbmQgd2l0aCBhIHRpbWUgaW5kZXguIEVhY2ggUiBvYmplY3QgaGFzIGF0IHNwZWNpZmljIGNsYXNzLiBJbiB0aGlzIGNhc2UsIHRoZSBjbGFzcyBvZiB0aGVzZSBkYXRhc2V0cyBpcyBjYWxsZWQgeHRzLXpvby4geHRzIHN0YW5kcyBmb3IgZXh0ZW5zaWJsZSB0aW1lLXNlcmllcy4gQW4geHRzLXpvbyBvYmplY3QgaXMgZGVzaWduZWQgdG8gZWFzaWx5IG1hbmlwdWxhdGUgdGltZSBzZXJpZXMgZGF0YS4KCkZvciBlYWNoIHBlcmlvZCwgWWFob28gRmluYW5jZSBrZWVwcyB0cmFjayBvZiB0aGUgb3BlbiwgaGlnaCwgbG93LCBjbG9zZSAoT0hMQykgYW5kIGFkanVzdGVkIHByaWNlcy4gQWxzbywgaXQga2VlcHMgdHJhY2sgb2Ygdm9sdW1lIHRoYXQgd2FzIHRyYWRlZCAoIyBvZiBzaGFyZXMgdHJhZGVkKSBpbiBldmVyeSBzcGVjaWZpYyBwZXJpb2QuIFRoZSBhZGp1c3RlZCBwcmljZXMgYXJlIHVzZWQgZm9yIHN0b2Nrcywgbm90IGZvciBtYXJrZXQgaW5kZXhlcy4gQWRqdXN0ZWQgcHJpY2VzIGNvbnNpZGVyIGRpdmlkZW5kIHBheW1lbnRzIGFuZCBzdG9jayBzcGxpdHMuIEZvciB0aGUgY2FzZSBvZiBtYXJrZXQgaW5kZXhlcywgdGhlIGFkanVzdGVkIHByaWNlcyBhcmUgYWx3YXlzIGVxdWFsIHRvIHRoZSBjbG9zZSBwcmljZXMuCgpMZXTigJlzIHNlZSBzb21lIG9mIHRoZSBiZW5lZml0cyBvZiB1c2luZyB4dHMtem9vIG9iamVjdHMuIFdlIGNhbiwgZm9yIGV4YW1wbGUsIHNlbGVjdCBjb2x1bW5zIHVzaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucywgd2hlcmUgeCByZXByZXNlbnRzIGEgZ2VuZXJpYyB4dHMgem9vIG9iamVjdDoKCk9wKHgpOiBFeHRyYWN0IHRoZSBPcGVuaW5nIHByaWNlcyBvZiB0aGUgcGVyaW9kLgpIaSh4KTogRXh0cmFjdCB0aGUgSGlnaGVzdCBwcmljZSBvZiB0aGUgcGVyaW9kLgpMbyh4KTogRXh0cmFjdCB0aGUgTG93ZXN0IHByaWNlIG9mIHRoZSBwZXJpb2QuCkNsKHgpOiBFeHRyYWN0IHRoZSBjbG9zaW5nIHByaWNlcyBvZiB0aGUgcGVyaW9kLgpWbyh4KTogRXh0cmFjdCB0aGUgdm9sdW1lIHRyYWRlZCBvZiB0aGUgcGVyaW9kLgpBZCh4KTogRXh0cmFjdCB0aGUgQWRqdXN0ZWQgcHJpY2VzIG9mIHRoZSBwZXJpb2QuLQoKIyBBNCBNZXJnaW5nIHRpbWUtc2VyaWVzIGRhdGFzZXRzCgotV2UgY2FuIGludGVncmF0ZSB4dHMtem9vIFIgb2JqZWN0cyBpbnRvIG9uZSB4dHMtem9vIGRhdGFzZXQgdXNpbmcgdGhlIG1lcmdlIGZ1bmN0aW9uLiBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgb25seSB1c2UgdGhlIGFkanVzdGVkIHByaWNlLCBzbyB3ZSBjYW4gYWxzbyB1c2UgdGhlIEFkIGZ1bmN0aW9uOi0KCmBgYHtyfQojIFdlIG1lcmdlIHRoZSBkYXRhc2V0cyBpbnRvIGEgbmV3IFIgb2JqZWN0IGNhbGxlZCBwcmljZXM6CnByaWNlcyA9IG1lcmdlKE1YWCxHU1BDKQojIFdlIG9ubHkga2VlcCB0aGUgYWRqdXN0ZWQgcHJpY2UgY29sdW1uczoKcHJpY2VzID0gQWQocHJpY2VzKQojIFdlIHJlbmFtZSB0aGUgY29sdW1ucyB3aXRoIHNpbXBsZXIgbmFtZXM6Cm5hbWVzKHByaWNlcykgPSBjKCJNWFgiLCJHU1BDIikKYGBgCgojIEE1IFEgVmlzdWFsaXppbmcgdGltZS1zZXJpZXMgdmFyaWFibGVzCgotRm9yIGVhY2ggaW5kZXggd2UgZG8gYSBncmFwaCB0byB2aXN1YWxpemUgaG93IHRoZSBpbmRleCBtb3ZlcyBvdmVyIHRpbWUuIFdlIGNhbiB1c2UgdGhlIGNoYXJ0U2VyaWVzIGZ1bmN0aW9uIGZyb20gdGhlIHF1YW50bW9kIHBhY2thZ2U6LQoKYGBge3J9CmNoYXJ0U2VyaWVzKE1YWCwgdGhlbWU9KCJ3aGl0ZSIpKQpgYGAKCmBgYHtyfQpjaGFydFNlcmllcyhHU1BDLCB0aGVtZT0oIndoaXRlIikpCmBgYAoKLVJlc3BvbmQgdG8gdGhlIGZvbGxvd2luZyBRVUVTVElPTjoKCldIQVQgWU9VIENBTiBTQVkgQUJPVVQgVEhFIFRSRU5EIE9GIEJPVEggTUFSS0VUIElOREVYRVM/IElTIElUIENPTlNUQU5UTFkgR1JPV0lORywgT1IgREVDTElOSU5HLCBPUiBUSEVSRSBJUyBOTyBDTEVBUiBUUkVORD8gQlJJRUZMWSBFWFBMQUlOCgpHZW5lcmF0ZSBhIG5ldyBkYXRhc2V0IHdpdGggdGhlIG5hdHVyYWwgbG9nIG9mIGJvdGggaW5kZXhlcyBhcyBmb2xsb3dzOi0KCiBJVCBJUyBRVUlURSBTSE9DS0lORyBUTyBTRUUgVEhFIENPTlRSQUNUSU9OUyBBTkQgVEhFIEdST1dUSFMgSU4gVEhFIE1BUktFVCBQQUlSSU5HIFRIRU0gVE8gVEhFIEhJU1RPUlkgV0UnVkUgTElWRUQgVEhST1VHSC4gMjAxOSBTSE9XRUQgQSBTVFJPTkcgQ09OVFJBQ1RJT04gVE9XQVJEUyBUSEUgTEFUVEVSIFFVQVJURVIgRFVFIFRPIFRIRSBHTE9CQUwgUEFOREVNSUMgQ09WSUQtMTkuIAoKIlRIRSBTVEFOREFSRCBBTkQgUE9PUlMgNTAwIE1FQVNVUkVTIFRIRSBWQUxVRSBPRiBUSEUgU1RPQ0tTIE9GIFRIRSBMQVJHRVNUIDUwMCBDT1JQT1JBVElPTlMgQlkgTUFSS0VUIENBUElUQUxJWkFUSU9OIExJU1RFRCBPTiBUSEUgTkVXIFlPUksgU1RPQ0sgRVhDSEFOR0UgQUtBLiBOQVNEQVEgQ09NUE9TSVRFLlRIRSBJTlRFTlRJT04gT0YgU1RBTkRBUkQgQU5EIFBPT1JTIDUwMCBJUyBUTyBBU1NJR04gQSBQUklDRSBUSEFUIFBST1ZJREVTIEEgUVVJQ0sgTE9PSyBBVCBUSEUgTUFSS0VUIEFORCBJVFMgSU5URVJBQ1RJT04gV0lUSCBUSEUgRUNPTk9NWSIgWUFIT08gRklOQU5DRS4iCgpPTiBUSEUgTE9ORyBSVU4gV0UgQ0FOIFNFRSBBIEdST1dUSCBUUkVORCBFVkVOIFRIT1VHSCBTTUFMTCBDT05UUkFDVElPTlMgQVJFIE9DQ1VSSU5HIFRIRVNFIERBWVMuIAoKYGBge3J9CmxucHJpY2VzID0gbG9nKHByaWNlcykKYGBgCgotTm93IGRvIGEgdGltZSBwbG90IGZvciB0aGUgbG9nIG9mIHRoZSBVUyBpbmRleDotCgpgYGB7cn0KcGxvdChsbnByaWNlcyRHU1BDLCBtYWluID0gIkxvZyBvZiB0aGUgVVMgSW5kZXggb3ZlciB0aW1lIikKCmBgYAoKUVVFU1RJT046IENPTVBBUkVEIFdJVEggVEhFIFBMT1QgT0YgVEhFIFVTIElOREVYLCBXSEFUIERJRkZFUkVOQ0VTIERPIFlPVSBTRUUgSU4gVEhJUyBQTE9UIE9GIFRIRSBMT0cgT0YgVEhFIFVTIElOREVYPyBCUklFRkxZIEVYUExBSU4KVEhJUyBJTkRFWCBCRVRURVIgUkVGTEVDVFMgVEhFIElNTUVESUFURSBGVVRVUkUgQVMgVEhFIEVDT05PTVkgQ09OVFJBQ1RTLiBJIERPTlQgUFJFU1VNRSBUTyBXQVJNT05HRVIgQlVUIFRFTlNJT05TIElOIFRIRSBVS1JBSU5FLVJVU1NJQSBIQVZFIFJFU1VMVEVEIElOIFRIRSBQUklDRSBPRiBCSVRDT0lOIEFORCBPVEhFUiBDUllQVE9DVVJSRU5DSUVTIFRPIERST1AuIAoKRVhFUkNJU0U6IERvIHRoZSBwbG90IGZvciB0aGUgbG9nIG9mIHRoZSBNZXhpY2FuIG1hcmtldCBpbmRleAoKYGBge3J9CnBsb3QobG5wcmljZXMkTVhYLCBtYWluID0gIkxvZyBvZiB0aGUgTUVYIEluZGV4IG92ZXIgdGltZSIpCmBgYAoKIyBCIEZJTkFOQ0lBTCBSRVRVUk5TCgotQSBmaW5hbmNpYWwgc2ltcGxlIHJldHVybiBmb3IgYSBzdG9jayAoUnQpIGlzIGNhbGN1bGF0ZWQgYXMgYSBwZXJjZW50YWdlIGNoYW5nZSBvZiBwcmljZSBmcm9tIHRoZSBwcmV2aW91cyBwZXJpb2QgKHQtMSkgdG8gdGhlIHByZXNlbnQgcGVyaW9kICh0KS0KClJ0PShBZGpwcmljZXTiiJJBZGpwcmljZXTiiJIxKUFkanByaWNldOKIkjE9QWRqcHJpY2V0QWRqcHJpY2V04oiSMeKIkjEKCi1Gb3IgZXhhbXBsZSwgaWYgdGhlIGFkanVzdGVkIHByaWNlIG9mIGEgc3RvY2sgYXQgdGhlIGVuZCBvZiBKYW51YXJ5IDIwMjEgd2FzICQxMDAuMDAsIGFuZCBpdHMgcHJldmlvdXMgKERlY2VtYmVyIDIwMjApIGFkanVzdGVkIHByaWNlIHdhcyAkODAuMDAsIHRoZW4gdGhlIG1vbnRobHkgc2ltcGxlIHJldHVybiBvZiB0aGUgc3RvY2sgaW4gSmFudWFyeSAyMDIxIHdpbGwgYmUtCgpSSmFuMjAyMT1BZHByaWNlSmFuMjAyMUFkcHJpY2VEZWMyMDIw4oiSMT0xMDA4MOKIkjE9MC4yNQoKLVdlIGNhbiB1c2UgcmV0dXJucyBpbiBkZWNpbWFsIG9yIGluIHBlcmNlbnRhZ2UgKG11bHRpcGx5aW5nIGJ5IDEwMCkuIFdlIHdpbGwga2VlcCB1c2luZyBkZWNpbWFscy4KCkluIEZpbmFuY2UgaXQgaXMgdmVyeSByZWNvbW1lbmRlZCB0byBjYWxjdWxhdGUgY29udGludW91c2x5IGNvbXBvdW5kZWQgcmV0dXJucyAoY2MgcmV0dXJucykgYW5kIHVzaW5nIGNjIHJldHVybnMgaW5zdGVhZCBvZiBzaW1wbGUgcmV0dXJucyBmb3IgZGF0YSBhbmFseXNpcywgc3RhdGlzdGljcyBhbmQgZWNvbm9tZXRyaWMgbW9kZWxzLiBjYyByZXR1cm5zIGFyZSBhbHNvIGNhbGxlZCBsb2cgcmV0dXJucy4KCk9uZSB3YXkgdG8gY2FsY3VsYXRlIGNjIHJldHVybnMgaXMgYnkgc3VidHJhY3RpbmcgdGhlIGxvZyBvZiB0aGUgY3VycmVudCBhZGp1c3RlZCBwcmljZSAoYXQgdCkgbWludXMgdGhlIGxvZyBvZiB0aGUgcHJldmlvdXMgYWRqdXN0ZWQgcHJpY2UgKGF0IHQtMSktCgpydD1sb2coQWRqcHJpY2V0KeKIkmxvZyhBZGpwcmljZXTiiJIxKQoKLVRoaXMgaXMgYWxzbyBjYWxsZWQgYXMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIGxvZyBvZiB0aGUgcHJpY2UuCgpXZSBjYW4gYWxzbyBjYWxjdWxhdGUgY2MgcmV0dXJucyBhcyB0aGUgbG9nIG9mIHRoZSBjdXJyZW50IGFkanVzdGVkIHByaWNlIChhdCB0KSBkaXZpZGVkIGJ5IHRoZSBwcmV2aW91cyBhZGp1c3RlZCBwcmljZSAoYXQgdC0xKS0KCnJ0PWxvZyhBZGpwcmljZXRBZGpwcmljZXTiiJIxKQoKLWNjIHJldHVybnMgYXJlIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgc21hbGwgciwgd2hpbGUgc2ltcGxlIHJldHVybnMgYXJlIHJlcHJlc2VudGVkIGJ5IGNhcGl0YWwgUi4tCgojIEIyIFEgQ2FsY3VsYXRpb24gb2YgZmluYW5jaWFsIHJldHVybnMKCi1JdCBpcyByZWNvbW1lbmRlZCB0byBhbHdheXMgdXNlIGFkanVzdGVkIHByaWNlcyB0byBjYWxjdWxhdGUgZmluYW5jaWFsIHJldHVybnMuIEluIHRoaXMgZXhhbXBsZSB0aGF0IHdlIGhhdmUgbWFya2V0IGluZGV4ZXMsIHRoZSBhZGp1c3RlZCBwcmljZSBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBjbG9zaW5nIHByaWNlIHNpbmNlIG1hcmtldCBpbmRleGVzIGRvIG5vdCBoYXZlIHN0b2NrIHNwbGl0cyBub3IgZGl2aWRlbmQgcGF5bWVudHMuLQoKLVdlIGNhbiB1c2UgdGhlIGxhZyBmdW5jdGlvbiB0byBnZXQgcGFzdCAobGFnZ2VkKSB2YWx1ZXMgb2YgYSB0aW1lLXNlcmllcyBkYXRhc2V0IChvciBjb2x1bW4pLiBXaXRoIHRoaXMgZnVuY3Rpb24gd2UgY2FuIGdldCB0aGUgcHJpY2Ugb2YgdGhlIHByZXZpb3VzIHBlcmlvZCB0byBjYWxjdWxhdGUgdGhlIHNpbXBsZSByZXR1cm4uIExldOKAmXMgY3JlYXRlIGEgbmV3IGRhdGFzZXQgZm9yIHRoZSBzaW1wbGUgbW9udGhseSByZXR1cm5zIG9mIGJvdGggaW5kZXhlcy0KCmBgYHtyfQpSID0gcHJpY2VzIC8gbGFnKHByaWNlcyxuPTEpIC0gMSAKYGBgCgotV2UgY2FuIHVzZSB0aGUgZGlmZiBmdW5jdGlvbiB0byBnZXQgdGhlIGRpZmZlcmVuY2Ugb2YgYSBjdXJyZW50IHZhbHVlIGFuZCBhIGxhZ2dlZCB2YWx1ZSBvZiBhIGRhdGFzZXQgKG9yIGEgY29sdW1uKS4gTGV04oCZcyBjcmVhdGUgYSBuZXcgZGF0YXNldCBmb3IgdGhlIGNjIHJldHVybiBvZiBib3RoIGluZGV4ZXMtCgpgYGB7cn0KciA9IGRpZmYobG9nKHByaWNlcykpCmBgYAoKLVJlbWVtYmVyIHRoYXQgdGhlIGNvbnRpbnVvdXNseSBjb21wb3VuZGVkIHJldHVybnMgY2FuIGJlIGNhbGN1bGF0ZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbG9nIG9mIHRoZSBwcmljZSBvZiB0b2RheSBtaW51cyB0aGUgbG9nIG9mIHRoZSBwcmljZSBvZiB0aGUgcHJldmlvdXMgcGVyaW9kLi0KCi1Ob3cgZG8gYSB0aW1lIGdyYXBoIGZvciB0aGUgY2MgcmV0dXJucyBvZiB0aGUgTWV4aWNhbiBpbmRleC0KCmBgYHtyfQpwbG90KHIkTVhYLCBjb2wgPSAiZGFya2JsdWUiLAogICAgIG1haW4gPSAiY2MgcmV0dXJuIGZvciB0aGUgTVhYIGluZGV4IikKYGBgCgpSRVNQT05EIFRPIFRIRSBGT0xMT1dJTkcgUVVFU1RJT05TOgoKKGEpIERPRVMgVEhJUyBTRVJJRVMgSEFWRSBBQk9VVCBUSEUgU0FNRSBNRUFOIEZPUiBBTEwgVElNRSBQRVJJT0RTPwpZRVMsIFRIRSBNRUFOIFRFTkRTIFRPV0FSRFMgMCwgQUxNT1NUIFJZVEhNSUNBTCBERVZJQVRJT05TIFJFU0VNQkxJTkcgQSBIRUFSVEJFQVQgRkxVQ1RVQVRFIEZST00gTkVHQVRJVkUgVE8gUE9TSVRJVkUsIExFQVZJTkcgVEhFIFNFUklFUyBDTE9TRSBUTyAwLiAKCihiKSBET0VTIElUIEhBVkUgVEhFIFNBTUUgU1RBTkRBUkQgREVWSUFUSU9OIChWT0xBVElMSVRZKSBGT1IgQUxMIFRJTUUgUEVSSU9EUz8gRlJPTSAyMDEwIFRPIDIwMTcgVk9MQVRJTElUWSBXQVMgTE9XLCBVUCBVTlRJTCAyMDIwLApXSEVSRVZPTEFUSUxJVFkgU1BJS0VEIFRPV0FSRFMgIFRIRSAtLjIwIE1BUksuIEEgSElHSCBTVEFOREFSRCBERVZJQVRJT04gSU5ESUNBVEVTIFRIQVQgVEhFIFZBTFVFUyBBUkUgU1BSRUFEIE9VVCBPVkVSIEEgV0lERVIgUkFOR0UuCgojIENRIFJFQUQgQU5EIFJFU1BPTkQKClJlYWQvc2tpbSB0aGUgbm90ZTog4oCcSW50cm9kdWN0aW9uIHRvIHRpbWUgc2VyaWVz4oCdLiBXaXRoIHlvdXIgb3duIHdvcmRzOgoKYSkgRVhQTEFJTiBXSEFUIElTIEEgU1RBVElPTkFSWSBTRVJJRVMuCgoiIOKAmFRpbWUgU2VyaWVz4oCZIGlzIGEgY29sbGVjdGlvbiBvZiBvYnNlcnZhdGlvbnMgaW5kZXhlZCBieSB0aW1lLiBUaGUgb2JzZXJ2YXRpb25zIGVhY2ggb2NjdXIgYXQgc29tZSB0aW1lIHQsIHdoZXJlIHQgYmVsb25ncyB0byB0aGUgc2V0IG9mIGFsbG93ZWQgdGltZXMsIFQuICBTdGF0aW9uYXJpdHkgbWVhbnMgdGhhdCB0aGUgc3RhdGlzdGljYWwgcHJvcGVydGllcyBvZiBhIHByb2Nlc3MgZ2VuZXJhdGluZyBhIHRpbWUgc2VyaWVzIGRvIG5vdCBjaGFuZ2Ugb3ZlciB0aW1lIC4gSXQgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBzZXJpZXMgZG9lcyBub3QgY2hhbmdlIG92ZXIgdGltZSwganVzdCB0aGF0IHRoZSB3YXkgaXQgY2hhbmdlcyBkb2VzIG5vdCBpdHNlbGYgY2hhbmdlIG92ZXIgdGltZS4iCihTLlBBTEFDSFksIDIwMTkpCgpTVEFUSU9OQVJZIFNFUklFUyBUSEVSRUZPUkUgQVJFIFBMT1RTIFdIRVJFIFRIRSBSQVRFIE9GIENIQU5HRSBJUyBUSEUgU0FNRSBBTkQgRVZFTiBUSE9VR0ggVEhFIFRJTUUgU0VSSUVTIEdST1dTIEFORCBDT05UUkFDVFMgVEhFIFNUQVJUSU5HIFBPSU5UIElTIFRIRSBTQU1FLiAKCmIpIFdISUNIIEFSRSBUSEUgQ09ORElUSU9OUyBPRiBBIFNFUklFUyBUTyBCRSBDT05TSURFUkVEIEFTIEEgU1RBVElPTkFSWSBTRVJJRVM/CgpJIEZPVU5EIEEgR1JFQVQgRVhQTEFOQVRJT04gVEhBVCBUSFJPVUdIIEFMTFVTSU9OIENPTVBBUkVTIEEgU1RBVElPTkFSWSBTRVJJRVMgVE8gQSBMSU5FQVIgRlVOQ1RJT04gSU5TVEVBRCBPRiBBIENPTlNUQU5UIEZVTkNUSU9OIFNJTkNFICIgdGhlIHZhbHVlIG9mIGEgbGluZWFyIGZ1bmN0aW9uIGNoYW5nZXMgYXMg8J2SmSBncm93cywgYnV0IHRoZSB3YXkgaXQgY2hhbmdlcyByZW1haW5zIGNvbnN0YW50Ii4gCgoKCg==