1. Introduction

1.1 Background

According to the Department of Environment and Energy, during the period of 2017-2018, the Australian economy grew by 2.8 percent to $1.8 trillion and the population grew by 1.6 percent to 25 million. At the same time, energy consumption rose by 0.9 per cent (52 petajoules) to reach 6,172 petajoules and Australia exported 14,739 petajoules. (Energy Statistics and Analysis Section, 2019, p.5).

In the last decade, Australia has positioned themselves as a large supplier of energy to the global market, however, according to Alexandra Heath, Head of Economic Analysis Department (Heath, 2016) due to factors such as: worsening economic conditions, adoption of cleaner technologies and regulations abroad and internationally; may sap energy demand overseas and thus have a significant impact on our abilities to export our surplus energy. At the same time, there is considerable uncertainty in how global energy demand will evolve as many smaller economies are rapidly developing and transforming thus requiring more energy.

To determine whether energy policy makers in Australia can decommission some of their non-renewable fuel mixes, this paper will model historical and current energy demand data provided by AEMO and create a prediction of energy demand for the future.

1.2 What Are We Testing?

The central question we are asking is:

“Utilising time series analysis can we predict Australia’s future energy demand based off a monthly aggregate of historical demand?”

1.3 Data Source Limitations

The data was obtained from Australian Energy Market Operator (AEMO) website and was extracted via a custom built automated scraper, performing initial analysis on the data shows the following characteristics:

  1. Demand for ACT was rolled up in the demand for NSW.
  2. Demand for NT were missing due to jurisdiction.

1.4 Data Considerations

1.4.1 Granularity

The raw data is half-hourly continuous timestamp, however, for his project we have aggregated the data to a monthly view.

1.4.2 Number of data points

There is a total of 1,691,560 data points, once this data has been aggregated to monthly view the total data points is dramatically cut down to 700 across 2008 to 2019.

1.4.3 Missing Values

None in current dataset, however, there are missing states, such as NT and WA.

1.4.4 Completeness

The website only included data from 1999 to 11/2019 (at the time of writing), however, this paper will only look at the period of 01/08 - 01/18.

2. Data Analysis

2.1 Seasonal Plot

In the seasonal plot below, we have summarised the monthly demand of energy demand data across all states using ggseasonplot functionality found in forecast.

From first glance, there seems to be some clear seasonal and cyclical trends in the data:

  1. There are upward trends in energy demand leading to summer and winter, peaking in July.

  2. There are downward trends during Spring and Autumn, with maximum troughs in April and October.

These trends are inline with seasonal energy demand, as there are greater demand place on generators due to the use of air conditioners.

rr demandts = ts(c(aemo_data$mean_total_demand),start=c(2008,1), end=c(2017,12),frequency=12) ggseasonplot(demandts) + ylab(Demand (GWh)) + ggtitle(Plot: Australia’s Energy Demand (Excluding WA and NT))

2.2 Seasonal Subseries Plots

To further emphasises and visualise the seasonal patterns within AEMO’s energy data, we have reframed the same data into a subseries plot in which the horizontal lines are the means of each month. From the below diagram, it is shown energy demand commence rising in April and plateau in September.

rr ggsubseriesplot(demandts) + ylab(Demand (GWh)) + ggtitle(Plot: Australia’s Energy Demand (Excluding WA and NT))

2.3 Decomposition of Additive Time Series

In addition to the above seasonal plot, we can also further decompose AEMO’s demand data into its relevant attributes, the main attributes of interest are Trend and Seasonal components of the data.

Seasonality defined as events which experiences regular and predictable changes that recur every calendar year is highly prominent in the below data.

While trend defined as the general direction in which the energy demand is developing or changing appears to be deceasing with an inflection point at 2012 where the demand consists around 8000 GWh range.

rr aemo_data_decomposed <- decompose(demandts, type=) plot(aemo_data_decomposed)

3. Model Internal Consistency Checks

3.1 Stationarity

A stationary time series is defined as a series whose properties are independent on the time of observation, thus, time series with seasonality are not stationary, hence in our case energy demand aggregated on a monthly basis would not be considered stationary.

We can confirm stationarity by performing a KPSS test on the data, from the Unit Root Test below we can see that the test-statistic is 1.7673 which is significant higher than the 1% significance level of 0.739, thus this confirms energy demand is non-stationary.

rr demandts %>% ur.kpss() %>% summary()


####################### 
# KPSS Unit Root Test # 
####################### 

Test is of type: mu with 4 lags. 

Value of test-statistic is: 1.7673 

Critical value for a significance level of: 
                10pct  5pct 2.5pct  1pct
critical values 0.347 0.463  0.574 0.739

Re-aggregating the same data on a yearly basis, shows a test-statistic of 0.4059 which is within the 1% significance level of 0.739, hence confirming energy demand aggregated on a yearly basis would be considered stationary.

rr demandtsyrly = ts(c(aemo_data_yearly$mean_total_demand),start=c(2008,1), end=c(2018,1),frequency=1) demandtsyrly %>% ur.kpss() %>% summary()


####################### 
# KPSS Unit Root Test # 
####################### 

Test is of type: mu with 2 lags. 

Value of test-statistic is: 0.4059 

Critical value for a significance level of: 
                10pct  5pct 2.5pct  1pct
critical values 0.347 0.463  0.574 0.739

3.2 White noise

White noise is another test that can be performed on the dataset to determine whether the data are just random points which happen to resemble usable data. If the data is ‘white noise’ then the results would not be meaningful.

White noise can be determined through the application of a Ljung-Box test, applying this test to energy demand monthly data shows a p-value of 0.00000000000000022 which indicates a significant result confirming the data is not white noise.

rr Box.test(demandts,type=,lag=10,fitdf = 0)


    Box-Ljung test

data:  demandts
X-squared = 188.16, df = 10, p-value < 2.2e-16

3.3 Autocorrelation (ACF)

Another important test to perform is Autocorrelation, Autocorrelation is the correlation of a variable against a time-shifted version of itself, this is done through the use of a ‘lag’ function which is effectively a specific period behind.

For time series dataset which are well structured, the expected plot would be a scalloped Auto-Correlation plot, unstructured or randomised data would closely resemble white noise.

When applying ACF, we can see from the graph below that:

  1. The autocorrelation for small lags are large and positive and decreases gradually as the lag increases, this suggests the data has a trend.

  2. The shape is ‘scalloped’ which suggests there are seasonality factors.

rr ggAcf(demandts, lag=48) + ggtitle(for energy demand time series (Monthly)) + theme_bw()

4. Forecast

4.1. ARIMA

Attempting to a create energy demand predictions for the future, the chosen prediction model to be used is the Auto-Regressive Integrated Moving Average (ARIMA) model. ARIMA comprises of 3 parts, these are:

  1. Autoregression (AR) - Our model will to a certain degree account for a pattern of change (growth / decline) in the energy demand data.

  2. Integrated (I) - As section 3.3, has shown energy demand data contains both seasonal and trend components, hence this will need to be subtracted out through differencing in order to make the time series stationary.

  3. Moving Average (MA) - Our model will to a certain degree account the noise between subsequent time points.

4.2 Prediction

rr autoplot(forecast(fit)) + ggtitle(Predictions for energy demand) + theme_bw() + labs(x=Demand
,y=
) + scale_x_continuous(breaks=seq(2007,2020))

Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.

4.3 Accuracy

The below graphs show that the chosen model produces forecasts that appear to account for all available information.

  1. The mean of the residuals is fairly close to zero.

  2. There is no significant correlation in the residual’s series, behaving like white noise. (p-value = 0.4345)

  3. The histogram suggests that the residuals appear to be normal.

  4. Majority of the residuals appears to have been captured in the histogram.

  5. Error measures (RMSE) is quite high at 158.7754.

5. Findings

After conducting a comprehensive analysis of energy demand data, and completing future forecasts, we have summarised our 5 key findings below:

  1. Energy demand appears to contain both seasonal and trend components, in terms of seasonal energy demand commence rising in April and plateau in September for each year.

  2. Starting in 2012, the current energy demands are on a downwards trend, this partially due to following reasons (Saddler, 2014):
    1. The impact of (mainly regulatory) energy efficiency programs
    2. Structural change in the economy away from electricity intensive industries
    3. Since 2010, the response of electricity consumers, especially residential consumers, to higher electricity prices.
    4. The dramatic rise in number of residential consumers installing small scale solar PVs and wind generators.
  3. Energy demand data is relatively clean and structured for forecasting, this is due to:
    1. Not Stationary
    2. Very little white noise
    3. Is Auto-Correlated
    4. Large dataset available to be easily extracted.
  4. After running the data through an ARIMA forecasting model, the predictions were relatively accurate, the actual mean energy demand for the 2018 was 7999.80, while ARIMA produced 8152.40, which was out by 2%.

  5. Using the produced model to project forward, we can be concluded that the energy demand will likely decrease again post 2019, however, the exact demand could vary dramatically depending on many external factors.

6. Limitation of Model

A number of limitations have been identified, these are:

  1. The Future energy demand predicted is based on single input factor, which is historical demand.

  2. The model does not capture the quantities of electricity supplied by small distributed generators, such as rooftop photovoltaics, wind turbines and landfill gas plants as it is electricity supplied to the national grid system by large generators which participate in the (wholesale) National Electricity Market.

  3. The model does not take in to account governmental policies implemented or in progress.

7. Opportunities for Future Research

During the research process, several additional questions were identified, which may enable the team to create a richer model, these are:

  1. How much of an influence does the weather play in determining demand.

  2. How much of an influence does population change play in determining demand.

The above questions could be addressed in a multivariate regression model to enhance the predictability of the existing model.

8. Conclusion

Analysis of AEMO’s historic energy demand is a suitable method of forecasting future demands. Exploration of the data has shown that energy demand is on a negative trend due to various factors defined in findings.

Moreover, having applied various statistical tests to the data, the data is suitable for time-series forecasting, due to it being not stationary, not white noise, auto-correlated, and easily accessible.

Revisiting our research question of, “Utilising time series analysis can we predict Australia’s future energy demand based off a monthly aggregate of historical demand?” The model we have devised has shown that energy demand is on a negative trend, however, due to many domestic and international factors in play, which are highly complex to model, it would be difficult to conclude with certainty whether we can decommission fuel mixes (even if they contribute to global warming). Thus, additional research and modelling will need to be performed to further enhance the current model, these questions have been covered in opportunities for future research.

9. References

Energy Statistics and Analysis Section, 2019. Australian energy update 2019, Australian energy statistics 43.

Heath, A., 2016. The Future of Energy Demand and Implications for Australia | Speeches [WWW Document]. Reserve Bank of Australia. URL https://www.rba.gov.au/speeches/2016/sp-so-2016-06-21.html (accessed 11.8.19).

Saddler, H., 2014. Why is electricity consumption decreasing in Australia? RenewEconomy. URL https://reneweconomy.com.au/why-is-electricity-consumption-decreasing-in-australia-19459/ (accessed 11.10.19).

LS0tDQp0aXRsZTogIldpbGwgRW5lcmd5IERlbWFuZCBLZWVwIFJpc2luZywgRmFsbGluZyBvciBQbGF0ZWF1PyINCnN1YnRpdGxlOiAnQSBUaW1lLVNlcmllcyBBbmFseXNpcyBvZiBIaXN0b3JpY2FsIERlbWFuZCBhbmQgRm9yZWNhc3QgZm9yIHRoZSBmdXR1cmUnDQphdXRob3I6ICJXaWxsaWFtIERhaSAoMTM2MjgwMTkpIg0KZGF0ZTogIjEwLzExLzIwMTkiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICB0aGVtZTogam91cm5hbA0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQpkb3dubG9hZF9ybWQ6IGZhbHNlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZm9yZWNhc3QpDQpsaWJyYXJ5KHVyY2EpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KDQpgYGANCg0KYGBge3IgR0VUIEFFTU8gRW5lcmd5IERhdGEsIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9DQoNCmV0bF9hZW1vX21vbnRobHlfc3VtbWFyaWVzIDwtIGZ1bmN0aW9uKCl7DQogIGFlbW9fZGF0YSA8LSByZWFkUkRTKHBhc3RlMChnZXR3ZCgpLCAiL2RhdGEvQUVNTy9BRU1PX0RhdGFfRXh0cmFjdF9Db25zb2xpZGF0ZWQucmRzIikpDQogIA0KICAgIGFlbW9fZGF0YSA8LSBhZW1vX2RhdGEgJT4lIA0KICAgICAgICBzZXBhcmF0ZShTRVRUTEVNRU5UREFURSwgYygnc2V0dGxlbWVudF9kYXRlJyksIHNlcCA9ICcgJykgJT4lDQogICAgICAgIG11dGF0ZShSRUdJT04gPSBzdHJfcmVtb3ZlKFJFR0lPTiwgJ1xcZCcpLCBzZXR0bGVtZW50X3lyID0geWVhcihzZXR0bGVtZW50X2RhdGUpLCBzZXR0bGVtZW50X21vbnRoID0gbW9udGgoc2V0dGxlbWVudF9kYXRlKSkgJT4lDQogICAgICAgIGdyb3VwX2J5KFJFR0lPTiwgc2V0dGxlbWVudF95ciwgc2V0dGxlbWVudF9tb250aCkgJT4lDQogICAgICAgIHN1bW1hcmlzZShtZWFuX3RvdGFsX2RlbWFuZCA9IG1lYW4oVE9UQUxERU1BTkQpDQogICAgICAgICkgJT4lDQogICAgICAgIHJlbmFtZSgiU3RhdGUiPVJFR0lPTikNCiAgICANCiAgICByZXR1cm4oYWVtb19kYXRhKQ0KfQ0KDQpldGxfYWVtb195ZWFybHlfc3VtbWFyaWVzIDwtIGZ1bmN0aW9uKCl7DQogICAgYWVtb19kYXRhIDwtIHJlYWRSRFMocGFzdGUwKCJDOi9Vc2Vycy9jaGludC9PbmVEcml2ZS9Eb2N1bWVudHMvR2l0SHViL01EU0lfU1REU19TUFIxOV9BVDIiLCAiL2RhdGEvQUVNTy9BRU1PX0RhdGFfRXh0cmFjdF9Db25zb2xpZGF0ZWQucmRzIikpDQogICAgDQogICAgYWVtb19kYXRhIDwtIGFlbW9fZGF0YSAlPiUgDQogICAgICAgIHNlcGFyYXRlKFNFVFRMRU1FTlREQVRFLCBjKCdzZXR0bGVtZW50X2RhdGUnKSwgc2VwID0gJyAnKSAlPiUNCiAgICAgICAgbXV0YXRlKFJFR0lPTiA9IHN0cl9yZW1vdmUoUkVHSU9OLCAnXFxkJyksIHNldHRsZW1lbnRfeXIgPSB5ZWFyKHNldHRsZW1lbnRfZGF0ZSksIHNldHRsZW1lbnRfbW9udGggPSBtb250aChzZXR0bGVtZW50X2RhdGUpKSAlPiUNCiAgICAgICAgZ3JvdXBfYnkoUkVHSU9OLCBzZXR0bGVtZW50X3lyKSAlPiUNCiAgICAgICAgc3VtbWFyaXNlKG1lYW5fdG90YWxfZGVtYW5kID0gbWVhbihUT1RBTERFTUFORCkNCiAgICAgICAgKSAlPiUNCiAgICAgICAgcmVuYW1lKCJTdGF0ZSI9UkVHSU9OKQ0KICAgIA0KICAgIHJldHVybihhZW1vX2RhdGEpDQp9DQoNCmFlbW9fZGF0YSA8LSBldGxfYWVtb19tb250aGx5X3N1bW1hcmllcygpICU+JSBmaWx0ZXIoc2V0dGxlbWVudF95ciA+PSAyMDA4KQ0KYWVtb19kYXRhX3llYXJseSA8LSBldGxfYWVtb195ZWFybHlfc3VtbWFyaWVzKCkgJT4lIGZpbHRlcihzZXR0bGVtZW50X3lyID49IDIwMDgpDQpgYGANCg0KIyAxLiBJbnRyb2R1Y3Rpb24NCg0KIyMjIDEuMSBCYWNrZ3JvdW5kDQpBY2NvcmRpbmcgdG8gdGhlIERlcGFydG1lbnQgb2YgRW52aXJvbm1lbnQgYW5kIEVuZXJneSwgZHVyaW5nIHRoZSBwZXJpb2Qgb2YgMjAxNy0yMDE4LCB0aGUgQXVzdHJhbGlhbiBlY29ub215IGdyZXcgYnkgMi44IHBlcmNlbnQgdG8gJDEuOCB0cmlsbGlvbiBhbmQgdGhlIHBvcHVsYXRpb24gZ3JldyBieSAxLjYgcGVyY2VudCB0byAyNSBtaWxsaW9uLiBBdCB0aGUgc2FtZSB0aW1lLCBlbmVyZ3kgY29uc3VtcHRpb24gcm9zZSBieSAwLjkgcGVyIGNlbnQgKDUyIHBldGFqb3VsZXMpIHRvIHJlYWNoIDYsMTcyIHBldGFqb3VsZXMgYW5kIEF1c3RyYWxpYSBleHBvcnRlZCAxNCw3MzkgcGV0YWpvdWxlcy4gKEVuZXJneSBTdGF0aXN0aWNzIGFuZCBBbmFseXNpcyBTZWN0aW9uLCAyMDE5LCBwLjUpLg0KDQpJbiB0aGUgbGFzdCBkZWNhZGUsIEF1c3RyYWxpYSBoYXMgcG9zaXRpb25lZCB0aGVtc2VsdmVzIGFzIGEgbGFyZ2Ugc3VwcGxpZXIgb2YgZW5lcmd5IHRvIHRoZSBnbG9iYWwgbWFya2V0LCBob3dldmVyLCBhY2NvcmRpbmcgdG8gQWxleGFuZHJhIEhlYXRoLCBIZWFkIG9mIEVjb25vbWljIEFuYWx5c2lzIERlcGFydG1lbnQgKEhlYXRoLCAyMDE2KSBkdWUgdG8gZmFjdG9ycyBzdWNoIGFzOiB3b3JzZW5pbmcgZWNvbm9taWMgY29uZGl0aW9ucywgYWRvcHRpb24gb2YgY2xlYW5lciB0ZWNobm9sb2dpZXMgYW5kIHJlZ3VsYXRpb25zIGFicm9hZCBhbmQgaW50ZXJuYXRpb25hbGx5OyBtYXkgc2FwIGVuZXJneSBkZW1hbmQgb3ZlcnNlYXMgYW5kIHRodXMgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiBvdXIgYWJpbGl0aWVzIHRvIGV4cG9ydCBvdXIgc3VycGx1cyBlbmVyZ3kuIEF0IHRoZSBzYW1lIHRpbWUsIHRoZXJlIGlzIGNvbnNpZGVyYWJsZSB1bmNlcnRhaW50eSBpbiBob3cgZ2xvYmFsIGVuZXJneSBkZW1hbmQgd2lsbCBldm9sdmUgYXMgbWFueSBzbWFsbGVyIGVjb25vbWllcyBhcmUgcmFwaWRseSBkZXZlbG9waW5nIGFuZCB0cmFuc2Zvcm1pbmcgdGh1cyByZXF1aXJpbmcgbW9yZSBlbmVyZ3kuDQoNClRvIGRldGVybWluZSB3aGV0aGVyIGVuZXJneSBwb2xpY3kgbWFrZXJzIGluIEF1c3RyYWxpYSBjYW4gZGVjb21taXNzaW9uIHNvbWUgb2YgdGhlaXIgbm9uLXJlbmV3YWJsZSBmdWVsIG1peGVzLCB0aGlzIHBhcGVyIHdpbGwgbW9kZWwgaGlzdG9yaWNhbCBhbmQgY3VycmVudCBlbmVyZ3kgZGVtYW5kIGRhdGEgcHJvdmlkZWQgYnkgQUVNTyBhbmQgY3JlYXRlIGEgcHJlZGljdGlvbiBvZiBlbmVyZ3kgZGVtYW5kIGZvciB0aGUgZnV0dXJlLg0KDQojIyMgMS4yIFdoYXQgQXJlIFdlIFRlc3Rpbmc/DQoNClRoZSBjZW50cmFsIHF1ZXN0aW9uIHdlIGFyZSBhc2tpbmcgaXM6DQoNCioqIlV0aWxpc2luZyB0aW1lIHNlcmllcyBhbmFseXNpcyBjYW4gd2UgcHJlZGljdCBBdXN0cmFsaWEncyBmdXR1cmUgZW5lcmd5IGRlbWFuZCBiYXNlZCBvZmYgYSBtb250aGx5IGFnZ3JlZ2F0ZSBvZiBoaXN0b3JpY2FsIGRlbWFuZD8iKioNCg0KIyMjIDEuMyBEYXRhIFNvdXJjZSBMaW1pdGF0aW9ucw0KDQpUaGUgZGF0YSB3YXMgb2J0YWluZWQgZnJvbSBBdXN0cmFsaWFuIEVuZXJneSBNYXJrZXQgT3BlcmF0b3IgKEFFTU8pIHdlYnNpdGUgYW5kIHdhcyBleHRyYWN0ZWQgdmlhIGEgY3VzdG9tIGJ1aWx0IGF1dG9tYXRlZCBzY3JhcGVyLCBwZXJmb3JtaW5nIGluaXRpYWwgYW5hbHlzaXMgb24gdGhlIGRhdGEgc2hvd3MgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3M6DQoNCjEuIERlbWFuZCBmb3IgQUNUIHdhcyByb2xsZWQgdXAgaW4gdGhlIGRlbWFuZCBmb3IgTlNXLg0KMi4gRGVtYW5kIGZvciBOVCB3ZXJlIG1pc3NpbmcgZHVlIHRvIGp1cmlzZGljdGlvbi4NCg0KIyMjIDEuNCBEYXRhIENvbnNpZGVyYXRpb25zDQoNCiMjIyMgMS40LjEgR3JhbnVsYXJpdHkNClRoZSByYXcgZGF0YSBpcyBoYWxmLWhvdXJseSBjb250aW51b3VzIHRpbWVzdGFtcCwgaG93ZXZlciwgZm9yIGhpcyBwcm9qZWN0IHdlIGhhdmUgYWdncmVnYXRlZCB0aGUgZGF0YSB0byBhIG1vbnRobHkgdmlldy4NCg0KIyMjIyAxLjQuMiBOdW1iZXIgb2YgZGF0YSBwb2ludHMNClRoZXJlIGlzIGEgdG90YWwgb2YgMSw2OTEsNTYwIGRhdGEgcG9pbnRzLCBvbmNlIHRoaXMgZGF0YSBoYXMgYmVlbiBhZ2dyZWdhdGVkIHRvIG1vbnRobHkgdmlldyB0aGUgdG90YWwgZGF0YSBwb2ludHMgaXMgZHJhbWF0aWNhbGx5IGN1dCBkb3duIHRvIDcwMCBhY3Jvc3MgMjAwOCB0byAyMDE5Lg0KDQojIyMjIDEuNC4zIE1pc3NpbmcgVmFsdWVzDQpOb25lIGluIGN1cnJlbnQgZGF0YXNldCwgaG93ZXZlciwgdGhlcmUgYXJlIG1pc3Npbmcgc3RhdGVzLCBzdWNoIGFzIE5UIGFuZCBXQS4NCg0KIyMjIyAxLjQuNCBDb21wbGV0ZW5lc3MNClRoZSB3ZWJzaXRlIG9ubHkgaW5jbHVkZWQgZGF0YSBmcm9tIDE5OTkgdG8gMTEvMjAxOSAoYXQgdGhlIHRpbWUgb2Ygd3JpdGluZyksIGhvd2V2ZXIsIHRoaXMgcGFwZXIgd2lsbCBvbmx5IGxvb2sgYXQgdGhlIHBlcmlvZCBvZiAwMS8wOCAtIDAxLzE4Lg0KDQojIDIuIERhdGEgQW5hbHlzaXMNCg0KIyMjIDIuMSBTZWFzb25hbCBQbG90DQoNCkluIHRoZSBzZWFzb25hbCBwbG90IGJlbG93LCB3ZSBoYXZlIHN1bW1hcmlzZWQgdGhlIG1vbnRobHkgZGVtYW5kIG9mIGVuZXJneSBkZW1hbmQgZGF0YSBhY3Jvc3MgYWxsIHN0YXRlcyB1c2luZyBnZ3NlYXNvbnBsb3QgZnVuY3Rpb25hbGl0eSBmb3VuZCBpbiBmb3JlY2FzdC4NCg0KRnJvbSBmaXJzdCBnbGFuY2UsIHRoZXJlIHNlZW1zIHRvIGJlIHNvbWUgY2xlYXIgc2Vhc29uYWwgYW5kIGN5Y2xpY2FsIHRyZW5kcyBpbiB0aGUgZGF0YToNCg0KMS4gVGhlcmUgYXJlIHVwd2FyZCB0cmVuZHMgaW4gZW5lcmd5IGRlbWFuZCBsZWFkaW5nIHRvIHN1bW1lciBhbmQgd2ludGVyLCBwZWFraW5nIGluIEp1bHkuDQoNCjIuIFRoZXJlIGFyZSBkb3dud2FyZCB0cmVuZHMgZHVyaW5nIFNwcmluZyBhbmQgQXV0dW1uLCB3aXRoIG1heGltdW0gdHJvdWdocyBpbiBBcHJpbCBhbmQgT2N0b2Jlci4NCg0KVGhlc2UgdHJlbmRzIGFyZSBpbmxpbmUgd2l0aCBzZWFzb25hbCBlbmVyZ3kgZGVtYW5kLCBhcyB0aGVyZSBhcmUgZ3JlYXRlciBkZW1hbmQgcGxhY2Ugb24gZ2VuZXJhdG9ycyBkdWUgdG8gdGhlIHVzZSBvZiBhaXIgY29uZGl0aW9uZXJzLg0KDQpgYGB7cn0NCmRlbWFuZHRzID0gdHMoYyhhZW1vX2RhdGEkbWVhbl90b3RhbF9kZW1hbmQpLHN0YXJ0PWMoMjAwOCwxKSwgZW5kPWMoMjAxNywxMiksZnJlcXVlbmN5PTEyKQ0KZ2dzZWFzb25wbG90KGRlbWFuZHRzKSArDQp5bGFiKCJFbmVyZ3kgRGVtYW5kIChHV2gpIikgKw0KICBnZ3RpdGxlKCJTZWFzb25hbCBQbG90OiBBdXN0cmFsaWEncyBFbmVyZ3kgRGVtYW5kIChFeGNsdWRpbmcgV0EgYW5kIE5UKSIpDQpgYGANCg0KIyMjIDIuMiBTZWFzb25hbCBTdWJzZXJpZXMgUGxvdHMNClRvIGZ1cnRoZXIgZW1waGFzaXNlcyBhbmQgdmlzdWFsaXNlIHRoZSBzZWFzb25hbCBwYXR0ZXJucyB3aXRoaW4gQUVNTydzIGVuZXJneSBkYXRhLCB3ZSBoYXZlIHJlZnJhbWVkIHRoZSBzYW1lIGRhdGEgaW50byBhIHN1YnNlcmllcyBwbG90IGluIHdoaWNoIHRoZSBob3Jpem9udGFsIGxpbmVzIGFyZSB0aGUgbWVhbnMgb2YgZWFjaCBtb250aC4gRnJvbSB0aGUgYmVsb3cgZGlhZ3JhbSwgaXQgaXMgc2hvd24gZW5lcmd5IGRlbWFuZCBjb21tZW5jZSByaXNpbmcgaW4gQXByaWwgYW5kIHBsYXRlYXUgaW4gU2VwdGVtYmVyLg0KDQpgYGB7cn0NCg0KZ2dzdWJzZXJpZXNwbG90KGRlbWFuZHRzKSArDQogIHlsYWIoIkVuZXJneSBEZW1hbmQgKEdXaCkiKSArDQogIGdndGl0bGUoIlNlYXNvbmFsIFBsb3Q6IEF1c3RyYWxpYSdzIEVuZXJneSBEZW1hbmQgKEV4Y2x1ZGluZyBXQSBhbmQgTlQpIikNCg0KYGBgDQoNCg0KIyMjIDIuMyBEZWNvbXBvc2l0aW9uIG9mIEFkZGl0aXZlIFRpbWUgU2VyaWVzDQpJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgc2Vhc29uYWwgcGxvdCwgd2UgY2FuIGFsc28gZnVydGhlciBkZWNvbXBvc2UgQUVNTydzIGRlbWFuZCBkYXRhIGludG8gaXRzIHJlbGV2YW50IGF0dHJpYnV0ZXMsIHRoZSBtYWluIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QgYXJlIFRyZW5kIGFuZCBTZWFzb25hbCBjb21wb25lbnRzIG9mIHRoZSBkYXRhLiANCg0KU2Vhc29uYWxpdHkgZGVmaW5lZCBhcyBldmVudHMgd2hpY2ggZXhwZXJpZW5jZXMgcmVndWxhciBhbmQgcHJlZGljdGFibGUgY2hhbmdlcyB0aGF0IHJlY3VyIGV2ZXJ5IGNhbGVuZGFyIHllYXIgaXMgaGlnaGx5IHByb21pbmVudCBpbiB0aGUgYmVsb3cgZGF0YS4NCg0KV2hpbGUgdHJlbmQgZGVmaW5lZCBhcyB0aGUgZ2VuZXJhbCBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIGVuZXJneSBkZW1hbmQgaXMgZGV2ZWxvcGluZyBvciBjaGFuZ2luZyBhcHBlYXJzIHRvIGJlIGRlY2Vhc2luZyB3aXRoIGFuIGluZmxlY3Rpb24gcG9pbnQgYXQgMjAxMiB3aGVyZSB0aGUgZGVtYW5kIGNvbnNpc3RzIGFyb3VuZCA4MDAwIEdXaCByYW5nZS4NCg0KYGBge3J9DQphZW1vX2RhdGFfZGVjb21wb3NlZCA8LSBkZWNvbXBvc2UoZGVtYW5kdHMsIHR5cGU9ImFkZGl0aXZlIikNCnBsb3QoYWVtb19kYXRhX2RlY29tcG9zZWQpDQpgYGANCg0KIyAzLiBNb2RlbCBJbnRlcm5hbCBDb25zaXN0ZW5jeSBDaGVja3MNCg0KIyMjIDMuMSBTdGF0aW9uYXJpdHkNCkEgc3RhdGlvbmFyeSB0aW1lIHNlcmllcyBpcyBkZWZpbmVkIGFzIGEgc2VyaWVzIHdob3NlIHByb3BlcnRpZXMgYXJlIGluZGVwZW5kZW50IG9uIHRoZSB0aW1lIG9mIG9ic2VydmF0aW9uLCB0aHVzLCB0aW1lIHNlcmllcyB3aXRoIHNlYXNvbmFsaXR5IGFyZSBub3Qgc3RhdGlvbmFyeSwgaGVuY2UgaW4gb3VyIGNhc2UgZW5lcmd5IGRlbWFuZCBhZ2dyZWdhdGVkIG9uIGEgbW9udGhseSBiYXNpcyB3b3VsZCBub3QgYmUgY29uc2lkZXJlZCBzdGF0aW9uYXJ5Lg0KDQpXZSBjYW4gY29uZmlybSBzdGF0aW9uYXJpdHkgYnkgcGVyZm9ybWluZyBhIEtQU1MgdGVzdCBvbiB0aGUgZGF0YSwgZnJvbSB0aGUgVW5pdCBSb290IFRlc3QgYmVsb3cgd2UgY2FuIHNlZSB0aGF0IHRoZSB0ZXN0LXN0YXRpc3RpYyBpcyAxLjc2NzMgd2hpY2ggaXMgc2lnbmlmaWNhbnQgaGlnaGVyIHRoYW4gdGhlIDElIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAwLjczOSwgdGh1cyB0aGlzIGNvbmZpcm1zIGVuZXJneSBkZW1hbmQgaXMgbm9uLXN0YXRpb25hcnkuDQoNCmBgYHtyfQ0KZGVtYW5kdHMgJT4lIHVyLmtwc3MoKSAlPiUgc3VtbWFyeSgpDQpgYGANCg0KUmUtYWdncmVnYXRpbmcgdGhlIHNhbWUgZGF0YSBvbiBhIHllYXJseSBiYXNpcywgc2hvd3MgYSB0ZXN0LXN0YXRpc3RpYyBvZiAwLjQwNTkgd2hpY2ggaXMgd2l0aGluIHRoZSAxJSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgMC43MzksIGhlbmNlIGNvbmZpcm1pbmcgZW5lcmd5IGRlbWFuZCBhZ2dyZWdhdGVkIG9uIGEgeWVhcmx5IGJhc2lzIHdvdWxkIGJlIGNvbnNpZGVyZWQgc3RhdGlvbmFyeS4NCmBgYHtyfQ0KZGVtYW5kdHN5cmx5ID0gdHMoYyhhZW1vX2RhdGFfeWVhcmx5JG1lYW5fdG90YWxfZGVtYW5kKSxzdGFydD1jKDIwMDgsMSksIGVuZD1jKDIwMTgsMSksZnJlcXVlbmN5PTEpDQpkZW1hbmR0c3lybHkgJT4lIHVyLmtwc3MoKSAlPiUgc3VtbWFyeSgpDQpgYGANCg0KIyMjIDMuMiBXaGl0ZSBub2lzZQ0KV2hpdGUgbm9pc2UgaXMgYW5vdGhlciB0ZXN0IHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgZGF0YXNldCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZGF0YSBhcmUganVzdCByYW5kb20gcG9pbnRzIHdoaWNoIGhhcHBlbiB0byByZXNlbWJsZSB1c2FibGUgZGF0YS4gSWYgdGhlIGRhdGEgaXMgJ3doaXRlIG5vaXNlJyB0aGVuIHRoZSByZXN1bHRzIHdvdWxkIG5vdCBiZSBtZWFuaW5nZnVsLg0KDQpXaGl0ZSBub2lzZSBjYW4gYmUgZGV0ZXJtaW5lZCB0aHJvdWdoIHRoZSBhcHBsaWNhdGlvbiBvZiBhIExqdW5nLUJveCB0ZXN0LCBhcHBseWluZyB0aGlzIHRlc3QgdG8gZW5lcmd5IGRlbWFuZCBtb250aGx5IGRhdGEgc2hvd3MgYSBwLXZhbHVlIG9mIDAuMDAwMDAwMDAwMDAwMDAwMjIgd2hpY2ggaW5kaWNhdGVzIGEgc2lnbmlmaWNhbnQgcmVzdWx0IGNvbmZpcm1pbmcgdGhlIGRhdGEgaXMgbm90IHdoaXRlIG5vaXNlLg0KDQpgYGB7cn0NCkJveC50ZXN0KGRlbWFuZHRzLHR5cGU9IkxqIixsYWc9MTAsZml0ZGYgPSAwKQ0KYGBgDQoNCiMjIyAzLjMgQXV0b2NvcnJlbGF0aW9uIChBQ0YpDQpBbm90aGVyIGltcG9ydGFudCB0ZXN0IHRvIHBlcmZvcm0gaXMgQXV0b2NvcnJlbGF0aW9uLCBBdXRvY29ycmVsYXRpb24gaXMgdGhlIGNvcnJlbGF0aW9uIG9mIGEgdmFyaWFibGUgYWdhaW5zdCBhIHRpbWUtc2hpZnRlZCB2ZXJzaW9uIG9mIGl0c2VsZiwgdGhpcyBpcyBkb25lIHRocm91Z2ggdGhlIHVzZSBvZiBhICdsYWcnIGZ1bmN0aW9uIHdoaWNoIGlzIGVmZmVjdGl2ZWx5IGEgc3BlY2lmaWMgcGVyaW9kIGJlaGluZC4NCg0KRm9yIHRpbWUgc2VyaWVzIGRhdGFzZXQgd2hpY2ggYXJlIHdlbGwgc3RydWN0dXJlZCwgdGhlIGV4cGVjdGVkIHBsb3Qgd291bGQgYmUgYSBzY2FsbG9wZWQgQXV0by1Db3JyZWxhdGlvbiBwbG90LCB1bnN0cnVjdHVyZWQgb3IgcmFuZG9taXNlZCBkYXRhIHdvdWxkIGNsb3NlbHkgcmVzZW1ibGUgd2hpdGUgbm9pc2UuDQoNCldoZW4gYXBwbHlpbmcgQUNGLCB3ZSBjYW4gc2VlIGZyb20gdGhlIGdyYXBoIGJlbG93IHRoYXQ6DQoNCjEuIFRoZSBhdXRvY29ycmVsYXRpb24gZm9yIHNtYWxsIGxhZ3MgYXJlIGxhcmdlIGFuZCBwb3NpdGl2ZSBhbmQgZGVjcmVhc2VzIGdyYWR1YWxseSBhcyB0aGUgbGFnIGluY3JlYXNlcywgdGhpcyBzdWdnZXN0cyB0aGUgZGF0YSBoYXMgYSB0cmVuZC4NCg0KMi4gVGhlIHNoYXBlIGlzICdzY2FsbG9wZWQnIHdoaWNoIHN1Z2dlc3RzIHRoZXJlIGFyZSBzZWFzb25hbGl0eSBmYWN0b3JzLg0KDQpgYGB7cn0NCmdnQWNmKGRlbWFuZHRzLCBsYWc9NDgpICsgZ2d0aXRsZSgiQUNGIGZvciBlbmVyZ3kgZGVtYW5kIHRpbWUgc2VyaWVzIChNb250aGx5KSIpICsgdGhlbWVfYncoKQ0KYGBgDQoNCiMgNC4gRm9yZWNhc3QNCg0KIyMjIDQuMS4gQVJJTUENCkF0dGVtcHRpbmcgdG8gYSBjcmVhdGUgZW5lcmd5IGRlbWFuZCBwcmVkaWN0aW9ucyBmb3IgdGhlIGZ1dHVyZSwgdGhlIGNob3NlbiBwcmVkaWN0aW9uIG1vZGVsIHRvIGJlIHVzZWQgaXMgdGhlIEF1dG8tUmVncmVzc2l2ZSBJbnRlZ3JhdGVkIE1vdmluZyBBdmVyYWdlIChBUklNQSkgbW9kZWwuIEFSSU1BIGNvbXByaXNlcyBvZiAzIHBhcnRzLCB0aGVzZSBhcmU6DQoNCjEuIEF1dG9yZWdyZXNzaW9uIChBUikgLSBPdXIgbW9kZWwgd2lsbCB0byBhIGNlcnRhaW4gZGVncmVlIGFjY291bnQgZm9yIGEgcGF0dGVybiBvZiBjaGFuZ2UgKGdyb3d0aCAvIGRlY2xpbmUpIGluIHRoZSBlbmVyZ3kgZGVtYW5kIGRhdGEuIA0KDQoyLiBJbnRlZ3JhdGVkIChJKSAtIEFzIHNlY3Rpb24gMy4zLCBoYXMgc2hvd24gZW5lcmd5IGRlbWFuZCBkYXRhIGNvbnRhaW5zIGJvdGggc2Vhc29uYWwgYW5kIHRyZW5kIGNvbXBvbmVudHMsIGhlbmNlIHRoaXMgd2lsbCBuZWVkIHRvIGJlIHN1YnRyYWN0ZWQgb3V0IHRocm91Z2ggZGlmZmVyZW5jaW5nIGluIG9yZGVyIHRvIG1ha2UgdGhlIHRpbWUgc2VyaWVzIHN0YXRpb25hcnkuDQoNCjMuIE1vdmluZyBBdmVyYWdlIChNQSkgLSBPdXIgbW9kZWwgd2lsbCB0byBhIGNlcnRhaW4gZGVncmVlIGFjY291bnQgdGhlIG5vaXNlIGJldHdlZW4gc3Vic2VxdWVudCB0aW1lIHBvaW50cy4NCg0KIyMjIDQuMiBQcmVkaWN0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9DQpkZW1hbmR0cyAlPiUgc3RsKHMud2luZG93PSdwZXJpb2RpYycpICU+JSBzZWFzYWRqKCkgLT4gZWVhZGoNCiNhdXRvcGxvdChlZWFkaikNCiNlZWFkaiAlPiUgZGlmZigpICU+JSBnZ3RzZGlzcGxheShtYWluPSIiKQ0KZml0IDwtIEFyaW1hKGVlYWRqLCBvcmRlcj1jKDYsMSw2KSkNCmBgYA0KDQpgYGB7cn0NCmF1dG9wbG90KGZvcmVjYXN0KGZpdCkpICsgZ2d0aXRsZSgiRnV0dXJlIFByZWRpY3Rpb25zIGZvciBlbmVyZ3kgZGVtYW5kIikgKyB0aGVtZV9idygpICsNCiAgICBsYWJzKHg9IkVuZXJneSBEZW1hbmQiDQogICAgICAgICAseT0iWWVhciINCiAgICAgICAgICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgyMDA3LDIwMjApKQ0KYGBgDQojIyMgNC4zIEFjY3VyYWN5DQpUaGUgYmVsb3cgZ3JhcGhzIHNob3cgdGhhdCB0aGUgY2hvc2VuIG1vZGVsIHByb2R1Y2VzIGZvcmVjYXN0cyB0aGF0IGFwcGVhciB0byBhY2NvdW50IGZvciBhbGwgYXZhaWxhYmxlIGluZm9ybWF0aW9uLg0KDQoxLiBUaGUgbWVhbiBvZiB0aGUgcmVzaWR1YWxzIGlzIGZhaXJseSBjbG9zZSB0byB6ZXJvLg0KDQoyLiBUaGVyZSBpcyBubyBzaWduaWZpY2FudCBjb3JyZWxhdGlvbiBpbiB0aGUgcmVzaWR1YWwncyBzZXJpZXMsIGJlaGF2aW5nIGxpa2Ugd2hpdGUgbm9pc2UuIChwLXZhbHVlID0gMC40MzQ1KQ0KDQozLiBUaGUgaGlzdG9ncmFtIHN1Z2dlc3RzIHRoYXQgdGhlIHJlc2lkdWFscyBhcHBlYXIgdG8gYmUgbm9ybWFsLg0KDQo0LiBNYWpvcml0eSBvZiB0aGUgcmVzaWR1YWxzIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGNhcHR1cmVkIGluIHRoZSBoaXN0b2dyYW0uDQoNCjUuIEVycm9yIG1lYXN1cmVzIChSTVNFKSBpcyBxdWl0ZSBoaWdoIGF0IDE1OC43NzU0Lg0KDQojIDUuIEZpbmRpbmdzDQpBZnRlciBjb25kdWN0aW5nIGEgY29tcHJlaGVuc2l2ZSBhbmFseXNpcyBvZiBlbmVyZ3kgZGVtYW5kIGRhdGEsIGFuZCBjb21wbGV0aW5nIGZ1dHVyZSBmb3JlY2FzdHMsIHdlIGhhdmUgc3VtbWFyaXNlZCBvdXIgNSBrZXkgZmluZGluZ3MgYmVsb3c6DQoNCjEuIEVuZXJneSBkZW1hbmQgYXBwZWFycyB0byBjb250YWluIGJvdGggc2Vhc29uYWwgYW5kIHRyZW5kIGNvbXBvbmVudHMsIGluIHRlcm1zIG9mIHNlYXNvbmFsIGVuZXJneSBkZW1hbmQgY29tbWVuY2UgcmlzaW5nIGluIEFwcmlsIGFuZCBwbGF0ZWF1IGluIFNlcHRlbWJlciBmb3IgZWFjaCB5ZWFyLg0KDQoyLiBTdGFydGluZyBpbiAyMDEyLCB0aGUgY3VycmVudCBlbmVyZ3kgZGVtYW5kcyBhcmUgb24gYSBkb3dud2FyZHMgdHJlbmQsIHRoaXMgcGFydGlhbGx5IGR1ZSB0byBmb2xsb3dpbmcgcmVhc29ucyAoU2FkZGxlciwgMjAxNCk6DQogICAgMS4gVGhlIGltcGFjdCBvZiAobWFpbmx5IHJlZ3VsYXRvcnkpIGVuZXJneSBlZmZpY2llbmN5IHByb2dyYW1zDQogICAgMS4gU3RydWN0dXJhbCBjaGFuZ2UgaW4gdGhlIGVjb25vbXkgYXdheSBmcm9tIGVsZWN0cmljaXR5IGludGVuc2l2ZSBpbmR1c3RyaWVzDQogICAgMS4gU2luY2UgMjAxMCwgdGhlIHJlc3BvbnNlIG9mIGVsZWN0cmljaXR5IGNvbnN1bWVycywgZXNwZWNpYWxseSByZXNpZGVudGlhbCBjb25zdW1lcnMsIHRvIGhpZ2hlciBlbGVjdHJpY2l0eSBwcmljZXMuDQogICAgMS4gVGhlIGRyYW1hdGljIHJpc2UgaW4gbnVtYmVyIG9mIHJlc2lkZW50aWFsIGNvbnN1bWVycyBpbnN0YWxsaW5nIHNtYWxsIHNjYWxlIHNvbGFyIFBWcyBhbmQgd2luZCBnZW5lcmF0b3JzLg0KICANCjMuIEVuZXJneSBkZW1hbmQgZGF0YSBpcyByZWxhdGl2ZWx5IGNsZWFuIGFuZCBzdHJ1Y3R1cmVkIGZvciBmb3JlY2FzdGluZywgdGhpcyBpcyBkdWUgdG86DQogICAgMS4gTm90IFN0YXRpb25hcnkNCiAgICAxLiBWZXJ5IGxpdHRsZSB3aGl0ZSBub2lzZQ0KICAgIDEuIElzIEF1dG8tQ29ycmVsYXRlZA0KICAgIDEuIExhcmdlIGRhdGFzZXQgYXZhaWxhYmxlIHRvIGJlIGVhc2lseSBleHRyYWN0ZWQuDQoNCjQuIEFmdGVyIHJ1bm5pbmcgdGhlIGRhdGEgdGhyb3VnaCBhbiBBUklNQSBmb3JlY2FzdGluZyBtb2RlbCwgdGhlIHByZWRpY3Rpb25zIHdlcmUgcmVsYXRpdmVseSBhY2N1cmF0ZSwgdGhlIGFjdHVhbCBtZWFuIGVuZXJneSBkZW1hbmQgZm9yIHRoZSAyMDE4IHdhcyA3OTk5LjgwLCB3aGlsZSBBUklNQSBwcm9kdWNlZCA4MTUyLjQwLCB3aGljaCB3YXMgb3V0IGJ5IDIlLg0KDQo1LiBVc2luZyB0aGUgcHJvZHVjZWQgbW9kZWwgdG8gcHJvamVjdCBmb3J3YXJkLCB3ZSBjYW4gYmUgY29uY2x1ZGVkIHRoYXQgdGhlIGVuZXJneSBkZW1hbmQgd2lsbCBsaWtlbHkgZGVjcmVhc2UgYWdhaW4gcG9zdCAyMDE5LCBob3dldmVyLCB0aGUgZXhhY3QgZGVtYW5kIGNvdWxkIHZhcnkgZHJhbWF0aWNhbGx5IGRlcGVuZGluZyBvbiBtYW55IGV4dGVybmFsIGZhY3RvcnMuDQoNCiM2LiBMaW1pdGF0aW9uIG9mIE1vZGVsDQpBIG51bWJlciBvZiBsaW1pdGF0aW9ucyBoYXZlIGJlZW4gaWRlbnRpZmllZCwgdGhlc2UgYXJlOg0KDQoxLiBUaGUgRnV0dXJlIGVuZXJneSBkZW1hbmQgcHJlZGljdGVkIGlzIGJhc2VkIG9uIHNpbmdsZSBpbnB1dCBmYWN0b3IsIHdoaWNoIGlzIGhpc3RvcmljYWwgZGVtYW5kLg0KDQoyLiBUaGUgbW9kZWwgZG9lcyBub3QgY2FwdHVyZSB0aGUgcXVhbnRpdGllcyBvZiBlbGVjdHJpY2l0eSBzdXBwbGllZCBieSBzbWFsbCBkaXN0cmlidXRlZCBnZW5lcmF0b3JzLCBzdWNoIGFzIHJvb2Z0b3AgcGhvdG92b2x0YWljcywgd2luZCB0dXJiaW5lcyBhbmQgbGFuZGZpbGwgZ2FzIHBsYW50cyBhcyBpdCBpcyBlbGVjdHJpY2l0eSBzdXBwbGllZCB0byB0aGUgbmF0aW9uYWwgZ3JpZCBzeXN0ZW0gYnkgbGFyZ2UgZ2VuZXJhdG9ycyB3aGljaCBwYXJ0aWNpcGF0ZSBpbiB0aGUgKHdob2xlc2FsZSkgTmF0aW9uYWwgRWxlY3RyaWNpdHkgTWFya2V0Lg0KDQozLiBUaGUgbW9kZWwgZG9lcyBub3QgdGFrZSBpbiB0byBhY2NvdW50IGdvdmVybm1lbnRhbCBwb2xpY2llcyBpbXBsZW1lbnRlZCBvciBpbiBwcm9ncmVzcy4NCg0KIzcuIE9wcG9ydHVuaXRpZXMgZm9yIEZ1dHVyZSBSZXNlYXJjaA0KRHVyaW5nIHRoZSByZXNlYXJjaCBwcm9jZXNzLCBzZXZlcmFsIGFkZGl0aW9uYWwgcXVlc3Rpb25zIHdlcmUgaWRlbnRpZmllZCwgd2hpY2ggbWF5IGVuYWJsZSB0aGUgdGVhbSB0byBjcmVhdGUgYSByaWNoZXIgbW9kZWwsIHRoZXNlIGFyZToNCg0KMS4gSG93IG11Y2ggb2YgYW4gaW5mbHVlbmNlIGRvZXMgdGhlIHdlYXRoZXIgcGxheSBpbiBkZXRlcm1pbmluZyBkZW1hbmQuDQoNCjIuIEhvdyBtdWNoIG9mIGFuIGluZmx1ZW5jZSBkb2VzIHBvcHVsYXRpb24gY2hhbmdlIHBsYXkgaW4gZGV0ZXJtaW5pbmcgZGVtYW5kLg0KDQpUaGUgYWJvdmUgcXVlc3Rpb25zIGNvdWxkIGJlIGFkZHJlc3NlZCBpbiBhIG11bHRpdmFyaWF0ZSByZWdyZXNzaW9uIG1vZGVsIHRvIGVuaGFuY2UgdGhlIHByZWRpY3RhYmlsaXR5IG9mIHRoZSBleGlzdGluZyBtb2RlbC4NCg0KIzguIENvbmNsdXNpb24NCkFuYWx5c2lzIG9mIEFFTU8ncyBoaXN0b3JpYyBlbmVyZ3kgZGVtYW5kIGlzIGEgc3VpdGFibGUgbWV0aG9kIG9mIGZvcmVjYXN0aW5nIGZ1dHVyZSBkZW1hbmRzLiBFeHBsb3JhdGlvbiBvZiB0aGUgZGF0YSBoYXMgc2hvd24gdGhhdCBlbmVyZ3kgZGVtYW5kIGlzIG9uIGEgbmVnYXRpdmUgdHJlbmQgZHVlIHRvIHZhcmlvdXMgZmFjdG9ycyBkZWZpbmVkIGluIGZpbmRpbmdzLg0KDQpNb3Jlb3ZlciwgaGF2aW5nIGFwcGxpZWQgdmFyaW91cyBzdGF0aXN0aWNhbCB0ZXN0cyB0byB0aGUgZGF0YSwgdGhlIGRhdGEgaXMgc3VpdGFibGUgZm9yIHRpbWUtc2VyaWVzIGZvcmVjYXN0aW5nLCBkdWUgdG8gaXQgYmVpbmcgbm90IHN0YXRpb25hcnksIG5vdCB3aGl0ZSBub2lzZSwgYXV0by1jb3JyZWxhdGVkLCBhbmQgZWFzaWx5IGFjY2Vzc2libGUuDQoNClJldmlzaXRpbmcgb3VyIHJlc2VhcmNoIHF1ZXN0aW9uIG9mLCAiVXRpbGlzaW5nIHRpbWUgc2VyaWVzIGFuYWx5c2lzIGNhbiB3ZSBwcmVkaWN0IEF1c3RyYWxpYSdzIGZ1dHVyZSBlbmVyZ3kgZGVtYW5kIGJhc2VkIG9mZiBhIG1vbnRobHkgYWdncmVnYXRlIG9mIGhpc3RvcmljYWwgZGVtYW5kPyIgVGhlIG1vZGVsIHdlIGhhdmUgZGV2aXNlZCBoYXMgc2hvd24gdGhhdCBlbmVyZ3kgZGVtYW5kIGlzIG9uIGEgbmVnYXRpdmUgdHJlbmQsIGhvd2V2ZXIsIGR1ZSB0byBtYW55IGRvbWVzdGljIGFuZCBpbnRlcm5hdGlvbmFsIGZhY3RvcnMgaW4gcGxheSwgd2hpY2ggYXJlIGhpZ2hseSBjb21wbGV4IHRvIG1vZGVsLCBpdCB3b3VsZCBiZSBkaWZmaWN1bHQgdG8gY29uY2x1ZGUgd2l0aCBjZXJ0YWludHkgd2hldGhlciB3ZSBjYW4gZGVjb21taXNzaW9uIGZ1ZWwgbWl4ZXMgKGV2ZW4gaWYgdGhleSBjb250cmlidXRlIHRvIGdsb2JhbCB3YXJtaW5nKS4gVGh1cywgYWRkaXRpb25hbCByZXNlYXJjaCBhbmQgbW9kZWxsaW5nIHdpbGwgbmVlZCB0byBiZSBwZXJmb3JtZWQgdG8gZnVydGhlciBlbmhhbmNlIHRoZSBjdXJyZW50IG1vZGVsLCB0aGVzZSBxdWVzdGlvbnMgaGF2ZSBiZWVuIGNvdmVyZWQgaW4gb3Bwb3J0dW5pdGllcyBmb3IgZnV0dXJlIHJlc2VhcmNoLg0KDQojOS4gUmVmZXJlbmNlcw0KRW5lcmd5IFN0YXRpc3RpY3MgYW5kIEFuYWx5c2lzIFNlY3Rpb24sIDIwMTkuIEF1c3RyYWxpYW4gZW5lcmd5IHVwZGF0ZSAyMDE5LCBBdXN0cmFsaWFuIGVuZXJneSBzdGF0aXN0aWNzIDQzLg0KDQpIZWF0aCwgQS4sIDIwMTYuIFRoZSBGdXR1cmUgb2YgRW5lcmd5IERlbWFuZCBhbmQgSW1wbGljYXRpb25zIGZvciBBdXN0cmFsaWEgfCBTcGVlY2hlcyBbV1dXIERvY3VtZW50XS4gUmVzZXJ2ZSBCYW5rIG9mIEF1c3RyYWxpYS4gVVJMIGh0dHBzOi8vd3d3LnJiYS5nb3YuYXUvc3BlZWNoZXMvMjAxNi9zcC1zby0yMDE2LTA2LTIxLmh0bWwgKGFjY2Vzc2VkIDExLjguMTkpLg0KDQpTYWRkbGVyLCBILiwgMjAxNC4gV2h5IGlzIGVsZWN0cmljaXR5IGNvbnN1bXB0aW9uIGRlY3JlYXNpbmcgaW4gQXVzdHJhbGlhPyBSZW5ld0Vjb25vbXkuIFVSTCBodHRwczovL3JlbmV3ZWNvbm9teS5jb20uYXUvd2h5LWlzLWVsZWN0cmljaXR5LWNvbnN1bXB0aW9uLWRlY3JlYXNpbmctaW4tYXVzdHJhbGlhLTE5NDU5LyAoYWNjZXNzZWQgMTEuMTAuMTkpLg0K