Introduction
Alvin Tan created interesting Noteboook, which is partly
used in this presentation. The Investopedia information source
is also used. In addition, a Bookdown of Technical
Analysis with R (second edition) from Ko Chiu Yu and ChatGPT were
helpful with the coding in R.
Technical analysis is a method to predict price movement in the
financial markets. Unlike the usual balance sheet analysis (fundamental
investing), technical analysis estimates the value of a given stock
using underlying trends of the price movement. The core assumption
behind this method is that the fundamentals (information from financial
statements) were factored into the price fluctuation, hence, detecting
the patterns and signals from the fluctuation should provide sufficient
indicator for future performance.
For this project, we are going to explore some of the common
technical indicators using the TQQQ Exchange trade fund (ETF) stock.
Among leveraged ETFs, ProShares UltraPro QQQ (TQQQ) is one of the
largest with assets under management of \(\$18.56\) billion as of July 2022. TQQQ is
also one of the more heavily traded leveraged ETFs in the U.S. with an
average daily volume of \(\$5.29\)
billion (compared with QQQ’s \(\$21\)
billion).
TQQQ carries an expense
ratio of 0.95%.
#install.packages("quantmod")
#install.packages("data.table")
#install.packages("ggplot2")
#install.packages("tidyquant")
library(quantmod)
library(data.table)
library(ggplot2)
library(tidyquant)
structure of the stock data
stock <<- as.data.table(TQQQ) ###### change TQQQ ticker to Your ticker symbol #########
names(stock)[1] <- c('Date')
tail(stock)
Interpretation of the HLCO graph
In finance, HLCO graph is a type of financial chart that plots the
high, low, close, and open prices for a given period of time. The HLCO
chart is similar to a candlestick chart, but it includes the open price
in addition to the high, low, and close prices.
The interpretation of an HLCO chart can provide insights into the
price action of a security during a given period of time. Here is a
brief explanation of how to interpret each component of an HLCO
chart:
High: The top of the vertical line represents the highest price
reached during the given period. This shows the highest price that
buyers were willing to pay for the security during the period.
Low: The bottom of the vertical line represents the lowest price
reached during the given period. This shows the lowest price that
sellers were willing to accept for the security during the
period.
Close: The horizontal line to the right of the vertical line
represents the closing price for the period. This shows the final price
at which the security traded during the period.
Open: The horizontal line to the left of the vertical line
represents the opening price for the period. This shows the initial
price at which the security traded during the period.
By looking at the patterns of the high, low, close, and open prices
in an HLCO chart, traders and investors can gain insight into the
overall trend and sentiment of the market for the given security. For
example, a long green candlestick with a high close and low open may
indicate bullish sentiment, while a long red candlestick with a low
close and high open may indicate bearish sentiment.
# feel free to change "HLCO" to "candlestick" or to some other types ("lines", "auto").
chartSeries(stock, subset='2020-01-01::2020-09-23', type = "candlesticks", bar.type = "ohlc",theme=chartTheme('white'))

Volume
One of the most common basic indicators traders examine is the
trading volume. Trading volume is an indication for the ‘activeness’ of
a financial instrument. Depending on the financial instruments, trading
volume can be measured either using the number of stocks traded or
number of contracts with changed ownerships. To put this in practice, if
an increase in volume is observed with a steady increase in price, the
instrument can be viewed as steady and strong. However, if volume and
price are changing in different directions, a reversal might be
happened.
You can analyze it in the previous picture.
Price - Moving Average
In terms of trading price, traders often observed the trends based on
the charts shape and cross in ways that form shapes - often times with
weird names like ‘head and shoulder’, ’ reverse head and sholder’,
‘double top’, ‘golden cross’, etc. A golden cross indicates a long term
bull market going forward, whereas the death cross is the exact
opposite, indicating a potential long term bear market. Both of these
refer to the confirmation of long term trend by the occurance of the
overlapping of moving average lines as shown below.
In the quantmod package in R, the addMA function can be used to add
moving averages to a financial time series chart. There are various
methods of calculating moving averages that can be used in this
function, which I will describe below:
Simple Moving Average (SMA): This is the most basic type of
moving average and is calculated by taking the average of a set number
of periods of data. For example, a 20-day SMA would be the average of
the closing prices for the last 20 days. This method gives equal weight
to all periods in the moving average. \[SMA_t
= \frac{P_t + \dots + P_{t-n+1}}{n}\] Buy signal arises
when a short-run SMA crosses from below to above a long-run SMA.
Sell signal arrises when a short-run SMA crosses from above to
below a long-run SMA.
Weighted Moving Average (WMA): This method assigns a weight to
each data point in the moving average, with more recent data points
given greater weight. The weights can be calculated in various ways,
such as linear or exponential.
Exponential Moving Average (EMA): This method is similar to the
WMA, but it gives greater weight to more recent data points using an
exponential decay formula. The formula used to calculate the EMA
involves a smoothing factor, which determines the weight given to each
data point. \[EMA_t = \beta P_t + (1-\beta)
EMA_{t-1}\] where the smoothing coefficient is usually defined
\(\beta = \frac{2}{n+1} \in
(0;1)\).
Double Exponential Moving Average (DEMA): This method is similar
to the EMA, but it uses a second EMA to smooth the first EMA. This
results in a smoother moving average that is less sensitive to
short-term fluctuations.
Triple Exponential Moving Average (TEMA): This method is similar
to the DEMA, but it uses a third EMA to further smooth the moving
average. This method is even less sensitive to short-term fluctuations
than the DEMA.
These are the main types of moving averages that can be used in the
addMA function in quantmod. Each method has its own advantages and
disadvantages, and the choice of method will depend on the specific
needs of the analysis being performed.
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "candlestick",
theme=chartTheme('white'))

addSMA(n = 12, on = 1, with.col = Cl, overlay = TRUE, col = "brown")

addSMA(n = 24, on = 1, with.col = Cl, overlay = TRUE, col = "blue")

NA
NA
Moving Average Convergence Divergence (MACD)
MACD stands for Moving Average Convergence Divergence. It is a
popular technical analysis indicator that is used to identify changes in
trend direction, momentum, and potential buy and sell signals in
financial markets.
The MACD is calculated by subtracting the 26-period Exponential
Moving Average (EMA) from the 12-period EMA. The result of this
calculation is then plotted on a chart along with a 9-period EMA, which
is often referred to as the “signal line”.
\[MACD(S=12,L=26)_t = EMA(t,S) -
EMA(t,L)\]
The MACD line oscillates above and below the signal line, indicating
changes in momentum and trend direction. When the MACD line crosses
above the signal line, it is considered a bullish signal, indicating a
potential buy opportunity. Conversely, when the MACD line crosses below
the signal line, it is considered a bearish signal, indicating a
potential sell opportunity. In other words Buy signal arises
when MACD crosses from below to above the signal line, and Sell
signal arises when MACD crosses from above to below the signal
line.
The MACD can also be used to identify divergences between the MACD
line and the price of the security being analyzed. When the MACD line
diverges from the price, it can be an indication that a trend reversal
may be imminent.
Traders and investors often use the MACD in conjunction with other
technical analysis tools, such as support and resistance levels, to make
informed trading decisions. It is important to note that while the MACD
can be a useful indicator, it is not infallible and should be used in
conjunction with other forms of analysis to make informed trading
decisions.
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addMACD(fast=12,slow=26,signal=9,type="EMA")

Bollinger Band
Apart from the death and golden crosses, the moving average lines can
be used to compute the Bollinger Band. A Bollinger Band is made up of 3
lines, the simple moving average, an upper boundary and a lower
boundary. Simply put, this is a measure to tell if a financial
instrument is overbought or oversold. The closer the prices move to the
upper band, the more likely the financial instrument is overbought,
which may lead to a reversal (market correction). Likewise, if the price
is moving to the lower band, the market has a higher probability of
being oversold, which will lead to a upward reversal.
For Bollinger band, channel is drawn over a trend line plus/minus 2
standard deviation (SD). Trend line: SMA or EMA of price (price can be
closing price or average of high, low, and close).
Bandwidth: determined by the asset volatility \[B_{t,n} = k*sdev(P_t,n)\] where usually we
have \(k=2\) and \(n=20\). The lower and upper bands are
defined \[up_t = P_t + B_{t,n} \quad
\text{and} \quad down_t = P_t - B_{t,n} \]
Bollinger Bands are a popular technical analysis tool used by traders
to measure the volatility and potential price movements of a financial
instrument. They are comprised of three lines: a simple moving average
(SMA), an upper band, and a lower band.
The SMA is typically calculated using a 20-day moving average, but
can be adjusted to fit the specific time frame being analyzed. The upper
band is calculated by adding two standard deviations to the SMA, while
the lower band is calculated by subtracting two standard deviations from
the SMA.
The bands are plotted on a chart, with the SMA as the center line and
the upper and lower bands representing two standard deviations away from
the SMA. As the volatility of the financial instrument increases or
decreases, the bands expand or contract accordingly.
Traders use Bollinger Bands to identify potential buying and selling
opportunities. When the price of the financial instrument touches or
crosses the upper band, it is considered overbought, and a sell signal
may be generated. When the price touches or crosses the lower band, it
is considered oversold, and a buy signal may be generated. Ko
Chiu Yu says that Buy signal arises when price is above the
band and Sell signal arises when price is below the band, which
is in fact the same.
It is important to note that Bollinger Bands should not be used in
isolation and should be used in conjunction with other technical
analysis tools to make informed trading decisions. Additionally, the
bands may not be effective in all market conditions, and traders should
adjust their strategies accordingly.
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addBBands(n = 20, sd = 2, maType = "SMA", draw = 'bands', on = -1)

Relative Strength Index (RSI)
Similar to the Bollinger Band, RSI is a momentum indicator that
evaluate the overbought and oversold condition of a financial
instrument. The only major difference between these is the method of
display. RSI is plotted as an oscillator with a range between 0 to 100
whereas the Bollinger Band are plotted along the moving average line of
the price. Hence, a huge advantage of RSI over Bollinger Band is the
ability to do cross comparison across multiple instruments.
Usually, RSI is evaluated using a 30-70 cutoffs. An RSI reading of 70
or above indicates an overbought or overvalued condition whereas an RSI
of below 30 indicates a undervalued condition.
Relative Strength Index (RSI) is a popular technical analysis
indicator used to measure the strength of price movements in financial
markets. It was developed by J. Welles Wilder Jr. and is used to
identify overbought and oversold conditions.
The calculation of RSI requires several steps:
Whether price has gone up or down each day
Relative strength (RS): the ratio of the (simple or exponential)
average numbers of up day to the average of down day
Relative strength index (RSI): normalize RS to the scale from 0
to 100.
Step 1. Calculate
\[U_t = 1 \quad \text{if} \quad P_t >
P_{t-1}, \quad \text{otherwise} \quad U_t=0\]
\[D_t = 1 \quad \text{if} \quad P_t <
P_{t-1}, \quad \text{otherwise} \quad D_t= 0\] Step 2: \[RS_{t,n} = \frac{\frac{U_t + U_{t-1} + \dots +
U_{t-n+1}}{n}}{\frac{D_t + D_{t-1} + \dots + D_{t-n+1}}{n}}\]
and, finally
\[RSI_{t,n} = 100
\frac{RS_{t,n}}{1+RS_{t,n}}\]
The RSI oscillates between 0 and 100, with readings above 70
indicating that the asset is overbought, and readings below 30
indicating that the asset is oversold.
Traders and investors use the RSI to identify potential trend
reversals and generate buy and sell signals. For example, when the RSI
crosses above 70, it is considered overbought, and a sell signal may be
generated. Conversely, when the RSI crosses below 30, it is considered
oversold, and a buy signal may be generated.
The RSI can also be used to identify divergences between the RSI line
and the price of the asset being analyzed. When the RSI line diverges
from the price, it can be an indication that a trend reversal may be
imminent.
It is important to note that like any technical analysis tool, the
RSI is not infallible and should be used in conjunction with other
indicators and analysis methods to make informed trading decisions.
Additionally, traders should adjust their strategies and parameters to
fit the specific market conditions being analyzed.
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addRSI(n = 14, maType = "EMA", wilder = TRUE)

Parabolic stop and reversal
The Parabolic Stop and Reversal (SAR) is a technical analysis tool
used by traders to determine potential trend reversals in price
movements. It was developed by J. Welles Wilder Jr. and is used to set
trailing stop-loss orders in order to limit potential losses in a
trade.
The SAR uses a series of dots placed above or below the price of the
asset being analyzed to indicate potential reversals in the direction of
the trend. When the price is moving upwards, the SAR dots are placed
below the price, and when the price is moving downwards, the SAR dots
are placed above the price.
The Parabolic Stop and Reversal (SAR) is a technical analysis tool
used by traders to determine potential trend reversals in price
movements. It was developed by J. Welles Wilder Jr. and is used to set
trailing stop-loss orders in order to limit potential losses in a
trade.
The SAR uses a series of dots placed above or below the price of the
asset being analyzed to indicate potential reversals in the direction of
the trend. When the price is moving upwards, the SAR dots are placed
below the price, and when the price is moving downwards, the SAR dots
are placed above the price.
As the price moves in the direction of the trend, the distance
between the price and the SAR dots increases. When the price reaches a
certain distance from the SAR dots, the dots begin to move closer to the
price, indicating that a potential reversal in the trend may be
imminent. When the price crosses the SAR dots, it is considered a signal
to exit a trade and potentially enter a new trade in the opposite
direction.
The Parabolic Stop and Reverse (SAR) is a technical analysis tool
used to identify potential reversal points in a price trend. The formula
for calculating the Parabolic SAR is as follows:
For an uptrend:
\[SAR_{n+1} = SAR_n + AF * (EP -
SAR_n)\]
For a downtrend:
\[SAR_{n+1} = SAR_n - AF * (SAR_n -
EP)\]
Where:
\(SAR_n\) is the current period’s
\(SAR\) value
\(SAR_{n+1}\) is the next period’s
\(SAR\) value
\(AF\) is the acceleration factor,
which starts at 0.02 and increases by 0.02 each time a new extreme point
(EP) is reached, up to a maximum of 0.20
\(EP\) is the highest high or lowest
low of the current trend, depending on the direction of the trend
The initial SAR value is set to the lowest low for an uptrend, and
the highest high for a downtrend. The SAR value is then calculated for
each subsequent period using the above formula.
The SAR can be used in conjunction with other technical analysis
tools, such as moving averages or trend lines, to confirm potential
trend reversals and identify potential entry or exit points for
trades.
It is important to note that the SAR should not be used in isolation
and should be used in conjunction with other analysis methods to make
informed trading decisions. Additionally, traders should adjust the
parameters of the SAR to fit the specific market conditions being
analyzed.
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addSAR(accel = c(0.02, 0.2), col = "blue")

NA
NA
Summary graphs
Apart from the few that was mentioned above, other indicators include
rate of change, money flow index (MFI), MACD and etc.
Chart Series
ChartSeries provides an alternative way to summarise the plot.
Instead of one plot for each indicator, all of them can now be compiled
into a single figure, where indicators can be added to the bottom of the
existing plot.
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addBBands(n=20,sd=2)

addRSI(n=14,maType="EMA")

addMACD(fast=12,slow=26,signal=9,type="EMA")

LS0tCnRpdGxlOiAiVGVjaG5pY2FsIGFuYWx5c2lzIGluIFIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIEludHJvZHVjdGlvbgoKQWx2aW4gVGFuIGNyZWF0ZWQgaW50ZXJlc3RpbmcgW05vdGVib29va10oaHR0cDovL3JwdWJzLmNvbS96aGVzaHVlbi82NjU2MTYpLCB3aGljaCBpcyBwYXJ0bHkgdXNlZCBpbiB0aGlzIHByZXNlbnRhdGlvbi4gVGhlIFtJbnZlc3RvcGVkaWFdKGh0dHBzOi8vd3d3LmludmVzdG9wZWRpYS5jb20vKSBpbmZvcm1hdGlvbiBzb3VyY2UgaXMgYWxzbyB1c2VkLiBJbiBhZGRpdGlvbiwgYSBCb29rZG93biBvZiBbVGVjaG5pY2FsIEFuYWx5c2lzIHdpdGggUiAoc2Vjb25kIGVkaXRpb24pIGZyb20gS28gQ2hpdSBZdV0oaHR0cHM6Ly9ib29rZG93bi5vcmcva29jaGl1eXUvdGVjaG5pY2FsLWFuYWx5c2lzLXdpdGgtci1zZWNvbmQtZWRpdGlvbjIvKSAgYW5kIENoYXRHUFQgd2VyZSBoZWxwZnVsIHdpdGggdGhlIGNvZGluZyBpbiBSLgoKVGVjaG5pY2FsIGFuYWx5c2lzIGlzIGEgbWV0aG9kIHRvIHByZWRpY3QgcHJpY2UgbW92ZW1lbnQgaW4gdGhlIGZpbmFuY2lhbCBtYXJrZXRzLiBVbmxpa2UgdGhlIHVzdWFsIGJhbGFuY2Ugc2hlZXQgYW5hbHlzaXMgKGZ1bmRhbWVudGFsIGludmVzdGluZyksIHRlY2huaWNhbCBhbmFseXNpcyBlc3RpbWF0ZXMgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gc3RvY2sgdXNpbmcgdW5kZXJseWluZyB0cmVuZHMgb2YgdGhlIHByaWNlIG1vdmVtZW50LiBUaGUgY29yZSBhc3N1bXB0aW9uIGJlaGluZCB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBmdW5kYW1lbnRhbHMgKGluZm9ybWF0aW9uIGZyb20gZmluYW5jaWFsIHN0YXRlbWVudHMpIHdlcmUgZmFjdG9yZWQgaW50byB0aGUgcHJpY2UgZmx1Y3R1YXRpb24sIGhlbmNlLCBkZXRlY3RpbmcgdGhlIHBhdHRlcm5zIGFuZCBzaWduYWxzIGZyb20gdGhlIGZsdWN0dWF0aW9uIHNob3VsZCBwcm92aWRlIHN1ZmZpY2llbnQgaW5kaWNhdG9yIGZvciBmdXR1cmUgcGVyZm9ybWFuY2UuCgpGb3IgdGhpcyBwcm9qZWN0LCB3ZSBhcmUgZ29pbmcgdG8gZXhwbG9yZSBzb21lIG9mIHRoZSBjb21tb24gdGVjaG5pY2FsIGluZGljYXRvcnMgdXNpbmcgdGhlIFRRUVEgRXhjaGFuZ2UgdHJhZGUgZnVuZCAoRVRGKSBzdG9jay4gQW1vbmcgbGV2ZXJhZ2VkIEVURnMsIFByb1NoYXJlcyBVbHRyYVBybyBRUVEgKFRRUVEpIGlzIG9uZSBvZiB0aGUgbGFyZ2VzdCB3aXRoIGFzc2V0cyB1bmRlciBtYW5hZ2VtZW50IG9mICRcJDE4LjU2JCBiaWxsaW9uIGFzIG9mIEp1bHkgMjAyMi4gVFFRUSBpcyBhbHNvIG9uZSBvZiB0aGUgbW9yZSBoZWF2aWx5IHRyYWRlZCBsZXZlcmFnZWQgRVRGcyBpbiB0aGUgVS5TLiB3aXRoIGFuIGF2ZXJhZ2UgZGFpbHkgdm9sdW1lIG9mICRcJDUuMjkkIGJpbGxpb24gKGNvbXBhcmVkIHdpdGggUVFRJ3MgJFwkMjEkIGJpbGxpb24pLgoKVFFRUSBjYXJyaWVzIGFuIFtleHBlbnNlIHJhdGlvXShodHRwczovL3d3dy5pbnZlc3RvcGVkaWEuY29tL3Rlcm1zL2UvZXhwZW5zZXJhdGlvLmFzcCkgb2YgMC45NSUuCgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKI2luc3RhbGwucGFja2FnZXMoImRhdGEudGFibGUiKQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5cXVhbnQiKQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0aWR5cXVhbnQpICAKYGBgCgojIyBEYXRhIEV4dHJhY3Rpb24gJiBNYW5pcHVsYXRpb24sIERhdGEgc3RydWN0dXJlCgpUUVFRIGRhdGEgaXMgZXh0cmFjdGVkIHVzaW5nIHRoZSBnZXRTeW1ib2xzIGZ1bmN0aW9uIGZyb20gWWFob28gRmluYW5jZS4gQWx0ZXJuYXRpdmVseSwgdGhlIHNvdXJjZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBGUkVELCBNeVNRTCwgR29vZ2xlLCBvciBvdGhlcnMuIFRoZSBkYXRhIGV4dHJhY3RlZCBzaG91bGQgYmUgaW4gYW4g4oCYeHRz4oCZIG9iamVjdCAtIGEgZm9ybWF0IGNvbW1vbmx5IHVzZWQgaW4gdGltZSBzZXJpZXMgYW5hbHlzaXMgd2hlcmUgb2JzZXJ2YXRpb25zIGFyZSByZWNvcmRlZCBpbiBhIG1hdHJpeCBzdHJ1Y3R1cmUgd2l0aCBhbiBpbmRleCBvZiBjb3JyZXNwb25kaW5nIHRpbWUuCgpUZWNobmljYWxseSwgYW5hbHlzaXMgY2FuIGJlIGRvbmUgaW4geHRzIGZvcm1hdCBhbG9uZSwgYnV0IGZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LCBkYXRhIGlzIGNvbnZlcnRlZCBpbnRvIGEgc3RhbmRhcmQgZGF0YWZyYW1lIGFuZCBpbmRleCBjb2x1bW4gaXMgcmVuYW1lZCBhcyAiRGF0ZeKAmS4gVGhlIGVuZCByZXN1bHQgaXMgc2hvd24gYXMgYmVsb3c6CgpgYGB7ciBkb3dubG9hZF9zdG9ja19oaXN0b3J5fQpnZXRTeW1ib2xzKCdUUVFRJyxzcmMgPSAneWFob28nKSAgICAgICAjIyBjaGFuZ2UgVFFRUSB0aWNrZXIgdG8gWW91ciB0aWNrZXIgc3ltYm9sCmBgYAoKIyMgc3RydWN0dXJlIG9mIHRoZSAqc3RvY2sqIGRhdGEKCmBgYHtyfQpzdG9jayA8PC0gYXMuZGF0YS50YWJsZShUUVFRKSAgICAgICAgIyMjIyMjIGNoYW5nZSBUUVFRIHRpY2tlciB0byBZb3VyIHRpY2tlciBzeW1ib2wgICMjIyMjIyMjIwpuYW1lcyhzdG9jaylbMV0gPC0gYygnRGF0ZScpCgp0YWlsKHN0b2NrKQpgYGAKCgojIyBJbnRlcnByZXRhdGlvbiBvZiB0aGUgSExDTyBncmFwaAoKSW4gZmluYW5jZSwgSExDTyBncmFwaCBpcyBhIHR5cGUgb2YgZmluYW5jaWFsIGNoYXJ0IHRoYXQgcGxvdHMgdGhlIGhpZ2gsIGxvdywgY2xvc2UsIGFuZCBvcGVuIHByaWNlcyBmb3IgYSBnaXZlbiBwZXJpb2Qgb2YgdGltZS4gVGhlIEhMQ08gY2hhcnQgaXMgc2ltaWxhciB0byBhIGNhbmRsZXN0aWNrIGNoYXJ0LCBidXQgaXQgaW5jbHVkZXMgdGhlIG9wZW4gcHJpY2UgaW4gYWRkaXRpb24gdG8gdGhlIGhpZ2gsIGxvdywgYW5kIGNsb3NlIHByaWNlcy4KClRoZSBpbnRlcnByZXRhdGlvbiBvZiBhbiBITENPIGNoYXJ0IGNhbiBwcm92aWRlIGluc2lnaHRzIGludG8gdGhlIHByaWNlIGFjdGlvbiBvZiBhIHNlY3VyaXR5IGR1cmluZyBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lLiBIZXJlIGlzIGEgYnJpZWYgZXhwbGFuYXRpb24gb2YgaG93IHRvIGludGVycHJldCBlYWNoIGNvbXBvbmVudCBvZiBhbiBITENPIGNoYXJ0OgoKMS4gSGlnaDogVGhlIHRvcCBvZiB0aGUgdmVydGljYWwgbGluZSByZXByZXNlbnRzIHRoZSBoaWdoZXN0IHByaWNlIHJlYWNoZWQgZHVyaW5nIHRoZSBnaXZlbiBwZXJpb2QuIFRoaXMgc2hvd3MgdGhlIGhpZ2hlc3QgcHJpY2UgdGhhdCBidXllcnMgd2VyZSB3aWxsaW5nIHRvIHBheSBmb3IgdGhlIHNlY3VyaXR5IGR1cmluZyB0aGUgcGVyaW9kLgoKMi4gTG93OiBUaGUgYm90dG9tIG9mIHRoZSB2ZXJ0aWNhbCBsaW5lIHJlcHJlc2VudHMgdGhlIGxvd2VzdCBwcmljZSByZWFjaGVkIGR1cmluZyB0aGUgZ2l2ZW4gcGVyaW9kLiBUaGlzIHNob3dzIHRoZSBsb3dlc3QgcHJpY2UgdGhhdCBzZWxsZXJzIHdlcmUgd2lsbGluZyB0byBhY2NlcHQgZm9yIHRoZSBzZWN1cml0eSBkdXJpbmcgdGhlIHBlcmlvZC4KCjMuIENsb3NlOiBUaGUgaG9yaXpvbnRhbCBsaW5lIHRvIHRoZSByaWdodCBvZiB0aGUgdmVydGljYWwgbGluZSByZXByZXNlbnRzIHRoZSBjbG9zaW5nIHByaWNlIGZvciB0aGUgcGVyaW9kLiBUaGlzIHNob3dzIHRoZSBmaW5hbCBwcmljZSBhdCB3aGljaCB0aGUgc2VjdXJpdHkgdHJhZGVkIGR1cmluZyB0aGUgcGVyaW9kLgoKNC4gT3BlbjogVGhlIGhvcml6b250YWwgbGluZSB0byB0aGUgbGVmdCBvZiB0aGUgdmVydGljYWwgbGluZSByZXByZXNlbnRzIHRoZSBvcGVuaW5nIHByaWNlIGZvciB0aGUgcGVyaW9kLiBUaGlzIHNob3dzIHRoZSBpbml0aWFsIHByaWNlIGF0IHdoaWNoIHRoZSBzZWN1cml0eSB0cmFkZWQgZHVyaW5nIHRoZSBwZXJpb2QuCgpCeSBsb29raW5nIGF0IHRoZSBwYXR0ZXJucyBvZiB0aGUgaGlnaCwgbG93LCBjbG9zZSwgYW5kIG9wZW4gcHJpY2VzIGluIGFuIEhMQ08gY2hhcnQsIHRyYWRlcnMgYW5kIGludmVzdG9ycyBjYW4gZ2FpbiBpbnNpZ2h0IGludG8gdGhlIG92ZXJhbGwgdHJlbmQgYW5kIHNlbnRpbWVudCBvZiB0aGUgbWFya2V0IGZvciB0aGUgZ2l2ZW4gc2VjdXJpdHkuIEZvciBleGFtcGxlLCBhIGxvbmcgZ3JlZW4gY2FuZGxlc3RpY2sgd2l0aCBhIGhpZ2ggY2xvc2UgYW5kIGxvdyBvcGVuIG1heSBpbmRpY2F0ZSBidWxsaXNoIHNlbnRpbWVudCwgd2hpbGUgYSBsb25nIHJlZCBjYW5kbGVzdGljayB3aXRoIGEgbG93IGNsb3NlIGFuZCBoaWdoIG9wZW4gbWF5IGluZGljYXRlIGJlYXJpc2ggc2VudGltZW50LgoKYGBge3J9CiMgZmVlbCBmcmVlIHRvIGNoYW5nZSAiSExDTyIgdG8gImNhbmRsZXN0aWNrIiBvciB0byBzb21lIG90aGVyIHR5cGVzICgibGluZXMiLCAiYXV0byIpLiAKY2hhcnRTZXJpZXMoc3RvY2ssIHN1YnNldD0nMjAyMC0wMS0wMTo6MjAyMC0wOS0yMycsIHR5cGUgPSAiY2FuZGxlc3RpY2tzIiwgYmFyLnR5cGUgPSAib2hsYyIsdGhlbWU9Y2hhcnRUaGVtZSgnd2hpdGUnKSkKYGBgCgoKCgojIyBWb2x1bWUgCgpPbmUgb2YgdGhlIG1vc3QgY29tbW9uIGJhc2ljIGluZGljYXRvcnMgdHJhZGVycyBleGFtaW5lIGlzIHRoZSB0cmFkaW5nIHZvbHVtZS4gVHJhZGluZyB2b2x1bWUgaXMgYW4gaW5kaWNhdGlvbiBmb3IgdGhlIOKAmGFjdGl2ZW5lc3PigJkgb2YgYSBmaW5hbmNpYWwgaW5zdHJ1bWVudC4gRGVwZW5kaW5nIG9uIHRoZSBmaW5hbmNpYWwgaW5zdHJ1bWVudHMsIHRyYWRpbmcgdm9sdW1lIGNhbiBiZSBtZWFzdXJlZCBlaXRoZXIgdXNpbmcgdGhlIG51bWJlciBvZiBzdG9ja3MgdHJhZGVkIG9yIG51bWJlciBvZiBjb250cmFjdHMgd2l0aCBjaGFuZ2VkIG93bmVyc2hpcHMuIFRvIHB1dCB0aGlzIGluIHByYWN0aWNlLCBpZiBhbiBpbmNyZWFzZSBpbiB2b2x1bWUgaXMgb2JzZXJ2ZWQgd2l0aCBhIHN0ZWFkeSBpbmNyZWFzZSBpbiBwcmljZSwgdGhlIGluc3RydW1lbnQgY2FuIGJlIHZpZXdlZCBhcyBzdGVhZHkgYW5kIHN0cm9uZy4gSG93ZXZlciwgaWYgdm9sdW1lIGFuZCBwcmljZSBhcmUgY2hhbmdpbmcgaW4gZGlmZmVyZW50IGRpcmVjdGlvbnMsIGEgcmV2ZXJzYWwgbWlnaHQgYmUgaGFwcGVuZWQuCgpZb3UgY2FuIGFuYWx5emUgaXQgaW4gdGhlIHByZXZpb3VzIHBpY3R1cmUuCgoKIyMgUHJpY2UgLSBNb3ZpbmcgQXZlcmFnZQoKSW4gdGVybXMgb2YgdHJhZGluZyBwcmljZSwgdHJhZGVycyBvZnRlbiBvYnNlcnZlZCB0aGUgdHJlbmRzIGJhc2VkIG9uIHRoZSBjaGFydHMgc2hhcGUgYW5kIGNyb3NzIGluIHdheXMgdGhhdCBmb3JtIHNoYXBlcyAtIG9mdGVuIHRpbWVzIHdpdGggd2VpcmQgbmFtZXMgbGlrZSDigJhoZWFkIGFuZCBzaG91bGRlcuKAmSwg4oCZIHJldmVyc2UgaGVhZCBhbmQgc2hvbGRlcuKAmSwg4oCYZG91YmxlIHRvcOKAmSwg4oCYZ29sZGVuIGNyb3Nz4oCZLCBldGMuIEEgZ29sZGVuIGNyb3NzIGluZGljYXRlcyBhIGxvbmcgdGVybSBidWxsIG1hcmtldCBnb2luZyBmb3J3YXJkLCB3aGVyZWFzIHRoZSBkZWF0aCBjcm9zcyBpcyB0aGUgZXhhY3Qgb3Bwb3NpdGUsIGluZGljYXRpbmcgYSBwb3RlbnRpYWwgbG9uZyB0ZXJtIGJlYXIgbWFya2V0LiBCb3RoIG9mIHRoZXNlIHJlZmVyIHRvIHRoZSBjb25maXJtYXRpb24gb2YgbG9uZyB0ZXJtIHRyZW5kIGJ5IHRoZSBvY2N1cmFuY2Ugb2YgdGhlIG92ZXJsYXBwaW5nIG9mIG1vdmluZyBhdmVyYWdlIGxpbmVzIGFzIHNob3duIGJlbG93LgoKSW4gdGhlIHF1YW50bW9kIHBhY2thZ2UgaW4gUiwgdGhlIGFkZE1BIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFkZCBtb3ZpbmcgYXZlcmFnZXMgdG8gYSBmaW5hbmNpYWwgdGltZSBzZXJpZXMgY2hhcnQuIFRoZXJlIGFyZSB2YXJpb3VzIG1ldGhvZHMgb2YgY2FsY3VsYXRpbmcgbW92aW5nIGF2ZXJhZ2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhpcyBmdW5jdGlvbiwgd2hpY2ggSSB3aWxsIGRlc2NyaWJlIGJlbG93OgoKMS4gU2ltcGxlIE1vdmluZyBBdmVyYWdlIChTTUEpOiBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHR5cGUgb2YgbW92aW5nIGF2ZXJhZ2UgYW5kIGlzIGNhbGN1bGF0ZWQgYnkgdGFraW5nIHRoZSBhdmVyYWdlIG9mIGEgc2V0IG51bWJlciBvZiBwZXJpb2RzIG9mIGRhdGEuIEZvciBleGFtcGxlLCBhIDIwLWRheSBTTUEgd291bGQgYmUgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGNsb3NpbmcgcHJpY2VzIGZvciB0aGUgbGFzdCAyMCBkYXlzLiBUaGlzIG1ldGhvZCBnaXZlcyBlcXVhbCB3ZWlnaHQgdG8gYWxsIHBlcmlvZHMgaW4gdGhlIG1vdmluZyBhdmVyYWdlLgogJCRTTUFfdCA9IFxmcmFje1BfdCArIFxkb3RzICsgUF97dC1uKzF9fXtufSQkCipCdXkgc2lnbmFsKiBhcmlzZXMgd2hlbiBhIHNob3J0LXJ1biBTTUEgY3Jvc3NlcyBmcm9tIGJlbG93IHRvIGFib3ZlIGEgbG9uZy1ydW4gU01BLiAqU2VsbCBzaWduYWwqIGFycmlzZXMgd2hlbiBhIHNob3J0LXJ1biBTTUEgY3Jvc3NlcyBmcm9tIGFib3ZlIHRvIGJlbG93IGEgbG9uZy1ydW4gU01BLgoKMi4gV2VpZ2h0ZWQgTW92aW5nIEF2ZXJhZ2UgKFdNQSk6IFRoaXMgbWV0aG9kIGFzc2lnbnMgYSB3ZWlnaHQgdG8gZWFjaCBkYXRhIHBvaW50IGluIHRoZSBtb3ZpbmcgYXZlcmFnZSwgd2l0aCBtb3JlIHJlY2VudCBkYXRhIHBvaW50cyBnaXZlbiBncmVhdGVyIHdlaWdodC4gVGhlIHdlaWdodHMgY2FuIGJlIGNhbGN1bGF0ZWQgaW4gdmFyaW91cyB3YXlzLCBzdWNoIGFzIGxpbmVhciBvciBleHBvbmVudGlhbC4KCjMuIEV4cG9uZW50aWFsIE1vdmluZyBBdmVyYWdlIChFTUEpOiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIHRoZSBXTUEsIGJ1dCBpdCBnaXZlcyBncmVhdGVyIHdlaWdodCB0byBtb3JlIHJlY2VudCBkYXRhIHBvaW50cyB1c2luZyBhbiBleHBvbmVudGlhbCBkZWNheSBmb3JtdWxhLiBUaGUgZm9ybXVsYSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgRU1BIGludm9sdmVzIGEgc21vb3RoaW5nIGZhY3Rvciwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgd2VpZ2h0IGdpdmVuIHRvIGVhY2ggZGF0YSBwb2ludC4KJCRFTUFfdCA9IFxiZXRhIFBfdCArICgxLVxiZXRhKSBFTUFfe3QtMX0kJAp3aGVyZSB0aGUgc21vb3RoaW5nIGNvZWZmaWNpZW50IGlzIHVzdWFsbHkgZGVmaW5lZCAkXGJldGEgPSBcZnJhY3syfXtuKzF9IFxpbiAoMDsxKSQuCgo0LiBEb3VibGUgRXhwb25lbnRpYWwgTW92aW5nIEF2ZXJhZ2UgKERFTUEpOiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIHRoZSBFTUEsIGJ1dCBpdCB1c2VzIGEgc2Vjb25kIEVNQSB0byBzbW9vdGggdGhlIGZpcnN0IEVNQS4gVGhpcyByZXN1bHRzIGluIGEgc21vb3RoZXIgbW92aW5nIGF2ZXJhZ2UgdGhhdCBpcyBsZXNzIHNlbnNpdGl2ZSB0byBzaG9ydC10ZXJtIGZsdWN0dWF0aW9ucy4KCjUuIFRyaXBsZSBFeHBvbmVudGlhbCBNb3ZpbmcgQXZlcmFnZSAoVEVNQSk6IFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gdGhlIERFTUEsIGJ1dCBpdCB1c2VzIGEgdGhpcmQgRU1BIHRvIGZ1cnRoZXIgc21vb3RoIHRoZSBtb3ZpbmcgYXZlcmFnZS4gVGhpcyBtZXRob2QgaXMgZXZlbiBsZXNzIHNlbnNpdGl2ZSB0byBzaG9ydC10ZXJtIGZsdWN0dWF0aW9ucyB0aGFuIHRoZSBERU1BLgoKVGhlc2UgYXJlIHRoZSBtYWluIHR5cGVzIG9mIG1vdmluZyBhdmVyYWdlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBhZGRNQSBmdW5jdGlvbiBpbiBxdWFudG1vZC4gRWFjaCBtZXRob2QgaGFzIGl0cyBvd24gYWR2YW50YWdlcyBhbmQgZGlzYWR2YW50YWdlcywgYW5kIHRoZSBjaG9pY2Ugb2YgbWV0aG9kIHdpbGwgZGVwZW5kIG9uIHRoZSBzcGVjaWZpYyBuZWVkcyBvZiB0aGUgYW5hbHlzaXMgYmVpbmcgcGVyZm9ybWVkLgoKYGBge3J9CmNoYXJ0U2VyaWVzKHN0b2NrLAogICAgICAgICAgICBzdWJzZXQ9JzIwMjAtMDEtMDE6OjIwMjAtMDktMjMnLCB0eXBlID0gImNhbmRsZXN0aWNrIiwKICAgICAgICAgICAgdGhlbWU9Y2hhcnRUaGVtZSgnd2hpdGUnKSkKYWRkU01BKG4gPSAxMiwgb24gPSAxLCB3aXRoLmNvbCA9IENsLCBvdmVybGF5ID0gVFJVRSwgY29sID0gImJyb3duIikKYWRkU01BKG4gPSAyNCwgb24gPSAxLCB3aXRoLmNvbCA9IENsLCBvdmVybGF5ID0gVFJVRSwgY29sID0gImJsdWUiKQoKCmBgYAoKIyMgTW92aW5nIEF2ZXJhZ2UgQ29udmVyZ2VuY2UgRGl2ZXJnZW5jZSAoTUFDRCkKCk1BQ0Qgc3RhbmRzIGZvciBNb3ZpbmcgQXZlcmFnZSBDb252ZXJnZW5jZSBEaXZlcmdlbmNlLiBJdCBpcyBhIHBvcHVsYXIgdGVjaG5pY2FsIGFuYWx5c2lzIGluZGljYXRvciB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgY2hhbmdlcyBpbiB0cmVuZCBkaXJlY3Rpb24sIG1vbWVudHVtLCBhbmQgcG90ZW50aWFsIGJ1eSBhbmQgc2VsbCBzaWduYWxzIGluIGZpbmFuY2lhbCBtYXJrZXRzLgoKVGhlIE1BQ0QgaXMgY2FsY3VsYXRlZCBieSBzdWJ0cmFjdGluZyB0aGUgMjYtcGVyaW9kIEV4cG9uZW50aWFsIE1vdmluZyBBdmVyYWdlIChFTUEpIGZyb20gdGhlIDEyLXBlcmlvZCBFTUEuIFRoZSByZXN1bHQgb2YgdGhpcyBjYWxjdWxhdGlvbiBpcyB0aGVuIHBsb3R0ZWQgb24gYSBjaGFydCBhbG9uZyB3aXRoIGEgOS1wZXJpb2QgRU1BLCB3aGljaCBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgInNpZ25hbCBsaW5lIi4KCiQkTUFDRChTPTEyLEw9MjYpX3QgPSBFTUEodCxTKSAtIEVNQSh0LEwpJCQKClRoZSBNQUNEIGxpbmUgb3NjaWxsYXRlcyBhYm92ZSBhbmQgYmVsb3cgdGhlIHNpZ25hbCBsaW5lLCBpbmRpY2F0aW5nIGNoYW5nZXMgaW4gbW9tZW50dW0gYW5kIHRyZW5kIGRpcmVjdGlvbi4gV2hlbiB0aGUgTUFDRCBsaW5lIGNyb3NzZXMgYWJvdmUgdGhlIHNpZ25hbCBsaW5lLCBpdCBpcyBjb25zaWRlcmVkIGEgYnVsbGlzaCBzaWduYWwsIGluZGljYXRpbmcgYSBwb3RlbnRpYWwgYnV5IG9wcG9ydHVuaXR5LiBDb252ZXJzZWx5LCB3aGVuIHRoZSBNQUNEIGxpbmUgY3Jvc3NlcyBiZWxvdyB0aGUgc2lnbmFsIGxpbmUsIGl0IGlzIGNvbnNpZGVyZWQgYSBiZWFyaXNoIHNpZ25hbCwgaW5kaWNhdGluZyBhIHBvdGVudGlhbCBzZWxsIG9wcG9ydHVuaXR5LiBJbiBvdGhlciB3b3JkcyAqQnV5IHNpZ25hbCogYXJpc2VzIHdoZW4gTUFDRCBjcm9zc2VzIGZyb20gYmVsb3cgdG8gYWJvdmUgdGhlIHNpZ25hbCBsaW5lLCBhbmQgKlNlbGwgc2lnbmFsKiBhcmlzZXMgd2hlbiBNQUNEIGNyb3NzZXMgZnJvbSBhYm92ZSB0byBiZWxvdyB0aGUgc2lnbmFsIGxpbmUuCgpUaGUgTUFDRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGlkZW50aWZ5IGRpdmVyZ2VuY2VzIGJldHdlZW4gdGhlIE1BQ0QgbGluZSBhbmQgdGhlIHByaWNlIG9mIHRoZSBzZWN1cml0eSBiZWluZyBhbmFseXplZC4gV2hlbiB0aGUgTUFDRCBsaW5lIGRpdmVyZ2VzIGZyb20gdGhlIHByaWNlLCBpdCBjYW4gYmUgYW4gaW5kaWNhdGlvbiB0aGF0IGEgdHJlbmQgcmV2ZXJzYWwgbWF5IGJlIGltbWluZW50LgoKVHJhZGVycyBhbmQgaW52ZXN0b3JzIG9mdGVuIHVzZSB0aGUgTUFDRCBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIHRlY2huaWNhbCBhbmFseXNpcyB0b29scywgc3VjaCBhcyBzdXBwb3J0IGFuZCByZXNpc3RhbmNlIGxldmVscywgdG8gbWFrZSBpbmZvcm1lZCB0cmFkaW5nIGRlY2lzaW9ucy4gSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB3aGlsZSB0aGUgTUFDRCBjYW4gYmUgYSB1c2VmdWwgaW5kaWNhdG9yLCBpdCBpcyBub3QgaW5mYWxsaWJsZSBhbmQgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciBmb3JtcyBvZiBhbmFseXNpcyB0byBtYWtlIGluZm9ybWVkIHRyYWRpbmcgZGVjaXNpb25zLgoKYGBge3J9CmNoYXJ0U2VyaWVzKHN0b2NrLAogICAgICAgICAgICBzdWJzZXQ9JzIwMjAtMDEtMDE6OjIwMjAtMDktMjMnLCB0eXBlID0gImJhcnMiLAogICAgICAgICAgICB0aGVtZT1jaGFydFRoZW1lKCd3aGl0ZScpKQphZGRNQUNEKGZhc3Q9MTIsc2xvdz0yNixzaWduYWw9OSx0eXBlPSJFTUEiKQoKYGBgCgoKIyMgQm9sbGluZ2VyIEJhbmQKCkFwYXJ0IGZyb20gdGhlIGRlYXRoIGFuZCBnb2xkZW4gY3Jvc3NlcywgdGhlIG1vdmluZyBhdmVyYWdlIGxpbmVzIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIEJvbGxpbmdlciBCYW5kLiBBIEJvbGxpbmdlciBCYW5kIGlzIG1hZGUgdXAgb2YgMyBsaW5lcywgdGhlIHNpbXBsZSBtb3ZpbmcgYXZlcmFnZSwgYW4gdXBwZXIgYm91bmRhcnkgYW5kIGEgbG93ZXIgYm91bmRhcnkuIFNpbXBseSBwdXQsIHRoaXMgaXMgYSBtZWFzdXJlIHRvIHRlbGwgaWYgYSBmaW5hbmNpYWwgaW5zdHJ1bWVudCBpcyBvdmVyYm91Z2h0IG9yIG92ZXJzb2xkLiBUaGUgY2xvc2VyIHRoZSBwcmljZXMgbW92ZSB0byB0aGUgdXBwZXIgYmFuZCwgdGhlIG1vcmUgbGlrZWx5IHRoZSBmaW5hbmNpYWwgaW5zdHJ1bWVudCBpcyBvdmVyYm91Z2h0LCB3aGljaCBtYXkgbGVhZCB0byBhIHJldmVyc2FsIChtYXJrZXQgY29ycmVjdGlvbikuIExpa2V3aXNlLCBpZiB0aGUgcHJpY2UgaXMgbW92aW5nIHRvIHRoZSBsb3dlciBiYW5kLCB0aGUgbWFya2V0IGhhcyBhIGhpZ2hlciBwcm9iYWJpbGl0eSBvZiBiZWluZyBvdmVyc29sZCwgd2hpY2ggd2lsbCBsZWFkIHRvIGEgdXB3YXJkIHJldmVyc2FsLgoKRm9yIEJvbGxpbmdlciBiYW5kLCBjaGFubmVsIGlzIGRyYXduIG92ZXIgYSB0cmVuZCBsaW5lIHBsdXMvbWludXMgMiBzdGFuZGFyZCBkZXZpYXRpb24gKFNEKS4gVHJlbmQgbGluZTogU01BIG9yIEVNQSBvZiBwcmljZSAocHJpY2UgY2FuIGJlIGNsb3NpbmcgcHJpY2Ugb3IgYXZlcmFnZSBvZiBoaWdoLCBsb3csIGFuZCBjbG9zZSkuCgpCYW5kd2lkdGg6IGRldGVybWluZWQgYnkgdGhlIGFzc2V0IHZvbGF0aWxpdHkKJCRCX3t0LG59ID0gaypzZGV2KFBfdCxuKSQkCndoZXJlIHVzdWFsbHkgd2UgaGF2ZSAkaz0yJCBhbmQgJG49MjAkLiBUaGUgbG93ZXIgYW5kIHVwcGVyIGJhbmRzIGFyZSBkZWZpbmVkCiQkdXBfdCA9IFBfdCArIEJfe3Qsbn0gXHF1YWQgXHRleHR7YW5kfSBccXVhZCBkb3duX3QgPSBQX3QgLSBCX3t0LG59ICQkCgpCb2xsaW5nZXIgQmFuZHMgYXJlIGEgcG9wdWxhciB0ZWNobmljYWwgYW5hbHlzaXMgdG9vbCB1c2VkIGJ5IHRyYWRlcnMgdG8gbWVhc3VyZSB0aGUgdm9sYXRpbGl0eSBhbmQgcG90ZW50aWFsIHByaWNlIG1vdmVtZW50cyBvZiBhIGZpbmFuY2lhbCBpbnN0cnVtZW50LiBUaGV5IGFyZSBjb21wcmlzZWQgb2YgdGhyZWUgbGluZXM6IGEgc2ltcGxlIG1vdmluZyBhdmVyYWdlIChTTUEpLCBhbiB1cHBlciBiYW5kLCBhbmQgYSBsb3dlciBiYW5kLgoKVGhlIFNNQSBpcyB0eXBpY2FsbHkgY2FsY3VsYXRlZCB1c2luZyBhIDIwLWRheSBtb3ZpbmcgYXZlcmFnZSwgYnV0IGNhbiBiZSBhZGp1c3RlZCB0byBmaXQgdGhlIHNwZWNpZmljIHRpbWUgZnJhbWUgYmVpbmcgYW5hbHl6ZWQuIFRoZSB1cHBlciBiYW5kIGlzIGNhbGN1bGF0ZWQgYnkgYWRkaW5nIHR3byBzdGFuZGFyZCBkZXZpYXRpb25zIHRvIHRoZSBTTUEsIHdoaWxlIHRoZSBsb3dlciBiYW5kIGlzIGNhbGN1bGF0ZWQgYnkgc3VidHJhY3RpbmcgdHdvIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgU01BLgoKVGhlIGJhbmRzIGFyZSBwbG90dGVkIG9uIGEgY2hhcnQsIHdpdGggdGhlIFNNQSBhcyB0aGUgY2VudGVyIGxpbmUgYW5kIHRoZSB1cHBlciBhbmQgbG93ZXIgYmFuZHMgcmVwcmVzZW50aW5nIHR3byBzdGFuZGFyZCBkZXZpYXRpb25zIGF3YXkgZnJvbSB0aGUgU01BLiBBcyB0aGUgdm9sYXRpbGl0eSBvZiB0aGUgZmluYW5jaWFsIGluc3RydW1lbnQgaW5jcmVhc2VzIG9yIGRlY3JlYXNlcywgdGhlIGJhbmRzIGV4cGFuZCBvciBjb250cmFjdCBhY2NvcmRpbmdseS4KClRyYWRlcnMgdXNlIEJvbGxpbmdlciBCYW5kcyB0byBpZGVudGlmeSBwb3RlbnRpYWwgYnV5aW5nIGFuZCBzZWxsaW5nIG9wcG9ydHVuaXRpZXMuIFdoZW4gdGhlIHByaWNlIG9mIHRoZSBmaW5hbmNpYWwgaW5zdHJ1bWVudCB0b3VjaGVzIG9yIGNyb3NzZXMgdGhlIHVwcGVyIGJhbmQsIGl0IGlzIGNvbnNpZGVyZWQgb3ZlcmJvdWdodCwgYW5kIGEgc2VsbCBzaWduYWwgbWF5IGJlIGdlbmVyYXRlZC4gV2hlbiB0aGUgcHJpY2UgdG91Y2hlcyBvciBjcm9zc2VzIHRoZSBsb3dlciBiYW5kLCBpdCBpcyBjb25zaWRlcmVkIG92ZXJzb2xkLCBhbmQgYSBidXkgc2lnbmFsIG1heSBiZSBnZW5lcmF0ZWQuIFtLbyBDaGl1IFl1XShodHRwczovL2Jvb2tkb3duLm9yZy9rb2NoaXV5dS90ZWNobmljYWwtYW5hbHlzaXMtd2l0aC1yLXNlY29uZC1lZGl0aW9uMi9ib2xsaW5nZXItYmFuZC5odG1sKSBzYXlzIHRoYXQgKkJ1eSBzaWduYWwqIGFyaXNlcyB3aGVuIHByaWNlIGlzIGFib3ZlIHRoZSBiYW5kIGFuZCAqU2VsbCBzaWduYWwqIGFyaXNlcyB3aGVuIHByaWNlIGlzIGJlbG93IHRoZSBiYW5kLCB3aGljaCBpcyBpbiBmYWN0IHRoZSBzYW1lLgoKSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBCb2xsaW5nZXIgQmFuZHMgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlzb2xhdGlvbiBhbmQgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciB0ZWNobmljYWwgYW5hbHlzaXMgdG9vbHMgdG8gbWFrZSBpbmZvcm1lZCB0cmFkaW5nIGRlY2lzaW9ucy4gQWRkaXRpb25hbGx5LCB0aGUgYmFuZHMgbWF5IG5vdCBiZSBlZmZlY3RpdmUgaW4gYWxsIG1hcmtldCBjb25kaXRpb25zLCBhbmQgdHJhZGVycyBzaG91bGQgYWRqdXN0IHRoZWlyIHN0cmF0ZWdpZXMgYWNjb3JkaW5nbHkuCgoKYGBge3J9CmNoYXJ0U2VyaWVzKHN0b2NrLAogICAgICAgICAgICBzdWJzZXQ9JzIwMjAtMDEtMDE6OjIwMjAtMDktMjMnLCB0eXBlID0gImJhcnMiLAogICAgICAgICAgICB0aGVtZT1jaGFydFRoZW1lKCd3aGl0ZScpKQphZGRCQmFuZHMobiA9IDIwLCBzZCA9IDIsIG1hVHlwZSA9ICJTTUEiLCBkcmF3ID0gJ2JhbmRzJywgb24gPSAtMSkKYGBgCgoKIyMgUmVsYXRpdmUgU3RyZW5ndGggSW5kZXggKFJTSSkKClNpbWlsYXIgdG8gdGhlIEJvbGxpbmdlciBCYW5kLCBSU0kgaXMgYSBtb21lbnR1bSBpbmRpY2F0b3IgdGhhdCBldmFsdWF0ZSB0aGUgb3ZlcmJvdWdodCBhbmQgb3ZlcnNvbGQgY29uZGl0aW9uIG9mIGEgZmluYW5jaWFsIGluc3RydW1lbnQuIFRoZSBvbmx5IG1ham9yIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSBpcyB0aGUgbWV0aG9kIG9mIGRpc3BsYXkuIFJTSSBpcyBwbG90dGVkIGFzIGFuIG9zY2lsbGF0b3Igd2l0aCBhIHJhbmdlIGJldHdlZW4gMCB0byAxMDAgd2hlcmVhcyB0aGUgQm9sbGluZ2VyIEJhbmQgYXJlIHBsb3R0ZWQgYWxvbmcgdGhlIG1vdmluZyBhdmVyYWdlIGxpbmUgb2YgdGhlIHByaWNlLiBIZW5jZSwgYSBodWdlIGFkdmFudGFnZSBvZiBSU0kgb3ZlciBCb2xsaW5nZXIgQmFuZCBpcyB0aGUgYWJpbGl0eSB0byBkbyBjcm9zcyBjb21wYXJpc29uIGFjcm9zcyBtdWx0aXBsZSBpbnN0cnVtZW50cy4KClVzdWFsbHksIFJTSSBpcyBldmFsdWF0ZWQgdXNpbmcgYSAzMC03MCBjdXRvZmZzLiBBbiBSU0kgcmVhZGluZyBvZiA3MCBvciBhYm92ZSBpbmRpY2F0ZXMgYW4gb3ZlcmJvdWdodCBvciBvdmVydmFsdWVkIGNvbmRpdGlvbiB3aGVyZWFzIGFuIFJTSSBvZiBiZWxvdyAzMCBpbmRpY2F0ZXMgYSB1bmRlcnZhbHVlZCBjb25kaXRpb24uCgpSZWxhdGl2ZSBTdHJlbmd0aCBJbmRleCAoUlNJKSBpcyBhIHBvcHVsYXIgdGVjaG5pY2FsIGFuYWx5c2lzIGluZGljYXRvciB1c2VkIHRvIG1lYXN1cmUgdGhlIHN0cmVuZ3RoIG9mIHByaWNlIG1vdmVtZW50cyBpbiBmaW5hbmNpYWwgbWFya2V0cy4gSXQgd2FzIGRldmVsb3BlZCBieSBKLiBXZWxsZXMgV2lsZGVyIEpyLiBhbmQgaXMgdXNlZCB0byBpZGVudGlmeSBvdmVyYm91Z2h0IGFuZCBvdmVyc29sZCBjb25kaXRpb25zLgoKVGhlIGNhbGN1bGF0aW9uIG9mIFJTSSByZXF1aXJlcyBzZXZlcmFsIHN0ZXBzOgoKMS4gV2hldGhlciBwcmljZSBoYXMgZ29uZSB1cCBvciBkb3duIGVhY2ggZGF5CgoyLiBSZWxhdGl2ZSBzdHJlbmd0aCAoUlMpOiB0aGUgcmF0aW8gb2YgdGhlIChzaW1wbGUgb3IgZXhwb25lbnRpYWwpIGF2ZXJhZ2UgbnVtYmVycyBvZiB1cCBkYXkgdG8gdGhlIGF2ZXJhZ2Ugb2YgZG93biBkYXkKCjMuIFJlbGF0aXZlIHN0cmVuZ3RoIGluZGV4IChSU0kpOiBub3JtYWxpemUgUlMgdG8gdGhlIHNjYWxlIGZyb20gMCB0byAxMDAuCgpTdGVwIDEuIENhbGN1bGF0ZQoKICQkVV90ID0gMSBccXVhZCBcdGV4dHtpZn0gXHF1YWQgUF90ID4gUF97dC0xfSwgXHF1YWQgXHRleHR7b3RoZXJ3aXNlfSBccXVhZCBVX3Q9MCQkCgokJERfdCA9IDEgXHF1YWQgXHRleHR7aWZ9IFxxdWFkIFBfdCA8IFBfe3QtMX0sIFxxdWFkIFx0ZXh0e290aGVyd2lzZX0gXHF1YWQgRF90PSAwJCQKU3RlcCAyOgokJFJTX3t0LG59ID0gXGZyYWN7XGZyYWN7VV90ICsgVV97dC0xfSArIFxkb3RzICsgVV97dC1uKzF9fXtufX17XGZyYWN7RF90ICsgRF97dC0xfSArIFxkb3RzICsgRF97dC1uKzF9fXtufX0kJAoKYW5kLCBmaW5hbGx5CgokJFJTSV97dCxufSA9IDEwMCBcZnJhY3tSU197dCxufX17MStSU197dCxufX0kJAoKVGhlIFJTSSBvc2NpbGxhdGVzIGJldHdlZW4gMCBhbmQgMTAwLCB3aXRoIHJlYWRpbmdzIGFib3ZlIDcwIGluZGljYXRpbmcgdGhhdCB0aGUgYXNzZXQgaXMgb3ZlcmJvdWdodCwgYW5kIHJlYWRpbmdzIGJlbG93IDMwIGluZGljYXRpbmcgdGhhdCB0aGUgYXNzZXQgaXMgb3ZlcnNvbGQuCgpUcmFkZXJzIGFuZCBpbnZlc3RvcnMgdXNlIHRoZSBSU0kgdG8gaWRlbnRpZnkgcG90ZW50aWFsIHRyZW5kIHJldmVyc2FscyBhbmQgZ2VuZXJhdGUgYnV5IGFuZCBzZWxsIHNpZ25hbHMuIEZvciBleGFtcGxlLCB3aGVuIHRoZSBSU0kgY3Jvc3NlcyBhYm92ZSA3MCwgaXQgaXMgY29uc2lkZXJlZCBvdmVyYm91Z2h0LCBhbmQgYSBzZWxsIHNpZ25hbCBtYXkgYmUgZ2VuZXJhdGVkLiBDb252ZXJzZWx5LCB3aGVuIHRoZSBSU0kgY3Jvc3NlcyBiZWxvdyAzMCwgaXQgaXMgY29uc2lkZXJlZCBvdmVyc29sZCwgYW5kIGEgYnV5IHNpZ25hbCBtYXkgYmUgZ2VuZXJhdGVkLgoKVGhlIFJTSSBjYW4gYWxzbyBiZSB1c2VkIHRvIGlkZW50aWZ5IGRpdmVyZ2VuY2VzIGJldHdlZW4gdGhlIFJTSSBsaW5lIGFuZCB0aGUgcHJpY2Ugb2YgdGhlIGFzc2V0IGJlaW5nIGFuYWx5emVkLiBXaGVuIHRoZSBSU0kgbGluZSBkaXZlcmdlcyBmcm9tIHRoZSBwcmljZSwgaXQgY2FuIGJlIGFuIGluZGljYXRpb24gdGhhdCBhIHRyZW5kIHJldmVyc2FsIG1heSBiZSBpbW1pbmVudC4KCkl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgbGlrZSBhbnkgdGVjaG5pY2FsIGFuYWx5c2lzIHRvb2wsIHRoZSBSU0kgaXMgbm90IGluZmFsbGlibGUgYW5kIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggb3RoZXIgaW5kaWNhdG9ycyBhbmQgYW5hbHlzaXMgbWV0aG9kcyB0byBtYWtlIGluZm9ybWVkIHRyYWRpbmcgZGVjaXNpb25zLiBBZGRpdGlvbmFsbHksIHRyYWRlcnMgc2hvdWxkIGFkanVzdCB0aGVpciBzdHJhdGVnaWVzIGFuZCBwYXJhbWV0ZXJzIHRvIGZpdCB0aGUgc3BlY2lmaWMgbWFya2V0IGNvbmRpdGlvbnMgYmVpbmcgYW5hbHl6ZWQuCgpgYGB7cn0KY2hhcnRTZXJpZXMoc3RvY2ssCiAgICAgICAgICAgIHN1YnNldD0nMjAyMC0wMS0wMTo6MjAyMC0wOS0yMycsIHR5cGUgPSAiYmFycyIsCiAgICAgICAgICAgIHRoZW1lPWNoYXJ0VGhlbWUoJ3doaXRlJykpCmFkZFJTSShuID0gMTQsIG1hVHlwZSA9ICJFTUEiLCB3aWxkZXIgPSBUUlVFKQoKYGBgCgoKCgoKIyMgUGFyYWJvbGljIHN0b3AgYW5kIHJldmVyc2FsCgpUaGUgUGFyYWJvbGljIFN0b3AgYW5kIFJldmVyc2FsIChTQVIpIGlzIGEgdGVjaG5pY2FsIGFuYWx5c2lzIHRvb2wgdXNlZCBieSB0cmFkZXJzIHRvIGRldGVybWluZSBwb3RlbnRpYWwgdHJlbmQgcmV2ZXJzYWxzIGluIHByaWNlIG1vdmVtZW50cy4gSXQgd2FzIGRldmVsb3BlZCBieSBKLiBXZWxsZXMgV2lsZGVyIEpyLiBhbmQgaXMgdXNlZCB0byBzZXQgdHJhaWxpbmcgc3RvcC1sb3NzIG9yZGVycyBpbiBvcmRlciB0byBsaW1pdCBwb3RlbnRpYWwgbG9zc2VzIGluIGEgdHJhZGUuCgpUaGUgU0FSIHVzZXMgYSBzZXJpZXMgb2YgZG90cyBwbGFjZWQgYWJvdmUgb3IgYmVsb3cgdGhlIHByaWNlIG9mIHRoZSBhc3NldCBiZWluZyBhbmFseXplZCB0byBpbmRpY2F0ZSBwb3RlbnRpYWwgcmV2ZXJzYWxzIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyZW5kLiBXaGVuIHRoZSBwcmljZSBpcyBtb3ZpbmcgdXB3YXJkcywgdGhlIFNBUiBkb3RzIGFyZSBwbGFjZWQgYmVsb3cgdGhlIHByaWNlLCBhbmQgd2hlbiB0aGUgcHJpY2UgaXMgbW92aW5nIGRvd253YXJkcywgdGhlIFNBUiBkb3RzIGFyZSBwbGFjZWQgYWJvdmUgdGhlIHByaWNlLgoKVGhlIFBhcmFib2xpYyBTdG9wIGFuZCBSZXZlcnNhbCAoU0FSKSBpcyBhIHRlY2huaWNhbCBhbmFseXNpcyB0b29sIHVzZWQgYnkgdHJhZGVycyB0byBkZXRlcm1pbmUgcG90ZW50aWFsIHRyZW5kIHJldmVyc2FscyBpbiBwcmljZSBtb3ZlbWVudHMuIEl0IHdhcyBkZXZlbG9wZWQgYnkgSi4gV2VsbGVzIFdpbGRlciBKci4gYW5kIGlzIHVzZWQgdG8gc2V0IHRyYWlsaW5nIHN0b3AtbG9zcyBvcmRlcnMgaW4gb3JkZXIgdG8gbGltaXQgcG90ZW50aWFsIGxvc3NlcyBpbiBhIHRyYWRlLgoKVGhlIFNBUiB1c2VzIGEgc2VyaWVzIG9mIGRvdHMgcGxhY2VkIGFib3ZlIG9yIGJlbG93IHRoZSBwcmljZSBvZiB0aGUgYXNzZXQgYmVpbmcgYW5hbHl6ZWQgdG8gaW5kaWNhdGUgcG90ZW50aWFsIHJldmVyc2FscyBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmVuZC4gV2hlbiB0aGUgcHJpY2UgaXMgbW92aW5nIHVwd2FyZHMsIHRoZSBTQVIgZG90cyBhcmUgcGxhY2VkIGJlbG93IHRoZSBwcmljZSwgYW5kIHdoZW4gdGhlIHByaWNlIGlzIG1vdmluZyBkb3dud2FyZHMsIHRoZSBTQVIgZG90cyBhcmUgcGxhY2VkIGFib3ZlIHRoZSBwcmljZS4KCkFzIHRoZSBwcmljZSBtb3ZlcyBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmVuZCwgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHByaWNlIGFuZCB0aGUgU0FSIGRvdHMgaW5jcmVhc2VzLiBXaGVuIHRoZSBwcmljZSByZWFjaGVzIGEgY2VydGFpbiBkaXN0YW5jZSBmcm9tIHRoZSBTQVIgZG90cywgdGhlIGRvdHMgYmVnaW4gdG8gbW92ZSBjbG9zZXIgdG8gdGhlIHByaWNlLCBpbmRpY2F0aW5nIHRoYXQgYSBwb3RlbnRpYWwgcmV2ZXJzYWwgaW4gdGhlIHRyZW5kIG1heSBiZSBpbW1pbmVudC4gV2hlbiB0aGUgcHJpY2UgY3Jvc3NlcyB0aGUgU0FSIGRvdHMsIGl0IGlzIGNvbnNpZGVyZWQgYSBzaWduYWwgdG8gZXhpdCBhIHRyYWRlIGFuZCBwb3RlbnRpYWxseSBlbnRlciBhIG5ldyB0cmFkZSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLgoKVGhlIFBhcmFib2xpYyBTdG9wIGFuZCBSZXZlcnNlIChTQVIpIGlzIGEgdGVjaG5pY2FsIGFuYWx5c2lzIHRvb2wgdXNlZCB0byBpZGVudGlmeSBwb3RlbnRpYWwgcmV2ZXJzYWwgcG9pbnRzIGluIGEgcHJpY2UgdHJlbmQuIFRoZSBmb3JtdWxhIGZvciBjYWxjdWxhdGluZyB0aGUgUGFyYWJvbGljIFNBUiBpcyBhcyBmb2xsb3dzOgoKRm9yIGFuIHVwdHJlbmQ6CgokJFNBUl97bisxfSA9IFNBUl9uICsgQUYgKiAoRVAgLSBTQVJfbikkJAoKRm9yIGEgZG93bnRyZW5kOgoKJCRTQVJfe24rMX0gPSBTQVJfbiAtIEFGICogKFNBUl9uIC0gRVApJCQKCldoZXJlOgoKJFNBUl9uJCBpcyB0aGUgY3VycmVudCBwZXJpb2QncyAkU0FSJCB2YWx1ZQoKJFNBUl97bisxfSQgaXMgdGhlIG5leHQgcGVyaW9kJ3MgJFNBUiQgdmFsdWUKCiRBRiQgaXMgdGhlIGFjY2VsZXJhdGlvbiBmYWN0b3IsIHdoaWNoIHN0YXJ0cyBhdCAwLjAyIGFuZCBpbmNyZWFzZXMgYnkgMC4wMiBlYWNoIHRpbWUgYSBuZXcgZXh0cmVtZSBwb2ludCAoRVApIGlzIHJlYWNoZWQsIHVwIHRvIGEgbWF4aW11bSBvZiAwLjIwCgokRVAkIGlzIHRoZSBoaWdoZXN0IGhpZ2ggb3IgbG93ZXN0IGxvdyBvZiB0aGUgY3VycmVudCB0cmVuZCwgZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyZW5kCgpUaGUgaW5pdGlhbCBTQVIgdmFsdWUgaXMgc2V0IHRvIHRoZSBsb3dlc3QgbG93IGZvciBhbiB1cHRyZW5kLCBhbmQgdGhlIGhpZ2hlc3QgaGlnaCBmb3IgYSBkb3dudHJlbmQuIFRoZSBTQVIgdmFsdWUgaXMgdGhlbiBjYWxjdWxhdGVkIGZvciBlYWNoIHN1YnNlcXVlbnQgcGVyaW9kIHVzaW5nIHRoZSBhYm92ZSBmb3JtdWxhLgoKVGhlIFNBUiBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIHRlY2huaWNhbCBhbmFseXNpcyB0b29scywgc3VjaCBhcyBtb3ZpbmcgYXZlcmFnZXMgb3IgdHJlbmQgbGluZXMsIHRvIGNvbmZpcm0gcG90ZW50aWFsIHRyZW5kIHJldmVyc2FscyBhbmQgaWRlbnRpZnkgcG90ZW50aWFsIGVudHJ5IG9yIGV4aXQgcG9pbnRzIGZvciB0cmFkZXMuCgpJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBTQVIgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlzb2xhdGlvbiBhbmQgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciBhbmFseXNpcyBtZXRob2RzIHRvIG1ha2UgaW5mb3JtZWQgdHJhZGluZyBkZWNpc2lvbnMuIEFkZGl0aW9uYWxseSwgdHJhZGVycyBzaG91bGQgYWRqdXN0IHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBTQVIgdG8gZml0IHRoZSBzcGVjaWZpYyBtYXJrZXQgY29uZGl0aW9ucyBiZWluZyBhbmFseXplZC4KCgoKCmBgYHtyfQpjaGFydFNlcmllcyhzdG9jaywKICAgICAgICAgICAgc3Vic2V0PScyMDIwLTAxLTAxOjoyMDIwLTA5LTIzJywgdHlwZSA9ICJiYXJzIiwKICAgICAgICAgICAgdGhlbWU9Y2hhcnRUaGVtZSgnd2hpdGUnKSkKYWRkU0FSKGFjY2VsID0gYygwLjAyLCAwLjIpLCBjb2wgPSAiYmx1ZSIpCgoKYGBgCgoKCgojIyBTdW1tYXJ5IGdyYXBocwoKQXBhcnQgZnJvbSB0aGUgZmV3IHRoYXQgd2FzIG1lbnRpb25lZCBhYm92ZSwgb3RoZXIgaW5kaWNhdG9ycyBpbmNsdWRlIHJhdGUgb2YgY2hhbmdlLCBtb25leSBmbG93IGluZGV4IChNRkkpLCBNQUNEIGFuZCBldGMuCgojIyBDaGFydCBTZXJpZXMKCkNoYXJ0U2VyaWVzIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHdheSB0byBzdW1tYXJpc2UgdGhlIHBsb3QuIEluc3RlYWQgb2Ygb25lIHBsb3QgZm9yIGVhY2ggaW5kaWNhdG9yLCBhbGwgb2YgdGhlbSBjYW4gbm93IGJlIGNvbXBpbGVkIGludG8gYSBzaW5nbGUgZmlndXJlLCB3aGVyZSBpbmRpY2F0b3JzIGNhbiBiZSBhZGRlZCB0byB0aGUgYm90dG9tIG9mIHRoZSBleGlzdGluZyBwbG90LgoKYGBge3J9CmNoYXJ0U2VyaWVzKHN0b2NrLAogICAgICAgICAgICBzdWJzZXQ9JzIwMjAtMDEtMDE6OjIwMjAtMDktMjMnLCB0eXBlID0gImJhcnMiLAogICAgICAgICAgICB0aGVtZT1jaGFydFRoZW1lKCd3aGl0ZScpKQphZGRCQmFuZHMobj0yMCxzZD0yKQphZGRSU0kobj0xNCxtYVR5cGU9IkVNQSIpCmFkZE1BQ0QoZmFzdD0xMixzbG93PTI2LHNpZ25hbD05LHR5cGU9IkVNQSIpCgpgYGAKCgo=