1 Introduction

This note is compiled based on an online post of Professor Claus Wilke (at UT Austin) that provides a quick visual overview of the various plots and charts that are commonly used to visualize data. Wilke defined various functions based on ggplot2 and used them to make many aesthetically pleasant plots particularly the beautiful ridge plots.

Since the graphs generated in this note involves significant coding, the source code are not included in this note.

2 Amounts

The most common approach to visualizing amounts (i.e., numerical values shown for some set of categories) is using bars, either vertically or horizontally arranged. However, instead of using bars, we can also place dots at the location where the corresponding bar would end.

If there are two or more sets of categories for which we want to show amounts, we can group or stack the bars. We can also map the categories onto the x and y axes and show amounts by color, via a heatmap.

3 Distributions

Histograms and density plots provide the most intuitive visualizations of a distribution, but both require arbitrary parameter choices and can be misleading. Cumulative densities and quantile-quantile (q-q) plots always represent the data faithfully but can be more difficult to interpret.

Box-plots, violins, strip charts, and sina plots are useful when we want to visualize many distributions at once and/or if we are primarily interested in overall shifts among the distributions. Stacked histograms and overlapping densities allow a more in-depth comparison of a smaller number of distributions, though stacked histograms can be difficult to interpret and are best avoided. Ridgeline plots can be a useful alternative to violin plots and are often useful when visualizing very large numbers of distributions or changes in distributions over time.

4 Proportions

Proportions can be visualized as pie charts, side-by-side bars, or stacked bars, and as in the case for amounts, bars can be arranged either vertically or horizontally. Pie charts emphasize that the individual parts add up to a whole and highlight simple fractions. However, the individual pieces are more easily compared in side-by-side bars. Stacked bars look awkward for a single set of proportions, but can be useful when comparing multiple sets of proportions (see below).

When visualizing multiple sets of proportions or changes in proportions across conditions, pie charts tend to be space-inefficient and often obscure relationships. Grouped bars work well as long as the number of conditions compared is moderate, and stacked bars can work for large numbers of conditions. Stacked densities are appropriate when the proportions change along a continuous variable.

When proportions are specified according to multiple grouping variables, then mosaic plots, treemaps, or parallel sets are useful visualization approaches.

Mosaic plots assume that every level of one grouping variable can be combined with every level of another grouping variable, whereas treemaps do not make such an assumption. Treemaps work well even if the subdivisions of one group are entirely distinct from the subdivisions of another. Parallel sets work better than either mosaic plots or treemaps when there are more than two grouping variables.

5 Relationships

There are different ways to visualize the relationship between two variables. This section focused primarily two numerical variables.

5.1 Scatter Plots

Scatterplots represent the archetypical visualization when we want to show one quantitative variable relative to another. If we have three quantitative variables, we can map one onto the dot size, creating a variant of the scatterplot called bubble chart. For paired data, where the variables along the x and the y axes are measured in the same units, it is generally helpful to add a line indicating x = y. Paired data can also be shown as a slope graph of paired points connected by straight lines.

5.2 Density-based Plots

For large numbers of points, regular scatter-plots can become uninformative due to overplotting. In this case, contour lines, 2D bins, or hex bins may provide an alternative. When we want to visualize more than two quantities, on the other hand, we may choose to plot correlation coefficients in the form of a correlogram instead of the underlying raw data.

6 Geospatial Information

The primary mode of showing geospatial data is in the form of a map. A map takes coordinates on the globe and projects them onto a flat surface, such that shapes and distances on the globe are approximately represented by shapes and distances in the 2D representation. In addition, we can show data values in different regions by coloring those regions in the map according to the data. Such a map is called a choropleth. In some cases, it may be helpful to distort the different regions according to some other quantity (e.g., population number) or simplify each region into a square. Such visualizations are called cartograms.

7 Uncertainty

Error bars are meant to indicate the range of likely values for some estimate or measurement. They extend horizontally and/or vertically from some reference point representing the estimate or measurement. Reference points can be shown in various ways, such as by dots or by bars. Graded error bars show multiple ranges at the same time, where each range corresponds to a different degree of confidence. They are in effect multiple error bars with different line thicknesses plotted on top of each other.

To achieve a more detailed visualization than is possible with error bars or graded error bars, we can visualize the actual confidence or posterior distributions. Confidence strips provide a clear visual sense of uncertainty but are difficult to read accurately. Eyes and half-eyes combine error bars with approaches to visualize distributions (violins and ridgelines, respectively), and thus show both precise ranges for some confidence levels and the overall uncertainty distribution. A quantile dot plot can serve as an alternative visualization of an uncertainty distribution. By showing the distribution in discrete units, the quantile dot plot is not as precise but can be easier to read than the continuous distribution shown by a violin or ridgeline plot.

For smooth line graphs, the equivalent of an error bar is a confidence band. It shows a range of values the line might pass through at a given confidence level. As in the case of error bars, we can draw graded confidence bands that show multiple confidence levels at once. We can also show individual fitted draws in lieu of or in addition to the confidence bands.

LS0tDQp0aXRsZTogIkRpcmVjdG9yeSBvZiBWaXN1YWxpemF0aW9uIg0KYXV0aG9yOiAiQ29tcGlsZWQgZnJvbSBQcm9mLiBXaWxrZSdzIE5vdGUiDQpkYXRlOiAiICINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNg0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHRoZW1lOiBsdW1lbg0KICAgIGZpZ19oZWlnaHQ6IDQNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogNQ0KICAgIGZpZ19oZWlnaHQ6IDQNCi0tLQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtY29sb3I6bGlnaHRncmF5Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzc4MGMwYzsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQpkaXYjVE9DIGE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiB1bnZpc2l0ZWQgbGluayAqLw0KZGl2I1RPQyBhOmxpbmsgew0KICBjb2xvcjogYmx1ZTsNCn0NCg0KDQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya2JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7DQp9DQpoNC5hdXRob3IgeyANCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IA0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgew0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IA0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IA0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IA0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiB1bnZpc2l0ZWQgbGluayAqLw0KYTpsaW5rIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiB2aXNpdGVkIGxpbmsgKi8NCmE6dmlzaXRlZCB7DQogIGNvbG9yOiBncmVlbjsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQphOmhvdmVyIHsNCiAgY29sb3I6IHJlZDsNCn0NCg0KLyogc2VsZWN0ZWQgbGluayAqLw0KYTphY3RpdmUgew0KICBjb2xvcjogeWVsbG93Ow0KfQ0KDQo8L3N0eWxlPg0KDQoNCmBgYHtyIHNldHVwLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBydW4gc2V0dXAgc2NyaXB0DQojaW5zdGFsbC5wYWNrYWdlcygicmVtb3RlcyIpDQojbGlicmFyeShyZW1vdGVzKQ0KI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJjbGF1c3dpbGtlL2R2aXouc3VwcCIpDQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJjbGF1c3dpbGtlL2R2aXouc3VwcCIpDQoNCmxpYnJhcnkoY29sb3JzcGFjZSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dmb3JjZSkNCmxpYnJhcnkoZ2dyaWRnZXMpDQpsaWJyYXJ5KHRyZWVtYXBpZnkpDQpsaWJyYXJ5KGZvcmNhdHMpDQpsaWJyYXJ5KHN0YXRlYmlucykNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGNvd3Bsb3QpDQoNCg0Kb3B0aW9ucyhkaWdpdHMgPSAzKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICAgICAgICAgICAgICAgICBlY2hvID0gRkFMU0UsDQogICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLA0KICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICNkcGkgPSAxMDUsICMgbm90IHN1cmUgd2h5LCBidXQgbmVlZCB0byBkaXZpZGUgdGhpcyBieSAyIHRvIGdldCAyMTAgYXQgNmluLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpY2ggaXMgMzAwIGF0IDQuMmluDQogICAgICAgICAgIGZpZy5hbGlnbiA9ICdjZW50ZXInLA0KICAgICAgICAgICBmaWcud2lkdGggPSA2LA0KICAgICAgICAgICAgIGZpZy5hc3AgPSAwLjYxOCwgICMgMSAvIHBoaQ0KICAgICAgICAgICAgZmlnLnNob3cgPSAiaG9sZCINCiAgICAgICAgICAgICkNCm9wdGlvbnMoZHBseXIucHJpbnRfbWluID0gNiwgZHBseXIucHJpbnRfbWF4ID0gNikNCmBgYA0KDQoNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KVGhpcyBub3RlIGlzIGNvbXBpbGVkIGJhc2VkIG9uIGFuIG9ubGluZSBwb3N0IG9mIFByb2Zlc3NvciBDbGF1cyBXaWxrZSAoYXQgVVQgQXVzdGluKSB0aGF0IHByb3ZpZGVzIGEgcXVpY2sgdmlzdWFsIG92ZXJ2aWV3IG9mIHRoZSB2YXJpb3VzIHBsb3RzIGFuZCBjaGFydHMgdGhhdCBhcmUgY29tbW9ubHkgdXNlZCB0byB2aXN1YWxpemUgZGF0YS4gV2lsa2UgZGVmaW5lZCB2YXJpb3VzIGZ1bmN0aW9ucyBiYXNlZCBvbiBnZ3Bsb3QyIGFuZCB1c2VkIHRoZW0gdG8gbWFrZSBtYW55IGFlc3RoZXRpY2FsbHkgcGxlYXNhbnQgcGxvdHMgcGFydGljdWxhcmx5IHRoZSBiZWF1dGlmdWwgcmlkZ2UgcGxvdHMuDQoNClNpbmNlIHRoZSBncmFwaHMgZ2VuZXJhdGVkIGluIHRoaXMgbm90ZSBpbnZvbHZlcyBzaWduaWZpY2FudCBjb2RpbmcsIHRoZSBzb3VyY2UgY29kZSBhcmUgbm90IGluY2x1ZGVkIGluIHRoaXMgbm90ZS4gDQoNCmBgYHtyfQ0KIyMgZ2VuZXJhbCBzZXR1cCBjb2RlDQojIGxpbmVfc2l6ZSA9IDAuNg0KIyB0aGVtZQ0KdGhlbWVfcGxvdF9pY29uIDwtIGZ1bmN0aW9uKGJnX2NvbG9yID0gIiNGNUY4RUEiLCBsaW5lX2NvbG9yID0gIiMyNDM0MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IC41LCBmb250X3NpemUgPSAxNCkgew0KICB0aGVtZV9kdml6X29wZW4oKSAlK3JlcGxhY2UlIHRoZW1lKA0KICAgIGF4aXMudGV4dC54ICAgICAgID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGV4dC55ICAgICAgID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGl0bGUueCAgICAgID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGl0bGUueSAgICAgID0gZWxlbWVudF9ibGFuaygpLA0KICAgICNheGlzLmxpbmUueCAgICAgICA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAjYXhpcy5saW5lLnkgICAgICAgPSBlbGVtZW50X2JsYW5rKCksDQogICAgI2F4aXMudGlja3MgICAgICAgID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMubGluZS54ICAgICAgID0gZWxlbWVudF9saW5lKHNpemUgPSBsaW5lX3NpemUsIGNvbG9yID0gbGluZV9jb2xvciksDQogICAgYXhpcy5saW5lLnkgICAgICAgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IGxpbmVfc2l6ZSwgY29sb3IgPSBsaW5lX2NvbG9yKSwNCiAgICBheGlzLnRpY2tzICAgICAgICA9IGVsZW1lbnRfbGluZShzaXplID0gbGluZV9zaXplLCBjb2xvciA9IGxpbmVfY29sb3IpLA0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gZ3JpZDo6dW5pdCg0LCAicHQiKSwNCiAgICBsZWdlbmQucG9zaXRpb24gICA9ICJub25lIiwNCiAgICBwbG90Lm1hcmdpbiAgICAgICA9IG1hcmdpbigNCiAgICAgIGZvbnRfc2l6ZSo4LzE0LCBmb250X3NpemUsIGZvbnRfc2l6ZSoxMC8xNCwgZm9udF9zaXplDQogICAgKSwNCiAgICBwbG90LnRpdGxlICAgICAgICA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGhqdXN0ID0gMC41LA0KICAgICAgI2ZhbWlseSA9IGR2aXpfZm9udF9mYW1pbHlfYm9sZCwNCiAgICAgIGZhbWlseSA9IGR2aXpfZm9udF9mYW1pbHlfY29uZGVuc2VkLA0KICAgICAgY29sb3IgPSBsaW5lX2NvbG9yLA0KICAgICAgc2l6ZSA9IGZvbnRfc2l6ZSwNCiAgICAgIG1hcmdpbiA9IG1hcmdpbigwLCAwLCBmb250X3NpemUqNi8xNCwgMCkNCiAgICApLA0KICAgIHBsb3QuYmFja2dyb3VuZCAgID0gZWxlbWVudF9yZWN0KGZpbGwgPSBiZ19jb2xvcikNCiAgKQ0KfQ0KDQoNCg0KDQoNCg0KdGhlbWVfcGxvdF9pY29uX2hncmlkIDwtIGZ1bmN0aW9uKGJnX2NvbG9yID0gIiNGNUY4RUEiLCBsaW5lX2NvbG9yID0gIiMyNDM0MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IC41LCBmb250X3NpemUgPSAxNCkgew0KICB0aGVtZV9wbG90X2ljb24oYmdfY29sb3IsIGxpbmVfY29sb3IsIGxpbmVfc2l6ZSwgZm9udF9zaXplKSAlK3JlcGxhY2UlIHRoZW1lKA0KICAgICAgIyBtYWtlIGdyaWQgbGluZXMNCiAgICAgICNwYW5lbC5ncmlkLm1ham9yLnkgICA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSBwYXN0ZTAobGluZV9jb2xvciwgIjMwIiksDQogICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuNSksDQogICAgICAjIHJlbW92ZSB4IGF4aXMNCiAgICAgIGF4aXMudGlja3MueCAgICAgICAgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLmxpbmUueCAgICAgICAgID0gZWxlbWVudF9ibGFuaygpDQogICkNCn0NCg0KdGhlbWVfcGxvdF9pY29uX3ZncmlkIDwtIGZ1bmN0aW9uKGJnX2NvbG9yID0gIiNGNUY4RUEiLCBsaW5lX2NvbG9yID0gIiMyNDM0MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IC41LCBmb250X3NpemUgPSAxNCkgew0KICB0aGVtZV9wbG90X2ljb24oYmdfY29sb3IsIGxpbmVfY29sb3IsIGxpbmVfc2l6ZSwgZm9udF9zaXplKSAlK3JlcGxhY2UlIHRoZW1lKA0KICAgICAgIyBtYWtlIGdyaWQgbGluZXMNCiAgICAgICNwYW5lbC5ncmlkLm1ham9yLnggICA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSBwYXN0ZTAobGluZV9jb2xvciwgIjMwIiksDQogICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuNSksDQogICAgICAjIHJlbW92ZSB5IGF4aXMNCiAgICAgIGF4aXMudGlja3MueSAgICAgICAgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLmxpbmUueSAgICAgICAgID0gZWxlbWVudF9ibGFuaygpDQogICkNCn0NCg0KdGhlbWVfcGxvdF9pY29uX2JsYW5rIDwtIGZ1bmN0aW9uKGJnX2NvbG9yID0gIiNGNUY4RUEiLCBsaW5lX2NvbG9yID0gIiMyNDM0MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IC41LCBmb250X3NpemUgPSAxNCkgew0KICB0aGVtZV9wbG90X2ljb24oYmdfY29sb3IsIGxpbmVfY29sb3IsIGxpbmVfc2l6ZSwgZm9udF9zaXplKSAlK3JlcGxhY2UlIHRoZW1lKA0KICAgICAgYXhpcy50aWNrcyAgICAgICAgICA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMubGluZS54ICAgICAgICAgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLmxpbmUueSAgICAgICAgID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy50aWNrcy5sZW5ndGggICAgPSBncmlkOjp1bml0KDAsICJwdCIpDQogICkNCn0NCg0KIyBkYXRhIHNldHMNCnNldC5zZWVkKDUxNDIpDQpuIDwtIDE1DQp4IDwtIHJub3JtKG4pDQp5IDwtIC40KnggKyAuNipybm9ybShuKQ0KZGZfc2NhdHRlcl94eSA8LSBkYXRhLmZyYW1lKHgsIHkpDQpkZl9vbmVfZGlzdCA8LSBkYXRhLmZyYW1lKHggPSBjKHJub3JtKDEwMDAsIDEuLCAxLjYpLCBybm9ybSgzMDAsIDQsIC40KSkpDQpkZl9vbmVfbm9ybWFsIDwtIGRhdGEuZnJhbWUoeCA9IHJub3JtKDIwKSkNCmRmX2ZyYWN0aW9ucyA8LSBkYXRhLmZyYW1lKHkgPSBjKC4zLCAuMzksIC40OCwgLjYsIC4yNSwgLjEzLCAuMjIsIC4yNCwgLjQ1LCAuNDgsIC4zLCAuMTYpLA0KICAgICAgICAgICAgICAgICB4ID0gZmFjdG9yKHJlcCgxOjQsIDMpKSwNCiAgICAgICAgICAgICAgICAgdHlwZSA9IHJlcChjKCJBIiwgIkIiLCAiQyIpLCBlYWNoID0gNCkpDQpzZXQuc2VlZCgyNDc0KQ0KbiA8LSA4DQp4IDwtIHJub3JtKG4pDQp5IDwtIC40KnggKyAuNipybm9ybShuKQ0KeiA8LSAuNSp4ICsgLjMqcm5vcm0obikNCnogPC0gKHogLSBtaW4oeikgKyAwLjEpXjINCmRmX3NjYXR0ZXJfeHl6IDwtIGRhdGEuZnJhbWUoeCwgeSwgeikNCnNldC5zZWVkKDUwMTIpDQpkZl9tdWx0aV9hbW91bnRzIDwtIG11dGF0ZShkZl9mcmFjdGlvbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYygxLjAsIDEuMSwgMS40LCAxLjIpW3hdKnkpDQpuIDwtIDcwDQpkZl9tdWx0aV9kaXN0IDwtIGRhdGEuZnJhbWUoeSA9IGMocm5vcm0obiwgMSwgLjgpLCBybm9ybShuLCAyLCAuNyksIHJub3JtKG4sIDAsIC41KSksDQogICAgICAgICAgICAgICAgIHR5cGUgPSByZXAoYygiQSIsICJCIiwgIkMiKSwgZWFjaCA9IG4pLA0KICAgICAgICAgICAgICAgICBudW1iZXIgPSByZXAoYygyLCAxLCAzKSwgZWFjaCA9IG4pKQ0KZGZfcHJvcHMgPSBkYXRhLmZyYW1lKHZhbHVlID0gYyg1NSwgMzAsIDE1KSwNCiAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGMoIkEiLCAiQiIsICJDIikpDQpkZl9tdWx0aV9wcm9wcyA8LSBkYXRhLmZyYW1lKA0KICB2YXIxID0gcmVwKGMoIkMiLCAiQiIsICJBIiksIDMpLA0KICB2YXIyID0gcmVwKGMoIkEiLCAiQiIsICJDIiksIGVhY2ggPSAzKSwNCiAgY291bnQgPSBjKDQsIDEsIDIsIDEyLCA5LCA1LCA0LCA1LCA0KQ0KKSAlPiUgZ3JvdXBfYnkodmFyMikgJT4lDQogIG11dGF0ZShncm91cF9jb3VudCA9IHN1bShjb3VudCkpDQpkZl9tdWx0aV9wcm9wczIgPC0gZGF0YS5mcmFtZSgNCiAgdmFyMSA9IHJlcChjKCJCIiwgIkEiKSwgOSksDQogIHZhcjIgPSByZXAoYygiRSIsICJFIiwgIkQiLCAiRCIsICJDIiwgIkMiKSwgMyksDQogIHZhcjMgPSByZXAoYygiSCIsICJHIiwgIkYiKSwgZWFjaCA9IDYpLA0KICBjb3VudCA9IGMoNSwgOCwgMCwgMCwgMCwgMCwgMCwgMywgMiwgNywgMCwgMCwgNCwgMCwgNCwgMiwgNywgNCkNCikNCmRmX3NldHMgPC0gZ2F0aGVyX3NldF9kYXRhKGRmX211bHRpX3Byb3BzMiwgMTozKQ0KZGZfb25lX2xpbmUgPC0gZGF0YS5mcmFtZSgNCiAgeCA9IDE6NSwNCiAgeSA9IGMoMy4xLCAzLjMsIDQuMCwgMy44LCA0LjQpDQopDQpzZXQuc2VlZCg5NjgxKQ0KbjEgPC0gMTUwMC81DQpuMiA8LSA4MDAvNQ0KeDEgPC0gcm5vcm0objEsIDAsIC43KQ0KeTEgPC0gMiAqIHgxICsgcm5vcm0objEsIDAsIC44KQ0KeDIgPC0gcm5vcm0objIsIDAsIDAuNCkNCnkyIDwtIDEuNSAqIHgyICsgcm5vcm0objIsIC41LCAuOCkNCmRmX2RlbnNlX3NjYXR0ZXIgPC0gbmEub21pdCgNCiAgZGF0YS5mcmFtZSgNCiAgICB4ID0gc2NhbGVzOjpjZW5zb3IoYyh4MSwgeDIgKyAyLjIpLCBjKC0yLCA0KSksDQogICAgeSA9IHNjYWxlczo6Y2Vuc29yKGMoeTEsIHkyICsgMS41KSwgYygtMy41LCA0LjUpKQ0KICApDQopDQp5MSA8LSAyICogeDEgKyBybm9ybShuMSwgMCwgMS42KQ0KeTIgPC0gMS41ICogeDIgKyBybm9ybShuMiwgLjUsIDEuNikNCmRmX2RlbnNlX3NjYXR0ZXJfc2FtcGxlIDwtIG5hLm9taXQoDQogIGRhdGEuZnJhbWUoDQogICAgeCA9IHNjYWxlczo6Y2Vuc29yKGMoeDEsIHgyICsgMi4yKSwgYygtMiwgNCkpLA0KICAgIHkgPSBzY2FsZXM6OmNlbnNvcihjKHkxLCB5MiArIDEuNSksIGMoLTMuNSwgNC41KSkNCiAgKQ0KKSAlPiUgc2FtcGxlX24oNTApDQpkZl9jb25uZWN0ZWRfc2NhdHRlciA8LSBkYXRhLmZyYW1lKA0KICB4ID0gYygxLjksIDEuNSwgMi4yLCAzLCAzLjMsIDIuNywgMS43LCAxKSwNCiAgeSA9IGMoMC4zLCAtMSwgLTIuMCwgLTAuOSwgLjYsIDEuOCwgMiwgMC43KSwNCiAgdCA9IDE6OA0KKQ0KZGZfcGFpcmVkIDwtIGRhdGEuZnJhbWUoDQogIHkgPSBjKDYsIDUuMywgMy44LCAyLjgsIDIsDQogICAgICAgIDQuMywgNi4xLCA1LjEsIDMuMywgMi40KSwNCiAgeCA9IHJlcChjKCJBIiwgIkIiKSwgZWFjaCA9IDUpLA0KICBncm91cCA9IHJlcCgxOjUsIDIpDQopDQpkZl91bmNlcnRhaW4gPC0gZGF0YS5mcmFtZSgNCiAgdHlwZSA9IGMoIkEiLCAiQiIsICJDIiksDQogIHggPSBjKDEuNSwgMi4yLCAzLjQpLA0KICB5ID0gYygzLjIsIDUuMSwgMy45KSwNCiAgZHggPSBjKC4yNSwgLjMsIC4zNSksDQogIGR5ID0gYyguNSwgLjQsIC42KQ0KKQ0KIyBwYWxldHRlcw0KbnBhbCA8LSA1DQojIGVhcnRoLWJyb3duIChBbW91bnRzKQ0KcGFsX2VhcnRoX2Jyb3duIDwtIHNlcXVlbnRpYWxfaGNsKG4gPSBucGFsLCBoMSA9IDcxLCBjMSA9IDgwLCBjMiA9IDEwLCBsMSA9IDE4LCBsMiA9IDk3LCBwMSA9IDEuNSkNCiMgYnJvd24tZ3JlZW4gKFByb3BvcnRpb25zKQ0KcGFsX2Jyb3duX2dyZWVuIDwtIHNlcXVlbnRpYWxfaGNsKG4gPSBucGFsLCBoMSA9IDg2LCBjMSA9IDgwLCBjMiA9IDEwLCBsMSA9IDE4LCBsMiA9IDk3LCBwMSA9IDEuNSkNCiMgZ3JlZW4tYnJvd24gKEdlb3NwYXRpYWwgZGF0YSkNCnBhbF9ncmVlbl9icm93biA8LSBzZXF1ZW50aWFsX2hjbChuID0gbnBhbCwgaDEgPSAtMjY1LCBjMSA9IDgwLCBjMiA9IDEwLCBsMSA9IDE4LCBsMiA9IDk3LCBwMSA9IDEuNSkNCiMgYnVyZ3VuZHktcmVkIA0KcGFsX3JlZF9icm93biA8LSBzZXF1ZW50aWFsX2hjbChuID0gbnBhbCwgaDEgPSAyOCwgYzEgPSA4MCwgYzIgPSAxMCwgbDEgPSAxOCwgbDIgPSA5NywgcDEgPSAxLjUpDQojIGJyb3duLXJlZCAoVW5jZXJ0YWludHkpDQpwYWxfYnJvd25fcmVkIDwtIHNlcXVlbnRpYWxfaGNsKG4gPSBucGFsLCBoMSA9IDQxLCBjMSA9IDgwLCBjMiA9IDEwLCBsMSA9IDE4LCBsMiA9IDk3LCBwMSA9IDEuNSkNCiMgb2NlYW4tYmx1ZSAoRGlzdHJpYnV0aW9ucykNCnBhbF9vY2Vhbl9ibHVlIDwtIHNlcXVlbnRpYWxfaGNsKG4gPSBucGFsLCBoMSA9IDI0MSwgYzEgPSA4MCwgYzIgPSAxMCwgbDEgPSAxOCwgbDIgPSA5NywgcDEgPSAxLjUpDQojIHN0ZWVsLWJsdWUgKHgteSByZWxhdGlvbnNoaXBzKQ0KcGFsX3N0ZWVsX2JsdWUgPC0gc2VxdWVudGlhbF9oY2wobiA9IG5wYWwsIGgxID0gMjU3LCBjMSA9IDgwLCBjMiA9IDEwLCBsMSA9IDE4LCBsMiA9IDk3LCBwMSA9IDEuNSkNCnBhbF9zdGVlbF9ibHVlX2ludiA8LSBzZXF1ZW50aWFsX2hjbChuID0gbnBhbCwgaDEgPSAyNTctMTgwLCBjMSA9IDgwLCBjMiA9IDEwLCBsMSA9IDE4LCBsMiA9IDk3LCBwMSA9IDEuNSkNCmBgYA0KDQoNCg0KYGBge3J9DQoNCiMnIGR2aXouc3VwcA0KIycNCiMnIFN1cHBvcnRpbmcgbWF0ZXJpYWxzIGZvciBDbGF1cyBXaWxrZSdzIGRhdGEgdmlzdWFsaXphdGlvbiBib29rLg0KIycgQG5hbWUgZHZpei5zdXBwDQojJyBAZG9jVHlwZSBwYWNrYWdlDQojJyBAaW1wb3J0IGRwbHlyDQojJyBAaW1wb3J0IGNvd3Bsb3QNCiMnIEBpbXBvcnQgY29sb3JzcGFjZQ0KIycgQGltcG9ydCBjb2xvcmJsaW5kcg0KIA0KDQojICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiMgICAgICAgICAgICAgICAgICAgICBTZXR1cA0KIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCi5vbkF0dGFjaCA8LSBmdW5jdGlvbihsaWJuYW1lLCBwa2duYW1lKSB7DQogICMgc3dpdGNoIHRoZSBjb3dwbG90IG51bGwgZGV2aWNlDQogIGNvd3Bsb3Q6OnNldF9udWxsX2RldmljZSgicG5nIikNCn0NCg0KIycgQG5vUmQNCiMnIEB1c2FnZSBOVUxMDQojJyBAZXhwb3J0DQpkdml6X2ZvbnRfZmFtaWx5IDwtICJNeXJpYWQgUHJvIg0KDQojJyBAbm9SZA0KIycgQHVzYWdlIE5VTEwNCiMnIEBleHBvcnQNCmR2aXpfZm9udF9mYW1pbHlfYm9sZCA8LSAiTXlyaWFkIFBybyBTZW1pYm9sZCINCg0KIycgQG5vUmQNCiMnIEB1c2FnZSBOVUxMDQojJyBAZXhwb3J0DQpkdml6X2ZvbnRfZmFtaWx5X2NvbmRlbnNlZCA8LSAiTXlyaWFkIFBybyBDb25kZW5zZWQiDQoNCiMnIEBub1JkDQojJyBAdXNhZ2UgTlVMTA0KIycgQGV4cG9ydA0KZHZpel9mb250X2ZhbWlseV9ib2xkX2NvbmRlbnNlZCA8LSAiTXlyaWFkIFBybyBCb2xkIENvbmRlbnNlZCINCmBgYA0KDQoNCg0KDQoNCmBgYHtyfQ0KIycgVGhlbWVzIGZvciBkYXRhIHZpeiBib29rDQojJw0KIycgVGhlIHRoZW1lcyB1c2VkIGluIHRoZSBkYXRhIHZpc3VhbGl6YXRpb24gYm9vay4gVGhlIGRlZmF1bHQgZm9udCBmb3IgdGhlc2UNCiMnIHRoZW1lcyBpcyBNeXJpYWQgUHJvLCB3aGljaCBuZWVkcyB0byBiZSBpbnN0YWxsZWQgb24gdGhlIHRhcmdldCBzeXN0ZW0gZm9yDQojJyB0aGVzZSB0aGVtZXMgdG8gd29yay4NCiMnDQojJyBAcGFyYW0gZm9udF9zaXplIE92ZXJhbGwgZm9udCBzaXplDQojJyBAcGFyYW0gZm9udF9mYW1pbHkgRm9udCBmYW1pbHkgZm9yIHBsb3QgdGl0bGUsIGF4aXMgdGl0bGVzIGFuZCBsYWJlbHMsIGxlZ2VuZCB0ZXh0cywgZXRjLg0KIycgQHBhcmFtIGxpbmVfc2l6ZSBMaW5lIHNpemUgZm9yIGF4aXMgbGluZXMNCiMnIEBwYXJhbSByZWxfc21hbGwgUmVsYXRpdmUgc2l6ZSBvZiBzbWFsbCB0ZXh0IChlLmcuLCBheGlzIHRpY2sgbGFiZWxzKQ0KIycgQHBhcmFtIHJlbF90aW55IFJlbGF0aXZlIHNpemUgb2YgdGlueSB0ZXh0IChlLmcuLCBjYXB0aW9uKQ0KIycgQHBhcmFtIHJlbF9sYXJnZSBSZWxhdGl2ZSBzaXplIG9mIGxhcmdlIHRleHQgKGUuZy4sIHRpdGxlKQ0KIycgQGV4cG9ydA0KdGhlbWVfZHZpel9vcGVuIDwtIGZ1bmN0aW9uKGZvbnRfc2l6ZSA9IDE0LCBmb250X2ZhbWlseSA9IGR2aXpfZm9udF9mYW1pbHksIGxpbmVfc2l6ZSA9IC41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfc21hbGwgPSAxMi8xNCwgcmVsX3RpbnkgPSAxMS8xNCwgcmVsX2xhcmdlID0gMTYvMTQpIHsNCiAgaGFsZl9saW5lIDwtIGZvbnRfc2l6ZSAvIDINCiAgDQogIGNvd3Bsb3Q6OnRoZW1lX2hhbGZfb3Blbihmb250X3NpemUgPSBmb250X3NpemUsIGZvbnRfZmFtaWx5ID0gZm9udF9mYW1pbHksIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9zbWFsbCA9IHJlbF9zbWFsbCwgcmVsX3RpbnkgPSByZWxfdGlueSwgcmVsX2xhcmdlID0gcmVsX2xhcmdlKSAgJStyZXBsYWNlJQ0KICAgIHRoZW1lKA0KICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oaGFsZl9saW5lLzIsIDEuNSwgaGFsZl9saW5lLzIsIDEuNSksDQogICAgICBjb21wbGV0ZSA9IFRSVUUNCiAgICApDQp9DQoNCiMnIEByZG5hbWUgdGhlbWVfZHZpel9vcGVuDQojJyBAcGFyYW0gY29sb3VyIENvbG9yIG9mIGdyaWQgbGluZXMNCiMnIEBleHBvcnQNCnRoZW1lX2R2aXpfZ3JpZCA8LSBmdW5jdGlvbihmb250X3NpemUgPSAxNCwgZm9udF9mYW1pbHkgPSBkdml6X2ZvbnRfZmFtaWx5LCBsaW5lX3NpemUgPSAuNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfc21hbGwgPSAxMi8xNCwgcmVsX3RpbnkgPSAxMS8xNCwgcmVsX2xhcmdlID0gMTYvMTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk5MCIpIHsNCiAgaGFsZl9saW5lIDwtIGZvbnRfc2l6ZSAvIDINCiAgDQogIGNvd3Bsb3Q6OnRoZW1lX21pbmltYWxfZ3JpZChmb250X3NpemUgPSBmb250X3NpemUsIGZvbnRfZmFtaWx5ID0gZm9udF9mYW1pbHksIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9zbWFsbCA9IHJlbF9zbWFsbCwgcmVsX3RpbnkgPSByZWxfdGlueSwgcmVsX2xhcmdlID0gcmVsX2xhcmdlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gY29sb3VyKSAgJStyZXBsYWNlJQ0KICAgIHRoZW1lKA0KICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oaGFsZl9saW5lLzIsIDEuNSwgaGFsZl9saW5lLzIsIDEuNSksDQogICAgICBjb21wbGV0ZSA9IFRSVUUNCiAgICApDQp9DQoNCiMnIEByZG5hbWUgdGhlbWVfZHZpel9vcGVuDQojJyBAZXhwb3J0DQp0aGVtZV9kdml6X2hncmlkIDwtIGZ1bmN0aW9uKGZvbnRfc2l6ZSA9IDE0LCBmb250X2ZhbWlseSA9IGR2aXpfZm9udF9mYW1pbHksIGxpbmVfc2l6ZSA9IC41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9zbWFsbCA9IDEyLzE0LCByZWxfdGlueSA9IDExLzE0LCByZWxfbGFyZ2UgPSAxNi8xNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTkwIikgew0KICBoYWxmX2xpbmUgPC0gZm9udF9zaXplIC8gMg0KICANCiAgY293cGxvdDo6dGhlbWVfbWluaW1hbF9oZ3JpZChmb250X3NpemUgPSBmb250X3NpemUsIGZvbnRfZmFtaWx5ID0gZm9udF9mYW1pbHksIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9zbWFsbCA9IHJlbF9zbWFsbCwgcmVsX3RpbnkgPSByZWxfdGlueSwgcmVsX2xhcmdlID0gcmVsX2xhcmdlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gY29sb3VyKSAgJStyZXBsYWNlJQ0KICAgIHRoZW1lKA0KICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oaGFsZl9saW5lLzIsIDEuNSwgaGFsZl9saW5lLzIsIDEuNSksDQogICAgICBjb21wbGV0ZSA9IFRSVUUNCiAgICApDQp9DQoNCiMnIEByZG5hbWUgdGhlbWVfZHZpel9vcGVuDQojJyBAZXhwb3J0DQp0aGVtZV9kdml6X3ZncmlkIDwtIGZ1bmN0aW9uKGZvbnRfc2l6ZSA9IDE0LCBmb250X2ZhbWlseSA9IGR2aXpfZm9udF9mYW1pbHksIGxpbmVfc2l6ZSA9IC41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9zbWFsbCA9IDEyLzE0LCByZWxfdGlueSA9IDExLzE0LCByZWxfbGFyZ2UgPSAxNi8xNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTkwIikgew0KICBoYWxmX2xpbmUgPC0gZm9udF9zaXplIC8gMg0KICANCiAgY293cGxvdDo6dGhlbWVfbWluaW1hbF92Z3JpZChmb250X3NpemUgPSBmb250X3NpemUsIGZvbnRfZmFtaWx5ID0gZm9udF9mYW1pbHksIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9zbWFsbCA9IHJlbF9zbWFsbCwgcmVsX3RpbnkgPSByZWxfdGlueSwgcmVsX2xhcmdlID0gcmVsX2xhcmdlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gY29sb3VyKSAgJStyZXBsYWNlJQ0KICAgIHRoZW1lKA0KICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oaGFsZl9saW5lLzIsIDEuNSwgaGFsZl9saW5lLzIsIDEuNSksDQogICAgICBjb21wbGV0ZSA9IFRSVUUNCiAgICApDQp9DQoNCiMnIEByZG5hbWUgdGhlbWVfZHZpel9vcGVuDQojJyBAZXhwb3J0DQp0aGVtZV9kdml6X21hcCA8LSBmdW5jdGlvbihmb250X3NpemUgPSAxNCwgZm9udF9mYW1pbHkgPSBkdml6X2ZvbnRfZmFtaWx5LCBsaW5lX3NpemUgPSAuNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfc21hbGwgPSAxMi8xNCwgcmVsX3RpbnkgPSAxMS8xNCwgcmVsX2xhcmdlID0gMTYvMTQpIHsNCiAgaGFsZl9saW5lIDwtIGZvbnRfc2l6ZSAvIDINCiAgDQogIGNvd3Bsb3Q6OnRoZW1lX21hcChmb250X3NpemUgPSBmb250X3NpemUsIGZvbnRfZmFtaWx5ID0gZm9udF9mYW1pbHksIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9zbWFsbCA9IHJlbF9zbWFsbCwgcmVsX3RpbnkgPSByZWxfdGlueSwgcmVsX2xhcmdlID0gcmVsX2xhcmdlKSAgJStyZXBsYWNlJQ0KICAgIHRoZW1lKA0KICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oaGFsZl9saW5lLzIsIDEuNSwgaGFsZl9saW5lLzIsIDEuNSksDQogICAgICBjb21wbGV0ZSA9IFRSVUUNCiAgICApDQp9DQpgYGANCg0KDQoNCiMgQW1vdW50cw0KDQpgYGB7ciBhbW91bnRzLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMS80fQ0KcGFsZXR0ZSA8LSBwYWxfZWFydGhfYnJvd24NCg0KcDEgPC0gZ2dwbG90KGRmX3Byb3BzLCBhZXMoeCA9IGdyb3VwLCB5ID0gdmFsdWUpKSArIA0KICBnZW9tX2NvbCgNCiAgICBwb3NpdGlvbj0iaWRlbnRpdHkiLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0sDQogICAgZmlsbCA9IHBhbGV0dGVbM10sIHdpZHRoID0gMC44DQogICkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA2NiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVsyOjRdKSArDQogIGxhYnModGl0bGUgPSAiQmFycyIpICsNCiAgdGhlbWVfcGxvdF9pY29uX2hncmlkKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQoNCg0KcDIgPC0gZ2dwbG90KGRmX3Byb3BzLCBhZXMoeCA9IGZjdF9yZXYoZ3JvdXApLCB5ID0gdmFsdWUpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbj0iaWRlbnRpdHkiLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0sIGZpbGwgPSBwYWxldHRlWzNdLA0KICAgICAgICAgICB3aWR0aCA9IC44KSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDY2KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBwYWxldHRlWzI6NF0pICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh0aXRsZSA9ICJCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25fdmdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnAzIDwtIGdncGxvdChmaWx0ZXIoZGZfbXVsdGlfYW1vdW50cywgeCE9NCksIGFlcyh4LCB5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPWZhY3Rvcih0eXBlLCBsZXZlbHMgPSBjKCJBIiwgIkMiLCAiQiIpKSkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uPSJkb2RnZSIsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSwNCiAgICAgICAgICAgd2lkdGggPSAuNykgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwNCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwgLjcpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbMjo0XSkgKw0KICBsYWJzKHRpdGxlID0gIkdyb3VwZWQgQmFycyIpICsNCiAgdGhlbWVfcGxvdF9pY29uX2hncmlkKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNCA8LSBnZ3Bsb3QoZmlsdGVyKGRmX211bHRpX2Ftb3VudHMsIHghPTQpLCBhZXMoeCwgeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1mYWN0b3IodHlwZSwgbGV2ZWxzID0gYygiQiIsICJDIiwgIkEiKSkpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbj0iZG9kZ2UiLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0sDQogICAgICAgICAgIHdpZHRoID0gLjcpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsIC43KSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSByZXYocGFsZXR0ZVsyOjRdKSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIkdyb3VwZWQgQmFycyIpICsNCiAgdGhlbWVfcGxvdF9pY29uX3ZncmlkKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNSA8LSBnZ3Bsb3QoZGZfbXVsdGlfYW1vdW50cywgYWVzKHgsIHksIGZpbGw9ZmFjdG9yKHR5cGUsIGxldmVscyA9IGMoIkIiLCAiQyIsICJBIikpKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb249InN0YWNrIiwgY29sb3IgPSBwYWxldHRlW25wYWxdKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEuNTUpLA0KICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSByZXYocGFsZXR0ZVsyOjRdKSkgKw0KICBsYWJzKHRpdGxlID0gIlN0YWNrZWQgQmFycyIpICsNCiAgdGhlbWVfcGxvdF9pY29uX2hncmlkKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNiA8LSBwNSArIGNvb3JkX2ZsaXAoKSArIHRoZW1lX3Bsb3RfaWNvbl92Z3JpZChwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDcgPC0gZ2dwbG90KGRmX3Byb3BzLCBhZXMoeCA9IGZjdF9yZXYoZ3JvdXApLCB5ID0gdmFsdWUpKSArIA0KICBnZW9tX3BvaW50KGNvbG9yID0gcGFsZXR0ZVsyXSwgc2l6ZSA9IDIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNjYpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIGNvb3JkX2ZsaXAoKSArIA0KICBsYWJzKHRpdGxlID0gIkRvdHMiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl92Z3JpZChwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDggPC0gZ2dwbG90KGZpbHRlcihkZl9tdWx0aV9hbW91bnRzLCB4ICE9IDEpLCBhZXMoeCwgeSA9IGZhY3Rvcih0eXBlLCBsZXZlbHMgPSBjKCJBIiwgIkMiLCAiQiIpKSwgZmlsbCA9IHkpKSArIA0KICBnZW9tX3RpbGUoY29sb3IgPSBwYWxldHRlWzVdLCBzaXplID0gMS41KSArDQogIHNjYWxlX2ZpbGxfY29udGludW91c19zZXF1ZW50aWFsKA0KICAgIGgxID0gNzEsIGMxID0gODAsIGMyID0gMTAsIGwxID0gMTgsIGwyID0gOTcsIHAxID0gMS41LA0KICAgIGJlZ2luID0gMC4yLCBlbmQgPSAwLjc1LA0KICAgIHJldiA9IEZBTFNFDQogICkgKw0KICBsYWJzKHRpdGxlID0gIkhlYXRtYXAiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHAxLCBwMiwgcDcsIG5jb2wgPSA0LCBzY2FsZSA9IC45KQ0KYGBgDQoNClRoZSBtb3N0IGNvbW1vbiBhcHByb2FjaCB0byB2aXN1YWxpemluZyBhbW91bnRzIChpLmUuLCBudW1lcmljYWwgdmFsdWVzIHNob3duIGZvciBzb21lIHNldCBvZiBjYXRlZ29yaWVzKSBpcyB1c2luZyBiYXJzLCBlaXRoZXIgdmVydGljYWxseSBvciBob3Jpem9udGFsbHkgYXJyYW5nZWQuIEhvd2V2ZXIsIGluc3RlYWQgb2YgdXNpbmcgYmFycywgd2UgY2FuIGFsc28gcGxhY2UgZG90cyBhdCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgYmFyIHdvdWxkIGVuZC4NCg0KDQpgYGB7ciBhbW91bnRzX211bHRpLCBmaWcud2lkdGggPSA1KjYvNC4yLCBmaWcuYXNwID0gMS8yfQ0KcGxvdF9ncmlkKHAzLCBwNCwgcDUsIHA2LCANCiAgICAgICAgICBwOCwgbmNvbCA9IDQsIHNjYWxlID0gLjkpDQpgYGANCg0KSWYgdGhlcmUgYXJlIHR3byBvciBtb3JlIHNldHMgb2YgY2F0ZWdvcmllcyBmb3Igd2hpY2ggd2Ugd2FudCB0byBzaG93IGFtb3VudHMsIHdlIGNhbiBncm91cCBvciBzdGFjayB0aGUgYmFycy4gV2UgY2FuIGFsc28gbWFwIHRoZSBjYXRlZ29yaWVzIG9udG8gdGhlICp4KiBhbmQgKnkqIGF4ZXMgYW5kIHNob3cgYW1vdW50cyBieSBjb2xvciwgdmlhIGEgaGVhdG1hcC4gDQoNCg0KDQojIERpc3RyaWJ1dGlvbnMNCg0KYGBge3Igc2luZ2xlLWRpc3RyaWJ1dGlvbnMsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpwYWxldHRlIDwtIHBhbF9vY2Vhbl9ibHVlDQpwMSA8LSBnZ3Bsb3QoZGZfb25lX2Rpc3QsIGFlcyh4KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gcGFsZXR0ZVszXSwgY29sb3IgPSBwYWxldHRlW25wYWxdLCBiaW53aWR0aCA9IDEsIGNlbnRlciA9IDApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTQuOCwgNi44KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAzNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0iKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDIgPC0gZ2dwbG90KGRmX29uZV9kaXN0LCBhZXMoeCkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSBwYWxldHRlWzNdLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0sIGJ3ID0gLjM1KSArDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC00LjgsIDYuOCksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgLjI3KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBsYWJzKHRpdGxlID0gIkRlbnNpdHkgUGxvdCIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwMyA8LSBnZ3Bsb3QoZGZfb25lX25vcm1hbCwgYWVzKHgpKSArDQogIHN0YXRfZWNkZihjb2xvciA9IHBhbGV0dGVbMl0sIHNpemUgPSAuNykgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLjA1LCAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxLjA4KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBsYWJzKHRpdGxlID0gIkN1bXVsYXRpdmUgRGVuc2l0eSIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNCA8LSBnZ3Bsb3QoZGZfb25lX25vcm1hbCwgYWVzKHNhbXBsZSA9IHgpKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgY29sb3IgPSBwYWxldHRlWzNdKSArDQogIGdlb21fcXEoY29sb3IgPSBwYWxldHRlWzFdLCBzaXplID0gMC44KSArDQogIGxhYnModGl0bGUgPSAiUXVhbnRpbGUtUXVhbnRpbGUgUGxvdCIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwbG90X2dyaWQocDEsIHAyLCBwMywgcDQsIG5jb2wgPSA0LCBzY2FsZSA9IC45KQ0KYGBgDQoNCkhpc3RvZ3JhbXMgYW5kIGRlbnNpdHkgcGxvdHMgcHJvdmlkZSB0aGUgbW9zdCBpbnR1aXRpdmUgdmlzdWFsaXphdGlvbnMgb2YgYSBkaXN0cmlidXRpb24sIGJ1dCBib3RoIHJlcXVpcmUgYXJiaXRyYXJ5IHBhcmFtZXRlciBjaG9pY2VzIGFuZCBjYW4gYmUgbWlzbGVhZGluZy4gQ3VtdWxhdGl2ZSBkZW5zaXRpZXMgYW5kIHF1YW50aWxlLXF1YW50aWxlIChxLXEpIHBsb3RzIGFsd2F5cyByZXByZXNlbnQgdGhlIGRhdGEgZmFpdGhmdWxseSBidXQgY2FuIGJlIG1vcmUgZGlmZmljdWx0IHRvIGludGVycHJldC4NCg0KDQpgYGB7cn0NCiMnIGdncGxvdDIgc3RhdCB0aGF0IGNyZWF0ZXMgc2luYSBwbG90cw0KIycgDQojJyBUaGlzIHN0YXQgY2xvc2VseSBtaXJyb3JzIFtgc3RhdF95ZGVuc2l0eSgpYF0gZnJvbSBnZ3Bsb3QyLiBUaGlzIGVuYWJsZXMgdGhlDQojJyB1c2VyIHRvIHBsb3Qgc2luYSBwbG90cyBvbiB0b3Agb2YgdmlvbGluIHBsb3RzIGFuZCBoYXZlIHRoZW0gbWF0Y2ggcGVyZmVjdGx5Lg0KIycgDQojJyBAaW5oZXJpdFBhcmFtcyBnZ3Bsb3QyOjpsYXllcg0KIycgQGluaGVyaXRQYXJhbXMgZ2dwbG90Mjo6Z2VvbV9wb2ludA0KIycgQGluaGVyaXRQYXJhbXMgZ2dwbG90Mjo6c3RhdF9kZW5zaXR5DQojJyBAcGFyYW0gc2NhbGUgaWYgImFyZWEiIChkZWZhdWx0KSwgYWxsIHZpb2xpbnMgaGF2ZSB0aGUgc2FtZSBhcmVhIChiZWZvcmUgdHJpbW1pbmcNCiMnICAgdGhlIHRhaWxzKS4gSWYgImNvdW50IiwgYXJlYXMgYXJlIHNjYWxlZCBwcm9wb3J0aW9uYWxseSB0byB0aGUgbnVtYmVyIG9mDQojJyAgIG9ic2VydmF0aW9ucy4gSWYgIndpZHRoIiwgYWxsIHZpb2xpbnMgaGF2ZSB0aGUgc2FtZSBtYXhpbXVtIHdpZHRoLg0KIycgQHNlZWFsc28gW2dlb21fdmlvbGluKCldDQojJyBAZXhhbXBsZXMNCiMnIGdncGxvdChpcmlzLCBhZXMoU3BlY2llcywgU2VwYWwuTGVuZ3RoKSkgKw0KIycgICBnZW9tX3Zpb2xpbihjb2xvciA9IE5BKSArDQojJyAgIHN0YXRfc2luYSgpDQojJyBAZXhwb3J0DQpzdGF0X3NpbmEgPC0gZnVuY3Rpb24obWFwcGluZyA9IE5VTEwsIGRhdGEgPSBOVUxMLA0KICAgICAgICAgICAgICAgICAgICAgIGdlb20gPSAicG9pbnQiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsDQogICAgICAgICAgICAgICAgICAgICAgLi4uLA0KICAgICAgICAgICAgICAgICAgICAgIGJ3ID0gIm5yZDAiLA0KICAgICAgICAgICAgICAgICAgICAgIGFkanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAga2VybmVsID0gImdhdXNzaWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICB0cmltID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9ICJhcmVhIiwNCiAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBUUlVFKSB7DQogIHNjYWxlIDwtIG1hdGNoLmFyZyhzY2FsZSwgYygiYXJlYSIsICJjb3VudCIsICJ3aWR0aCIpKQ0KICANCiAgbGF5ZXIoDQogICAgZGF0YSA9IGRhdGEsDQogICAgbWFwcGluZyA9IG1hcHBpbmcsDQogICAgc3RhdCA9IFN0YXRTaW5hLA0KICAgIGdlb20gPSBnZW9tLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb24sDQogICAgc2hvdy5sZWdlbmQgPSBzaG93LmxlZ2VuZCwNCiAgICBpbmhlcml0LmFlcyA9IGluaGVyaXQuYWVzLA0KICAgIHBhcmFtcyA9IGxpc3QoDQogICAgICBidyA9IGJ3LA0KICAgICAgYWRqdXN0ID0gYWRqdXN0LA0KICAgICAga2VybmVsID0ga2VybmVsLA0KICAgICAgdHJpbSA9IHRyaW0sDQogICAgICBzY2FsZSA9IHNjYWxlLA0KICAgICAgbmEucm0gPSBuYS5ybSwNCiAgICAgIC4uLg0KICAgICkNCiAgKQ0KfQ0KDQoNCiMnIEByZG5hbWUgc3RhdF9zaW5hDQojJyBAZm9ybWF0IE5VTEwNCiMnIEB1c2FnZSBOVUxMDQojJyBAZXhwb3J0DQpTdGF0U2luYSA8LSBnZ3Byb3RvKCJTdGF0U2luYSIsIFN0YXQsDQogIHJlcXVpcmVkX2FlcyA9IGMoIngiLCAieSIpLA0KICBub25fbWlzc2luZ19hZXMgPSAid2VpZ2h0IiwNCiAgDQogIGNvbXB1dGVfZ3JvdXAgPSBmdW5jdGlvbihkYXRhLCBzY2FsZXMsIHdpZHRoID0gTlVMTCwgYncgPSAibnJkMCIsIGFkanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWwgPSAiZ2F1c3NpYW4iLCB0cmltID0gVFJVRSwgbmEucm0gPSBGQUxTRSkgew0KICAgIGlmIChucm93KGRhdGEpIDwgMykgcmV0dXJuKGRhdGEuZnJhbWUoKSkNCiAgICByYW5nZSA8LSByYW5nZShkYXRhJHksIG5hLnJtID0gVFJVRSkNCiAgICBtb2RpZmllciA8LSBpZiAodHJpbSkgMCBlbHNlIDMNCiAgICBidyA8LSBjYWxjX2J3KGRhdGEkeSwgYncpDQogICAgZGVucyA8LSBnZ3Bsb3QyOjo6Y29tcHV0ZV9kZW5zaXR5KGRhdGEkeSwgZGF0YSR3LCBmcm9tID0gcmFuZ2VbMV0gLSBtb2RpZmllcipidywgdG8gPSByYW5nZVsyXSArIG1vZGlmaWVyKmJ3LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3ID0gYncsIGFkanVzdCA9IGFkanVzdCwga2VybmVsID0ga2VybmVsKQ0KICAgIA0KICAgIGRlbnNmIDwtIGFwcHJveGZ1bihkZW5zJHgsIGRlbnMkZGVuc2l0eSwgcnVsZSA9IDIpDQogIA0KICAgICMgQ29tcHV0ZSB3aWR0aCBpZiB4IGhhcyBtdWx0aXBsZSB2YWx1ZXMNCiAgICBpZiAobGVuZ3RoKHVuaXF1ZShkYXRhJHgpKSA+IDEpIHsNCiAgICAgIHdpZHRoIDwtIGRpZmYocmFuZ2UoZGF0YSR4KSkgKiAwLjkNCiAgICB9DQogICAgZGF0YSR3aWR0aCA8LSB3aWR0aA0KICAgIA0KICAgIGRhdGEkZGVuc2l0eSA8LSBkZW5zZihkYXRhJHkpDQogICAgZGF0YSR4IDwtIG1lYW4ocmFuZ2UoZGF0YSR4KSkNCiAgICANCiAgICBkYXRhDQogIH0sDQogIA0KICBjb21wdXRlX3BhbmVsID0gZnVuY3Rpb24oc2VsZiwgZGF0YSwgc2NhbGVzLCB3aWR0aCA9IE5VTEwsIGJ3ID0gIm5yZDAiLCBhZGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsID0gImdhdXNzaWFuIiwgdHJpbSA9IFRSVUUsIG5hLnJtID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9ICJhcmVhIikgew0KICAgIGRhdGEgPC0gZ2dwcm90b19wYXJlbnQoU3RhdCwgc2VsZikkY29tcHV0ZV9wYW5lbCgNCiAgICAgIGRhdGEsIHNjYWxlcywgd2lkdGggPSB3aWR0aCwgYncgPSBidywgYWRqdXN0ID0gYWRqdXN0LCBrZXJuZWwgPSBrZXJuZWwsDQogICAgICB0cmltID0gdHJpbSwgbmEucm0gPSBuYS5ybQ0KICAgICkNCiAgICANCiAgICAjIGNob29zZSBob3cgdmlvbGlucyBhcmUgc2NhbGVkIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXINCiAgICBkYXRhJHZpb2xpbndpZHRoIDwtIHN3aXRjaChzY2FsZSwNCiAgICAgICMgYXJlYSA6IGtlZXAgdGhlIG9yaWdpbmFsIGRlbnNpdGllcyBidXQgc2NhbGUgdGhlbSB0byBhIG1heCB3aWR0aCBvZiAxDQogICAgICAjICAgICAgICBmb3IgcGxvdHRpbmcgcHVycG9zZXMgb25seQ0KICAgICAgYXJlYSA9IGRhdGEkZGVuc2l0eSAvIG1heChkYXRhJGRlbnNpdHkpLA0KICAgICAgIyBjb3VudDogdXNlIHRoZSBvcmlnaW5hbCBkZW5zaXRpZXMgc2NhbGVkIHRvIGEgbWF4aW11bSBvZiAxIChhcyBhYm92ZSkNCiAgICAgICMgICAgICAgIGFuZCB0aGVuIHNjYWxlIHRoZW0gYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zDQogICAgICBjb3VudCA9IGRhdGEkZGVuc2l0eSAvIG1heChkYXRhJGRlbnNpdHkpICogZGF0YSRuIC8gbWF4KGRhdGEkbiksDQogICAgICAjIHdpZHRoOiBjb25zdGFudCB3aWR0aCAoZGVuc2l0eSBzY2FsZWQgdG8gYSBtYXhpbXVtIG9mIDEpDQogICAgICB3aWR0aCA9IGRhdGEkc2NhbGVkDQogICAgKQ0KICAgIA0KICAgIGRhdGEkeCA8LSBkYXRhJHggKyBydW5pZihucm93KGRhdGEpLCBtaW4gPSAtMSwgbWF4ID0gMSkgKg0KICAgICAgMC45KmRhdGEkdmlvbGlud2lkdGgvMg0KICAgIA0KICAgIGRhdGENCiAgfQ0KICANCikNCg0KY2FsY19idyA8LSBmdW5jdGlvbih4LCBidykgew0KICBpZiAoaXMuY2hhcmFjdGVyKGJ3KSkgew0KICAgIGlmIChsZW5ndGgoeCkgPCAyKQ0KICAgICAgc3RvcCgibmVlZCBhdCBsZWFzdCAyIHBvaW50cyB0byBzZWxlY3QgYSBiYW5kd2lkdGggYXV0b21hdGljYWxseSIsIGNhbGwuID0gRkFMU0UpDQogICAgYncgPC0gc3dpdGNoKA0KICAgICAgdG9sb3dlcihidyksDQogICAgICBucmQwID0gc3RhdHM6OmJ3Lm5yZDAoeCksDQogICAgICBucmQgPSBzdGF0czo6YncubnJkKHgpLA0KICAgICAgdWN2ID0gc3RhdHM6OmJ3LnVjdih4KSwNCiAgICAgIGJjdiA9IHN0YXRzOjpidy5iY3YoeCksDQogICAgICBzaiA9ICwNCiAgICAgIGBzai1zdGVgID0gc3RhdHM6OmJ3LlNKKHgsIG1ldGhvZCA9ICJzdGUiKSwNCiAgICAgIGBzai1kcGlgID0gc3RhdHM6OmJ3LlNKKHgsIG1ldGhvZCA9ICJkcGkiKSwNCiAgICAgIHN0b3AoInVua25vd24gYmFuZHdpZHRoIHJ1bGUiKQ0KICAgICkNCiAgfQ0KICBidw0KfQ0KYGBgDQoNCg0KDQpgYGB7ciBtdWx0aXBsZS1kaXN0cmlidXRpb25zLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMS8yfQ0KcGFsZXR0ZSA8LSBwYWxfb2NlYW5fYmx1ZQ0KcDEgPC0gZ2dwbG90KGRmX211bHRpX2Rpc3QsIGFlcyh4ID0gdHlwZSwgeSA9IHkpKSArIA0KICBnZW9tX2JveHBsb3QoY29sb3IgPSBwYWxldHRlWzFdLCBmaWxsID0gcGFsZXR0ZVs0XSkgKw0KICBsYWJzKHRpdGxlID0gIkJveHBsb3RzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnAyIDwtIGdncGxvdChkZl9tdWx0aV9kaXN0LCBhZXMoeCA9IHR5cGUsIHkgPSB5KSkgKyANCiAgZ2VvbV92aW9saW4oY29sb3IgPSBwYWxldHRlW25wYWxdLCBmaWxsID0gcGFsZXR0ZVsyXSwgc2l6ZSA9IDApICsNCiAgbGFicyh0aXRsZSA9ICJWaW9saW5zIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCmRmX211bHRpX2Rpc3Rfc21hbGwgPC0gZ3JvdXBfYnkoZGZfbXVsdGlfZGlzdCwgdHlwZSkgJT4lDQogIHNhbXBsZV9uKDUwKQ0KcDMgPC0gZ2dwbG90KGRmX211bHRpX2Rpc3Rfc21hbGwsIGFlcyh4ID0gdHlwZSwgeSA9IHkpKSArIA0KICBnZW9tX2ppdHRlcihjb2xvciA9IHBhbGV0dGVbMV0sIHdpZHRoID0gMC4xNSwgaGVpZ2h0ID0gMCwgc2l6ZSA9IC4zKSArDQogIGxhYnModGl0bGUgPSAiU3RyaXAgQ2hhcnRzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA0IDwtIGdncGxvdChkZl9tdWx0aV9kaXN0X3NtYWxsLCBhZXMoeCA9IHR5cGUsIHkgPSB5KSkgKyANCiAgIHN0YXRfc2luYShjb2xvciA9IHBhbGV0dGVbMV0sIHNpemUgPSAwLjMpICsNCiAgbGFicyh0aXRsZSA9ICJTaW5hIFBsb3RzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA1IDwtIGdncGxvdChkZl9tdWx0aV9kaXN0LCBhZXMoeCA9IHksIGZpbGwgPSBmYWN0b3IodHlwZSwgbGV2ZWxzID0gYygiQyIsICJBIiwgIkIiKSkpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShjb2xvciA9IHBhbGV0dGVbbnBhbF0sIGJpbndpZHRoID0gMC41LCBjZW50ZXIgPSAwKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbMjo0XSkgKw0KICBsYWJzKHRpdGxlID0gIlN0YWNrZWQgSGlzdG9ncmFtcyIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA0OSksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNiA8LSBnZ3Bsb3QoZGZfbXVsdGlfZGlzdCwgYWVzKHggPSB5LCBmaWxsID0gZmFjdG9yKHR5cGUsIGxldmVscyA9IGMoIkMiLCAiQSIsICJCIikpKSkgKyANCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC43LCBjb2xvciA9IHBhbGV0dGVbbnBhbF0pICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVsxOjNdKSArDQogIGxhYnModGl0bGUgPSAiT3ZlcmxhcHBpbmcgRGVuc2l0aWVzIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEuMSksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNyA8LSBnZ3Bsb3QoZGZfbXVsdGlfZGlzdCwgYWVzKHggPSB5LCB5ID0gbnVtYmVyLCBncm91cCA9IG51bWJlcikpICsgDQogIGdlb21fZGVuc2l0eV9yaWRnZXMoYWxwaGEgPSAwLjcsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSwgZmlsbCA9IHBhbGV0dGVbMl0sIHNjYWxlID0gMi41KSArDQogIGxhYnModGl0bGUgPSAiUmlkZ2VsaW5lIFBsb3QiKSArDQogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDEsIDYuNSksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwbG90X2dyaWQocDEsIHAyLCBwMywgcDQsIA0KICAgICAgICAgIHA1LCBwNiwgcDcsIG5jb2wgPSA0LCBzY2FsZSA9IC45KQ0KYGBgDQoNCg0KQm94LXBsb3RzLCB2aW9saW5zLCBzdHJpcCBjaGFydHMsIGFuZCBzaW5hIHBsb3RzIGFyZSB1c2VmdWwgd2hlbiB3ZSB3YW50IHRvIHZpc3VhbGl6ZSBtYW55IGRpc3RyaWJ1dGlvbnMgYXQgb25jZSBhbmQvb3IgaWYgd2UgYXJlIHByaW1hcmlseSBpbnRlcmVzdGVkIGluIG92ZXJhbGwgc2hpZnRzIGFtb25nIHRoZSBkaXN0cmlidXRpb25zLiBTdGFja2VkIGhpc3RvZ3JhbXMgYW5kIG92ZXJsYXBwaW5nIGRlbnNpdGllcyBhbGxvdyBhIG1vcmUgaW4tZGVwdGggY29tcGFyaXNvbiBvZiBhIHNtYWxsZXIgbnVtYmVyIG9mIGRpc3RyaWJ1dGlvbnMsIHRob3VnaCBzdGFja2VkIGhpc3RvZ3JhbXMgY2FuIGJlIGRpZmZpY3VsdCB0byBpbnRlcnByZXQgYW5kIGFyZSBiZXN0IGF2b2lkZWQuIFJpZGdlbGluZSBwbG90cyBjYW4gYmUgYSB1c2VmdWwgYWx0ZXJuYXRpdmUgdG8gdmlvbGluIHBsb3RzIGFuZCBhcmUgb2Z0ZW4gdXNlZnVsIHdoZW4gdmlzdWFsaXppbmcgdmVyeSBsYXJnZSBudW1iZXJzIG9mIGRpc3RyaWJ1dGlvbnMgb3IgY2hhbmdlcyBpbiBkaXN0cmlidXRpb25zIG92ZXIgdGltZS4NCg0KDQoNCiMgUHJvcG9ydGlvbnMNCg0KYGBge3IgcHJvcG9ydGlvbnMsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpwYWxldHRlIDwtIHBhbF9icm93bl9ncmVlbg0KcDFfbWFpbiA8LSBnZ3Bsb3QoZGZfcHJvcHMsIGFlcyh4ID0gMSwgeSA9IHZhbHVlLCBmaWxsID0gZ3JvdXApKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSkgKyANCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwsIG5hbWUgPSAiIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCwgbmFtZSA9ICIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbMjo0XSkgKw0KICB0aGVtZV9wbG90X2ljb25fYmxhbmsocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkgKw0KICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKSkNCiMgbWFrZSBzdXJlIHBsb3QgYmFja2dyb3VuZCBpcyBmdWxseSBmaWxsZWQsIGFzIGluIHRoZSBvdGhlciBwbG90cw0KcDEgPC0gZ2dkcmF3KHAxX21haW4pICsNCiAgbGFicyh0aXRsZSA9ICJQaWUgQ2hhcnQiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDIgPC0gZ2dwbG90KGRmX3Byb3BzLCBhZXMoeCA9IGZhY3RvcigxKSwgeSA9IHZhbHVlLCBmaWxsID0gZ3JvdXApKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHJldmVyc2UgPSBUUlVFKSwgd2lkdGggPSAuNDUsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTA4KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBwYWxldHRlWzI6NF0pICsNCiAgbGFicyh0aXRsZSA9ICJTdGFja2VkIEJhcnMiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9oZ3JpZChwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDMgPC0gZ2dwbG90KGRmX3Byb3BzLCBhZXMoeCA9IGZhY3RvcigxKSwgeSA9IHZhbHVlLCBmaWxsID0gZ3JvdXApKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHJldmVyc2UgPSBUUlVFKSwgd2lkdGggPSAuNDUsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSkgKyANCiAgI3NjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDExMCksIGV4cGFuZCA9IGMoMCwgMCksIHBvc2l0aW9uID0gInJpZ2h0IikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxMTApLCBleHBhbmQgPSBjKDAsIDApKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbMjo0XSkgKw0KICBsYWJzKHRpdGxlID0gIlN0YWNrZWQgQmFycyIpICsNCiAgdGhlbWVfcGxvdF9pY29uX3ZncmlkKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNCA8LSBnZ3Bsb3QoZGZfcHJvcHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSB2YWx1ZSwgZmlsbCA9IGdyb3VwKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb249ImlkZW50aXR5IiwgY29sb3IgPSBwYWxldHRlW25wYWxdLA0KICAgICAgICAgICB3aWR0aCA9IC44KSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDY2KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBwYWxldHRlWzI6NF0pICsNCiAgbGFicyh0aXRsZSA9ICJCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA1IDwtIGdncGxvdChkZl9wcm9wcywgYWVzKHggPSBmY3RfcmV2KGdyb3VwKSwgeSA9IHZhbHVlLCBmaWxsID0gZ3JvdXApKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbj0iaWRlbnRpdHkiLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0sDQogICAgICAgICAgIHdpZHRoID0gLjgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNjYpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbMjo0XSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIkJhcnMiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl92Z3JpZChwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHAxLCBwNCwgcDUsIHAyLCBuY29sID0gNCwgc2NhbGUgPSAuOSkNCmBgYA0KDQpQcm9wb3J0aW9ucyBjYW4gYmUgdmlzdWFsaXplZCBhcyBwaWUgY2hhcnRzLCBzaWRlLWJ5LXNpZGUgYmFycywgb3Igc3RhY2tlZCBiYXJzLCBhbmQgYXMgaW4gdGhlIGNhc2UgZm9yIGFtb3VudHMsIGJhcnMgY2FuIGJlIGFycmFuZ2VkIGVpdGhlciB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseS4gUGllIGNoYXJ0cyBlbXBoYXNpemUgdGhhdCB0aGUgaW5kaXZpZHVhbCBwYXJ0cyBhZGQgdXAgdG8gYSB3aG9sZSBhbmQgaGlnaGxpZ2h0IHNpbXBsZSBmcmFjdGlvbnMuIEhvd2V2ZXIsIHRoZSBpbmRpdmlkdWFsIHBpZWNlcyBhcmUgbW9yZSBlYXNpbHkgY29tcGFyZWQgaW4gc2lkZS1ieS1zaWRlIGJhcnMuIFN0YWNrZWQgYmFycyBsb29rIGF3a3dhcmQgZm9yIGEgc2luZ2xlIHNldCBvZiBwcm9wb3J0aW9ucywgYnV0IGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wYXJpbmcgbXVsdGlwbGUgc2V0cyBvZiBwcm9wb3J0aW9ucyAoc2VlIGJlbG93KS4NCg0KDQpgYGB7ciBwcm9wb3J0aW9ucy1jb21wLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMS80fQ0KcDUgPC0gZ2dwbG90KGZpbHRlcihkZl9mcmFjdGlvbnMsIHghPTQpLCBhZXMoeCwgeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1mYWN0b3IodHlwZSwgbGV2ZWxzID0gYygiQSIsICJDIiwgIkIiKSkpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbj0iZG9kZ2UiLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0sDQogICAgICAgICAgIHdpZHRoID0gLjcpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsIC41OCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVsyOjRdKSArDQogIGxhYnModGl0bGUgPSAiR3JvdXBlZCBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA2IDwtIGdncGxvdChkZl9mcmFjdGlvbnMsIGFlcyh4LCB5LCBmaWxsPXR5cGUpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbj0ic3RhY2siLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0pICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMS4wOCksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVsyOjRdKSArDQogIGxhYnModGl0bGUgPSAiU3RhY2tlZCBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA3IDwtIGdncGxvdChkZl9tdWx0aV9kaXN0LCBhZXMoeCA9IHksIGZpbGwgPSBmYWN0b3IodHlwZSwgbGV2ZWxzID0gYygiQyIsICJBIiwgIkIiKSkpKSArIA0KICBnZW9tX2RlbnNpdHkoY29sb3IgPSBwYWxldHRlW25wYWxdLCBwb3NpdGlvbiA9ICJmaWxsIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBwYWxldHRlWzI6NF0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMC4wNCwgMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMS4wOCksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgbGFicyh0aXRsZSA9ICJTdGFja2VkIERlbnNpdGllcyIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwOF9hIDwtIGdncGxvdChmaWx0ZXIoZGZfZnJhY3Rpb25zLCB4PT0xKSwgYWVzKHggPSAxLCB5ID0geSwgZmlsbCA9IHR5cGUpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSkgKyANCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwsIG5hbWUgPSAiIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCwgbmFtZSA9ICIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbYygyLCAxLCAzKV0pICsNCiAgdGhlbWVfcGxvdF9pY29uX2JsYW5rKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0sIGZvbnRfc2l6ZSA9IDUpICsNCiAgdGhlbWUoDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApDQogICkNCnA4X2IgPC0gZ2dwbG90KGZpbHRlcihkZl9mcmFjdGlvbnMsIHg9PTIpLCBhZXMoeCA9IDEsIHkgPSB5LCBmaWxsID0gdHlwZSkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gInN0YWNrIiwgY29sb3IgPSBwYWxldHRlW25wYWxdKSArIA0KICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCwgbmFtZSA9ICIiKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBOVUxMLCBuYW1lID0gIiIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVtjKDIsIDEsIDMpXSkgKw0KICB0aGVtZV9wbG90X2ljb25fYmxhbmsocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSwgZm9udF9zaXplID0gNSkgKw0KICB0aGVtZSgNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMCkNCiAgKQ0KcDhfYyA8LSBnZ3Bsb3QoZmlsdGVyKGRmX2ZyYWN0aW9ucywgeD09MyksIGFlcyh4ID0gMSwgeSA9IHksIGZpbGwgPSB0eXBlKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0pICsgDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMLCBuYW1lID0gIiIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwsIG5hbWUgPSAiIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBwYWxldHRlW2MoMiwgMSwgMyldKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdLCBmb250X3NpemUgPSA1KSArDQogIHRoZW1lKA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKQ0KICApDQojIGNvbWJpbmUNCnA4IDwtIHBsb3RfZ3JpZChwOF9hLCBwOF9iLCBwOF9jLCBuY29sID0gMywgc2NhbGUgPSAxLjEpICsNCiAgICAgIGxhYnModGl0bGUgPSAiTXVsdGlwbGUgUGllIENoYXJ0cyIpICsNCiAgICAgIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHA4LCBwNSwgcDYsIHA3LCBuY29sID0gNCwgc2NhbGUgPSAuOSkNCmBgYA0KDQoNCldoZW4gdmlzdWFsaXppbmcgbXVsdGlwbGUgc2V0cyBvZiBwcm9wb3J0aW9ucyBvciBjaGFuZ2VzIGluIHByb3BvcnRpb25zIGFjcm9zcyBjb25kaXRpb25zLCBwaWUgY2hhcnRzIHRlbmQgdG8gYmUgc3BhY2UtaW5lZmZpY2llbnQgYW5kIG9mdGVuIG9ic2N1cmUgcmVsYXRpb25zaGlwcy4gR3JvdXBlZCBiYXJzIHdvcmsgd2VsbCBhcyBsb25nIGFzIHRoZSBudW1iZXIgb2YgY29uZGl0aW9ucyBjb21wYXJlZCBpcyBtb2RlcmF0ZSwgYW5kIHN0YWNrZWQgYmFycyBjYW4gd29yayBmb3IgbGFyZ2UgbnVtYmVycyBvZiBjb25kaXRpb25zLiBTdGFja2VkIGRlbnNpdGllcyBhcmUgYXBwcm9wcmlhdGUgd2hlbiB0aGUgcHJvcG9ydGlvbnMgY2hhbmdlIGFsb25nIGEgY29udGludW91cyB2YXJpYWJsZS4NCg0KDQpgYGB7ciBwcm9wb3J0aW9ucy1tdWx0aSwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDEvNH0NCnAxIDwtIGdncGxvdChkZl9tdWx0aV9wcm9wcywgYWVzKHggPSB2YXIyLCB5ID0gY291bnQsIGZpbGwgPSB2YXIxLCB3aWR0aCA9IGdyb3VwX2NvdW50KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIsIGNvbG91ciA9IHBhbGV0dGVbbnBhbF0sIHNpemUgPSAwLjUpICsNCiAgZmFjZXRfZ3JpZCh+dmFyMiwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gTlVMTCwgYnJlYWtzID0gTlVMTCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9IE5VTEwsIGJyZWFrcyA9IE5VTEwsIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVs0OjJdLCBndWlkZSA9ICJub25lIikgKw0KICBjb29yZF9jYXJ0ZXNpYW4oY2xpcCA9ICJvZmYiKSArDQogIGxhYnModGl0bGUgPSAiTW9zYWljIFBsb3QiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKSArDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuc3BhY2luZy54ID0gdW5pdCgwLCAicHQiKQ0KICApDQogIA0KcDIgPC0gZ2dwbG90KGRmX211bHRpX3Byb3BzLCBhZXMoYXJlYSA9IGNvdW50LCBzdWJncm91cCA9IHZhcjIsIGZpbGwgPSB2YXIyKSkgKw0KICBnZW9tX3RyZWVtYXAoY29sb3IgPSBwYWxldHRlW25wYWxdLCBzaXplID0gMC41Ki5wdCwgYWxwaGEgPSBOQSkgKyANCiAgZ2VvbV90cmVlbWFwX3N1Ymdyb3VwX2JvcmRlcihjb2xvciA9IHBhbGV0dGVbbnBhbF0sIHNpemUgPSAxLjUqLnB0KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbNDoyXSwgZ3VpZGUgPSAibm9uZSIpICsNCiAgY29vcmRfY2FydGVzaWFuKGNsaXAgPSAib2ZmIikgKw0KICBsYWJzKHRpdGxlID0gIlRyZWVtYXAiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKSANCnAzIDwtIGdncGxvdChkZl9zZXRzLCBhZXMoeCwgaWQgPSBpZCwgc3BsaXQgPSB5LCB2YWx1ZSA9IGNvdW50KSkgKw0KICBnZW9tX3BhcmFsbGVsX3NldHMoYWVzKGZpbGwgPSB2YXIxKSwgYWxwaGEgPSAwLjcsIGF4aXMud2lkdGggPSAwLjE1KSArDQogIGdlb21fcGFyYWxsZWxfc2V0c19heGVzKGF4aXMud2lkdGggPSAwLjA2LCBmaWxsID0gcGFsZXR0ZVsyXSwgY29sb3IgPSBwYWxldHRlWzJdKSArDQogIHNjYWxlX3hfZGlzY3JldGUoDQogICAgbmFtZSA9IE5VTEwsDQogICAgYnJlYWtzID0gTlVMTCwNCiAgICBleHBhbmQgPSBjKDAsIDAuMTUvMikNCiAgKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMocGFsZXR0ZVszXSwgcGFsZXR0ZVsyXSksIGd1aWRlID0gIm5vbmUiKSArDQogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgU2V0cyIpICsNCiAgdGhlbWVfcGxvdF9pY29uX2JsYW5rKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwbG90X2dyaWQocDEsIHAyLCBwMywgbmNvbCA9IDMsIHNjYWxlID0gLjkpDQpgYGANCg0KV2hlbiBwcm9wb3J0aW9ucyBhcmUgc3BlY2lmaWVkIGFjY29yZGluZyB0byBtdWx0aXBsZSBncm91cGluZyB2YXJpYWJsZXMsIHRoZW4gbW9zYWljIHBsb3RzLCB0cmVlbWFwcywgb3IgcGFyYWxsZWwgc2V0cyBhcmUgdXNlZnVsIHZpc3VhbGl6YXRpb24gYXBwcm9hY2hlcy4NCg0KTW9zYWljIHBsb3RzIGFzc3VtZSB0aGF0IGV2ZXJ5IGxldmVsIG9mIG9uZSBncm91cGluZyB2YXJpYWJsZSBjYW4gYmUgY29tYmluZWQgd2l0aCBldmVyeSBsZXZlbCBvZiBhbm90aGVyIGdyb3VwaW5nIHZhcmlhYmxlLCB3aGVyZWFzIHRyZWVtYXBzIGRvIG5vdCBtYWtlIHN1Y2ggYW4gYXNzdW1wdGlvbi4gVHJlZW1hcHMgd29yayB3ZWxsIGV2ZW4gaWYgdGhlIHN1YmRpdmlzaW9ucyBvZiBvbmUgZ3JvdXAgYXJlIGVudGlyZWx5IGRpc3RpbmN0IGZyb20gdGhlIHN1YmRpdmlzaW9ucyBvZiBhbm90aGVyLiBQYXJhbGxlbCBzZXRzIHdvcmsgYmV0dGVyIHRoYW4gZWl0aGVyIG1vc2FpYyBwbG90cyBvciB0cmVlbWFwcyB3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gdHdvIGdyb3VwaW5nIHZhcmlhYmxlcy4NCg0KDQojIFJlbGF0aW9uc2hpcHMgDQoNClRoZXJlIGFyZSBkaWZmZXJlbnQgd2F5cyB0byB2aXN1YWxpemUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byB2YXJpYWJsZXMuIFRoaXMgc2VjdGlvbiBmb2N1c2VkIHByaW1hcmlseSB0d28gbnVtZXJpY2FsIHZhcmlhYmxlcy4NCg0KIyMgU2NhdHRlciBQbG90cw0KDQpgYGB7ciBiYXNpYy1zY2F0dGVyLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMS80fQ0KcGFsZXR0ZSA8LSBwYWxfc3RlZWxfYmx1ZQ0KcDEgPC0gZ2dwbG90KGRmX3NjYXR0ZXJfeHksIGFlcyh4LCB5KSkgKyANCiAgZ2VvbV9wb2ludChmaWxsID0gcGFsZXR0ZVsyXSwgY29sb3IgPSBwYWxldHRlW25wYWxdLCBwY2ggPSAyMSwgc2l6ZSA9IDIuNCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoLjIsIDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKC4yLCAwKSkgKw0KICBsYWJzKHRpdGxlID0gIlNjYXR0ZXJwbG90IikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnAyIDwtIGdncGxvdChkZl9zY2F0dGVyX3h5eiwgYWVzKHgsIHksIHNpemUgPSB6KSkgKyANCiAgZ2VvbV9wb2ludChmaWxsID0gcGFsZXR0ZVsyXSwgY29sb3IgPSBwYWxldHRlW25wYWxdLCBwY2ggPSAyMSwgYWxwaGEgPSAwLjcpICsgDQogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKC4yLCAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYyguMiwgMCkpICsNCiAgc2NhbGVfcmFkaXVzKHJhbmdlID0gYygyLCA4KSkgKw0KICBsYWJzKHRpdGxlID0gIkJ1YmJsZSBDaGFydCIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwMyA8LSBnZ3Bsb3Qoc3ByZWFkKGRmX3BhaXJlZCwgeCwgeSksIGFlcyhBLCBCKSkgKyANCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2xvciA9IHBhbGV0dGVbM10sIHNpemUgPSAwLjMpICsgDQogIGdlb21fcG9pbnQoDQogICAgc2hhcGUgPSAyMSwgc2l6ZSA9IDIuNCwgc3Ryb2tlID0gMSwNCiAgICBmaWxsID0gcGFsZXR0ZVsyXSwgY29sb3IgPSBwYWxldHRlW25wYWxdDQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLjUsIDYuNSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMS41LCA2LjUpKSArDQogIGxhYnModGl0bGUgPSAiUGFpcmVkIFNjYXR0ZXJwbG90IikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA0IDwtIGdncGxvdChkZl9wYWlyZWQsIGFlcyh4LCB5LCBncm91cCA9IGdyb3VwKSkgKyANCiAgZ2VvbV9saW5lKGNvbG9yID0gcGFsZXR0ZVsxXSkgKyANCiAgZ2VvbV9wb2ludCgNCiAgICBzaGFwZSA9IDIxLCBzaXplID0gMi40LCBzdHJva2UgPSAxLA0KICAgIGZpbGwgPSBwYWxldHRlWzJdLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0NCiAgKSArDQogIHNjYWxlX3hfZGlzY3JldGUoZXhwYW5kID0gYygwLCAwLjQpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDEuNSwgNi41KSkgKw0KICBsYWJzKHRpdGxlID0gIlNsb3BlZ3JhcGgiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKSArDQogIHRoZW1lKA0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQpwbG90X2dyaWQocDEsIHAyLCBwMywgcDQsIG5jb2wgPSA0LCBzY2FsZSA9IC45KQ0KYGBgDQoNCg0KDQpTY2F0dGVycGxvdHMgcmVwcmVzZW50IHRoZSBhcmNoZXR5cGljYWwgdmlzdWFsaXphdGlvbiB3aGVuIHdlIHdhbnQgdG8gc2hvdyBvbmUgcXVhbnRpdGF0aXZlIHZhcmlhYmxlIHJlbGF0aXZlIHRvIGFub3RoZXIuIElmIHdlIGhhdmUgdGhyZWUgcXVhbnRpdGF0aXZlIHZhcmlhYmxlcywgd2UgY2FuIG1hcCBvbmUgb250byB0aGUgZG90IHNpemUsIGNyZWF0aW5nIGEgdmFyaWFudCBvZiB0aGUgc2NhdHRlcnBsb3QgY2FsbGVkIGJ1YmJsZSBjaGFydC4gRm9yIHBhaXJlZCBkYXRhLCB3aGVyZSB0aGUgdmFyaWFibGVzIGFsb25nIHRoZSAqeCogYW5kIHRoZSAqeSogYXhlcyBhcmUgbWVhc3VyZWQgaW4gdGhlIHNhbWUgdW5pdHMsIGl0IGlzIGdlbmVyYWxseSBoZWxwZnVsIHRvIGFkZCBhIGxpbmUgaW5kaWNhdGluZyAqeCogPSAqeSouIFBhaXJlZCBkYXRhIGNhbiBhbHNvIGJlIHNob3duIGFzIGEgc2xvcGUgZ3JhcGggb2YgcGFpcmVkIHBvaW50cyBjb25uZWN0ZWQgYnkgc3RyYWlnaHQgbGluZXMuDQoNCiMjIERlbnNpdHktYmFzZWQgUGxvdHMNCg0KDQpgYGB7ciB4eS1iaW5uaW5nLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMS80fQ0KcDUgPC0gZ2dwbG90KGRmX2RlbnNlX3NjYXR0ZXIsIGFlcyh4LCB5KSkgKyANCiAgZ2VvbV9kZW5zaXR5MmQoYmlud2lkdGggPSAwLjAyLCBjb2xvciA9IHBhbGV0dGVbMV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTIsIDMuNiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTQsIDUpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIGxhYnModGl0bGUgPSAiRGVuc2l0eSBDb250b3VycyIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNiA8LSBnZ3Bsb3QoZGZfZGVuc2Vfc2NhdHRlciwgYWVzKHgsIHkpKSArIA0KICBnZW9tX2JpbjJkKGJpbnMgPSAxMiwgY29sb3IgPSBwYWxldHRlW25wYWxdLCBzaXplID0gMC41KSArDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0yLCAzLjYpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC00LCA1KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBwYWxldHRlWzE6KG5wYWwtMSldKSArDQogIGxhYnModGl0bGUgPSAiMkQgQmlucyIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNyA8LSBnZ3Bsb3QoZGZfZGVuc2Vfc2NhdHRlciwgYWVzKHgsIHkpKSArIA0KICBnZW9tX2hleChiaW5zID0gMTIsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSwgc2l6ZSA9IDAuNSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMiwgMy42KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNCwgNSksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gcGFsZXR0ZVsxOihucGFsLTEpXSkgKw0KICBsYWJzKHRpdGxlID0gIkhleCBCaW5zIikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCmNtIDwtIGNvcihzZWxlY3QobXRjYXJzLCBtcGcsIGhwLCBkcmF0LCB3dCwgcXNlYykpDQpkZl93aWRlIDwtIGFzLmRhdGEuZnJhbWUoY20pDQpkZl9sb25nIDwtIHN0YWNrKGRmX3dpZGUpDQpuYW1lcyhkZl9sb25nKSA8LSBjKCJjb3IiLCAidmFyMSIpDQpkZl9sb25nIDwtIGNiaW5kKGRmX2xvbmcsIHZhcjIgPSByZXAocm93bmFtZXMoY20pLCBsZW5ndGgocm93bmFtZXMoY20pKSkpDQpjbHVzdCA8LSBoY2x1c3QoYXMuZGlzdCgxLWNtKSwgbWV0aG9kPSJhdmVyYWdlIikgDQpsZXZlbHMgPC0gY2x1c3QkbGFiZWxzW2NsdXN0JG9yZGVyXQ0KZGZfbG9uZyR2YXIxIDwtIGZhY3RvcihkZl9sb25nJHZhcjEsIGxldmVscyA9IGxldmVscykNCmRmX2xvbmckdmFyMiA8LSBmYWN0b3IoZGZfbG9uZyR2YXIyLCBsZXZlbHMgPSBsZXZlbHMpDQpwOCA8LSBnZ3Bsb3QoZmlsdGVyKGRmX2xvbmcsIGFzLmludGVnZXIodmFyMSkgPCBhcy5pbnRlZ2VyKHZhcjIpKSwNCiAgICAgICBhZXModmFyMSwgdmFyMiwgZmlsbD1jb3IsIHNpemUgPSBhYnMoY29yKSkpICsgDQogIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgc3Ryb2tlID0gMCkgKyANCiAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiLCBuYW1lID0gTlVMTCwgZXhwYW5kID0gYygwLCAwLjUpKSArDQogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9IE5VTEwsIGV4cGFuZCA9IGMoMCwgMC41KSkgKw0KICBzY2FsZV9zaXplX2FyZWEobWF4X3NpemUgPSA4LCBsaW1pdHMgPSBjKDAsIDAuOSksIGd1aWRlID0gIm5vbmUiKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGhpZ2ggPSBwYWxldHRlWzJdLCBtaWQgPSBwYWxldHRlW25wYWxdLCBsb3cgPSBwYWxfc3RlZWxfYmx1ZV9pbnZbMl0sIGd1aWRlID0gIm5vbmUiKSArDQogIGxhYnModGl0bGUgPSAiQ29ycmVsb2dyYW0iKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHA1LCBwNiwgcDcsIHA4LCBuY29sID0gNCwgc2NhbGUgPSAuOSkNCmBgYA0KDQpGb3IgbGFyZ2UgbnVtYmVycyBvZiBwb2ludHMsIHJlZ3VsYXIgc2NhdHRlci1wbG90cyBjYW4gYmVjb21lIHVuaW5mb3JtYXRpdmUgZHVlIHRvIG92ZXJwbG90dGluZy4gSW4gdGhpcyBjYXNlLCBjb250b3VyIGxpbmVzLCAyRCBiaW5zLCBvciBoZXggYmlucyBtYXkgcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZS4gV2hlbiB3ZSB3YW50IHRvIHZpc3VhbGl6ZSBtb3JlIHRoYW4gdHdvIHF1YW50aXRpZXMsIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBtYXkgY2hvb3NlIHRvIHBsb3QgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIGluIHRoZSBmb3JtIG9mIGEgY29ycmVsb2dyYW0gaW5zdGVhZCBvZiB0aGUgdW5kZXJseWluZyByYXcgZGF0YS4NCg0KDQojIyBTZXJpYWwgTGluZSBQbG90cyAoZm9yIFRyZW5kcykNCg0KYGBge3IgeHktbGluZXMsIGZpZy53aWR0aCA9IDUqNi80LjIsIGZpZy5hc3AgPSAxLzR9DQpwMSA8LSBnZ3Bsb3QoZGZfb25lX2xpbmUsIGFlcyh4LCB5KSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSBwYWxldHRlWzFdKSArIA0KICBnZW9tX3BvaW50KA0KICAgIHNoYXBlID0gMjEsIHNpemUgPSAyLjQsIHN0cm9rZSA9IDEsDQogICAgZmlsbCA9IHBhbGV0dGVbMl0sIGNvbG9yID0gcGFsZXR0ZVtucGFsXQ0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMC41LCA1LjUpLCBicmVha3MgPSBjKDEsIDMsIDUpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDIuOCwgNC44KSkgKw0KICBsYWJzKHRpdGxlID0gIkxpbmUgR3JhcGgiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDIgPC0gZ2dwbG90KGRmX2Nvbm5lY3RlZF9zY2F0dGVyLCBhZXMoeCwgeSwgY29sb3IgPSB0LCBmaWxsID0gdCkpICsNCiAgZ2VvbV9wYXRoKCkgKw0KICBnZW9tX3BvaW50KA0KICAgIHNoYXBlID0gMjEsIHNpemUgPSAyLjQsIHN0cm9rZSA9IDEsDQogICAgY29sb3IgPSBwYWxldHRlW25wYWxdDQogICkgKw0KICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oDQogICAgYWVzdGhldGljcyA9IGMoImNvbG91ciIsICJmaWxsIiksDQogICAgY29sb3JzID0gcGFsZXR0ZVsobnBhbC0yKToxXQ0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMC4zLCAzLjcpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0yLjUsIDIuNSkpICsNCiAgbGFicyh0aXRsZSA9ICJDb25uZWN0ZWQgU2NhdHRlcnBsb3QiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDMgPC0gZ2dwbG90KGRmX2RlbnNlX3NjYXR0ZXJfc2FtcGxlLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9IHBhbGV0dGVbMl0sIHNpemUgPSAwLjMsIGFscGhhID0gMS8yKSArDQogIGdlb21fc21vb3RoKA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBmaWxsID0gcGFsZXR0ZVtucGFsLTJdLA0KICAgIHNpemUgPSAwLjUsDQogICAgc2UgPSBGQUxTRQ0KICApICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTUsIDUpKSArDQogIGxhYnModGl0bGUgPSAiU21vb3RoIExpbmUgR3JhcGgiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHAxLCBwMiwgcDMsIG5jb2wgPSAzLCBzY2FsZSA9IC45KQ0KYGBgDQoNCldoZW4gdGhlICp4KiBheGlzIHJlcHJlc2VudHMgdGltZSBvciBhIHN0cmljdGx5IGluY3JlYXNpbmcgcXVhbnRpdHkgc3VjaCBhcyBhIHRyZWF0bWVudCBkb3NlLCB3ZSBjb21tb25seSBkcmF3IGxpbmUgZ3JhcGhzLiBJZiB3ZSBoYXZlIGEgdGVtcG9yYWwgc2VxdWVuY2Ugb2YgdHdvIHJlc3BvbnNlIHZhcmlhYmxlcywgd2UgY2FuIGRyYXcgYSBjb25uZWN0ZWQgc2NhdHRlcnBsb3Qgd2hlcmUgd2UgZmlyc3QgcGxvdCB0aGUgdHdvIHJlc3BvbnNlIHZhcmlhYmxlcyBpbiBhIHNjYXR0ZXJwbG90IGFuZCB0aGVuIGNvbm5lY3QgZG90cyBjb3JyZXNwb25kaW5nIHRvIGFkamFjZW50IHRpbWUgcG9pbnRzLiBXZSBjYW4gdXNlIHNtb290aCBsaW5lcyB0byByZXByZXNlbnQgdHJlbmRzIGluIGEgbGFyZ2VyIGRhdGFzZXQuIA0KDQoNCg0KIyBHZW9zcGF0aWFsIEluZm9ybWF0aW9uIA0KDQoNCmBgYHtyIGdlb3NwYXRpYWwsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpsb2FkKGZpbGUgPSAiVVNfaW5jb21lLnJkYSIpDQpsb2FkKGZpbGUgPSAiVVNfaW5jb21lX2NhcnRvZ3JhbS5yZGEiKQ0KcGFsZXR0ZSA8LSBwYWxfZ3JlZW5fYnJvd24NCmxvd2VyNDggPC0gbXV0YXRlKA0KICBVU19pbmNvbWUsDQogIGluY29tZV9iaW5zID0gY3V0KA0KICAgIGlmZWxzZShpcy5uYShtZWRpYW5faW5jb21lKSwgMjUwMDAsIG1lZGlhbl9pbmNvbWUpLCAjIGhpZGUgbWlzc2luZyB2YWx1ZQ0KICAgIGJyZWFrcyA9IGMoMCwgNDAwMDAsIDUwMDAwLCA2MDAwMCwgNzAwMDAsIDgwMDAwKQ0KICApDQopICU+JSBmaWx0ZXIoIW5hbWUgJWluJSBjKCJBbGFza2EiLCAiSGF3YWlpIiwgIkRpc3RyaWN0IG9mIENvbHVtYmlhIikpDQpwMV9tYWluIDwtIGdncGxvdChsb3dlcjQ4KSArDQogIGdlb21fc2YoY29sb3IgPSBwYWxldHRlWzFdLCBmaWxsID0gcGFsZXR0ZVs0XSwgc2l6ZSA9IDAuMykgKw0KICBjb29yZF9zZihkYXR1bSA9IE5BLCBleHBhbmQgPSBGQUxTRSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMjUwMDAwMCwgMTAwMDAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtOTAwMDAwLCAxNTU4OTM1KSkgKw0KICB0aGVtZV9wbG90X2ljb25fYmxhbmsocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkgKw0KICB0aGVtZSgNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigyLCA1LCAzLCA1KQ0KICApDQojIG1ha2Ugc3VyZSBwbG90IGJhY2tncm91bmQgaXMgZnVsbHkgZmlsbGVkLCBhcyBpbiB0aGUgb3RoZXIgcGxvdHMNCnAxIDwtIGdnZHJhdyhwMV9tYWluKSArDQogIGxhYnModGl0bGUgPSAiTWFwIikgKw0KICB0aGVtZV9wbG90X2ljb25fYmxhbmsocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnAyX21haW4gPC0gZ2dwbG90KGxvd2VyNDgsIGFlcyhmaWxsID0gaW5jb21lX2JpbnMpKSArDQogIGdlb21fc2YoY29sb3IgPSBwYWxldHRlWzFdLCBzaXplID0gMC4yKSArDQogIGNvb3JkX3NmKGRhdHVtID0gTkEsIGV4cGFuZCA9IEZBTFNFKSArDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0yNTAwMDAwLCAxMDAwMDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC05MDAwMDAsIDE1NTg5MzUpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGUpICsNCiAgdGhlbWVfcGxvdF9pY29uX2JsYW5rKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pICsNCiAgdGhlbWUoDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMiwgNSwgMywgNSkNCiAgKQ0KcDIgPC0gZ2dkcmF3KHAyX21haW4pICsNCiAgbGFicyh0aXRsZSA9ICJDaG9yb3BsZXRoIikgKw0KICB0aGVtZV9wbG90X2ljb25fYmxhbmsocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCmxvd2VyNDhfY2FydG8gPC0gbXV0YXRlKA0KICBVU19pbmNvbWVfY2FydG9ncmFtLA0KICBpbmNvbWVfYmlucyA9IGN1dCgNCiAgICBpZmVsc2UoaXMubmEobWVkaWFuX2luY29tZSksIDI1MDAwLCBtZWRpYW5faW5jb21lKSwgIyBoaWRlIG1pc3NpbmcgdmFsdWUNCiAgICBicmVha3MgPSBjKDAsIDQwMDAwLCA1MDAwMCwgNjAwMDAsIDcwMDAwLCA4MDAwMCkNCiAgKQ0KKSAlPiUgZmlsdGVyKCFuYW1lICVpbiUgYygiQWxhc2thIiwgIkhhd2FpaSIsICJEaXN0cmljdCBvZiBDb2x1bWJpYSIpKQ0KcDNfbWFpbiA8LSBnZ3Bsb3QobG93ZXI0OF9jYXJ0bywgYWVzKGZpbGwgPSBpbmNvbWVfYmlucykpICsNCiAgZ2VvbV9zZihjb2xvciA9IHBhbGV0dGVbMV0sIHNpemUgPSAwLjIpICsNCiAgY29vcmRfc2YoZGF0dW0gPSBOQSwgZXhwYW5kID0gRkFMU0UpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTI1MDAwMDAsIDEwMDAwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEwMDAwMDAsIDE0NTg5MzUpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGUpICsNCiAgdGhlbWVfcGxvdF9pY29uX2JsYW5rKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pICsNCiAgdGhlbWUoDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMiwgNSwgMywgNSkNCiAgKQ0KcDMgPC0gZ2dkcmF3KHAzX21haW4pICsNCiAgbGFicyh0aXRsZSA9ICJDYXJ0b2dyYW0iKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KbG93ZXI0OF9zbWFsbCA8LSBmaWx0ZXIobG93ZXI0OCwgR0VPSUQgJWluJSBjKA0KICAiMDQiLCAiMDYiLCAiMDgiLCAiMTYiLCAiMjAiLCAiMzAiLCAiMzEiLCAiMzIiLCAiMzUiLCAiMzgiLCAiNDEiLCAiNDYiLCAiNDkiLCAiNTMiLCAiNTYiKSkNCnA0X21haW4gPC0gZ2dwbG90KGxvd2VyNDhfc21hbGwsIGFlcyhzdGF0ZSA9IG5hbWUsIGZpbGwgPSBpbmNvbWVfYmlucykpICsNCiAgZ2VvbV9zdGF0ZWJpbnMoDQogICAgZmFtaWx5ID0gZHZpel9mb250X2ZhbWlseSwNCiAgICBsYmxfc2l6ZSA9IDgvLnB0LA0KICAgIGJvcmRlcl9zaXplID0gMS4sDQogICAgYm9yZGVyX2NvbCA9IHBhbGV0dGVbbnBhbF0NCiAgKSArDQogIGNvb3JkX2VxdWFsKHhsaW0gPSBjKDEuNSwgNS41KSwgeWxpbSA9IGMoLTIuNSwgLTYuNSksIGV4cGFuZCA9IEZBTFNFLCBjbGlwID0gIm9mZiIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVsyOjVdKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKSArDQogIHRoZW1lKA0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDIsIDAsIDAsIDcpDQogICkNCnA0IDwtIGdnZHJhdyhwNF9tYWluKSArIGxhYnModGl0bGUgPSAiQ2FydG9ncmFtIEhlYXRtYXAiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHAxLCBwMiwgcDMsIHA0LCBzY2FsZSA9IDAuOSwgbnJvdyA9IDEpDQpgYGANCg0KDQpUaGUgcHJpbWFyeSBtb2RlIG9mIHNob3dpbmcgZ2Vvc3BhdGlhbCBkYXRhIGlzIGluIHRoZSBmb3JtIG9mIGEgbWFwLiBBIG1hcCB0YWtlcyBjb29yZGluYXRlcyBvbiB0aGUgZ2xvYmUgYW5kIHByb2plY3RzIHRoZW0gb250byBhIGZsYXQgc3VyZmFjZSwgc3VjaCB0aGF0IHNoYXBlcyBhbmQgZGlzdGFuY2VzIG9uIHRoZSBnbG9iZSBhcmUgYXBwcm94aW1hdGVseSByZXByZXNlbnRlZCBieSBzaGFwZXMgYW5kIGRpc3RhbmNlcyBpbiB0aGUgMkQgcmVwcmVzZW50YXRpb24uIEluIGFkZGl0aW9uLCB3ZSBjYW4gc2hvdyBkYXRhIHZhbHVlcyBpbiBkaWZmZXJlbnQgcmVnaW9ucyBieSBjb2xvcmluZyB0aG9zZSByZWdpb25zIGluIHRoZSBtYXAgYWNjb3JkaW5nIHRvIHRoZSBkYXRhLiBTdWNoIGEgbWFwIGlzIGNhbGxlZCBhIGNob3JvcGxldGguIEluIHNvbWUgY2FzZXMsIGl0IG1heSBiZSBoZWxwZnVsIHRvIGRpc3RvcnQgdGhlIGRpZmZlcmVudCByZWdpb25zIGFjY29yZGluZyB0byBzb21lIG90aGVyIHF1YW50aXR5IChlLmcuLCBwb3B1bGF0aW9uIG51bWJlcikgb3Igc2ltcGxpZnkgZWFjaCByZWdpb24gaW50byBhIHNxdWFyZS4gU3VjaCB2aXN1YWxpemF0aW9ucyBhcmUgY2FsbGVkIGNhcnRvZ3JhbXMuDQoNCg0KIyBVbmNlcnRhaW50eQ0KDQpgYGB7ciBlcnJvcmJhcnMsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpwYWxldHRlIDwtIHBhbF9icm93bl9yZWQNCnAxIDwtIGdncGxvdChkZl91bmNlcnRhaW4sIGFlcyh5LCB0eXBlKSkgKw0KICBnZW9tX2Vycm9yYmFyaCgNCiAgICBhZXMoeG1pbiA9IHktZHksIHhtYXggPSB5K2R5KSwNCiAgICBjb2xvciA9IHBhbGV0dGVbMV0sIGhlaWdodCA9IDAuMiwgc2l6ZSA9IDAuNQ0KICApICsNCiAgZ2VvbV9wb2ludCgNCiAgICBjb2xvciA9IHBhbGV0dGVbMV0sDQogICAgc2l6ZSA9IDINCiAgKSArDQogIGxhYnModGl0bGUgPSAiRXJyb3IgQmFycyIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pICsNCiAgdGhlbWUoDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpDQogICkNCnAyIDwtIGdncGxvdChkZl91bmNlcnRhaW4sIGFlcyh0eXBlLCB5KSkgKw0KICBnZW9tX2NvbChmaWxsID0gcGFsZXR0ZVszXSwgd2lkdGggPSAwLjgpICsNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGFlcyh4ZW5kID0gdHlwZSwgeSA9IHktZHksIHllbmQgPSB5K2R5KSwNCiAgICBjb2xvciA9IHBhbGV0dGVbMV0sDQogICAgc2l6ZSA9IDAuNw0KICApICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgbGFicyh0aXRsZSA9ICJFcnJvciBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkgKw0KICB0aGVtZSgNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KcDMgPC0gZ2dwbG90KGRmX3VuY2VydGFpbiwgYWVzKHksIHR5cGUpKSArDQogIGdlb21fZXJyb3JiYXJoKA0KICAgIGFlcyh4bWluID0geS0yLjU4KmR5LCB4bWF4ID0geSsyLjU4KmR5KSwgIyA5OSUgQ0kNCiAgICBjb2xvciA9IHBhbGV0dGVbM10sIGhlaWdodCA9IDAsIHNpemUgPSAwLjUNCiAgKSArDQogIGdlb21fZXJyb3JiYXJoKA0KICAgIGFlcyh4bWluID0geS0xLjk2KmR5LCB4bWF4ID0geSsxLjk2KmR5KSwgIyA5NSUgQ0kNCiAgICBjb2xvciA9IHBhbGV0dGVbMl0sIGhlaWdodCA9IDAsIHNpemUgPSAxDQogICkgKw0KICBnZW9tX2Vycm9yYmFyaCgNCiAgICBhZXMoeG1pbiA9IHktMS4yOCpkeSwgeG1heCA9IHkrMS4yOCpkeSksICMgODAlIENJDQogICAgY29sb3IgPSBwYWxldHRlWzFdLCBoZWlnaHQgPSAwLCBzaXplID0gMS41DQogICkgKw0KICAjZ2VvbV9lcnJvcmJhcmgoDQogICMgIGFlcyh4bWluID0geS1keSwgeG1heCA9IHkrZHkpLA0KICAjICBjb2xvciA9IHBhbGV0dGVbMV0sIGhlaWdodCA9IDAuMSwgc2l6ZSA9IDAuNQ0KICAjKSArDQogIGdlb21fcG9pbnQoDQogICAgY29sb3IgPSBwYWxldHRlWzFdLA0KICAgIHNpemUgPSAyDQogICkgKw0KICBsYWJzKHRpdGxlID0gIkdyYWRlZCBFcnJvciBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkgKw0KICB0aGVtZSgNCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KcDQgPC0gZ2dwbG90KGRmX3VuY2VydGFpbiwgYWVzKHgsIHkpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSBwYWxldHRlWzFdLCBzaXplID0gMikgKw0KICBnZW9tX3NlZ21lbnQoDQogICAgYWVzKHhlbmQgPSB4LCB5ID0geS1keSwgeWVuZCA9IHkrZHkpLA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBzaXplID0gMC43DQogICkgKw0KICBnZW9tX3NlZ21lbnQoDQogICAgYWVzKHllbmQgPSB5LCB4ID0geC1keCwgeGVuZCA9IHgrZHgpLA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBzaXplID0gMC43DQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLCA0KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygyLCA2KSkgKw0KICBsYWJzKHRpdGxlID0gIjJEIEVycm9yIEJhcnMiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KICANCnBsb3RfZ3JpZChwMSwgcDIsIHA0LCBwMywgbmNvbCA9IDQsIHNjYWxlID0gLjkpDQogIA0KYGBgDQoNCkVycm9yIGJhcnMgYXJlIG1lYW50IHRvIGluZGljYXRlIHRoZSByYW5nZSBvZiBsaWtlbHkgdmFsdWVzIGZvciBzb21lIGVzdGltYXRlIG9yIG1lYXN1cmVtZW50LiBUaGV5IGV4dGVuZCBob3Jpem9udGFsbHkgYW5kL29yIHZlcnRpY2FsbHkgZnJvbSBzb21lIHJlZmVyZW5jZSBwb2ludCByZXByZXNlbnRpbmcgdGhlIGVzdGltYXRlIG9yIG1lYXN1cmVtZW50LiBSZWZlcmVuY2UgcG9pbnRzIGNhbiBiZSBzaG93biBpbiB2YXJpb3VzIHdheXMsIHN1Y2ggYXMgYnkgZG90cyBvciBieSBiYXJzLiBHcmFkZWQgDQplcnJvciBiYXJzIHNob3cgbXVsdGlwbGUgcmFuZ2VzIGF0IHRoZSBzYW1lIHRpbWUsIHdoZXJlIGVhY2ggcmFuZ2UgY29ycmVzcG9uZHMgdG8gYSBkaWZmZXJlbnQgZGVncmVlIG9mIGNvbmZpZGVuY2UuIFRoZXkgYXJlIGluIGVmZmVjdCBtdWx0aXBsZSBlcnJvciBiYXJzIHdpdGggZGlmZmVyZW50IGxpbmUgdGhpY2tuZXNzZXMgcGxvdHRlZCBvbiB0b3Agb2YgZWFjaCBvdGhlci4NCg0KYGBge3J9DQojJyBDb25maWRlbmNlIGRlbnNpdHkgZGlzdHJpYnV0aW9ucyBnZW5lcmF0ZWQgZnJvbSBlc3RpbWF0ZSBhbmQgbWFyZ2luIG9mIGVycm9yDQojJw0KIycgVGhpcyBzdGF0IGdlbmVyYXRlcyBub3JtYWwgZGVuc2l0aWVzIGZyb20gcHJvdmlkZWQgZXN0aW1hdGVzIHBsdXMgbWFyZ2lucw0KIycgb2YgZXJyb3IgKGF0IGEgc3BlY2lmaWVkIGNvbmZpZGVuY2UgbGV2ZWwpLiBJdCBjYW4gYmUgdXNlZCB0byBlc3RpbWF0ZQ0KIycgdGhlIGNvbmZpZGVuY2UgZGVuc2l0eSB0aGF0IHVuZGVybGllcyBhIGdpdmVuIHBhcmFtZXRlciBlc3RpbWF0ZSB3aXRoDQojJyBnaXZlbiBtYXJnaW4gb2YgZXJyb3IuDQojJw0KIycgQGluaGVyaXRQYXJhbXMgZ2dwbG90Mjo6bGF5ZXINCiMnIEBwYXJhbSAuLi4gT3RoZXIgYXJndW1lbnRzIHBhc3NlZCBvbiB0byBbYGxheWVyKClgXS4gVGhlc2UgYXJlDQojJyAgIG9mdGVuIGFlc3RoZXRpY3MsIHVzZWQgdG8gc2V0IGFuIGFlc3RoZXRpYyB0byBhIGZpeGVkIHZhbHVlLCBsaWtlDQojJyAgIGBjb2xvdXIgPSAicmVkImAgb3IgYHNpemUgPSAzYC4gVGhleSBtYXkgYWxzbyBiZSBwYXJhbWV0ZXJzDQojJyAgIHRvIHRoZSBwYWlyZWQgZ2VvbS9zdGF0Lg0KIycgQHBhcmFtIGNvbmZpZGVuY2UgVGhlIGNvbmZpZGVuY2UgbGV2ZWwgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGBtb2VgIHN0YXRpc3RpYy4NCiMnICAgIFRoaXMgZGVmYXVsdHMgdG8gMC45NSAoYG1vZWAgY29ycmVzcG9uZHMgdG8gOTVcJSBjb25maWRlbmNlIGludGVydmFsKS4NCiMnIEBwYXJhbSB4bGltIE51bWVyaWMgdmVjdG9yIG9mIHR3byBudW1iZXJzIHNldHRpbmcgdGhlIHJhbmdlIG9mIHggdmFsdWVzIHRvIGJlDQojJyAgIGNvdmVyZWQgYnkgdGhlIGNvbmZpZGVuY2UgZGVuc2l0eS4gSWYgbm90IHN1cHBsaWVkLCBpcyB0YWtlbiBmcm9tIHRoZSB4IHNjYWxlLg0KIycgQHBhcmFtIG4gTnVtYmVyIG9mIGVxdWFsbHkgc3BhY2VkIHBvaW50cyBhdCB3aGljaCB0aGUgZGVuc2l0eSBpcyBjYWxjdWxhdGVkLg0KIycgQHBhcmFtIG5hLnJtIElmIGBGQUxTRWAsIHRoZSBkZWZhdWx0LCBtaXNzaW5nIHZhbHVlcyBhcmUgcmVtb3ZlZCB3aXRoDQojJyAgIGEgd2FybmluZy4gSWYgYFRSVUVgLCBtaXNzaW5nIHZhbHVlcyBhcmUgc2lsZW50bHkgcmVtb3ZlZC4NCiMnDQojJyBAc2VjdGlvbiBEZXRhaWxzOg0KIycNCiMnIFRoZSBmb2xsb3dpbmcgYWVzdGhldGljcyBhcmUgdW5kZXJzdG9vZCBieSB0aGlzIHN0YXQgKHJlcXVpcmVkIGFlc3RoZXRpY3MNCiMnIGFyZSBpbiBib2xkKToNCiMnICAqICoqYHhgKio6IFRoZSBlc3RpbWF0ZSB3aG9zZSB1bmNlcnRhaW50eSBpcyB0byBiZSBkaXNwbGF5ZWQNCiMnICAqICoqYG1vZWAqKjogTWFyZ2luIG9mIGVycm9yDQojJyAgKiBgY29uZmlkZW5jZWA6IENvbmZpZGVuY2UgbGV2ZWwgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGBtb2VgIHN0YXRpc3RpYy4NCiMnICAgIFRoaXMgZGVmYXVsdHMgdG8gMC45NSAoYG1vZWAgY29ycmVzcG9uZHMgdG8gOTVcJSBjb25maWRlbmNlIGludGVydmFsKS4NCiMnDQojJyBAc291cmNlDQojJyBBZHJpYW4gVy4gQm93bWFuLiBHcmFwaHMgZm9yIFVuY2VydGFpbnR5LiBKLiBSLiBTdGF0aXN0LiBTb2MuIEEgMTgyOjEtMTYsIDIwMTguDQojJyBcdXJse2h0dHA6Ly93d3cucnNzLm9yZy51ay9JbWFnZXMvUERGL2V2ZW50cy8yMDE4L0Jvd21hbi01LVNlcHQtMjAxOC5wZGZ9DQojJyBAZXhhbXBsZXMNCiMnIGxpYnJhcnkoZ2dwbG90MikNCiMnIGxpYnJhcnkoZHBseXIpDQojJw0KIycgY2FjYW9fc21hbGwgPC0gY2FjYW8gJT4lDQojJyAgIGZpbHRlcihsb2NhdGlvbiAlaW4lIGMoIlN3aXR6ZXJsYW5kIiwgIkNhbmFkYSIsICJVLlMuQS4iLCAiQmVsZ2l1bSIpKQ0KIycNCiMnIGNhY2FvX3N1bW1hcnkgPC0gY2FjYW9fc21hbGwgJT4lDQojJyAgIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUNCiMnICAgc3VtbWFyaXplKA0KIycgICAgIHNkID0gc2QocmF0aW5nKSwNCiMnICAgICBtb2UgPSBzZCoxLjk2LA0KIycgICAgIHJhdGluZyA9IG1lYW4ocmF0aW5nKQ0KIycgICApDQojJw0KIycgZ2dwbG90KGNhY2FvX3N1bW1hcnksIGFlcyh4ID0gcmF0aW5nLCB5ID0gbG9jYXRpb24pKSArDQojJyAgIHN0YXRfY29uZmlkZW5jZV9kZW5zaXR5KGFlcyhtb2UgPSBtb2UsIGZpbGwgPSBzdGF0KG5kZW5zaXR5KSksIGhlaWdodCA9IDAuOCkgKw0KIycgICBnZW9tX3BvaW50KGRhdGEgPSBjYWNhb19zbWFsbCwgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjA1KSwgc2l6ZSA9IDAuMykgKw0KIycgICBnZW9tX2Vycm9yYmFyaCgNCiMnICAgICBhZXMoeG1pbiA9IHJhdGluZyAtIHNkLCB4bWF4ID0gcmF0aW5nICsgc2QpLA0KIycgICAgIGhlaWdodCA9IDAuMywgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSAxDQojJyAgICkgKw0KIycgICBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICJkYXJrcmVkIikgKw0KIycgICB0aGVtZV9taW5pbWFsKCkNCiMnDQojJw0KIycgbGlicmFyeShnZ3JpZGdlcykNCiMnDQojJyBjYWNhb19zZSA8LSBjYWNhb19zbWFsbCAlPiUNCiMnICAgZ3JvdXBfYnkobG9jYXRpb24pICU+JQ0KIycgICBzdW1tYXJpemUoDQojJyAgICAgc2UgPSBzZChyYXRpbmcpL3NxcnQobigpKSwNCiMnICAgICBtb2UgPSBzZSoxLjk2LA0KIycgICAgIHJhdGluZyA9IG1lYW4ocmF0aW5nKQ0KIycgICApDQojJw0KIycgZ2dwbG90KGNhY2FvX3NlLCBhZXMoeCA9IHJhdGluZywgeSA9IGxvY2F0aW9uKSkgKw0KIycgICBzdGF0X2NvbmZpZGVuY2VfZGVuc2l0eSgNCiMnICAgICBnZW9tID0gInJpZGdlbGluZSIsDQojJyAgICAgYWVzKG1vZSA9IG1vZSwgaGVpZ2h0ID0gc3RhdChkZW5zaXR5KSksDQojJyAgICAgYWxwaGEgPSBOQSwgeGxpbSA9IGMoMi41LCAzLjc1KSwgc2NhbGUgPSAwLjA4DQojJyAgICkgKw0KIycgICB0aGVtZV9taW5pbWFsKCkNCiMnIEBleHBvcnQNCnN0YXRfY29uZmlkZW5jZV9kZW5zaXR5IDwtIGZ1bmN0aW9uKG1hcHBpbmcgPSBOVUxMLCBkYXRhID0gTlVMTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tID0gInRpbGUiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAwLjk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsaW0gPSBOVUxMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSA1MDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gVFJVRSkgew0KICBsIDwtIGxheWVyKA0KICAgIGRhdGEgPSBkYXRhLA0KICAgIG1hcHBpbmcgPSBtYXBwaW5nLA0KICAgIHN0YXQgPSBTdGF0Q29uZmlkZW5jZURlbnNpdHksDQogICAgZ2VvbSA9IGdlb20sDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbiwNCiAgICBzaG93LmxlZ2VuZCA9IHNob3cubGVnZW5kLA0KICAgIGluaGVyaXQuYWVzID0gaW5oZXJpdC5hZXMsDQogICAgcGFyYW1zID0gbGlzdCgNCiAgICAgIGNvbmZpZGVuY2UgPSBjb25maWRlbmNlLA0KICAgICAgbiA9IG4sDQogICAgICBuYS5ybSA9IG5hLnJtLA0KICAgICAgeGxpbSA9IHhsaW0sDQogICAgICAuLi4NCiAgICApDQogICkNCg0KICBsaXN0KGwsIHNjYWxlX2FscGhhX2lkZW50aXR5KCkpDQp9DQoNCiMnIEByZG5hbWUgc3RhdF9jb25maWRlbmNlX2RlbnNpdHkNCiMnIEB1c2FnZSBOVUxMDQojJyBAZm9ybWF0IE5VTEwNCiMnIEBleHBvcnQNClN0YXRDb25maWRlbmNlRGVuc2l0eSA8LSBnZ3Byb3RvKCJTdGF0Q29uZmlkZW5jZURlbnNpdHkiLCBTdGF0LA0KICByZXF1aXJlZF9hZXMgPSBjKCJ4IiwgIm1vZSIpLA0KICBkZWZhdWx0X2FlcyA9IGFlcygNCiAgICBhbHBoYSA9IHN0YXQobmRlbnNpdHkpLA0KICAgIGNvbmZpZGVuY2UgPSAwLjk1DQogICksDQoNCiAgY29tcHV0ZV9ncm91cCA9IGZ1bmN0aW9uKGRhdGEsIHNjYWxlcywgeGxpbSA9IE5VTEwsIG4gPSA1MDEsIGNvbmZpZGVuY2UgPSAwLjk1KSB7DQogICAgIyBhc3N1bWUgY29uZmlkZW5jZSBsZXZlbCBpcyAwLjk1IGlmIG5vdCBwcm92aWRlZA0KICAgIGlmIChpcy5udWxsKGRhdGEkY29uZmlkZW5jZSkpIHsNCiAgICAgIGRhdGEkY29uZmlkZW5jZSA8LSBjb25maWRlbmNlDQogICAgfQ0KDQogICAgIyBDaGVjayB0aGF0IGNvbmZpZGVuY2UgZGVuc2l0eSBwYXJhbWV0ZXJzIGFyZSBjb25zdGFudCB3aXRoaW4gZ3JvdXANCiAgICBwYXJhbXMgPC0gdW5pcXVlKGRhdGFbYygieCIsICJtb2UiLCAiY29uZmlkZW5jZSIpXSkNCiAgICBpZiAobnJvdyhwYXJhbXMpID4gMSkgew0KICAgICAgc3RvcCgiQ29uZmlkZW5jZSBkZW5zaXR5IHBhcmFtZXRlcnMgY2FuIG5vdCB2YXJ5IHdpdGhpbiBkYXRhIGdyb3VwcyIsIGNhbGwuID0gRkFMU0UpDQogICAgfQ0KICAgIHBhcmFtcyA8LSBhcy5saXN0KHBhcmFtcykNCg0KICAgIHJhbmdlIDwtIHhsaW0gJXx8JSBzY2FsZXMkeCRkaW1lbnNpb24oKQ0KICAgIHhzZXEgPC0gc2VxKHJhbmdlWzFdLCByYW5nZVsyXSwgbGVuZ3RoLm91dCA9IG4pDQoNCiAgICBpZiAoc2NhbGVzJHgkaXNfZGlzY3JldGUoKSkgew0KICAgICAgeF90cmFucyA8LSB4c2VxDQogICAgfSBlbHNlIHsNCiAgICAgICMgRm9yIGNvbnRpbnVvdXMgc2NhbGVzLCBuZWVkIHRvIGJhY2sgdHJhbnNmb3JtIGZyb20gdHJhbnNmb3JtZWQgcmFuZ2UNCiAgICAgICMgdG8gb3JpZ2luYWwgdmFsdWVzDQogICAgICB4X3RyYW5zIDwtIHNjYWxlcyR4JHRyYW5zJGludmVyc2UoeHNlcSkNCiAgICAgIHBhcmFtcyR4IDwtIHNjYWxlcyR4JHRyYW5zJGludmVyc2UocGFyYW1zJHgpDQogICAgICBwYXJhbXMkc3RhdGlzdGljIDwtIHNjYWxlcyR4JHRyYW5zJGludmVyc2UocGFyYW1zJHN0YXRpc3RpYykNCiAgICB9DQoNCiAgICBmdW4gPC0gZG8uY2FsbChmaXRfbm9ybWFsLCBwYXJhbXMpDQogICAgZGVuc2l0eSA8LSBmdW4oeF90cmFucykNCg0KICAgIGRhdGEuZnJhbWUoDQogICAgICB4ID0geHNlcSwNCiAgICAgIGRlbnNpdHkgPSBkZW5zaXR5LA0KICAgICAgbmRlbnNpdHkgPSBkZW5zaXR5L21heChkZW5zaXR5KQ0KICAgICkNCiAgfQ0KKQ0KDQoNCmZpdF9ub3JtYWwgPC0gZnVuY3Rpb24oeCwgbW9lLCBjb25maWRlbmNlKSB7DQogICMgY29udmVydCB0byB0d28tdGFpbGVkIHZhbHVlDQogIGNvbmZpZGVuY2UgPC0gMS0oMS1jb25maWRlbmNlKS8yDQogIGZ1bmN0aW9uKHopIHN0YXRzOjpkbm9ybSh6LCBtZWFuID0geCwgc2QgPSBtb2Uvc3RhdHM6OnFub3JtKGNvbmZpZGVuY2UpKQ0KfQ0KYGBgDQoNCg0KDQoNCmBgYHtyIGNvbmZpZGVuY2UtZGlzdHMsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpwMSA8LSBnZ3Bsb3QoZGZfdW5jZXJ0YWluLCBhZXMoeSwgdHlwZSkpICsNCiAgc3RhdF9jb25maWRlbmNlX2RlbnNpdHkoYWVzKG1vZSA9IGR5KSwgZmlsbCA9IHBhbGV0dGVbM10sIGhlaWdodCA9IDAuNiwgY29uZmlkZW5jZSA9IDAuNjgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMS42LCA2LjQpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gYygwLCAxKSkgKw0KICBsYWJzKHRpdGxlID0gIkNvbmZpZGVuY2UgU3RyaXBzIikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkgKw0KICB0aGVtZSgNCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KcDIgPC0gZ2dwbG90KGRmX3VuY2VydGFpbiwgYWVzKHksIHR5cGUpKSArDQogIGdlb21fcmliYm9uKA0KICAgIGRhdGEgPSBmaWx0ZXIoZGZfdW5jZXJ0YWluLCB0eXBlID09ICJBIiksDQogICAgYWVzKG1vZSA9IGR5LCB5bWluID0gMSAtIC41KnN0YXQoZGVuc2l0eSksIHltYXggPSAxICsgLjUqc3RhdChkZW5zaXR5KSksDQogICAgc3RhdCA9ICJjb25maWRlbmNlX2RlbnNpdHkiLA0KICAgIGZpbGwgPSBwYWxldHRlWzNdLCBjb2xvciA9IE5BLCBhbHBoYSA9IE5BLCBjb25maWRlbmNlID0gMC42OA0KICApICsNCiAgZ2VvbV9yaWJib24oDQogICAgZGF0YSA9IGZpbHRlcihkZl91bmNlcnRhaW4sIHR5cGUgPT0gIkIiKSwNCiAgICBhZXMobW9lID0gZHksIHltaW4gPSAyIC0gLjUqc3RhdChkZW5zaXR5KSwgeW1heCA9IDIgKyAuNSpzdGF0KGRlbnNpdHkpKSwNCiAgICBzdGF0ID0gImNvbmZpZGVuY2VfZGVuc2l0eSIsDQogICAgZmlsbCA9IHBhbGV0dGVbM10sIGNvbG9yID0gTkEsIGFscGhhID0gTkEsIGNvbmZpZGVuY2UgPSAwLjY4DQogICkgKw0KICBnZW9tX3JpYmJvbigNCiAgICBkYXRhID0gZmlsdGVyKGRmX3VuY2VydGFpbiwgdHlwZSA9PSAiQyIpLA0KICAgIGFlcyhtb2UgPSBkeSwgeW1pbiA9IDMgLSAuNSpzdGF0KGRlbnNpdHkpLCB5bWF4ID0gMyArIC41KnN0YXQoZGVuc2l0eSkpLA0KICAgIHN0YXQgPSAiY29uZmlkZW5jZV9kZW5zaXR5IiwNCiAgICBmaWxsID0gcGFsZXR0ZVszXSwgY29sb3IgPSBOQSwgYWxwaGEgPSBOQSwgY29uZmlkZW5jZSA9IDAuNjgNCiAgKSArDQogIGdlb21fZXJyb3JiYXJoKA0KICAgIGFlcyh4bWluID0geS0xLjI4KmR5LCB4bWF4ID0geSsxLjI4KmR5KSwgDQogICAgY29sb3IgPSBwYWxldHRlWzFdLCBoZWlnaHQgPSAwLCBzaXplID0gMC41DQogICkgKw0KICBnZW9tX3BvaW50KA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBzaXplID0gMg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMS42LCA2LjQpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gZXhwYW5kX3NjYWxlKGFkZCA9IGMoMC44LCAwLjgpKSkgKw0KICBsYWJzKHRpdGxlID0gIkV5ZXMiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKSArDQogIHRoZW1lKA0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQpwMyA8LSBnZ3Bsb3QoZGZfdW5jZXJ0YWluLCBhZXMoeSwgdHlwZSkpICsNCiAgc3RhdF9jb25maWRlbmNlX2RlbnNpdHkoDQogICAgYWVzKG1vZSA9IGR5LCBoZWlnaHQgPSAuOSpzdGF0KGRlbnNpdHkpKSwNCiAgICBnZW9tID0gInJpZGdlbGluZSIsDQogICAgZmlsbCA9IHBhbGV0dGVbM10sIGNvbG9yID0gTkEsIGFscGhhID0gTkEsIGNvbmZpZGVuY2UgPSAwLjY4DQogICkgKw0KICBnZW9tX2Vycm9yYmFyaCgNCiAgICBhZXMoeG1pbiA9IHktMS4yOCpkeSwgeG1heCA9IHkrMS4yOCpkeSksDQogICAgY29sb3IgPSBwYWxldHRlWzFdLCBoZWlnaHQgPSAwLCBzaXplID0gMC41DQogICkgKw0KICBnZW9tX3BvaW50KA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBzaXplID0gMg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMS42LCA2LjQpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gZXhwYW5kX3NjYWxlKGFkZCA9IGMoMC4yLCAwLjgpKSkgKw0KICBsYWJzKHRpdGxlID0gIkhhbGYtRXllcyIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pICsNCiAgdGhlbWUoDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpDQogICkNCmRmX25vcm0gPC0gZGF0YS5mcmFtZSgNCiAgeCA9IHNlcSgtMywgMywgbGVuZ3RoLm91dCA9IDEwMCksDQogIHkgPSBkbm9ybShzZXEoLTMsIDMsIGxlbmd0aC5vdXQgPSAxMDApKQ0KKQ0KZGZfcSA8LSBkYXRhLmZyYW1lKHggPSBxbm9ybShwcG9pbnRzKDIwKSkpDQpwNCA8LSBnZ3Bsb3QoZGZfcSwgYWVzKHgpKSArDQogIGdlb21fbGluZShkYXRhID0gZGZfbm9ybSwgYWVzKHgsIC4zNip5KSwgY29sb3IgPSBwYWxldHRlWzFdLCBuYS5ybSA9IEZBTFNFLCBzaXplID0gMC4yNSkgKyAjIGZhY3RvciAuMzYgbWFudWFsbHkgZGV0ZXJtaW5lZA0KICBnZW9tX2RvdHBsb3QoYmlud2lkdGggPSAuNCwgZmlsbCA9IHBhbGV0dGVbM10sIGNvbG9yID0gcGFsZXR0ZVsxXSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYygtMi44LCAyLjgpLA0KICAgIGV4cGFuZCA9IGMoMCwgMCkNCiAgKSArDQogIHNjYWxlX3lfY29udGludW91cygNCiAgICBleHBhbmQgPSBjKDAuMDIsIDApLA0KICAgIGxpbWl0cyA9IGMoMCwgMC40KQ0KICApICsNCiAgbGFicyh0aXRsZSA9ICJRdWFudGlsZSBEb3QgUGxvdCIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pICsNCiAgdGhlbWUoDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpDQogICkNCnBsb3RfZ3JpZChwMSwgcDIsIHAzLCBwNCwgbmNvbCA9IDQsIHNjYWxlID0gLjkpDQogIA0KYGBgDQoNClRvIGFjaGlldmUgYSBtb3JlIGRldGFpbGVkIHZpc3VhbGl6YXRpb24gdGhhbiBpcyBwb3NzaWJsZSB3aXRoIGVycm9yIGJhcnMgb3IgZ3JhZGVkIGVycm9yIGJhcnMsIHdlIGNhbiB2aXN1YWxpemUgdGhlIGFjdHVhbCBjb25maWRlbmNlIG9yIHBvc3RlcmlvciBkaXN0cmlidXRpb25zLiBDb25maWRlbmNlIHN0cmlwcyBwcm92aWRlIGEgY2xlYXIgdmlzdWFsIHNlbnNlIG9mIHVuY2VydGFpbnR5IGJ1dCBhcmUgZGlmZmljdWx0IHRvIHJlYWQgYWNjdXJhdGVseS4gRXllcyBhbmQgaGFsZi1leWVzIGNvbWJpbmUgZXJyb3IgYmFycyB3aXRoIGFwcHJvYWNoZXMgdG8gdmlzdWFsaXplIGRpc3RyaWJ1dGlvbnMgKHZpb2xpbnMgYW5kIHJpZGdlbGluZXMsIHJlc3BlY3RpdmVseSksIGFuZCB0aHVzIHNob3cgYm90aCBwcmVjaXNlIHJhbmdlcyBmb3Igc29tZSBjb25maWRlbmNlIGxldmVscyBhbmQgdGhlIG92ZXJhbGwgdW5jZXJ0YWludHkgZGlzdHJpYnV0aW9uLiBBIHF1YW50aWxlIGRvdCBwbG90IGNhbiBzZXJ2ZSBhcyBhbiBhbHRlcm5hdGl2ZSB2aXN1YWxpemF0aW9uIG9mIGFuIHVuY2VydGFpbnR5IGRpc3RyaWJ1dGlvbi4gQnkgc2hvd2luZyB0aGUgZGlzdHJpYnV0aW9uIGluIGRpc2NyZXRlIHVuaXRzLCB0aGUgcXVhbnRpbGUgZG90IHBsb3QgaXMgbm90IGFzIHByZWNpc2UgYnV0IGNhbiBiZSBlYXNpZXIgdG8gcmVhZCB0aGFuIHRoZSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBzaG93biBieSBhIHZpb2xpbiBvciByaWRnZWxpbmUgcGxvdC4NCg0KDQpgYGB7cn0NCiMgZmlsZSBiYXNlZCBvbiBzdGF0LXNtb290aC5SIGZyb20gZ2dwbG90Mg0KDQojJyBHZW5lcmF0ZSBvdXRjb21lIGRyYXdzIGZyb20gYSBzbW9vdGggZml0DQojJw0KIycgR2VuZXJhdGUgb3V0Y29tZSBkcmF3cyBmcm9tIGEgc21vb3RoIGZpdC4gVGhpcyBzdGF0IGlzIHNpbWlsYXIgdG8gW2BzdGF0X3Ntb290aCgpYF0sDQojJyBidXQgdGhlcmUgYXJlIGEgZmV3IGltcG9ydGFudCBkaWZmZXJlbmNlcy4gRmlyc3QsIHRoZXJlIGlzIG5vIGBtZXRob2RgIGFyZ3VtZW50Lg0KIycgT25seSBzbW9vdGggZml0cyBmaXR0ZWQgdmlhIFtgbWdjdjo6Z2FtKClgXSBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4gSWYgeW91IHdhbnQgYQ0KIycgbGluZWFyIGZpdCwgc2V0IGEgbGluZWFyIGZvcm11bGEgdmlhIGBmb3JtdWxhID0geSB+IHhgLiBTZWNvbmQsIHRoZXJlIGlzIG5vIGBzZWANCiMnIGFyZ3VtZW50LiBUaGlzIHN0YXQgY2Fubm90IGRyYXcgY29uZmlkZW5jZSBiYW5kcy4gU2VlIFtgY29uZmlkZW5jZV9iYW5kKClgXSBmb3IgYQ0KIycgd29ya2Fyb3VuZCBpZiB5b3Ugd2FudCB0byBhZGQgY29uZmlkZW5jZSBiYW5kcy4gSW50ZXJuYWxseSwgdGhlIHN0YXQgdXNlcyB0aGUNCiMnIGZ1bmN0aW9uIFtgc2FtcGxlX291dGNvbWVzKClgXSB0byBjYWxjdWxhdGUgb3V0Y29tZXMuDQojJw0KIycgVGhpcyBzdGF0IGZpdHMgdGhlIGdhbSB3aXRoIFJlc3RyaWN0ZWQgTWF4aW11bSBMaWtlbGlob29kIChSRU1MKSBhbmQgdXNlcyB0aGUNCiMnIHNtb290aGluZyBwYXJhbWV0ZXIgdW5jZXJ0YWludHkgY29ycmVjdGVkIGNvdmFyaWFuY2UgbWF0cml4IHRvIGdlbmVyYXRlIG91dGNvbWVzDQojJyAoYHVuY29uZGl0aW9uYWwgPSBUUlVFYCBpbiBbYHNhbXBsZV9vdXRjb21lcygpYF0pLiBJZiB5b3UgY2hvb3NlIGEgZGlmZmVyZW50IGdhbQ0KIycgZml0dGluZyBtZXRob2QgdGhlIHN0YXQgc2V0cyBgdW5jb25kaXRpb25hbCA9IEZBTFNFYC4NCiMnDQojJyBOb3RlIHRoYXQgZm9yIHN0YXRpYyBwbG90cywgeW91IHdpbGwgZ2VuZXJhbGx5IGhhdmUgdG8gc2V0IHRoZSBgZ3JvdXBgDQojJyBhZXN0aGV0aWMgYXBwcm9wcmlhdGVseSAoZS5nLiwgYGFlcyhncm91cCA9IHN0YXQoLmRyYXcpKWApLiBIb3dldmVyLCBmb3INCiMnIGFuaW1hdGVkIHBsb3RzIHlvdSB3aWxsIG5vcm1hbGx5IG5vdCB3YW50IHRvIHNldCB0aGUgZ3JvdXAgYWVzdGhldGljIGluDQojJyB0aGlzIHdheS4gVG8gZW5hYmxlIGFuaW1hdGlvbnMgYnkgZGVmYXVsdCwgYHN0YXRfc21vb3RoX2RyYXdzKClgIGRvZXMgbm90DQojJyBzZXQgYSBncm91cCBhZXN0aGV0aWMuIFNlZSBleGFtcGxlcyBmb3IgZnVydGhlciBkZXRhaWxzLg0KIycNCiMnIEBpbmhlcml0UGFyYW1zIGdncGxvdDI6OnN0YXRfc21vb3RoDQojJyBAcGFyYW0gdGltZXMgTnVtYmVyIG9mIG91dGNvbWVzIHRvIGRyYXcuDQojJyBAcGFyYW0gZm9ybXVsYSBGb3JtdWxhIHRvIHVzZSBpbiBzbW9vdGhpbmcgZnVuY3Rpb24uIERlZmF1bHQgaXMNCiMnICAgYSBjdWJpYyBzcGxpbmUsIGB5IH4gcyh4LCBicyA9ICJjcyIpYC4gVG8gZ2VuZXJhdGUgYSBsaW5lYXIgZml0LA0KIycgICBzZXQgYGZvcm11bGEgPSB5IH4geGAuDQojJyBAcGFyYW0gZ2FtLmFyZ3MgTGlzdCBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwYXNzZWQgb24gdG8gdGhlDQojJyAgIEdBTSBjYWxsLg0KIycgQGV4YW1wbGVzDQojJyBsaWJyYXJ5KGdncGxvdDIpDQojJw0KIycgIyBzdGF0aWMgcGxvdHMsIG5lZWQgdG8gc2V0IGdyb3VwIGFlc3RoZXRpYyBtYW51YWxseQ0KIycgZ2dwbG90KG10Y2FycywgYWVzKGhwLCBtcGcpKSArDQojJyAgIGdlb21fcG9pbnQoKSArDQojJyAgIHN0YXRfc21vb3RoX2RyYXdzKGFlcyhncm91cCA9IHN0YXQoLmRyYXcpKSwgc2l6ZSA9IDAuNSkgKw0KIycgICB0aGVtZV9idygpDQojJw0KIycgIyBpZiB3ZSB3YW50IHRvIGdyb3VwIGJ5IG11bHRpcGxlIHZhcmlhYmxlcywgd2UgaGF2ZSB0byB1c2UgdGhlaXINCiMnICMgbWFwcGVkIG5hbWUgKGhlcmUsIGBjb2xvdXJgIGluc3RlYWQgb2YgYFNwZWNpZXNgKSBiZWNhdXNlIHdlJ3JlDQojJyAjIGNyZWF0aW5nIHRoZSBncm91cHMgYWZ0ZXIgYWZ0ZXIgaW5pdGlhbCBkYXRhIG1hcHBpbmcNCiMnIGdncGxvdChpcmlzLCBhZXMoU2VwYWwuTGVuZ3RoLCBTZXBhbC5XaWR0aCwgY29sb3VyID0gU3BlY2llcykpICsNCiMnICAgZ2VvbV9wb2ludCgpICsNCiMnICAgc3RhdF9zbW9vdGhfZHJhd3MoDQojJyAgICAgZm9ybXVsYSA9IHkgfiB4LA0KIycgICAgIGFlcyhncm91cCA9IGludGVyYWN0aW9uKHN0YXQoLmRyYXcpLCBjb2xvdXIpKSwNCiMnICAgICBzaXplID0gMC41DQojJyAgICkgKw0KIycgICB0aGVtZV9idygpDQojJw0KIycgXGRvbnRydW57DQojJw0KIycgIyBhbmltYXRlZCBwbG90cw0KIycgbGlicmFyeShnZ2FuaW1hdGUpDQojJw0KIycgZ2dwbG90KG10Y2FycywgYWVzKGhwLCBtcGcpKSArDQojJyAgIGdlb21fcG9pbnQoKSArDQojJyAgIHN0YXRfc21vb3RoX2RyYXdzKHNpemUgPSAwLjUpICsNCiMnICAgdHJhbnNpdGlvbl9zdGF0ZXMoc3RhdCguZHJhdyksIDEsIDIpDQojJw0KIycgZ2dwbG90KGlyaXMsIGFlcyhTZXBhbC5MZW5ndGgsIFNlcGFsLldpZHRoLCBjb2xvdXIgPSBTcGVjaWVzKSkgKw0KIycgICBnZW9tX3BvaW50KCkgKw0KIycgICBzdGF0X3Ntb290aF9kcmF3cyhmb3JtdWxhID0geSB+IHgsIHRpbWVzID0gMjAsIHNpemUgPSAwLjUpICsNCiMnICAgdHJhbnNpdGlvbl9zdGF0ZXMoc3RhdCguZHJhdyksIDEsIDIpDQojJyB9DQojJyBAZXhwb3J0DQpzdGF0X3Ntb290aF9kcmF3cyA8LSBmdW5jdGlvbihtYXBwaW5nID0gTlVMTCwgdGltZXMgPSAxMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBOVUxMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbSA9ICJzbW9vdGgiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtdWxhID0geSB+IHMoeCwgYnMgPSAiY3MiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSA4MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxyYW5nZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtLmFyZ3MgPSBsaXN0KG1ldGhvZCA9ICJSRU1MIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gVFJVRSkgew0KICBsYXllcigNCiAgICBkYXRhID0gZGF0YSwNCiAgICBtYXBwaW5nID0gbWFwcGluZywNCiAgICBzdGF0ID0gU3RhdFNtb290aGRyYXdzLA0KICAgIGdlb20gPSBnZW9tLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb24sDQogICAgc2hvdy5sZWdlbmQgPSBzaG93LmxlZ2VuZCwNCiAgICBpbmhlcml0LmFlcyA9IGluaGVyaXQuYWVzLA0KICAgIHBhcmFtcyA9IGxpc3QoDQogICAgICB0aW1lcyA9IHRpbWVzLA0KICAgICAgZm9ybXVsYSA9IGZvcm11bGEsDQogICAgICBuID0gbiwNCiAgICAgIGZ1bGxyYW5nZSA9IGZ1bGxyYW5nZSwNCiAgICAgIG5hLnJtID0gbmEucm0sDQogICAgICBnYW0uYXJncyA9IGdhbS5hcmdzLA0KICAgICAgLi4uDQogICAgKQ0KICApDQp9DQoNCiMnIEByZG5hbWUgc3RhdF9zbW9vdGhfZHJhd3MNCiMnIEBmb3JtYXQgTlVMTA0KIycgQHVzYWdlIE5VTEwNCiMnIEBleHBvcnQNClN0YXRTbW9vdGhkcmF3cyA8LSBnZ3Byb3RvKCJTdGF0U21vb3RoZHJhd3MiLCBTdGF0LA0KICAjIFNldHRpbmcgdGhlIGdyb3VwIGFlc3RoZXRpYyBieSBkZWZhdWx0IGlzIGdvb2QgZm9yIHN0YXRpYyBwbG90cyBidXQNCiAgIyBiYWQgZm9yIGFuaW1hdGlvbnMuIFdlIGtlZXAgaXQgdW5zZXQgYnkgZGVmYXVsdCB0byBtYWtlIGFuaW1hdGlvbnMNCiAgIyBlYXNpZXIuDQogICNkZWZhdWx0X2FlcyA9IGFlcyhncm91cCA9IHN0YXQoLmRyYXcpKSwNCg0KICBjb21wdXRlX2dyb3VwID0gZnVuY3Rpb24oZGF0YSwgc2NhbGVzLCB0aW1lcyA9IDEwLCBmb3JtdWxhID0geSB+IHMoeCwgYnMgPSAiY3MiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gRkFMU0UsIG4gPSA4MCwgZnVsbHJhbmdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB4c2VxID0gTlVMTCwgbGV2ZWwgPSAwLjk1LCBnYW0uYXJncyA9IGxpc3QobWV0aG9kID0gIlJFTUwiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gRkFMU0UpIHsNCiAgICBpZiAobGVuZ3RoKHVuaXF1ZShkYXRhJHgpKSA8IDIpIHsNCiAgICAgICMgTm90IGVub3VnaCBkYXRhIHRvIHBlcmZvcm0gZml0DQogICAgICByZXR1cm4obmV3X2RhdGFfZnJhbWUoKSkNCiAgICB9DQoNCiAgICBpZiAoaXMubnVsbChkYXRhJHdlaWdodCkpIGRhdGEkd2VpZ2h0IDwtIDENCg0KICAgIGlmIChpcy5udWxsKHhzZXEpKSB7DQogICAgICBpZiAoaXMuaW50ZWdlcihkYXRhJHgpKSB7DQogICAgICAgIGlmIChmdWxscmFuZ2UpIHsNCiAgICAgICAgICB4c2VxIDwtIHNjYWxlcyR4JGRpbWVuc2lvbigpDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgeHNlcSA8LSBzb3J0KHVuaXF1ZShkYXRhJHgpKQ0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBpZiAoZnVsbHJhbmdlKSB7DQogICAgICAgICAgcmFuZ2UgPC0gc2NhbGVzJHgkZGltZW5zaW9uKCkNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICByYW5nZSA8LSByYW5nZShkYXRhJHgsIG5hLnJtID0gVFJVRSkNCiAgICAgICAgfQ0KICAgICAgICB4c2VxIDwtIHNlcShyYW5nZVsxXSwgcmFuZ2VbMl0sIGxlbmd0aC5vdXQgPSBuKQ0KICAgICAgfQ0KICAgIH0NCg0KDQogICAgI2Jhc2UuYXJncyA8LSBsaXN0KHF1b3RlKGZvcm11bGEpLCBkYXRhID0gcXVvdGUoZGF0YSksIHdlaWdodHMgPSBxdW90ZSh3ZWlnaHQpKQ0KICAgIGJhc2UuYXJncyA8LSBsaXN0KHF1b3RlKGZvcm11bGEpLCBkYXRhID0gcXVvdGUoZGF0YSkpDQogICAgbW9kZWwgPC0gZG8uY2FsbChtZ2N2OjpnYW0sIGMoYmFzZS5hcmdzLCBnYW0uYXJncykpDQoNCiAgICB1bmNvbmRpdGlvbmFsIDwtIEZBTFNFDQogICAgaWYgKGdhbS5hcmdzJG1ldGhvZCA9PSAiUkVNTCIpIHsNCiAgICAgIHVuY29uZGl0aW9uYWwgPC0gVFJVRQ0KICAgIH0NCg0KICAgIHNhbXBsZV9vdXRjb21lcyhtb2RlbCwgZGF0YS5mcmFtZSh4ID0geHNlcSksIHRpbWVzID0gdGltZXMsIHVuY29uZGl0aW9uYWwgPSB1bmNvbmRpdGlvbmFsKQ0KICB9LA0KDQogIHJlcXVpcmVkX2FlcyA9IGMoIngiLCAieSIpDQopDQpgYGANCg0KDQoNCg0KYGBge3IgY29uZmlkZW5jZS1iYW5kcywgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDEvNH0NCnAxIDwtIGdncGxvdChkZl9kZW5zZV9zY2F0dGVyX3NhbXBsZSwgYWVzKHgsIHkpKSArDQogIGdlb21fc21vb3RoKA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBmaWxsID0gcGFsZXR0ZVtucGFsLTJdLA0KICAgIHNpemUgPSAwLjUsDQogICAgbGV2ZWwgPSAwLjk1DQogICkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwgNSkpICsNCiAgbGFicyh0aXRsZSA9ICJDb25maWRlbmNlIEJhbmQiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDIgPC0gZ2dwbG90KGRmX2RlbnNlX3NjYXR0ZXJfc2FtcGxlLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV9zbW9vdGgoY29sb3IgPSBOQSwgZmlsbCA9IHBhbGV0dGVbbnBhbC0xXSwgbGV2ZWwgPSAwLjk5KSArDQogIGdlb21fc21vb3RoKGNvbG9yID0gTkEsIGZpbGwgPSBwYWxldHRlW25wYWwtMl0sIGxldmVsID0gMC45NSkgKw0KICBnZW9tX3Ntb290aCgNCiAgICBjb2xvciA9IHBhbGV0dGVbMV0sDQogICAgZmlsbCA9IHBhbGV0dGVbbnBhbC0zXSwNCiAgICBzaXplID0gMC41LA0KICAgIGxldmVsID0gMC44DQogICkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwgNSkpICsNCiAgbGFicyh0aXRsZSA9ICJHcmFkZWQgQ29uZmlkZW5jZSBCYW5kIikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnAzIDwtIGdncGxvdChkZl9kZW5zZV9zY2F0dGVyX3NhbXBsZSwgYWVzKHgsIHkpKSArDQogIHN0YXRfc21vb3RoX2RyYXdzKA0KICAgIHRpbWVzID0gOCwNCiAgICBhZXMoZ3JvdXAgPSBzdGF0KC5kcmF3KSksDQogICAgY29sb3IgPSBwYWxldHRlWzFdLA0KICAgIHNpemUgPSAwLjE1DQogICkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwgNSkpICsNCiAgbGFicyh0aXRsZSA9ICJGaXR0ZWQgRHJhd3MiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHAxLCBwMiwgcDMsIG5jb2wgPSAzLCBzY2FsZSA9IC45KQ0KYGBgDQoNCkZvciBzbW9vdGggbGluZSBncmFwaHMsIHRoZSBlcXVpdmFsZW50IG9mIGFuIGVycm9yIGJhciBpcyBhIGNvbmZpZGVuY2UgYmFuZC4gSXQgc2hvd3MgYSByYW5nZSBvZiB2YWx1ZXMgdGhlIGxpbmUgbWlnaHQgcGFzcyB0aHJvdWdoIGF0IGEgZ2l2ZW4gY29uZmlkZW5jZSBsZXZlbC4gQXMgaW4gdGhlIGNhc2Ugb2YgZXJyb3IgYmFycywgd2UgY2FuIGRyYXcgZ3JhZGVkIGNvbmZpZGVuY2UgYmFuZHMgdGhhdCBzaG93IG11bHRpcGxlIGNvbmZpZGVuY2UgbGV2ZWxzIGF0IG9uY2UuIFdlIGNhbiBhbHNvIHNob3cgaW5kaXZpZHVhbCBmaXR0ZWQgZHJhd3MgaW4gbGlldSBvZiBvciBpbiBhZGRpdGlvbiB0byB0aGUgY29uZmlkZW5jZSBiYW5kcy4NCg==