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.
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.
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.
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.
Relationships
There are different ways to visualize the relationship between two
variables. This section focused primarily two numerical variables.
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.
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.
Serial Line Plots
(for Trends)

When the x axis represents time or a strictly increasing
quantity such as a treatment dose, we commonly draw line graphs. If we
have a temporal sequence of two response variables, we can draw a
connected scatterplot where we first plot the two response variables in
a scatterplot and then connect dots corresponding to adjacent time
points. We can use smooth lines to represent trends in a larger
dataset.
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.
LS0tDQp0aXRsZTogIkRpcmVjdG9yeSBvZiBWaXN1YWxpemF0aW9uIg0KYXV0aG9yOiAiQ29tcGlsZWQgZnJvbSBQcm9mLiBXaWxrZSdzIE5vdGUiDQpkYXRlOiAiICINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNg0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX2hlaWdodDogNA0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiA1DQogICAgZmlnX2hlaWdodDogNA0KLS0tDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQpkaXYjVE9DIGxpIHsNCiAgICBsaXN0LXN0eWxlOm5vbmU7DQogICAgYmFja2dyb3VuZC1jb2xvcjpsaWdodGdyYXk7DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICAgIGNvbG9yOiAjNzgwYzBjOw0KfQ0KDQovKiBtb3VzZSBvdmVyIGxpbmsgKi8NCmRpdiNUT0MgYTpob3ZlciB7DQogIGNvbG9yOiByZWQ7DQp9DQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQpkaXYjVE9DIGE6bGluayB7DQogIGNvbG9yOiBibHVlOw0KfQ0KDQoNCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBEYXJrYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgZm9udC12YXJpYW50LWNhcHM6IG5vcm1hbDsNCn0NCmg0LmF1dGhvciB7IA0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7DQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgDQogICAgZm9udC1zaXplOiAxNXB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQphOmxpbmsgew0KICBjb2xvcjogZ3JlZW47DQp9DQoNCi8qIHZpc2l0ZWQgbGluayAqLw0KYTp2aXNpdGVkIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiBtb3VzZSBvdmVyIGxpbmsgKi8NCmE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiBzZWxlY3RlZCBsaW5rICovDQphOmFjdGl2ZSB7DQogIGNvbG9yOiB5ZWxsb3c7DQp9DQoNCjwvc3R5bGU+DQoNCg0KYGBge3Igc2V0dXAsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIHJ1biBzZXR1cCBzY3JpcHQNCiNpbnN0YWxsLnBhY2thZ2VzKCJyZW1vdGVzIikNCiNsaWJyYXJ5KHJlbW90ZXMpDQojcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoImNsYXVzd2lsa2UvZHZpei5zdXBwIikNCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImNsYXVzd2lsa2UvZHZpei5zdXBwIikNCg0KbGlicmFyeShjb2xvcnNwYWNlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ2ZvcmNlKQ0KbGlicmFyeShnZ3JpZGdlcykNCmxpYnJhcnkodHJlZW1hcGlmeSkNCmxpYnJhcnkoZm9yY2F0cykNCmxpYnJhcnkoc3RhdGViaW5zKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoY293cGxvdCkNCg0KDQpvcHRpb25zKGRpZ2l0cyA9IDMpDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogICAgICAgICAgICAgICAgIGVjaG8gPSBGQUxTRSwNCiAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsDQogICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgI2RwaSA9IDEwNSwgIyBub3Qgc3VyZSB3aHksIGJ1dCBuZWVkIHRvIGRpdmlkZSB0aGlzIGJ5IDIgdG8gZ2V0IDIxMCBhdCA2aW4sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGljaCBpcyAzMDAgYXQgNC4yaW4NCiAgICAgICAgICAgZmlnLmFsaWduID0gJ2NlbnRlcicsDQogICAgICAgICAgIGZpZy53aWR0aCA9IDYsDQogICAgICAgICAgICAgZmlnLmFzcCA9IDAuNjE4LCAgIyAxIC8gcGhpDQogICAgICAgICAgICBmaWcuc2hvdyA9ICJob2xkIg0KICAgICAgICAgICAgKQ0Kb3B0aW9ucyhkcGx5ci5wcmludF9taW4gPSA2LCBkcGx5ci5wcmludF9tYXggPSA2KQ0KYGBgDQoNCg0KDQojIEludHJvZHVjdGlvbg0KDQpUaGlzIG5vdGUgaXMgY29tcGlsZWQgYmFzZWQgb24gYW4gb25saW5lIHBvc3Qgb2YgUHJvZmVzc29yIENsYXVzIFdpbGtlIChhdCBVVCBBdXN0aW4pIHRoYXQgcHJvdmlkZXMgYSBxdWljayB2aXN1YWwgb3ZlcnZpZXcgb2YgdGhlIHZhcmlvdXMgcGxvdHMgYW5kIGNoYXJ0cyB0aGF0IGFyZSBjb21tb25seSB1c2VkIHRvIHZpc3VhbGl6ZSBkYXRhLiBXaWxrZSBkZWZpbmVkIHZhcmlvdXMgZnVuY3Rpb25zIGJhc2VkIG9uIGdncGxvdDIgYW5kIHVzZWQgdGhlbSB0byBtYWtlIG1hbnkgYWVzdGhldGljYWxseSBwbGVhc2FudCBwbG90cyBwYXJ0aWN1bGFybHkgdGhlIGJlYXV0aWZ1bCByaWRnZSBwbG90cy4NCg0KU2luY2UgdGhlIGdyYXBocyBnZW5lcmF0ZWQgaW4gdGhpcyBub3RlIGludm9sdmVzIHNpZ25pZmljYW50IGNvZGluZywgdGhlIHNvdXJjZSBjb2RlIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhpcyBub3RlLiANCg0KYGBge3J9DQojIyBnZW5lcmFsIHNldHVwIGNvZGUNCiMgbGluZV9zaXplID0gMC42DQojIHRoZW1lDQp0aGVtZV9wbG90X2ljb24gPC0gZnVuY3Rpb24oYmdfY29sb3IgPSAiI0Y1RjhFQSIsIGxpbmVfY29sb3IgPSAiIzI0MzQwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplID0gLjUsIGZvbnRfc2l6ZSA9IDE0KSB7DQogIHRoZW1lX2R2aXpfb3BlbigpICUrcmVwbGFjZSUgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggICAgICAgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50ZXh0LnkgICAgICAgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aXRsZS54ICAgICAgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aXRsZS55ICAgICAgPSBlbGVtZW50X2JsYW5rKCksDQogICAgI2F4aXMubGluZS54ICAgICAgID0gZWxlbWVudF9ibGFuaygpLA0KICAgICNheGlzLmxpbmUueSAgICAgICA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAjYXhpcy50aWNrcyAgICAgICAgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy5saW5lLnggICAgICAgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IGxpbmVfc2l6ZSwgY29sb3IgPSBsaW5lX2NvbG9yKSwNCiAgICBheGlzLmxpbmUueSAgICAgICA9IGVsZW1lbnRfbGluZShzaXplID0gbGluZV9zaXplLCBjb2xvciA9IGxpbmVfY29sb3IpLA0KICAgIGF4aXMudGlja3MgICAgICAgID0gZWxlbWVudF9saW5lKHNpemUgPSBsaW5lX3NpemUsIGNvbG9yID0gbGluZV9jb2xvciksDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSBncmlkOjp1bml0KDQsICJwdCIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiAgID0gIm5vbmUiLA0KICAgIHBsb3QubWFyZ2luICAgICAgID0gbWFyZ2luKA0KICAgICAgZm9udF9zaXplKjgvMTQsIGZvbnRfc2l6ZSwgZm9udF9zaXplKjEwLzE0LCBmb250X3NpemUNCiAgICApLA0KICAgIHBsb3QudGl0bGUgICAgICAgID0gZWxlbWVudF90ZXh0KA0KICAgICAgaGp1c3QgPSAwLjUsDQogICAgICAjZmFtaWx5ID0gZHZpel9mb250X2ZhbWlseV9ib2xkLA0KICAgICAgZmFtaWx5ID0gZHZpel9mb250X2ZhbWlseV9jb25kZW5zZWQsDQogICAgICBjb2xvciA9IGxpbmVfY29sb3IsDQogICAgICBzaXplID0gZm9udF9zaXplLA0KICAgICAgbWFyZ2luID0gbWFyZ2luKDAsIDAsIGZvbnRfc2l6ZSo2LzE0LCAwKQ0KICAgICksDQogICAgcGxvdC5iYWNrZ3JvdW5kICAgPSBlbGVtZW50X3JlY3QoZmlsbCA9IGJnX2NvbG9yKQ0KICApDQp9DQoNCg0KDQoNCg0KDQp0aGVtZV9wbG90X2ljb25faGdyaWQgPC0gZnVuY3Rpb24oYmdfY29sb3IgPSAiI0Y1RjhFQSIsIGxpbmVfY29sb3IgPSAiIzI0MzQwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplID0gLjUsIGZvbnRfc2l6ZSA9IDE0KSB7DQogIHRoZW1lX3Bsb3RfaWNvbihiZ19jb2xvciwgbGluZV9jb2xvciwgbGluZV9zaXplLCBmb250X3NpemUpICUrcmVwbGFjZSUgdGhlbWUoDQogICAgICAjIG1ha2UgZ3JpZCBsaW5lcw0KICAgICAgI3BhbmVsLmdyaWQubWFqb3IueSAgID0gZWxlbWVudF9saW5lKGNvbG91ciA9IHBhc3RlMChsaW5lX2NvbG9yLCAiMzAiKSwNCiAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC41KSwNCiAgICAgICMgcmVtb3ZlIHggYXhpcw0KICAgICAgYXhpcy50aWNrcy54ICAgICAgICA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMubGluZS54ICAgICAgICAgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KfQ0KDQp0aGVtZV9wbG90X2ljb25fdmdyaWQgPC0gZnVuY3Rpb24oYmdfY29sb3IgPSAiI0Y1RjhFQSIsIGxpbmVfY29sb3IgPSAiIzI0MzQwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplID0gLjUsIGZvbnRfc2l6ZSA9IDE0KSB7DQogIHRoZW1lX3Bsb3RfaWNvbihiZ19jb2xvciwgbGluZV9jb2xvciwgbGluZV9zaXplLCBmb250X3NpemUpICUrcmVwbGFjZSUgdGhlbWUoDQogICAgICAjIG1ha2UgZ3JpZCBsaW5lcw0KICAgICAgI3BhbmVsLmdyaWQubWFqb3IueCAgID0gZWxlbWVudF9saW5lKGNvbG91ciA9IHBhc3RlMChsaW5lX2NvbG9yLCAiMzAiKSwNCiAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC41KSwNCiAgICAgICMgcmVtb3ZlIHkgYXhpcw0KICAgICAgYXhpcy50aWNrcy55ICAgICAgICA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMubGluZS55ICAgICAgICAgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KfQ0KDQp0aGVtZV9wbG90X2ljb25fYmxhbmsgPC0gZnVuY3Rpb24oYmdfY29sb3IgPSAiI0Y1RjhFQSIsIGxpbmVfY29sb3IgPSAiIzI0MzQwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9zaXplID0gLjUsIGZvbnRfc2l6ZSA9IDE0KSB7DQogIHRoZW1lX3Bsb3RfaWNvbihiZ19jb2xvciwgbGluZV9jb2xvciwgbGluZV9zaXplLCBmb250X3NpemUpICUrcmVwbGFjZSUgdGhlbWUoDQogICAgICBheGlzLnRpY2tzICAgICAgICAgID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy5saW5lLnggICAgICAgICA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMubGluZS55ICAgICAgICAgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLnRpY2tzLmxlbmd0aCAgICA9IGdyaWQ6OnVuaXQoMCwgInB0IikNCiAgKQ0KfQ0KDQojIGRhdGEgc2V0cw0Kc2V0LnNlZWQoNTE0MikNCm4gPC0gMTUNCnggPC0gcm5vcm0obikNCnkgPC0gLjQqeCArIC42KnJub3JtKG4pDQpkZl9zY2F0dGVyX3h5IDwtIGRhdGEuZnJhbWUoeCwgeSkNCmRmX29uZV9kaXN0IDwtIGRhdGEuZnJhbWUoeCA9IGMocm5vcm0oMTAwMCwgMS4sIDEuNiksIHJub3JtKDMwMCwgNCwgLjQpKSkNCmRmX29uZV9ub3JtYWwgPC0gZGF0YS5mcmFtZSh4ID0gcm5vcm0oMjApKQ0KZGZfZnJhY3Rpb25zIDwtIGRhdGEuZnJhbWUoeSA9IGMoLjMsIC4zOSwgLjQ4LCAuNiwgLjI1LCAuMTMsIC4yMiwgLjI0LCAuNDUsIC40OCwgLjMsIC4xNiksDQogICAgICAgICAgICAgICAgIHggPSBmYWN0b3IocmVwKDE6NCwgMykpLA0KICAgICAgICAgICAgICAgICB0eXBlID0gcmVwKGMoIkEiLCAiQiIsICJDIiksIGVhY2ggPSA0KSkNCnNldC5zZWVkKDI0NzQpDQpuIDwtIDgNCnggPC0gcm5vcm0obikNCnkgPC0gLjQqeCArIC42KnJub3JtKG4pDQp6IDwtIC41KnggKyAuMypybm9ybShuKQ0KeiA8LSAoeiAtIG1pbih6KSArIDAuMSleMg0KZGZfc2NhdHRlcl94eXogPC0gZGF0YS5mcmFtZSh4LCB5LCB6KQ0Kc2V0LnNlZWQoNTAxMikNCmRmX211bHRpX2Ftb3VudHMgPC0gbXV0YXRlKGRmX2ZyYWN0aW9ucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjKDEuMCwgMS4xLCAxLjQsIDEuMilbeF0qeSkNCm4gPC0gNzANCmRmX211bHRpX2Rpc3QgPC0gZGF0YS5mcmFtZSh5ID0gYyhybm9ybShuLCAxLCAuOCksIHJub3JtKG4sIDIsIC43KSwgcm5vcm0obiwgMCwgLjUpKSwNCiAgICAgICAgICAgICAgICAgdHlwZSA9IHJlcChjKCJBIiwgIkIiLCAiQyIpLCBlYWNoID0gbiksDQogICAgICAgICAgICAgICAgIG51bWJlciA9IHJlcChjKDIsIDEsIDMpLCBlYWNoID0gbikpDQpkZl9wcm9wcyA9IGRhdGEuZnJhbWUodmFsdWUgPSBjKDU1LCAzMCwgMTUpLA0KICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gYygiQSIsICJCIiwgIkMiKSkNCmRmX211bHRpX3Byb3BzIDwtIGRhdGEuZnJhbWUoDQogIHZhcjEgPSByZXAoYygiQyIsICJCIiwgIkEiKSwgMyksDQogIHZhcjIgPSByZXAoYygiQSIsICJCIiwgIkMiKSwgZWFjaCA9IDMpLA0KICBjb3VudCA9IGMoNCwgMSwgMiwgMTIsIDksIDUsIDQsIDUsIDQpDQopICU+JSBncm91cF9ieSh2YXIyKSAlPiUNCiAgbXV0YXRlKGdyb3VwX2NvdW50ID0gc3VtKGNvdW50KSkNCmRmX211bHRpX3Byb3BzMiA8LSBkYXRhLmZyYW1lKA0KICB2YXIxID0gcmVwKGMoIkIiLCAiQSIpLCA5KSwNCiAgdmFyMiA9IHJlcChjKCJFIiwgIkUiLCAiRCIsICJEIiwgIkMiLCAiQyIpLCAzKSwNCiAgdmFyMyA9IHJlcChjKCJIIiwgIkciLCAiRiIpLCBlYWNoID0gNiksDQogIGNvdW50ID0gYyg1LCA4LCAwLCAwLCAwLCAwLCAwLCAzLCAyLCA3LCAwLCAwLCA0LCAwLCA0LCAyLCA3LCA0KQ0KKQ0KZGZfc2V0cyA8LSBnYXRoZXJfc2V0X2RhdGEoZGZfbXVsdGlfcHJvcHMyLCAxOjMpDQpkZl9vbmVfbGluZSA8LSBkYXRhLmZyYW1lKA0KICB4ID0gMTo1LA0KICB5ID0gYygzLjEsIDMuMywgNC4wLCAzLjgsIDQuNCkNCikNCnNldC5zZWVkKDk2ODEpDQpuMSA8LSAxNTAwLzUNCm4yIDwtIDgwMC81DQp4MSA8LSBybm9ybShuMSwgMCwgLjcpDQp5MSA8LSAyICogeDEgKyBybm9ybShuMSwgMCwgLjgpDQp4MiA8LSBybm9ybShuMiwgMCwgMC40KQ0KeTIgPC0gMS41ICogeDIgKyBybm9ybShuMiwgLjUsIC44KQ0KZGZfZGVuc2Vfc2NhdHRlciA8LSBuYS5vbWl0KA0KICBkYXRhLmZyYW1lKA0KICAgIHggPSBzY2FsZXM6OmNlbnNvcihjKHgxLCB4MiArIDIuMiksIGMoLTIsIDQpKSwNCiAgICB5ID0gc2NhbGVzOjpjZW5zb3IoYyh5MSwgeTIgKyAxLjUpLCBjKC0zLjUsIDQuNSkpDQogICkNCikNCnkxIDwtIDIgKiB4MSArIHJub3JtKG4xLCAwLCAxLjYpDQp5MiA8LSAxLjUgKiB4MiArIHJub3JtKG4yLCAuNSwgMS42KQ0KZGZfZGVuc2Vfc2NhdHRlcl9zYW1wbGUgPC0gbmEub21pdCgNCiAgZGF0YS5mcmFtZSgNCiAgICB4ID0gc2NhbGVzOjpjZW5zb3IoYyh4MSwgeDIgKyAyLjIpLCBjKC0yLCA0KSksDQogICAgeSA9IHNjYWxlczo6Y2Vuc29yKGMoeTEsIHkyICsgMS41KSwgYygtMy41LCA0LjUpKQ0KICApDQopICU+JSBzYW1wbGVfbig1MCkNCmRmX2Nvbm5lY3RlZF9zY2F0dGVyIDwtIGRhdGEuZnJhbWUoDQogIHggPSBjKDEuOSwgMS41LCAyLjIsIDMsIDMuMywgMi43LCAxLjcsIDEpLA0KICB5ID0gYygwLjMsIC0xLCAtMi4wLCAtMC45LCAuNiwgMS44LCAyLCAwLjcpLA0KICB0ID0gMTo4DQopDQpkZl9wYWlyZWQgPC0gZGF0YS5mcmFtZSgNCiAgeSA9IGMoNiwgNS4zLCAzLjgsIDIuOCwgMiwNCiAgICAgICAgNC4zLCA2LjEsIDUuMSwgMy4zLCAyLjQpLA0KICB4ID0gcmVwKGMoIkEiLCAiQiIpLCBlYWNoID0gNSksDQogIGdyb3VwID0gcmVwKDE6NSwgMikNCikNCmRmX3VuY2VydGFpbiA8LSBkYXRhLmZyYW1lKA0KICB0eXBlID0gYygiQSIsICJCIiwgIkMiKSwNCiAgeCA9IGMoMS41LCAyLjIsIDMuNCksDQogIHkgPSBjKDMuMiwgNS4xLCAzLjkpLA0KICBkeCA9IGMoLjI1LCAuMywgLjM1KSwNCiAgZHkgPSBjKC41LCAuNCwgLjYpDQopDQojIHBhbGV0dGVzDQpucGFsIDwtIDUNCiMgZWFydGgtYnJvd24gKEFtb3VudHMpDQpwYWxfZWFydGhfYnJvd24gPC0gc2VxdWVudGlhbF9oY2wobiA9IG5wYWwsIGgxID0gNzEsIGMxID0gODAsIGMyID0gMTAsIGwxID0gMTgsIGwyID0gOTcsIHAxID0gMS41KQ0KIyBicm93bi1ncmVlbiAoUHJvcG9ydGlvbnMpDQpwYWxfYnJvd25fZ3JlZW4gPC0gc2VxdWVudGlhbF9oY2wobiA9IG5wYWwsIGgxID0gODYsIGMxID0gODAsIGMyID0gMTAsIGwxID0gMTgsIGwyID0gOTcsIHAxID0gMS41KQ0KIyBncmVlbi1icm93biAoR2Vvc3BhdGlhbCBkYXRhKQ0KcGFsX2dyZWVuX2Jyb3duIDwtIHNlcXVlbnRpYWxfaGNsKG4gPSBucGFsLCBoMSA9IC0yNjUsIGMxID0gODAsIGMyID0gMTAsIGwxID0gMTgsIGwyID0gOTcsIHAxID0gMS41KQ0KIyBidXJndW5keS1yZWQgDQpwYWxfcmVkX2Jyb3duIDwtIHNlcXVlbnRpYWxfaGNsKG4gPSBucGFsLCBoMSA9IDI4LCBjMSA9IDgwLCBjMiA9IDEwLCBsMSA9IDE4LCBsMiA9IDk3LCBwMSA9IDEuNSkNCiMgYnJvd24tcmVkIChVbmNlcnRhaW50eSkNCnBhbF9icm93bl9yZWQgPC0gc2VxdWVudGlhbF9oY2wobiA9IG5wYWwsIGgxID0gNDEsIGMxID0gODAsIGMyID0gMTAsIGwxID0gMTgsIGwyID0gOTcsIHAxID0gMS41KQ0KIyBvY2Vhbi1ibHVlIChEaXN0cmlidXRpb25zKQ0KcGFsX29jZWFuX2JsdWUgPC0gc2VxdWVudGlhbF9oY2wobiA9IG5wYWwsIGgxID0gMjQxLCBjMSA9IDgwLCBjMiA9IDEwLCBsMSA9IDE4LCBsMiA9IDk3LCBwMSA9IDEuNSkNCiMgc3RlZWwtYmx1ZSAoeC15IHJlbGF0aW9uc2hpcHMpDQpwYWxfc3RlZWxfYmx1ZSA8LSBzZXF1ZW50aWFsX2hjbChuID0gbnBhbCwgaDEgPSAyNTcsIGMxID0gODAsIGMyID0gMTAsIGwxID0gMTgsIGwyID0gOTcsIHAxID0gMS41KQ0KcGFsX3N0ZWVsX2JsdWVfaW52IDwtIHNlcXVlbnRpYWxfaGNsKG4gPSBucGFsLCBoMSA9IDI1Ny0xODAsIGMxID0gODAsIGMyID0gMTAsIGwxID0gMTgsIGwyID0gOTcsIHAxID0gMS41KQ0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KIycgZHZpei5zdXBwDQojJw0KIycgU3VwcG9ydGluZyBtYXRlcmlhbHMgZm9yIENsYXVzIFdpbGtlJ3MgZGF0YSB2aXN1YWxpemF0aW9uIGJvb2suDQojJyBAbmFtZSBkdml6LnN1cHANCiMnIEBkb2NUeXBlIHBhY2thZ2UNCiMnIEBpbXBvcnQgZHBseXINCiMnIEBpbXBvcnQgY293cGxvdA0KIycgQGltcG9ydCBjb2xvcnNwYWNlDQojJyBAaW1wb3J0IGNvbG9yYmxpbmRyDQogDQoNCiMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KIyAgICAgICAgICAgICAgICAgICAgIFNldHVwDQojICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg0KLm9uQXR0YWNoIDwtIGZ1bmN0aW9uKGxpYm5hbWUsIHBrZ25hbWUpIHsNCiAgIyBzd2l0Y2ggdGhlIGNvd3Bsb3QgbnVsbCBkZXZpY2UNCiAgY293cGxvdDo6c2V0X251bGxfZGV2aWNlKCJwbmciKQ0KfQ0KDQojJyBAbm9SZA0KIycgQHVzYWdlIE5VTEwNCiMnIEBleHBvcnQNCmR2aXpfZm9udF9mYW1pbHkgPC0gIk15cmlhZCBQcm8iDQoNCiMnIEBub1JkDQojJyBAdXNhZ2UgTlVMTA0KIycgQGV4cG9ydA0KZHZpel9mb250X2ZhbWlseV9ib2xkIDwtICJNeXJpYWQgUHJvIFNlbWlib2xkIg0KDQojJyBAbm9SZA0KIycgQHVzYWdlIE5VTEwNCiMnIEBleHBvcnQNCmR2aXpfZm9udF9mYW1pbHlfY29uZGVuc2VkIDwtICJNeXJpYWQgUHJvIENvbmRlbnNlZCINCg0KIycgQG5vUmQNCiMnIEB1c2FnZSBOVUxMDQojJyBAZXhwb3J0DQpkdml6X2ZvbnRfZmFtaWx5X2JvbGRfY29uZGVuc2VkIDwtICJNeXJpYWQgUHJvIEJvbGQgQ29uZGVuc2VkIg0KYGBgDQoNCg0KDQoNCg0KYGBge3J9DQojJyBUaGVtZXMgZm9yIGRhdGEgdml6IGJvb2sNCiMnDQojJyBUaGUgdGhlbWVzIHVzZWQgaW4gdGhlIGRhdGEgdmlzdWFsaXphdGlvbiBib29rLiBUaGUgZGVmYXVsdCBmb250IGZvciB0aGVzZQ0KIycgdGhlbWVzIGlzIE15cmlhZCBQcm8sIHdoaWNoIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgdGFyZ2V0IHN5c3RlbSBmb3INCiMnIHRoZXNlIHRoZW1lcyB0byB3b3JrLg0KIycNCiMnIEBwYXJhbSBmb250X3NpemUgT3ZlcmFsbCBmb250IHNpemUNCiMnIEBwYXJhbSBmb250X2ZhbWlseSBGb250IGZhbWlseSBmb3IgcGxvdCB0aXRsZSwgYXhpcyB0aXRsZXMgYW5kIGxhYmVscywgbGVnZW5kIHRleHRzLCBldGMuDQojJyBAcGFyYW0gbGluZV9zaXplIExpbmUgc2l6ZSBmb3IgYXhpcyBsaW5lcw0KIycgQHBhcmFtIHJlbF9zbWFsbCBSZWxhdGl2ZSBzaXplIG9mIHNtYWxsIHRleHQgKGUuZy4sIGF4aXMgdGljayBsYWJlbHMpDQojJyBAcGFyYW0gcmVsX3RpbnkgUmVsYXRpdmUgc2l6ZSBvZiB0aW55IHRleHQgKGUuZy4sIGNhcHRpb24pDQojJyBAcGFyYW0gcmVsX2xhcmdlIFJlbGF0aXZlIHNpemUgb2YgbGFyZ2UgdGV4dCAoZS5nLiwgdGl0bGUpDQojJyBAZXhwb3J0DQp0aGVtZV9kdml6X29wZW4gPC0gZnVuY3Rpb24oZm9udF9zaXplID0gMTQsIGZvbnRfZmFtaWx5ID0gZHZpel9mb250X2ZhbWlseSwgbGluZV9zaXplID0gLjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9zbWFsbCA9IDEyLzE0LCByZWxfdGlueSA9IDExLzE0LCByZWxfbGFyZ2UgPSAxNi8xNCkgew0KICBoYWxmX2xpbmUgPC0gZm9udF9zaXplIC8gMg0KICANCiAgY293cGxvdDo6dGhlbWVfaGFsZl9vcGVuKGZvbnRfc2l6ZSA9IGZvbnRfc2l6ZSwgZm9udF9mYW1pbHkgPSBmb250X2ZhbWlseSwgbGluZV9zaXplID0gbGluZV9zaXplLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3NtYWxsID0gcmVsX3NtYWxsLCByZWxfdGlueSA9IHJlbF90aW55LCByZWxfbGFyZ2UgPSByZWxfbGFyZ2UpICAlK3JlcGxhY2UlDQogICAgdGhlbWUoDQogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbihoYWxmX2xpbmUvMiwgMS41LCBoYWxmX2xpbmUvMiwgMS41KSwNCiAgICAgIGNvbXBsZXRlID0gVFJVRQ0KICAgICkNCn0NCg0KIycgQHJkbmFtZSB0aGVtZV9kdml6X29wZW4NCiMnIEBwYXJhbSBjb2xvdXIgQ29sb3Igb2YgZ3JpZCBsaW5lcw0KIycgQGV4cG9ydA0KdGhlbWVfZHZpel9ncmlkIDwtIGZ1bmN0aW9uKGZvbnRfc2l6ZSA9IDE0LCBmb250X2ZhbWlseSA9IGR2aXpfZm9udF9mYW1pbHksIGxpbmVfc2l6ZSA9IC41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9zbWFsbCA9IDEyLzE0LCByZWxfdGlueSA9IDExLzE0LCByZWxfbGFyZ2UgPSAxNi8xNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTkwIikgew0KICBoYWxmX2xpbmUgPC0gZm9udF9zaXplIC8gMg0KICANCiAgY293cGxvdDo6dGhlbWVfbWluaW1hbF9ncmlkKGZvbnRfc2l6ZSA9IGZvbnRfc2l6ZSwgZm9udF9mYW1pbHkgPSBmb250X2ZhbWlseSwgbGluZV9zaXplID0gbGluZV9zaXplLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3NtYWxsID0gcmVsX3NtYWxsLCByZWxfdGlueSA9IHJlbF90aW55LCByZWxfbGFyZ2UgPSByZWxfbGFyZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBjb2xvdXIpICAlK3JlcGxhY2UlDQogICAgdGhlbWUoDQogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbihoYWxmX2xpbmUvMiwgMS41LCBoYWxmX2xpbmUvMiwgMS41KSwNCiAgICAgIGNvbXBsZXRlID0gVFJVRQ0KICAgICkNCn0NCg0KIycgQHJkbmFtZSB0aGVtZV9kdml6X29wZW4NCiMnIEBleHBvcnQNCnRoZW1lX2R2aXpfaGdyaWQgPC0gZnVuY3Rpb24oZm9udF9zaXplID0gMTQsIGZvbnRfZmFtaWx5ID0gZHZpel9mb250X2ZhbWlseSwgbGluZV9zaXplID0gLjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3NtYWxsID0gMTIvMTQsIHJlbF90aW55ID0gMTEvMTQsIHJlbF9sYXJnZSA9IDE2LzE0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5OTAiKSB7DQogIGhhbGZfbGluZSA8LSBmb250X3NpemUgLyAyDQogIA0KICBjb3dwbG90Ojp0aGVtZV9taW5pbWFsX2hncmlkKGZvbnRfc2l6ZSA9IGZvbnRfc2l6ZSwgZm9udF9mYW1pbHkgPSBmb250X2ZhbWlseSwgbGluZV9zaXplID0gbGluZV9zaXplLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3NtYWxsID0gcmVsX3NtYWxsLCByZWxfdGlueSA9IHJlbF90aW55LCByZWxfbGFyZ2UgPSByZWxfbGFyZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBjb2xvdXIpICAlK3JlcGxhY2UlDQogICAgdGhlbWUoDQogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbihoYWxmX2xpbmUvMiwgMS41LCBoYWxmX2xpbmUvMiwgMS41KSwNCiAgICAgIGNvbXBsZXRlID0gVFJVRQ0KICAgICkNCn0NCg0KIycgQHJkbmFtZSB0aGVtZV9kdml6X29wZW4NCiMnIEBleHBvcnQNCnRoZW1lX2R2aXpfdmdyaWQgPC0gZnVuY3Rpb24oZm9udF9zaXplID0gMTQsIGZvbnRfZmFtaWx5ID0gZHZpel9mb250X2ZhbWlseSwgbGluZV9zaXplID0gLjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3NtYWxsID0gMTIvMTQsIHJlbF90aW55ID0gMTEvMTQsIHJlbF9sYXJnZSA9IDE2LzE0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5OTAiKSB7DQogIGhhbGZfbGluZSA8LSBmb250X3NpemUgLyAyDQogIA0KICBjb3dwbG90Ojp0aGVtZV9taW5pbWFsX3ZncmlkKGZvbnRfc2l6ZSA9IGZvbnRfc2l6ZSwgZm9udF9mYW1pbHkgPSBmb250X2ZhbWlseSwgbGluZV9zaXplID0gbGluZV9zaXplLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3NtYWxsID0gcmVsX3NtYWxsLCByZWxfdGlueSA9IHJlbF90aW55LCByZWxfbGFyZ2UgPSByZWxfbGFyZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBjb2xvdXIpICAlK3JlcGxhY2UlDQogICAgdGhlbWUoDQogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbihoYWxmX2xpbmUvMiwgMS41LCBoYWxmX2xpbmUvMiwgMS41KSwNCiAgICAgIGNvbXBsZXRlID0gVFJVRQ0KICAgICkNCn0NCg0KIycgQHJkbmFtZSB0aGVtZV9kdml6X29wZW4NCiMnIEBleHBvcnQNCnRoZW1lX2R2aXpfbWFwIDwtIGZ1bmN0aW9uKGZvbnRfc2l6ZSA9IDE0LCBmb250X2ZhbWlseSA9IGR2aXpfZm9udF9mYW1pbHksIGxpbmVfc2l6ZSA9IC41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9zbWFsbCA9IDEyLzE0LCByZWxfdGlueSA9IDExLzE0LCByZWxfbGFyZ2UgPSAxNi8xNCkgew0KICBoYWxmX2xpbmUgPC0gZm9udF9zaXplIC8gMg0KICANCiAgY293cGxvdDo6dGhlbWVfbWFwKGZvbnRfc2l6ZSA9IGZvbnRfc2l6ZSwgZm9udF9mYW1pbHkgPSBmb250X2ZhbWlseSwgbGluZV9zaXplID0gbGluZV9zaXplLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3NtYWxsID0gcmVsX3NtYWxsLCByZWxfdGlueSA9IHJlbF90aW55LCByZWxfbGFyZ2UgPSByZWxfbGFyZ2UpICAlK3JlcGxhY2UlDQogICAgdGhlbWUoDQogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbihoYWxmX2xpbmUvMiwgMS41LCBoYWxmX2xpbmUvMiwgMS41KSwNCiAgICAgIGNvbXBsZXRlID0gVFJVRQ0KICAgICkNCn0NCmBgYA0KDQoNCg0KIyBBbW91bnRzDQoNCmBgYHtyIGFtb3VudHMsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpwYWxldHRlIDwtIHBhbF9lYXJ0aF9icm93bg0KDQpwMSA8LSBnZ3Bsb3QoZGZfcHJvcHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSB2YWx1ZSkpICsgDQogIGdlb21fY29sKA0KICAgIHBvc2l0aW9uPSJpZGVudGl0eSIsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSwNCiAgICBmaWxsID0gcGFsZXR0ZVszXSwgd2lkdGggPSAwLjgNCiAgKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDY2KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBwYWxldHRlWzI6NF0pICsNCiAgbGFicyh0aXRsZSA9ICJCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCg0KDQpwMiA8LSBnZ3Bsb3QoZGZfcHJvcHMsIGFlcyh4ID0gZmN0X3Jldihncm91cCksIHkgPSB2YWx1ZSkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uPSJpZGVudGl0eSIsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSwgZmlsbCA9IHBhbGV0dGVbM10sDQogICAgICAgICAgIHdpZHRoID0gLjgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNjYpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbMjo0XSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIkJhcnMiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl92Z3JpZChwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDMgPC0gZ2dwbG90KGZpbHRlcihkZl9tdWx0aV9hbW91bnRzLCB4IT00KSwgYWVzKHgsIHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9ZmFjdG9yKHR5cGUsIGxldmVscyA9IGMoIkEiLCAiQyIsICJCIikpKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb249ImRvZGdlIiwgY29sb3IgPSBwYWxldHRlW25wYWxdLA0KICAgICAgICAgICB3aWR0aCA9IC43KSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLCAuNykpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVsyOjRdKSArDQogIGxhYnModGl0bGUgPSAiR3JvdXBlZCBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA0IDwtIGdncGxvdChmaWx0ZXIoZGZfbXVsdGlfYW1vdW50cywgeCE9NCksIGFlcyh4LCB5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPWZhY3Rvcih0eXBlLCBsZXZlbHMgPSBjKCJCIiwgIkMiLCAiQSIpKSkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uPSJkb2RnZSIsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSwNCiAgICAgICAgICAgd2lkdGggPSAuNykgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwNCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwgLjcpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJldihwYWxldHRlWzI6NF0pKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnModGl0bGUgPSAiR3JvdXBlZCBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25fdmdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA1IDwtIGdncGxvdChkZl9tdWx0aV9hbW91bnRzLCBhZXMoeCwgeSwgZmlsbD1mYWN0b3IodHlwZSwgbGV2ZWxzID0gYygiQiIsICJDIiwgIkEiKSkpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbj0ic3RhY2siLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0pICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMS41NSksDQogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJldihwYWxldHRlWzI6NF0pKSArDQogIGxhYnModGl0bGUgPSAiU3RhY2tlZCBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA2IDwtIHA1ICsgY29vcmRfZmxpcCgpICsgdGhlbWVfcGxvdF9pY29uX3ZncmlkKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNyA8LSBnZ3Bsb3QoZGZfcHJvcHMsIGFlcyh4ID0gZmN0X3Jldihncm91cCksIHkgPSB2YWx1ZSkpICsgDQogIGdlb21fcG9pbnQoY29sb3IgPSBwYWxldHRlWzJdLCBzaXplID0gMikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA2NiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgY29vcmRfZmxpcCgpICsgDQogIGxhYnModGl0bGUgPSAiRG90cyIpICsNCiAgdGhlbWVfcGxvdF9pY29uX3ZncmlkKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwOCA8LSBnZ3Bsb3QoZmlsdGVyKGRmX211bHRpX2Ftb3VudHMsIHggIT0gMSksIGFlcyh4LCB5ID0gZmFjdG9yKHR5cGUsIGxldmVscyA9IGMoIkEiLCAiQyIsICJCIikpLCBmaWxsID0geSkpICsgDQogIGdlb21fdGlsZShjb2xvciA9IHBhbGV0dGVbNV0sIHNpemUgPSAxLjUpICsNCiAgc2NhbGVfZmlsbF9jb250aW51b3VzX3NlcXVlbnRpYWwoDQogICAgaDEgPSA3MSwgYzEgPSA4MCwgYzIgPSAxMCwgbDEgPSAxOCwgbDIgPSA5NywgcDEgPSAxLjUsDQogICAgYmVnaW4gPSAwLjIsIGVuZCA9IDAuNzUsDQogICAgcmV2ID0gRkFMU0UNCiAgKSArDQogIGxhYnModGl0bGUgPSAiSGVhdG1hcCIpICsNCiAgdGhlbWVfcGxvdF9pY29uX2JsYW5rKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwbG90X2dyaWQocDEsIHAyLCBwNywgbmNvbCA9IDQsIHNjYWxlID0gLjkpDQpgYGANCg0KDQoNClRoZSBtb3N0IGNvbW1vbiBhcHByb2FjaCB0byB2aXN1YWxpemluZyBhbW91bnRzIChpLmUuLCBudW1lcmljYWwgdmFsdWVzIHNob3duIGZvciBzb21lIHNldCBvZiBjYXRlZ29yaWVzKSBpcyB1c2luZyBiYXJzLCBlaXRoZXIgdmVydGljYWxseSBvciBob3Jpem9udGFsbHkgYXJyYW5nZWQuIEhvd2V2ZXIsIGluc3RlYWQgb2YgdXNpbmcgYmFycywgd2UgY2FuIGFsc28gcGxhY2UgZG90cyBhdCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgYmFyIHdvdWxkIGVuZC4NCg0KDQpgYGB7ciBhbW91bnRzX211bHRpLCBmaWcud2lkdGggPSA1KjYvNC4yLCBmaWcuYXNwID0gMS8yfQ0KcGxvdF9ncmlkKHAzLCBwNCwgcDUsIHA2LCANCiAgICAgICAgICBwOCwgbmNvbCA9IDQsIHNjYWxlID0gLjkpDQpgYGANCg0KSWYgdGhlcmUgYXJlIHR3byBvciBtb3JlIHNldHMgb2YgY2F0ZWdvcmllcyBmb3Igd2hpY2ggd2Ugd2FudCB0byBzaG93IGFtb3VudHMsIHdlIGNhbiBncm91cCBvciBzdGFjayB0aGUgYmFycy4gV2UgY2FuIGFsc28gbWFwIHRoZSBjYXRlZ29yaWVzIG9udG8gdGhlICp4KiBhbmQgKnkqIGF4ZXMgYW5kIHNob3cgYW1vdW50cyBieSBjb2xvciwgdmlhIGEgaGVhdG1hcC4gDQoNCg0KDQojIERpc3RyaWJ1dGlvbnMNCg0KYGBge3Igc2luZ2xlLWRpc3RyaWJ1dGlvbnMsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpwYWxldHRlIDwtIHBhbF9vY2Vhbl9ibHVlDQpwMSA8LSBnZ3Bsb3QoZGZfb25lX2Rpc3QsIGFlcyh4KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShmaWxsID0gcGFsZXR0ZVszXSwgY29sb3IgPSBwYWxldHRlW25wYWxdLCBiaW53aWR0aCA9IDEsIGNlbnRlciA9IDApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTQuOCwgNi44KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAzNTApLCANCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0iKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDIgPC0gZ2dwbG90KGRmX29uZV9kaXN0LCBhZXMoeCkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSBwYWxldHRlWzNdLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0sIGJ3ID0gLjM1KSArDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC00LjgsIDYuOCksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgLjI3KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBsYWJzKHRpdGxlID0gIkRlbnNpdHkgUGxvdCIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwMyA8LSBnZ3Bsb3QoZGZfb25lX25vcm1hbCwgYWVzKHgpKSArDQogIHN0YXRfZWNkZihjb2xvciA9IHBhbGV0dGVbMl0sIHNpemUgPSAuNykgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLjA1LCAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxLjA4KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBsYWJzKHRpdGxlID0gIkN1bXVsYXRpdmUgRGVuc2l0eSIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNCA8LSBnZ3Bsb3QoZGZfb25lX25vcm1hbCwgYWVzKHNhbXBsZSA9IHgpKSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgY29sb3IgPSBwYWxldHRlWzNdKSArDQogIGdlb21fcXEoY29sb3IgPSBwYWxldHRlWzFdLCBzaXplID0gMC44KSArDQogIGxhYnModGl0bGUgPSAiUXVhbnRpbGUtUXVhbnRpbGUgUGxvdCIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwbG90X2dyaWQocDEsIHAyLCBwMywgcDQsIG5jb2wgPSA0LCBzY2FsZSA9IC45KQ0KYGBgDQoNCkhpc3RvZ3JhbXMgYW5kIGRlbnNpdHkgcGxvdHMgcHJvdmlkZSB0aGUgbW9zdCBpbnR1aXRpdmUgdmlzdWFsaXphdGlvbnMgb2YgYSBkaXN0cmlidXRpb24sIGJ1dCBib3RoIHJlcXVpcmUgYXJiaXRyYXJ5IHBhcmFtZXRlciBjaG9pY2VzIGFuZCBjYW4gYmUgbWlzbGVhZGluZy4gQ3VtdWxhdGl2ZSBkZW5zaXRpZXMgYW5kIHF1YW50aWxlLXF1YW50aWxlIChxLXEpIHBsb3RzIGFsd2F5cyByZXByZXNlbnQgdGhlIGRhdGEgZmFpdGhmdWxseSBidXQgY2FuIGJlIG1vcmUgZGlmZmljdWx0IHRvIGludGVycHJldC4NCg0KDQpgYGB7cn0NCiMnIGdncGxvdDIgc3RhdCB0aGF0IGNyZWF0ZXMgc2luYSBwbG90cw0KIycgDQojJyBUaGlzIHN0YXQgY2xvc2VseSBtaXJyb3JzIFtgc3RhdF95ZGVuc2l0eSgpYF0gZnJvbSBnZ3Bsb3QyLiBUaGlzIGVuYWJsZXMgdGhlDQojJyB1c2VyIHRvIHBsb3Qgc2luYSBwbG90cyBvbiB0b3Agb2YgdmlvbGluIHBsb3RzIGFuZCBoYXZlIHRoZW0gbWF0Y2ggcGVyZmVjdGx5Lg0KIycgDQojJyBAaW5oZXJpdFBhcmFtcyBnZ3Bsb3QyOjpsYXllcg0KIycgQGluaGVyaXRQYXJhbXMgZ2dwbG90Mjo6Z2VvbV9wb2ludA0KIycgQGluaGVyaXRQYXJhbXMgZ2dwbG90Mjo6c3RhdF9kZW5zaXR5DQojJyBAcGFyYW0gc2NhbGUgaWYgImFyZWEiIChkZWZhdWx0KSwgYWxsIHZpb2xpbnMgaGF2ZSB0aGUgc2FtZSBhcmVhIChiZWZvcmUgdHJpbW1pbmcNCiMnICAgdGhlIHRhaWxzKS4gSWYgImNvdW50IiwgYXJlYXMgYXJlIHNjYWxlZCBwcm9wb3J0aW9uYWxseSB0byB0aGUgbnVtYmVyIG9mDQojJyAgIG9ic2VydmF0aW9ucy4gSWYgIndpZHRoIiwgYWxsIHZpb2xpbnMgaGF2ZSB0aGUgc2FtZSBtYXhpbXVtIHdpZHRoLg0KIycgQHNlZWFsc28gW2dlb21fdmlvbGluKCldDQojJyBAZXhhbXBsZXMNCiMnIGdncGxvdChpcmlzLCBhZXMoU3BlY2llcywgU2VwYWwuTGVuZ3RoKSkgKw0KIycgICBnZW9tX3Zpb2xpbihjb2xvciA9IE5BKSArDQojJyAgIHN0YXRfc2luYSgpDQojJyBAZXhwb3J0DQpzdGF0X3NpbmEgPC0gZnVuY3Rpb24obWFwcGluZyA9IE5VTEwsIGRhdGEgPSBOVUxMLA0KICAgICAgICAgICAgICAgICAgICAgIGdlb20gPSAicG9pbnQiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsDQogICAgICAgICAgICAgICAgICAgICAgLi4uLA0KICAgICAgICAgICAgICAgICAgICAgIGJ3ID0gIm5yZDAiLA0KICAgICAgICAgICAgICAgICAgICAgIGFkanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAga2VybmVsID0gImdhdXNzaWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICB0cmltID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9ICJhcmVhIiwNCiAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBUUlVFKSB7DQogIHNjYWxlIDwtIG1hdGNoLmFyZyhzY2FsZSwgYygiYXJlYSIsICJjb3VudCIsICJ3aWR0aCIpKQ0KICANCiAgbGF5ZXIoDQogICAgZGF0YSA9IGRhdGEsDQogICAgbWFwcGluZyA9IG1hcHBpbmcsDQogICAgc3RhdCA9IFN0YXRTaW5hLA0KICAgIGdlb20gPSBnZW9tLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb24sDQogICAgc2hvdy5sZWdlbmQgPSBzaG93LmxlZ2VuZCwNCiAgICBpbmhlcml0LmFlcyA9IGluaGVyaXQuYWVzLA0KICAgIHBhcmFtcyA9IGxpc3QoDQogICAgICBidyA9IGJ3LA0KICAgICAgYWRqdXN0ID0gYWRqdXN0LA0KICAgICAga2VybmVsID0ga2VybmVsLA0KICAgICAgdHJpbSA9IHRyaW0sDQogICAgICBzY2FsZSA9IHNjYWxlLA0KICAgICAgbmEucm0gPSBuYS5ybSwNCiAgICAgIC4uLg0KICAgICkNCiAgKQ0KfQ0KDQoNCiMnIEByZG5hbWUgc3RhdF9zaW5hDQojJyBAZm9ybWF0IE5VTEwNCiMnIEB1c2FnZSBOVUxMDQojJyBAZXhwb3J0DQpTdGF0U2luYSA8LSBnZ3Byb3RvKCJTdGF0U2luYSIsIFN0YXQsDQogIHJlcXVpcmVkX2FlcyA9IGMoIngiLCAieSIpLA0KICBub25fbWlzc2luZ19hZXMgPSAid2VpZ2h0IiwNCiAgDQogIGNvbXB1dGVfZ3JvdXAgPSBmdW5jdGlvbihkYXRhLCBzY2FsZXMsIHdpZHRoID0gTlVMTCwgYncgPSAibnJkMCIsIGFkanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWwgPSAiZ2F1c3NpYW4iLCB0cmltID0gVFJVRSwgbmEucm0gPSBGQUxTRSkgew0KICAgIGlmIChucm93KGRhdGEpIDwgMykgcmV0dXJuKGRhdGEuZnJhbWUoKSkNCiAgICByYW5nZSA8LSByYW5nZShkYXRhJHksIG5hLnJtID0gVFJVRSkNCiAgICBtb2RpZmllciA8LSBpZiAodHJpbSkgMCBlbHNlIDMNCiAgICBidyA8LSBjYWxjX2J3KGRhdGEkeSwgYncpDQogICAgZGVucyA8LSBnZ3Bsb3QyOjo6Y29tcHV0ZV9kZW5zaXR5KGRhdGEkeSwgZGF0YSR3LCBmcm9tID0gcmFuZ2VbMV0gLSBtb2RpZmllcipidywgdG8gPSByYW5nZVsyXSArIG1vZGlmaWVyKmJ3LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3ID0gYncsIGFkanVzdCA9IGFkanVzdCwga2VybmVsID0ga2VybmVsKQ0KICAgIA0KICAgIGRlbnNmIDwtIGFwcHJveGZ1bihkZW5zJHgsIGRlbnMkZGVuc2l0eSwgcnVsZSA9IDIpDQogIA0KICAgICMgQ29tcHV0ZSB3aWR0aCBpZiB4IGhhcyBtdWx0aXBsZSB2YWx1ZXMNCiAgICBpZiAobGVuZ3RoKHVuaXF1ZShkYXRhJHgpKSA+IDEpIHsNCiAgICAgIHdpZHRoIDwtIGRpZmYocmFuZ2UoZGF0YSR4KSkgKiAwLjkNCiAgICB9DQogICAgZGF0YSR3aWR0aCA8LSB3aWR0aA0KICAgIA0KICAgIGRhdGEkZGVuc2l0eSA8LSBkZW5zZihkYXRhJHkpDQogICAgZGF0YSR4IDwtIG1lYW4ocmFuZ2UoZGF0YSR4KSkNCiAgICANCiAgICBkYXRhDQogIH0sDQogIA0KICBjb21wdXRlX3BhbmVsID0gZnVuY3Rpb24oc2VsZiwgZGF0YSwgc2NhbGVzLCB3aWR0aCA9IE5VTEwsIGJ3ID0gIm5yZDAiLCBhZGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsID0gImdhdXNzaWFuIiwgdHJpbSA9IFRSVUUsIG5hLnJtID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9ICJhcmVhIikgew0KICAgIGRhdGEgPC0gZ2dwcm90b19wYXJlbnQoU3RhdCwgc2VsZikkY29tcHV0ZV9wYW5lbCgNCiAgICAgIGRhdGEsIHNjYWxlcywgd2lkdGggPSB3aWR0aCwgYncgPSBidywgYWRqdXN0ID0gYWRqdXN0LCBrZXJuZWwgPSBrZXJuZWwsDQogICAgICB0cmltID0gdHJpbSwgbmEucm0gPSBuYS5ybQ0KICAgICkNCiAgICANCiAgICAjIGNob29zZSBob3cgdmlvbGlucyBhcmUgc2NhbGVkIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXINCiAgICBkYXRhJHZpb2xpbndpZHRoIDwtIHN3aXRjaChzY2FsZSwNCiAgICAgICMgYXJlYSA6IGtlZXAgdGhlIG9yaWdpbmFsIGRlbnNpdGllcyBidXQgc2NhbGUgdGhlbSB0byBhIG1heCB3aWR0aCBvZiAxDQogICAgICAjICAgICAgICBmb3IgcGxvdHRpbmcgcHVycG9zZXMgb25seQ0KICAgICAgYXJlYSA9IGRhdGEkZGVuc2l0eSAvIG1heChkYXRhJGRlbnNpdHkpLA0KICAgICAgIyBjb3VudDogdXNlIHRoZSBvcmlnaW5hbCBkZW5zaXRpZXMgc2NhbGVkIHRvIGEgbWF4aW11bSBvZiAxIChhcyBhYm92ZSkNCiAgICAgICMgICAgICAgIGFuZCB0aGVuIHNjYWxlIHRoZW0gYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zDQogICAgICBjb3VudCA9IGRhdGEkZGVuc2l0eSAvIG1heChkYXRhJGRlbnNpdHkpICogZGF0YSRuIC8gbWF4KGRhdGEkbiksDQogICAgICAjIHdpZHRoOiBjb25zdGFudCB3aWR0aCAoZGVuc2l0eSBzY2FsZWQgdG8gYSBtYXhpbXVtIG9mIDEpDQogICAgICB3aWR0aCA9IGRhdGEkc2NhbGVkDQogICAgKQ0KICAgIA0KICAgIGRhdGEkeCA8LSBkYXRhJHggKyBydW5pZihucm93KGRhdGEpLCBtaW4gPSAtMSwgbWF4ID0gMSkgKg0KICAgICAgMC45KmRhdGEkdmlvbGlud2lkdGgvMg0KICAgIA0KICAgIGRhdGENCiAgfQ0KICANCikNCg0KY2FsY19idyA8LSBmdW5jdGlvbih4LCBidykgew0KICBpZiAoaXMuY2hhcmFjdGVyKGJ3KSkgew0KICAgIGlmIChsZW5ndGgoeCkgPCAyKQ0KICAgICAgc3RvcCgibmVlZCBhdCBsZWFzdCAyIHBvaW50cyB0byBzZWxlY3QgYSBiYW5kd2lkdGggYXV0b21hdGljYWxseSIsIGNhbGwuID0gRkFMU0UpDQogICAgYncgPC0gc3dpdGNoKA0KICAgICAgdG9sb3dlcihidyksDQogICAgICBucmQwID0gc3RhdHM6OmJ3Lm5yZDAoeCksDQogICAgICBucmQgPSBzdGF0czo6YncubnJkKHgpLA0KICAgICAgdWN2ID0gc3RhdHM6OmJ3LnVjdih4KSwNCiAgICAgIGJjdiA9IHN0YXRzOjpidy5iY3YoeCksDQogICAgICBzaiA9ICwNCiAgICAgIGBzai1zdGVgID0gc3RhdHM6OmJ3LlNKKHgsIG1ldGhvZCA9ICJzdGUiKSwNCiAgICAgIGBzai1kcGlgID0gc3RhdHM6OmJ3LlNKKHgsIG1ldGhvZCA9ICJkcGkiKSwNCiAgICAgIHN0b3AoInVua25vd24gYmFuZHdpZHRoIHJ1bGUiKQ0KICAgICkNCiAgfQ0KICBidw0KfQ0KYGBgDQoNCg0KDQpgYGB7ciBtdWx0aXBsZS1kaXN0cmlidXRpb25zLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMS8yfQ0KcGFsZXR0ZSA8LSBwYWxfb2NlYW5fYmx1ZQ0KcDEgPC0gZ2dwbG90KGRmX211bHRpX2Rpc3QsIGFlcyh4ID0gdHlwZSwgeSA9IHkpKSArIA0KICBnZW9tX2JveHBsb3QoY29sb3IgPSBwYWxldHRlWzFdLCBmaWxsID0gcGFsZXR0ZVs0XSkgKw0KICBsYWJzKHRpdGxlID0gIkJveHBsb3RzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnAyIDwtIGdncGxvdChkZl9tdWx0aV9kaXN0LCBhZXMoeCA9IHR5cGUsIHkgPSB5KSkgKyANCiAgZ2VvbV92aW9saW4oY29sb3IgPSBwYWxldHRlW25wYWxdLCBmaWxsID0gcGFsZXR0ZVsyXSwgc2l6ZSA9IDApICsNCiAgbGFicyh0aXRsZSA9ICJWaW9saW5zIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCmRmX211bHRpX2Rpc3Rfc21hbGwgPC0gZ3JvdXBfYnkoZGZfbXVsdGlfZGlzdCwgdHlwZSkgJT4lDQogIHNhbXBsZV9uKDUwKQ0KcDMgPC0gZ2dwbG90KGRmX211bHRpX2Rpc3Rfc21hbGwsIGFlcyh4ID0gdHlwZSwgeSA9IHkpKSArIA0KICBnZW9tX2ppdHRlcihjb2xvciA9IHBhbGV0dGVbMV0sIHdpZHRoID0gMC4xNSwgaGVpZ2h0ID0gMCwgc2l6ZSA9IC4zKSArDQogIGxhYnModGl0bGUgPSAiU3RyaXAgQ2hhcnRzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA0IDwtIGdncGxvdChkZl9tdWx0aV9kaXN0X3NtYWxsLCBhZXMoeCA9IHR5cGUsIHkgPSB5KSkgKyANCiAgIHN0YXRfc2luYShjb2xvciA9IHBhbGV0dGVbMV0sIHNpemUgPSAwLjMpICsNCiAgbGFicyh0aXRsZSA9ICJTaW5hIFBsb3RzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA1IDwtIGdncGxvdChkZl9tdWx0aV9kaXN0LCBhZXMoeCA9IHksIGZpbGwgPSBmYWN0b3IodHlwZSwgbGV2ZWxzID0gYygiQyIsICJBIiwgIkIiKSkpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShjb2xvciA9IHBhbGV0dGVbbnBhbF0sIGJpbndpZHRoID0gMC41LCBjZW50ZXIgPSAwKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbMjo0XSkgKw0KICBsYWJzKHRpdGxlID0gIlN0YWNrZWQgSGlzdG9ncmFtcyIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA0OSksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNiA8LSBnZ3Bsb3QoZGZfbXVsdGlfZGlzdCwgYWVzKHggPSB5LCBmaWxsID0gZmFjdG9yKHR5cGUsIGxldmVscyA9IGMoIkMiLCAiQSIsICJCIikpKSkgKyANCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC43LCBjb2xvciA9IHBhbGV0dGVbbnBhbF0pICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVsxOjNdKSArDQogIGxhYnModGl0bGUgPSAiT3ZlcmxhcHBpbmcgRGVuc2l0aWVzIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEuMSksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNyA8LSBnZ3Bsb3QoZGZfbXVsdGlfZGlzdCwgYWVzKHggPSB5LCB5ID0gbnVtYmVyLCBncm91cCA9IG51bWJlcikpICsgDQogIGdlb21fZGVuc2l0eV9yaWRnZXMoYWxwaGEgPSAwLjcsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSwgZmlsbCA9IHBhbGV0dGVbMl0sIHNjYWxlID0gMi41KSArDQogIGxhYnModGl0bGUgPSAiUmlkZ2VsaW5lIFBsb3QiKSArDQogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDEsIDYuNSksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwbG90X2dyaWQocDEsIHAyLCBwMywgcDQsIA0KICAgICAgICAgIHA1LCBwNiwgcDcsIG5jb2wgPSA0LCBzY2FsZSA9IC45KQ0KYGBgDQoNCg0KQm94LXBsb3RzLCB2aW9saW5zLCBzdHJpcCBjaGFydHMsIGFuZCBzaW5hIHBsb3RzIGFyZSB1c2VmdWwgd2hlbiB3ZSB3YW50IHRvIHZpc3VhbGl6ZSBtYW55IGRpc3RyaWJ1dGlvbnMgYXQgb25jZSBhbmQvb3IgaWYgd2UgYXJlIHByaW1hcmlseSBpbnRlcmVzdGVkIGluIG92ZXJhbGwgc2hpZnRzIGFtb25nIHRoZSBkaXN0cmlidXRpb25zLiBTdGFja2VkIGhpc3RvZ3JhbXMgYW5kIG92ZXJsYXBwaW5nIGRlbnNpdGllcyBhbGxvdyBhIG1vcmUgaW4tZGVwdGggY29tcGFyaXNvbiBvZiBhIHNtYWxsZXIgbnVtYmVyIG9mIGRpc3RyaWJ1dGlvbnMsIHRob3VnaCBzdGFja2VkIGhpc3RvZ3JhbXMgY2FuIGJlIGRpZmZpY3VsdCB0byBpbnRlcnByZXQgYW5kIGFyZSBiZXN0IGF2b2lkZWQuIFJpZGdlbGluZSBwbG90cyBjYW4gYmUgYSB1c2VmdWwgYWx0ZXJuYXRpdmUgdG8gdmlvbGluIHBsb3RzIGFuZCBhcmUgb2Z0ZW4gdXNlZnVsIHdoZW4gdmlzdWFsaXppbmcgdmVyeSBsYXJnZSBudW1iZXJzIG9mIGRpc3RyaWJ1dGlvbnMgb3IgY2hhbmdlcyBpbiBkaXN0cmlidXRpb25zIG92ZXIgdGltZS4NCg0KDQoNCiMgUHJvcG9ydGlvbnMNCg0KYGBge3IgcHJvcG9ydGlvbnMsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpwYWxldHRlIDwtIHBhbF9icm93bl9ncmVlbg0KcDFfbWFpbiA8LSBnZ3Bsb3QoZGZfcHJvcHMsIGFlcyh4ID0gMSwgeSA9IHZhbHVlLCBmaWxsID0gZ3JvdXApKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSkgKyANCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwsIG5hbWUgPSAiIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCwgbmFtZSA9ICIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbMjo0XSkgKw0KICB0aGVtZV9wbG90X2ljb25fYmxhbmsocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkgKw0KICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKSkNCiMgbWFrZSBzdXJlIHBsb3QgYmFja2dyb3VuZCBpcyBmdWxseSBmaWxsZWQsIGFzIGluIHRoZSBvdGhlciBwbG90cw0KcDEgPC0gZ2dkcmF3KHAxX21haW4pICsNCiAgbGFicyh0aXRsZSA9ICJQaWUgQ2hhcnQiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDIgPC0gZ2dwbG90KGRmX3Byb3BzLCBhZXMoeCA9IGZhY3RvcigxKSwgeSA9IHZhbHVlLCBmaWxsID0gZ3JvdXApKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHJldmVyc2UgPSBUUlVFKSwgd2lkdGggPSAuNDUsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTA4KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBwYWxldHRlWzI6NF0pICsNCiAgbGFicyh0aXRsZSA9ICJTdGFja2VkIEJhcnMiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9oZ3JpZChwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDMgPC0gZ2dwbG90KGRmX3Byb3BzLCBhZXMoeCA9IGZhY3RvcigxKSwgeSA9IHZhbHVlLCBmaWxsID0gZ3JvdXApKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHJldmVyc2UgPSBUUlVFKSwgd2lkdGggPSAuNDUsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSkgKyANCiAgI3NjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDExMCksIGV4cGFuZCA9IGMoMCwgMCksIHBvc2l0aW9uID0gInJpZ2h0IikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxMTApLCBleHBhbmQgPSBjKDAsIDApKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbMjo0XSkgKw0KICBsYWJzKHRpdGxlID0gIlN0YWNrZWQgQmFycyIpICsNCiAgdGhlbWVfcGxvdF9pY29uX3ZncmlkKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNCA8LSBnZ3Bsb3QoZGZfcHJvcHMsIGFlcyh4ID0gZ3JvdXAsIHkgPSB2YWx1ZSwgZmlsbCA9IGdyb3VwKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb249ImlkZW50aXR5IiwgY29sb3IgPSBwYWxldHRlW25wYWxdLA0KICAgICAgICAgICB3aWR0aCA9IC44KSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDY2KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBwYWxldHRlWzI6NF0pICsNCiAgbGFicyh0aXRsZSA9ICJCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA1IDwtIGdncGxvdChkZl9wcm9wcywgYWVzKHggPSBmY3RfcmV2KGdyb3VwKSwgeSA9IHZhbHVlLCBmaWxsID0gZ3JvdXApKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbj0iaWRlbnRpdHkiLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0sDQogICAgICAgICAgIHdpZHRoID0gLjgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNjYpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbMjo0XSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIkJhcnMiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl92Z3JpZChwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHAxLCBwNCwgcDUsIHAyLCBuY29sID0gNCwgc2NhbGUgPSAuOSkNCmBgYA0KDQpQcm9wb3J0aW9ucyBjYW4gYmUgdmlzdWFsaXplZCBhcyBwaWUgY2hhcnRzLCBzaWRlLWJ5LXNpZGUgYmFycywgb3Igc3RhY2tlZCBiYXJzLCBhbmQgYXMgaW4gdGhlIGNhc2UgZm9yIGFtb3VudHMsIGJhcnMgY2FuIGJlIGFycmFuZ2VkIGVpdGhlciB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseS4gUGllIGNoYXJ0cyBlbXBoYXNpemUgdGhhdCB0aGUgaW5kaXZpZHVhbCBwYXJ0cyBhZGQgdXAgdG8gYSB3aG9sZSBhbmQgaGlnaGxpZ2h0IHNpbXBsZSBmcmFjdGlvbnMuIEhvd2V2ZXIsIHRoZSBpbmRpdmlkdWFsIHBpZWNlcyBhcmUgbW9yZSBlYXNpbHkgY29tcGFyZWQgaW4gc2lkZS1ieS1zaWRlIGJhcnMuIFN0YWNrZWQgYmFycyBsb29rIGF3a3dhcmQgZm9yIGEgc2luZ2xlIHNldCBvZiBwcm9wb3J0aW9ucywgYnV0IGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wYXJpbmcgbXVsdGlwbGUgc2V0cyBvZiBwcm9wb3J0aW9ucyAoc2VlIGJlbG93KS4NCg0KDQpgYGB7ciBwcm9wb3J0aW9ucy1jb21wLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMS80fQ0KcDUgPC0gZ2dwbG90KGZpbHRlcihkZl9mcmFjdGlvbnMsIHghPTQpLCBhZXMoeCwgeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1mYWN0b3IodHlwZSwgbGV2ZWxzID0gYygiQSIsICJDIiwgIkIiKSkpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbj0iZG9kZ2UiLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0sDQogICAgICAgICAgIHdpZHRoID0gLjcpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsIC41OCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVsyOjRdKSArDQogIGxhYnModGl0bGUgPSAiR3JvdXBlZCBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA2IDwtIGdncGxvdChkZl9mcmFjdGlvbnMsIGFlcyh4LCB5LCBmaWxsPXR5cGUpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbj0ic3RhY2siLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0pICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMS4wOCksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVsyOjRdKSArDQogIGxhYnModGl0bGUgPSAiU3RhY2tlZCBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb25faGdyaWQocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA3IDwtIGdncGxvdChkZl9tdWx0aV9kaXN0LCBhZXMoeCA9IHksIGZpbGwgPSBmYWN0b3IodHlwZSwgbGV2ZWxzID0gYygiQyIsICJBIiwgIkIiKSkpKSArIA0KICBnZW9tX2RlbnNpdHkoY29sb3IgPSBwYWxldHRlW25wYWxdLCBwb3NpdGlvbiA9ICJmaWxsIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBwYWxldHRlWzI6NF0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMC4wNCwgMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMS4wOCksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgbGFicyh0aXRsZSA9ICJTdGFja2VkIERlbnNpdGllcyIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwOF9hIDwtIGdncGxvdChmaWx0ZXIoZGZfZnJhY3Rpb25zLCB4PT0xKSwgYWVzKHggPSAxLCB5ID0geSwgZmlsbCA9IHR5cGUpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSkgKyANCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwsIG5hbWUgPSAiIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCwgbmFtZSA9ICIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbYygyLCAxLCAzKV0pICsNCiAgdGhlbWVfcGxvdF9pY29uX2JsYW5rKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0sIGZvbnRfc2l6ZSA9IDUpICsNCiAgdGhlbWUoDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApDQogICkNCnA4X2IgPC0gZ2dwbG90KGZpbHRlcihkZl9mcmFjdGlvbnMsIHg9PTIpLCBhZXMoeCA9IDEsIHkgPSB5LCBmaWxsID0gdHlwZSkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gInN0YWNrIiwgY29sb3IgPSBwYWxldHRlW25wYWxdKSArIA0KICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCwgbmFtZSA9ICIiKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBOVUxMLCBuYW1lID0gIiIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVtjKDIsIDEsIDMpXSkgKw0KICB0aGVtZV9wbG90X2ljb25fYmxhbmsocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSwgZm9udF9zaXplID0gNSkgKw0KICB0aGVtZSgNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMCkNCiAgKQ0KcDhfYyA8LSBnZ3Bsb3QoZmlsdGVyKGRmX2ZyYWN0aW9ucywgeD09MyksIGFlcyh4ID0gMSwgeSA9IHksIGZpbGwgPSB0eXBlKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0pICsgDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMLCBuYW1lID0gIiIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwsIG5hbWUgPSAiIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBwYWxldHRlW2MoMiwgMSwgMyldKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdLCBmb250X3NpemUgPSA1KSArDQogIHRoZW1lKA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKQ0KICApDQojIGNvbWJpbmUNCnA4IDwtIHBsb3RfZ3JpZChwOF9hLCBwOF9iLCBwOF9jLCBuY29sID0gMywgc2NhbGUgPSAxLjEpICsNCiAgICAgIGxhYnModGl0bGUgPSAiTXVsdGlwbGUgUGllIENoYXJ0cyIpICsNCiAgICAgIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHA4LCBwNSwgcDYsIHA3LCBuY29sID0gNCwgc2NhbGUgPSAuOSkNCmBgYA0KDQoNCldoZW4gdmlzdWFsaXppbmcgbXVsdGlwbGUgc2V0cyBvZiBwcm9wb3J0aW9ucyBvciBjaGFuZ2VzIGluIHByb3BvcnRpb25zIGFjcm9zcyBjb25kaXRpb25zLCBwaWUgY2hhcnRzIHRlbmQgdG8gYmUgc3BhY2UtaW5lZmZpY2llbnQgYW5kIG9mdGVuIG9ic2N1cmUgcmVsYXRpb25zaGlwcy4gR3JvdXBlZCBiYXJzIHdvcmsgd2VsbCBhcyBsb25nIGFzIHRoZSBudW1iZXIgb2YgY29uZGl0aW9ucyBjb21wYXJlZCBpcyBtb2RlcmF0ZSwgYW5kIHN0YWNrZWQgYmFycyBjYW4gd29yayBmb3IgbGFyZ2UgbnVtYmVycyBvZiBjb25kaXRpb25zLiBTdGFja2VkIGRlbnNpdGllcyBhcmUgYXBwcm9wcmlhdGUgd2hlbiB0aGUgcHJvcG9ydGlvbnMgY2hhbmdlIGFsb25nIGEgY29udGludW91cyB2YXJpYWJsZS4NCg0KDQpgYGB7ciBwcm9wb3J0aW9ucy1tdWx0aSwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDEvNH0NCnAxIDwtIGdncGxvdChkZl9tdWx0aV9wcm9wcywgYWVzKHggPSB2YXIyLCB5ID0gY291bnQsIGZpbGwgPSB2YXIxLCB3aWR0aCA9IGdyb3VwX2NvdW50KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIsIGNvbG91ciA9IHBhbGV0dGVbbnBhbF0sIHNpemUgPSAwLjUpICsNCiAgZmFjZXRfZ3JpZCh+dmFyMiwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gTlVMTCwgYnJlYWtzID0gTlVMTCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9IE5VTEwsIGJyZWFrcyA9IE5VTEwsIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVs0OjJdLCBndWlkZSA9ICJub25lIikgKw0KICBjb29yZF9jYXJ0ZXNpYW4oY2xpcCA9ICJvZmYiKSArDQogIGxhYnModGl0bGUgPSAiTW9zYWljIFBsb3QiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKSArDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuc3BhY2luZy54ID0gdW5pdCgwLCAicHQiKQ0KICApDQogIA0KcDIgPC0gZ2dwbG90KGRmX211bHRpX3Byb3BzLCBhZXMoYXJlYSA9IGNvdW50LCBzdWJncm91cCA9IHZhcjIsIGZpbGwgPSB2YXIyKSkgKw0KICBnZW9tX3RyZWVtYXAoY29sb3IgPSBwYWxldHRlW25wYWxdLCBzaXplID0gMC41Ki5wdCwgYWxwaGEgPSBOQSkgKyANCiAgZ2VvbV90cmVlbWFwX3N1Ymdyb3VwX2JvcmRlcihjb2xvciA9IHBhbGV0dGVbbnBhbF0sIHNpemUgPSAxLjUqLnB0KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGVbNDoyXSwgZ3VpZGUgPSAibm9uZSIpICsNCiAgY29vcmRfY2FydGVzaWFuKGNsaXAgPSAib2ZmIikgKw0KICBsYWJzKHRpdGxlID0gIlRyZWVtYXAiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKSANCnAzIDwtIGdncGxvdChkZl9zZXRzLCBhZXMoeCwgaWQgPSBpZCwgc3BsaXQgPSB5LCB2YWx1ZSA9IGNvdW50KSkgKw0KICBnZW9tX3BhcmFsbGVsX3NldHMoYWVzKGZpbGwgPSB2YXIxKSwgYWxwaGEgPSAwLjcsIGF4aXMud2lkdGggPSAwLjE1KSArDQogIGdlb21fcGFyYWxsZWxfc2V0c19heGVzKGF4aXMud2lkdGggPSAwLjA2LCBmaWxsID0gcGFsZXR0ZVsyXSwgY29sb3IgPSBwYWxldHRlWzJdKSArDQogIHNjYWxlX3hfZGlzY3JldGUoDQogICAgbmFtZSA9IE5VTEwsDQogICAgYnJlYWtzID0gTlVMTCwNCiAgICBleHBhbmQgPSBjKDAsIDAuMTUvMikNCiAgKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMocGFsZXR0ZVszXSwgcGFsZXR0ZVsyXSksIGd1aWRlID0gIm5vbmUiKSArDQogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgU2V0cyIpICsNCiAgdGhlbWVfcGxvdF9pY29uX2JsYW5rKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwbG90X2dyaWQocDEsIHAyLCBwMywgbmNvbCA9IDMsIHNjYWxlID0gLjkpDQpgYGANCg0KV2hlbiBwcm9wb3J0aW9ucyBhcmUgc3BlY2lmaWVkIGFjY29yZGluZyB0byBtdWx0aXBsZSBncm91cGluZyB2YXJpYWJsZXMsIHRoZW4gbW9zYWljIHBsb3RzLCB0cmVlbWFwcywgb3IgcGFyYWxsZWwgc2V0cyBhcmUgdXNlZnVsIHZpc3VhbGl6YXRpb24gYXBwcm9hY2hlcy4NCg0KTW9zYWljIHBsb3RzIGFzc3VtZSB0aGF0IGV2ZXJ5IGxldmVsIG9mIG9uZSBncm91cGluZyB2YXJpYWJsZSBjYW4gYmUgY29tYmluZWQgd2l0aCBldmVyeSBsZXZlbCBvZiBhbm90aGVyIGdyb3VwaW5nIHZhcmlhYmxlLCB3aGVyZWFzIHRyZWVtYXBzIGRvIG5vdCBtYWtlIHN1Y2ggYW4gYXNzdW1wdGlvbi4gVHJlZW1hcHMgd29yayB3ZWxsIGV2ZW4gaWYgdGhlIHN1YmRpdmlzaW9ucyBvZiBvbmUgZ3JvdXAgYXJlIGVudGlyZWx5IGRpc3RpbmN0IGZyb20gdGhlIHN1YmRpdmlzaW9ucyBvZiBhbm90aGVyLiBQYXJhbGxlbCBzZXRzIHdvcmsgYmV0dGVyIHRoYW4gZWl0aGVyIG1vc2FpYyBwbG90cyBvciB0cmVlbWFwcyB3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gdHdvIGdyb3VwaW5nIHZhcmlhYmxlcy4NCg0KDQojIFJlbGF0aW9uc2hpcHMgDQoNClRoZXJlIGFyZSBkaWZmZXJlbnQgd2F5cyB0byB2aXN1YWxpemUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byB2YXJpYWJsZXMuIFRoaXMgc2VjdGlvbiBmb2N1c2VkIHByaW1hcmlseSB0d28gbnVtZXJpY2FsIHZhcmlhYmxlcy4NCg0KIyMgU2NhdHRlciBQbG90cw0KDQpgYGB7ciBiYXNpYy1zY2F0dGVyLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMS80fQ0KcGFsZXR0ZSA8LSBwYWxfc3RlZWxfYmx1ZQ0KcDEgPC0gZ2dwbG90KGRmX3NjYXR0ZXJfeHksIGFlcyh4LCB5KSkgKyANCiAgZ2VvbV9wb2ludChmaWxsID0gcGFsZXR0ZVsyXSwgY29sb3IgPSBwYWxldHRlW25wYWxdLCBwY2ggPSAyMSwgc2l6ZSA9IDIuNCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoLjIsIDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKC4yLCAwKSkgKw0KICBsYWJzKHRpdGxlID0gIlNjYXR0ZXJwbG90IikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnAyIDwtIGdncGxvdChkZl9zY2F0dGVyX3h5eiwgYWVzKHgsIHksIHNpemUgPSB6KSkgKyANCiAgZ2VvbV9wb2ludChmaWxsID0gcGFsZXR0ZVsyXSwgY29sb3IgPSBwYWxldHRlW25wYWxdLCBwY2ggPSAyMSwgYWxwaGEgPSAwLjcpICsgDQogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKC4yLCAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYyguMiwgMCkpICsNCiAgc2NhbGVfcmFkaXVzKHJhbmdlID0gYygyLCA4KSkgKw0KICBsYWJzKHRpdGxlID0gIkJ1YmJsZSBDaGFydCIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwMyA8LSBnZ3Bsb3Qoc3ByZWFkKGRmX3BhaXJlZCwgeCwgeSksIGFlcyhBLCBCKSkgKyANCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2xvciA9IHBhbGV0dGVbM10sIHNpemUgPSAwLjMpICsgDQogIGdlb21fcG9pbnQoDQogICAgc2hhcGUgPSAyMSwgc2l6ZSA9IDIuNCwgc3Ryb2tlID0gMSwNCiAgICBmaWxsID0gcGFsZXR0ZVsyXSwgY29sb3IgPSBwYWxldHRlW25wYWxdDQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLjUsIDYuNSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMS41LCA2LjUpKSArDQogIGxhYnModGl0bGUgPSAiUGFpcmVkIFNjYXR0ZXJwbG90IikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnA0IDwtIGdncGxvdChkZl9wYWlyZWQsIGFlcyh4LCB5LCBncm91cCA9IGdyb3VwKSkgKyANCiAgZ2VvbV9saW5lKGNvbG9yID0gcGFsZXR0ZVsxXSkgKyANCiAgZ2VvbV9wb2ludCgNCiAgICBzaGFwZSA9IDIxLCBzaXplID0gMi40LCBzdHJva2UgPSAxLA0KICAgIGZpbGwgPSBwYWxldHRlWzJdLCBjb2xvciA9IHBhbGV0dGVbbnBhbF0NCiAgKSArDQogIHNjYWxlX3hfZGlzY3JldGUoZXhwYW5kID0gYygwLCAwLjQpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDEuNSwgNi41KSkgKw0KICBsYWJzKHRpdGxlID0gIlNsb3BlZ3JhcGgiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKSArDQogIHRoZW1lKA0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQpwbG90X2dyaWQocDEsIHAyLCBwMywgcDQsIG5jb2wgPSA0LCBzY2FsZSA9IC45KQ0KYGBgDQoNCg0KDQpTY2F0dGVycGxvdHMgcmVwcmVzZW50IHRoZSBhcmNoZXR5cGljYWwgdmlzdWFsaXphdGlvbiB3aGVuIHdlIHdhbnQgdG8gc2hvdyBvbmUgcXVhbnRpdGF0aXZlIHZhcmlhYmxlIHJlbGF0aXZlIHRvIGFub3RoZXIuIElmIHdlIGhhdmUgdGhyZWUgcXVhbnRpdGF0aXZlIHZhcmlhYmxlcywgd2UgY2FuIG1hcCBvbmUgb250byB0aGUgZG90IHNpemUsIGNyZWF0aW5nIGEgdmFyaWFudCBvZiB0aGUgc2NhdHRlcnBsb3QgY2FsbGVkIGJ1YmJsZSBjaGFydC4gRm9yIHBhaXJlZCBkYXRhLCB3aGVyZSB0aGUgdmFyaWFibGVzIGFsb25nIHRoZSAqeCogYW5kIHRoZSAqeSogYXhlcyBhcmUgbWVhc3VyZWQgaW4gdGhlIHNhbWUgdW5pdHMsIGl0IGlzIGdlbmVyYWxseSBoZWxwZnVsIHRvIGFkZCBhIGxpbmUgaW5kaWNhdGluZyAqeCogPSAqeSouIFBhaXJlZCBkYXRhIGNhbiBhbHNvIGJlIHNob3duIGFzIGEgc2xvcGUgZ3JhcGggb2YgcGFpcmVkIHBvaW50cyBjb25uZWN0ZWQgYnkgc3RyYWlnaHQgbGluZXMuDQoNCiMjIERlbnNpdHktYmFzZWQgUGxvdHMNCg0KDQpgYGB7ciB4eS1iaW5uaW5nLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMS80fQ0KcDUgPC0gZ2dwbG90KGRmX2RlbnNlX3NjYXR0ZXIsIGFlcyh4LCB5KSkgKyANCiAgZ2VvbV9kZW5zaXR5MmQoYmlud2lkdGggPSAwLjAyLCBjb2xvciA9IHBhbGV0dGVbMV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTIsIDMuNiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTQsIDUpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIGxhYnModGl0bGUgPSAiRGVuc2l0eSBDb250b3VycyIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNiA8LSBnZ3Bsb3QoZGZfZGVuc2Vfc2NhdHRlciwgYWVzKHgsIHkpKSArIA0KICBnZW9tX2JpbjJkKGJpbnMgPSAxMiwgY29sb3IgPSBwYWxldHRlW25wYWxdLCBzaXplID0gMC41KSArDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0yLCAzLjYpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC00LCA1KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBwYWxldHRlWzE6KG5wYWwtMSldKSArDQogIGxhYnModGl0bGUgPSAiMkQgQmlucyIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pDQpwNyA8LSBnZ3Bsb3QoZGZfZGVuc2Vfc2NhdHRlciwgYWVzKHgsIHkpKSArIA0KICBnZW9tX2hleChiaW5zID0gMTIsIGNvbG9yID0gcGFsZXR0ZVtucGFsXSwgc2l6ZSA9IDAuNSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMiwgMy42KSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNCwgNSksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gcGFsZXR0ZVsxOihucGFsLTEpXSkgKw0KICBsYWJzKHRpdGxlID0gIkhleCBCaW5zIikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCmNtIDwtIGNvcihzZWxlY3QobXRjYXJzLCBtcGcsIGhwLCBkcmF0LCB3dCwgcXNlYykpDQpkZl93aWRlIDwtIGFzLmRhdGEuZnJhbWUoY20pDQpkZl9sb25nIDwtIHN0YWNrKGRmX3dpZGUpDQpuYW1lcyhkZl9sb25nKSA8LSBjKCJjb3IiLCAidmFyMSIpDQpkZl9sb25nIDwtIGNiaW5kKGRmX2xvbmcsIHZhcjIgPSByZXAocm93bmFtZXMoY20pLCBsZW5ndGgocm93bmFtZXMoY20pKSkpDQpjbHVzdCA8LSBoY2x1c3QoYXMuZGlzdCgxLWNtKSwgbWV0aG9kPSJhdmVyYWdlIikgDQpsZXZlbHMgPC0gY2x1c3QkbGFiZWxzW2NsdXN0JG9yZGVyXQ0KZGZfbG9uZyR2YXIxIDwtIGZhY3RvcihkZl9sb25nJHZhcjEsIGxldmVscyA9IGxldmVscykNCmRmX2xvbmckdmFyMiA8LSBmYWN0b3IoZGZfbG9uZyR2YXIyLCBsZXZlbHMgPSBsZXZlbHMpDQpwOCA8LSBnZ3Bsb3QoZmlsdGVyKGRmX2xvbmcsIGFzLmludGVnZXIodmFyMSkgPCBhcy5pbnRlZ2VyKHZhcjIpKSwNCiAgICAgICBhZXModmFyMSwgdmFyMiwgZmlsbD1jb3IsIHNpemUgPSBhYnMoY29yKSkpICsgDQogIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgc3Ryb2tlID0gMCkgKyANCiAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiLCBuYW1lID0gTlVMTCwgZXhwYW5kID0gYygwLCAwLjUpKSArDQogIHNjYWxlX3lfZGlzY3JldGUobmFtZSA9IE5VTEwsIGV4cGFuZCA9IGMoMCwgMC41KSkgKw0KICBzY2FsZV9zaXplX2FyZWEobWF4X3NpemUgPSA4LCBsaW1pdHMgPSBjKDAsIDAuOSksIGd1aWRlID0gIm5vbmUiKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGhpZ2ggPSBwYWxldHRlWzJdLCBtaWQgPSBwYWxldHRlW25wYWxdLCBsb3cgPSBwYWxfc3RlZWxfYmx1ZV9pbnZbMl0sIGd1aWRlID0gIm5vbmUiKSArDQogIGxhYnModGl0bGUgPSAiQ29ycmVsb2dyYW0iKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHA1LCBwNiwgcDcsIHA4LCBuY29sID0gNCwgc2NhbGUgPSAuOSkNCmBgYA0KDQpGb3IgbGFyZ2UgbnVtYmVycyBvZiBwb2ludHMsIHJlZ3VsYXIgc2NhdHRlci1wbG90cyBjYW4gYmVjb21lIHVuaW5mb3JtYXRpdmUgZHVlIHRvIG92ZXJwbG90dGluZy4gSW4gdGhpcyBjYXNlLCBjb250b3VyIGxpbmVzLCAyRCBiaW5zLCBvciBoZXggYmlucyBtYXkgcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZS4gV2hlbiB3ZSB3YW50IHRvIHZpc3VhbGl6ZSBtb3JlIHRoYW4gdHdvIHF1YW50aXRpZXMsIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBtYXkgY2hvb3NlIHRvIHBsb3QgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIGluIHRoZSBmb3JtIG9mIGEgY29ycmVsb2dyYW0gaW5zdGVhZCBvZiB0aGUgdW5kZXJseWluZyByYXcgZGF0YS4NCg0KDQojIyBTZXJpYWwgTGluZSBQbG90cyAoZm9yIFRyZW5kcykNCg0KYGBge3IgeHktbGluZXMsIGZpZy53aWR0aCA9IDUqNi80LjIsIGZpZy5hc3AgPSAxLzR9DQpwMSA8LSBnZ3Bsb3QoZGZfb25lX2xpbmUsIGFlcyh4LCB5KSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSBwYWxldHRlWzFdKSArIA0KICBnZW9tX3BvaW50KA0KICAgIHNoYXBlID0gMjEsIHNpemUgPSAyLjQsIHN0cm9rZSA9IDEsDQogICAgZmlsbCA9IHBhbGV0dGVbMl0sIGNvbG9yID0gcGFsZXR0ZVtucGFsXQ0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMC41LCA1LjUpLCBicmVha3MgPSBjKDEsIDMsIDUpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDIuOCwgNC44KSkgKw0KICBsYWJzKHRpdGxlID0gIkxpbmUgR3JhcGgiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDIgPC0gZ2dwbG90KGRmX2Nvbm5lY3RlZF9zY2F0dGVyLCBhZXMoeCwgeSwgY29sb3IgPSB0LCBmaWxsID0gdCkpICsNCiAgZ2VvbV9wYXRoKCkgKw0KICBnZW9tX3BvaW50KA0KICAgIHNoYXBlID0gMjEsIHNpemUgPSAyLjQsIHN0cm9rZSA9IDEsDQogICAgY29sb3IgPSBwYWxldHRlW25wYWxdDQogICkgKw0KICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oDQogICAgYWVzdGhldGljcyA9IGMoImNvbG91ciIsICJmaWxsIiksDQogICAgY29sb3JzID0gcGFsZXR0ZVsobnBhbC0yKToxXQ0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMC4zLCAzLjcpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0yLjUsIDIuNSkpICsNCiAgbGFicyh0aXRsZSA9ICJDb25uZWN0ZWQgU2NhdHRlcnBsb3QiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDMgPC0gZ2dwbG90KGRmX2RlbnNlX3NjYXR0ZXJfc2FtcGxlLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9IHBhbGV0dGVbMl0sIHNpemUgPSAwLjMsIGFscGhhID0gMS8yKSArDQogIGdlb21fc21vb3RoKA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBmaWxsID0gcGFsZXR0ZVtucGFsLTJdLA0KICAgIHNpemUgPSAwLjUsDQogICAgc2UgPSBGQUxTRQ0KICApICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTUsIDUpKSArDQogIGxhYnModGl0bGUgPSAiU21vb3RoIExpbmUgR3JhcGgiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHAxLCBwMiwgcDMsIG5jb2wgPSAzLCBzY2FsZSA9IC45KQ0KYGBgDQoNCldoZW4gdGhlICp4KiBheGlzIHJlcHJlc2VudHMgdGltZSBvciBhIHN0cmljdGx5IGluY3JlYXNpbmcgcXVhbnRpdHkgc3VjaCBhcyBhIHRyZWF0bWVudCBkb3NlLCB3ZSBjb21tb25seSBkcmF3IGxpbmUgZ3JhcGhzLiBJZiB3ZSBoYXZlIGEgdGVtcG9yYWwgc2VxdWVuY2Ugb2YgdHdvIHJlc3BvbnNlIHZhcmlhYmxlcywgd2UgY2FuIGRyYXcgYSBjb25uZWN0ZWQgc2NhdHRlcnBsb3Qgd2hlcmUgd2UgZmlyc3QgcGxvdCB0aGUgdHdvIHJlc3BvbnNlIHZhcmlhYmxlcyBpbiBhIHNjYXR0ZXJwbG90IGFuZCB0aGVuIGNvbm5lY3QgZG90cyBjb3JyZXNwb25kaW5nIHRvIGFkamFjZW50IHRpbWUgcG9pbnRzLiBXZSBjYW4gdXNlIHNtb290aCBsaW5lcyB0byByZXByZXNlbnQgdHJlbmRzIGluIGEgbGFyZ2VyIGRhdGFzZXQuIA0KDQoNCg0KIyBHZW9zcGF0aWFsIEluZm9ybWF0aW9uIA0KDQoNCmBgYHtyIGdlb3NwYXRpYWwsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpsb2FkKGZpbGUgPSAiVVNfaW5jb21lLnJkYSIpDQpsb2FkKGZpbGUgPSAiVVNfaW5jb21lX2NhcnRvZ3JhbS5yZGEiKQ0KcGFsZXR0ZSA8LSBwYWxfZ3JlZW5fYnJvd24NCmxvd2VyNDggPC0gbXV0YXRlKA0KICBVU19pbmNvbWUsDQogIGluY29tZV9iaW5zID0gY3V0KA0KICAgIGlmZWxzZShpcy5uYShtZWRpYW5faW5jb21lKSwgMjUwMDAsIG1lZGlhbl9pbmNvbWUpLCAjIGhpZGUgbWlzc2luZyB2YWx1ZQ0KICAgIGJyZWFrcyA9IGMoMCwgNDAwMDAsIDUwMDAwLCA2MDAwMCwgNzAwMDAsIDgwMDAwKQ0KICApDQopICU+JSBmaWx0ZXIoIW5hbWUgJWluJSBjKCJBbGFza2EiLCAiSGF3YWlpIiwgIkRpc3RyaWN0IG9mIENvbHVtYmlhIikpDQpwMV9tYWluIDwtIGdncGxvdChsb3dlcjQ4KSArDQogIGdlb21fc2YoY29sb3IgPSBwYWxldHRlWzFdLCBmaWxsID0gcGFsZXR0ZVs0XSwgc2l6ZSA9IDAuMykgKw0KICBjb29yZF9zZihkYXR1bSA9IE5BLCBleHBhbmQgPSBGQUxTRSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMjUwMDAwMCwgMTAwMDAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtOTAwMDAwLCAxNTU4OTM1KSkgKw0KICB0aGVtZV9wbG90X2ljb25fYmxhbmsocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkgKw0KICB0aGVtZSgNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigyLCA1LCAzLCA1KQ0KICApDQojIG1ha2Ugc3VyZSBwbG90IGJhY2tncm91bmQgaXMgZnVsbHkgZmlsbGVkLCBhcyBpbiB0aGUgb3RoZXIgcGxvdHMNCnAxIDwtIGdnZHJhdyhwMV9tYWluKSArDQogIGxhYnModGl0bGUgPSAiTWFwIikgKw0KICB0aGVtZV9wbG90X2ljb25fYmxhbmsocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnAyX21haW4gPC0gZ2dwbG90KGxvd2VyNDgsIGFlcyhmaWxsID0gaW5jb21lX2JpbnMpKSArDQogIGdlb21fc2YoY29sb3IgPSBwYWxldHRlWzFdLCBzaXplID0gMC4yKSArDQogIGNvb3JkX3NmKGRhdHVtID0gTkEsIGV4cGFuZCA9IEZBTFNFKSArDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0yNTAwMDAwLCAxMDAwMDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC05MDAwMDAsIDE1NTg5MzUpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGUpICsNCiAgdGhlbWVfcGxvdF9pY29uX2JsYW5rKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pICsNCiAgdGhlbWUoDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMiwgNSwgMywgNSkNCiAgKQ0KcDIgPC0gZ2dkcmF3KHAyX21haW4pICsNCiAgbGFicyh0aXRsZSA9ICJDaG9yb3BsZXRoIikgKw0KICB0aGVtZV9wbG90X2ljb25fYmxhbmsocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCmxvd2VyNDhfY2FydG8gPC0gbXV0YXRlKA0KICBVU19pbmNvbWVfY2FydG9ncmFtLA0KICBpbmNvbWVfYmlucyA9IGN1dCgNCiAgICBpZmVsc2UoaXMubmEobWVkaWFuX2luY29tZSksIDI1MDAwLCBtZWRpYW5faW5jb21lKSwgIyBoaWRlIG1pc3NpbmcgdmFsdWUNCiAgICBicmVha3MgPSBjKDAsIDQwMDAwLCA1MDAwMCwgNjAwMDAsIDcwMDAwLCA4MDAwMCkNCiAgKQ0KKSAlPiUgZmlsdGVyKCFuYW1lICVpbiUgYygiQWxhc2thIiwgIkhhd2FpaSIsICJEaXN0cmljdCBvZiBDb2x1bWJpYSIpKQ0KcDNfbWFpbiA8LSBnZ3Bsb3QobG93ZXI0OF9jYXJ0bywgYWVzKGZpbGwgPSBpbmNvbWVfYmlucykpICsNCiAgZ2VvbV9zZihjb2xvciA9IHBhbGV0dGVbMV0sIHNpemUgPSAwLjIpICsNCiAgY29vcmRfc2YoZGF0dW0gPSBOQSwgZXhwYW5kID0gRkFMU0UpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTI1MDAwMDAsIDEwMDAwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEwMDAwMDAsIDE0NTg5MzUpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhbGV0dGUpICsNCiAgdGhlbWVfcGxvdF9pY29uX2JsYW5rKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pICsNCiAgdGhlbWUoDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMiwgNSwgMywgNSkNCiAgKQ0KcDMgPC0gZ2dkcmF3KHAzX21haW4pICsNCiAgbGFicyh0aXRsZSA9ICJDYXJ0b2dyYW0iKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KbG93ZXI0OF9zbWFsbCA8LSBmaWx0ZXIobG93ZXI0OCwgR0VPSUQgJWluJSBjKA0KICAiMDQiLCAiMDYiLCAiMDgiLCAiMTYiLCAiMjAiLCAiMzAiLCAiMzEiLCAiMzIiLCAiMzUiLCAiMzgiLCAiNDEiLCAiNDYiLCAiNDkiLCAiNTMiLCAiNTYiKSkNCnA0X21haW4gPC0gZ2dwbG90KGxvd2VyNDhfc21hbGwsIGFlcyhzdGF0ZSA9IG5hbWUsIGZpbGwgPSBpbmNvbWVfYmlucykpICsNCiAgZ2VvbV9zdGF0ZWJpbnMoDQogICAgZmFtaWx5ID0gZHZpel9mb250X2ZhbWlseSwNCiAgICBsYmxfc2l6ZSA9IDgvLnB0LA0KICAgIGJvcmRlcl9zaXplID0gMS4sDQogICAgYm9yZGVyX2NvbCA9IHBhbGV0dGVbbnBhbF0NCiAgKSArDQogIGNvb3JkX2VxdWFsKHhsaW0gPSBjKDEuNSwgNS41KSwgeWxpbSA9IGMoLTIuNSwgLTYuNSksIGV4cGFuZCA9IEZBTFNFLCBjbGlwID0gIm9mZiIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsZXR0ZVsyOjVdKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKSArDQogIHRoZW1lKA0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDIsIDAsIDAsIDcpDQogICkNCnA0IDwtIGdnZHJhdyhwNF9tYWluKSArIGxhYnModGl0bGUgPSAiQ2FydG9ncmFtIEhlYXRtYXAiKSArDQogIHRoZW1lX3Bsb3RfaWNvbl9ibGFuayhwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHAxLCBwMiwgcDMsIHA0LCBzY2FsZSA9IDAuOSwgbnJvdyA9IDEpDQpgYGANCg0KDQpUaGUgcHJpbWFyeSBtb2RlIG9mIHNob3dpbmcgZ2Vvc3BhdGlhbCBkYXRhIGlzIGluIHRoZSBmb3JtIG9mIGEgbWFwLiBBIG1hcCB0YWtlcyBjb29yZGluYXRlcyBvbiB0aGUgZ2xvYmUgYW5kIHByb2plY3RzIHRoZW0gb250byBhIGZsYXQgc3VyZmFjZSwgc3VjaCB0aGF0IHNoYXBlcyBhbmQgZGlzdGFuY2VzIG9uIHRoZSBnbG9iZSBhcmUgYXBwcm94aW1hdGVseSByZXByZXNlbnRlZCBieSBzaGFwZXMgYW5kIGRpc3RhbmNlcyBpbiB0aGUgMkQgcmVwcmVzZW50YXRpb24uIEluIGFkZGl0aW9uLCB3ZSBjYW4gc2hvdyBkYXRhIHZhbHVlcyBpbiBkaWZmZXJlbnQgcmVnaW9ucyBieSBjb2xvcmluZyB0aG9zZSByZWdpb25zIGluIHRoZSBtYXAgYWNjb3JkaW5nIHRvIHRoZSBkYXRhLiBTdWNoIGEgbWFwIGlzIGNhbGxlZCBhIGNob3JvcGxldGguIEluIHNvbWUgY2FzZXMsIGl0IG1heSBiZSBoZWxwZnVsIHRvIGRpc3RvcnQgdGhlIGRpZmZlcmVudCByZWdpb25zIGFjY29yZGluZyB0byBzb21lIG90aGVyIHF1YW50aXR5IChlLmcuLCBwb3B1bGF0aW9uIG51bWJlcikgb3Igc2ltcGxpZnkgZWFjaCByZWdpb24gaW50byBhIHNxdWFyZS4gU3VjaCB2aXN1YWxpemF0aW9ucyBhcmUgY2FsbGVkIGNhcnRvZ3JhbXMuDQoNCg0KIyBVbmNlcnRhaW50eQ0KDQpgYGB7ciBlcnJvcmJhcnMsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpwYWxldHRlIDwtIHBhbF9icm93bl9yZWQNCnAxIDwtIGdncGxvdChkZl91bmNlcnRhaW4sIGFlcyh5LCB0eXBlKSkgKw0KICBnZW9tX2Vycm9yYmFyaCgNCiAgICBhZXMoeG1pbiA9IHktZHksIHhtYXggPSB5K2R5KSwNCiAgICBjb2xvciA9IHBhbGV0dGVbMV0sIGhlaWdodCA9IDAuMiwgc2l6ZSA9IDAuNQ0KICApICsNCiAgZ2VvbV9wb2ludCgNCiAgICBjb2xvciA9IHBhbGV0dGVbMV0sDQogICAgc2l6ZSA9IDINCiAgKSArDQogIGxhYnModGl0bGUgPSAiRXJyb3IgQmFycyIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pICsNCiAgdGhlbWUoDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpDQogICkNCnAyIDwtIGdncGxvdChkZl91bmNlcnRhaW4sIGFlcyh0eXBlLCB5KSkgKw0KICBnZW9tX2NvbChmaWxsID0gcGFsZXR0ZVszXSwgd2lkdGggPSAwLjgpICsNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGFlcyh4ZW5kID0gdHlwZSwgeSA9IHktZHksIHllbmQgPSB5K2R5KSwNCiAgICBjb2xvciA9IHBhbGV0dGVbMV0sDQogICAgc2l6ZSA9IDAuNw0KICApICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgbGFicyh0aXRsZSA9ICJFcnJvciBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkgKw0KICB0aGVtZSgNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KcDMgPC0gZ2dwbG90KGRmX3VuY2VydGFpbiwgYWVzKHksIHR5cGUpKSArDQogIGdlb21fZXJyb3JiYXJoKA0KICAgIGFlcyh4bWluID0geS0yLjU4KmR5LCB4bWF4ID0geSsyLjU4KmR5KSwgIyA5OSUgQ0kNCiAgICBjb2xvciA9IHBhbGV0dGVbM10sIGhlaWdodCA9IDAsIHNpemUgPSAwLjUNCiAgKSArDQogIGdlb21fZXJyb3JiYXJoKA0KICAgIGFlcyh4bWluID0geS0xLjk2KmR5LCB4bWF4ID0geSsxLjk2KmR5KSwgIyA5NSUgQ0kNCiAgICBjb2xvciA9IHBhbGV0dGVbMl0sIGhlaWdodCA9IDAsIHNpemUgPSAxDQogICkgKw0KICBnZW9tX2Vycm9yYmFyaCgNCiAgICBhZXMoeG1pbiA9IHktMS4yOCpkeSwgeG1heCA9IHkrMS4yOCpkeSksICMgODAlIENJDQogICAgY29sb3IgPSBwYWxldHRlWzFdLCBoZWlnaHQgPSAwLCBzaXplID0gMS41DQogICkgKw0KICAjZ2VvbV9lcnJvcmJhcmgoDQogICMgIGFlcyh4bWluID0geS1keSwgeG1heCA9IHkrZHkpLA0KICAjICBjb2xvciA9IHBhbGV0dGVbMV0sIGhlaWdodCA9IDAuMSwgc2l6ZSA9IDAuNQ0KICAjKSArDQogIGdlb21fcG9pbnQoDQogICAgY29sb3IgPSBwYWxldHRlWzFdLA0KICAgIHNpemUgPSAyDQogICkgKw0KICBsYWJzKHRpdGxlID0gIkdyYWRlZCBFcnJvciBCYXJzIikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkgKw0KICB0aGVtZSgNCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KcDQgPC0gZ2dwbG90KGRmX3VuY2VydGFpbiwgYWVzKHgsIHkpKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSBwYWxldHRlWzFdLCBzaXplID0gMikgKw0KICBnZW9tX3NlZ21lbnQoDQogICAgYWVzKHhlbmQgPSB4LCB5ID0geS1keSwgeWVuZCA9IHkrZHkpLA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBzaXplID0gMC43DQogICkgKw0KICBnZW9tX3NlZ21lbnQoDQogICAgYWVzKHllbmQgPSB5LCB4ID0geC1keCwgeGVuZCA9IHgrZHgpLA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBzaXplID0gMC43DQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLCA0KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygyLCA2KSkgKw0KICBsYWJzKHRpdGxlID0gIjJEIEVycm9yIEJhcnMiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KICANCnBsb3RfZ3JpZChwMSwgcDIsIHA0LCBwMywgbmNvbCA9IDQsIHNjYWxlID0gLjkpDQogIA0KYGBgDQoNCkVycm9yIGJhcnMgYXJlIG1lYW50IHRvIGluZGljYXRlIHRoZSByYW5nZSBvZiBsaWtlbHkgdmFsdWVzIGZvciBzb21lIGVzdGltYXRlIG9yIG1lYXN1cmVtZW50LiBUaGV5IGV4dGVuZCBob3Jpem9udGFsbHkgYW5kL29yIHZlcnRpY2FsbHkgZnJvbSBzb21lIHJlZmVyZW5jZSBwb2ludCByZXByZXNlbnRpbmcgdGhlIGVzdGltYXRlIG9yIG1lYXN1cmVtZW50LiBSZWZlcmVuY2UgcG9pbnRzIGNhbiBiZSBzaG93biBpbiB2YXJpb3VzIHdheXMsIHN1Y2ggYXMgYnkgZG90cyBvciBieSBiYXJzLiBHcmFkZWQgDQplcnJvciBiYXJzIHNob3cgbXVsdGlwbGUgcmFuZ2VzIGF0IHRoZSBzYW1lIHRpbWUsIHdoZXJlIGVhY2ggcmFuZ2UgY29ycmVzcG9uZHMgdG8gYSBkaWZmZXJlbnQgZGVncmVlIG9mIGNvbmZpZGVuY2UuIFRoZXkgYXJlIGluIGVmZmVjdCBtdWx0aXBsZSBlcnJvciBiYXJzIHdpdGggZGlmZmVyZW50IGxpbmUgdGhpY2tuZXNzZXMgcGxvdHRlZCBvbiB0b3Agb2YgZWFjaCBvdGhlci4NCg0KYGBge3J9DQojJyBDb25maWRlbmNlIGRlbnNpdHkgZGlzdHJpYnV0aW9ucyBnZW5lcmF0ZWQgZnJvbSBlc3RpbWF0ZSBhbmQgbWFyZ2luIG9mIGVycm9yDQojJw0KIycgVGhpcyBzdGF0IGdlbmVyYXRlcyBub3JtYWwgZGVuc2l0aWVzIGZyb20gcHJvdmlkZWQgZXN0aW1hdGVzIHBsdXMgbWFyZ2lucw0KIycgb2YgZXJyb3IgKGF0IGEgc3BlY2lmaWVkIGNvbmZpZGVuY2UgbGV2ZWwpLiBJdCBjYW4gYmUgdXNlZCB0byBlc3RpbWF0ZQ0KIycgdGhlIGNvbmZpZGVuY2UgZGVuc2l0eSB0aGF0IHVuZGVybGllcyBhIGdpdmVuIHBhcmFtZXRlciBlc3RpbWF0ZSB3aXRoDQojJyBnaXZlbiBtYXJnaW4gb2YgZXJyb3IuDQojJw0KIycgQGluaGVyaXRQYXJhbXMgZ2dwbG90Mjo6bGF5ZXINCiMnIEBwYXJhbSAuLi4gT3RoZXIgYXJndW1lbnRzIHBhc3NlZCBvbiB0byBbYGxheWVyKClgXS4gVGhlc2UgYXJlDQojJyAgIG9mdGVuIGFlc3RoZXRpY3MsIHVzZWQgdG8gc2V0IGFuIGFlc3RoZXRpYyB0byBhIGZpeGVkIHZhbHVlLCBsaWtlDQojJyAgIGBjb2xvdXIgPSAicmVkImAgb3IgYHNpemUgPSAzYC4gVGhleSBtYXkgYWxzbyBiZSBwYXJhbWV0ZXJzDQojJyAgIHRvIHRoZSBwYWlyZWQgZ2VvbS9zdGF0Lg0KIycgQHBhcmFtIGNvbmZpZGVuY2UgVGhlIGNvbmZpZGVuY2UgbGV2ZWwgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGBtb2VgIHN0YXRpc3RpYy4NCiMnICAgIFRoaXMgZGVmYXVsdHMgdG8gMC45NSAoYG1vZWAgY29ycmVzcG9uZHMgdG8gOTVcJSBjb25maWRlbmNlIGludGVydmFsKS4NCiMnIEBwYXJhbSB4bGltIE51bWVyaWMgdmVjdG9yIG9mIHR3byBudW1iZXJzIHNldHRpbmcgdGhlIHJhbmdlIG9mIHggdmFsdWVzIHRvIGJlDQojJyAgIGNvdmVyZWQgYnkgdGhlIGNvbmZpZGVuY2UgZGVuc2l0eS4gSWYgbm90IHN1cHBsaWVkLCBpcyB0YWtlbiBmcm9tIHRoZSB4IHNjYWxlLg0KIycgQHBhcmFtIG4gTnVtYmVyIG9mIGVxdWFsbHkgc3BhY2VkIHBvaW50cyBhdCB3aGljaCB0aGUgZGVuc2l0eSBpcyBjYWxjdWxhdGVkLg0KIycgQHBhcmFtIG5hLnJtIElmIGBGQUxTRWAsIHRoZSBkZWZhdWx0LCBtaXNzaW5nIHZhbHVlcyBhcmUgcmVtb3ZlZCB3aXRoDQojJyAgIGEgd2FybmluZy4gSWYgYFRSVUVgLCBtaXNzaW5nIHZhbHVlcyBhcmUgc2lsZW50bHkgcmVtb3ZlZC4NCiMnDQojJyBAc2VjdGlvbiBEZXRhaWxzOg0KIycNCiMnIFRoZSBmb2xsb3dpbmcgYWVzdGhldGljcyBhcmUgdW5kZXJzdG9vZCBieSB0aGlzIHN0YXQgKHJlcXVpcmVkIGFlc3RoZXRpY3MNCiMnIGFyZSBpbiBib2xkKToNCiMnICAqICoqYHhgKio6IFRoZSBlc3RpbWF0ZSB3aG9zZSB1bmNlcnRhaW50eSBpcyB0byBiZSBkaXNwbGF5ZWQNCiMnICAqICoqYG1vZWAqKjogTWFyZ2luIG9mIGVycm9yDQojJyAgKiBgY29uZmlkZW5jZWA6IENvbmZpZGVuY2UgbGV2ZWwgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGBtb2VgIHN0YXRpc3RpYy4NCiMnICAgIFRoaXMgZGVmYXVsdHMgdG8gMC45NSAoYG1vZWAgY29ycmVzcG9uZHMgdG8gOTVcJSBjb25maWRlbmNlIGludGVydmFsKS4NCiMnDQojJyBAc291cmNlDQojJyBBZHJpYW4gVy4gQm93bWFuLiBHcmFwaHMgZm9yIFVuY2VydGFpbnR5LiBKLiBSLiBTdGF0aXN0LiBTb2MuIEEgMTgyOjEtMTYsIDIwMTguDQojJyBcdXJse2h0dHA6Ly93d3cucnNzLm9yZy51ay9JbWFnZXMvUERGL2V2ZW50cy8yMDE4L0Jvd21hbi01LVNlcHQtMjAxOC5wZGZ9DQojJyBAZXhhbXBsZXMNCiMnIGxpYnJhcnkoZ2dwbG90MikNCiMnIGxpYnJhcnkoZHBseXIpDQojJw0KIycgY2FjYW9fc21hbGwgPC0gY2FjYW8gJT4lDQojJyAgIGZpbHRlcihsb2NhdGlvbiAlaW4lIGMoIlN3aXR6ZXJsYW5kIiwgIkNhbmFkYSIsICJVLlMuQS4iLCAiQmVsZ2l1bSIpKQ0KIycNCiMnIGNhY2FvX3N1bW1hcnkgPC0gY2FjYW9fc21hbGwgJT4lDQojJyAgIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUNCiMnICAgc3VtbWFyaXplKA0KIycgICAgIHNkID0gc2QocmF0aW5nKSwNCiMnICAgICBtb2UgPSBzZCoxLjk2LA0KIycgICAgIHJhdGluZyA9IG1lYW4ocmF0aW5nKQ0KIycgICApDQojJw0KIycgZ2dwbG90KGNhY2FvX3N1bW1hcnksIGFlcyh4ID0gcmF0aW5nLCB5ID0gbG9jYXRpb24pKSArDQojJyAgIHN0YXRfY29uZmlkZW5jZV9kZW5zaXR5KGFlcyhtb2UgPSBtb2UsIGZpbGwgPSBzdGF0KG5kZW5zaXR5KSksIGhlaWdodCA9IDAuOCkgKw0KIycgICBnZW9tX3BvaW50KGRhdGEgPSBjYWNhb19zbWFsbCwgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjA1KSwgc2l6ZSA9IDAuMykgKw0KIycgICBnZW9tX2Vycm9yYmFyaCgNCiMnICAgICBhZXMoeG1pbiA9IHJhdGluZyAtIHNkLCB4bWF4ID0gcmF0aW5nICsgc2QpLA0KIycgICAgIGhlaWdodCA9IDAuMywgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSAxDQojJyAgICkgKw0KIycgICBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICJkYXJrcmVkIikgKw0KIycgICB0aGVtZV9taW5pbWFsKCkNCiMnDQojJw0KIycgbGlicmFyeShnZ3JpZGdlcykNCiMnDQojJyBjYWNhb19zZSA8LSBjYWNhb19zbWFsbCAlPiUNCiMnICAgZ3JvdXBfYnkobG9jYXRpb24pICU+JQ0KIycgICBzdW1tYXJpemUoDQojJyAgICAgc2UgPSBzZChyYXRpbmcpL3NxcnQobigpKSwNCiMnICAgICBtb2UgPSBzZSoxLjk2LA0KIycgICAgIHJhdGluZyA9IG1lYW4ocmF0aW5nKQ0KIycgICApDQojJw0KIycgZ2dwbG90KGNhY2FvX3NlLCBhZXMoeCA9IHJhdGluZywgeSA9IGxvY2F0aW9uKSkgKw0KIycgICBzdGF0X2NvbmZpZGVuY2VfZGVuc2l0eSgNCiMnICAgICBnZW9tID0gInJpZGdlbGluZSIsDQojJyAgICAgYWVzKG1vZSA9IG1vZSwgaGVpZ2h0ID0gc3RhdChkZW5zaXR5KSksDQojJyAgICAgYWxwaGEgPSBOQSwgeGxpbSA9IGMoMi41LCAzLjc1KSwgc2NhbGUgPSAwLjA4DQojJyAgICkgKw0KIycgICB0aGVtZV9taW5pbWFsKCkNCiMnIEBleHBvcnQNCnN0YXRfY29uZmlkZW5jZV9kZW5zaXR5IDwtIGZ1bmN0aW9uKG1hcHBpbmcgPSBOVUxMLCBkYXRhID0gTlVMTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tID0gInRpbGUiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAwLjk1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsaW0gPSBOVUxMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSA1MDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gVFJVRSkgew0KICBsIDwtIGxheWVyKA0KICAgIGRhdGEgPSBkYXRhLA0KICAgIG1hcHBpbmcgPSBtYXBwaW5nLA0KICAgIHN0YXQgPSBTdGF0Q29uZmlkZW5jZURlbnNpdHksDQogICAgZ2VvbSA9IGdlb20sDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbiwNCiAgICBzaG93LmxlZ2VuZCA9IHNob3cubGVnZW5kLA0KICAgIGluaGVyaXQuYWVzID0gaW5oZXJpdC5hZXMsDQogICAgcGFyYW1zID0gbGlzdCgNCiAgICAgIGNvbmZpZGVuY2UgPSBjb25maWRlbmNlLA0KICAgICAgbiA9IG4sDQogICAgICBuYS5ybSA9IG5hLnJtLA0KICAgICAgeGxpbSA9IHhsaW0sDQogICAgICAuLi4NCiAgICApDQogICkNCg0KICBsaXN0KGwsIHNjYWxlX2FscGhhX2lkZW50aXR5KCkpDQp9DQoNCiMnIEByZG5hbWUgc3RhdF9jb25maWRlbmNlX2RlbnNpdHkNCiMnIEB1c2FnZSBOVUxMDQojJyBAZm9ybWF0IE5VTEwNCiMnIEBleHBvcnQNClN0YXRDb25maWRlbmNlRGVuc2l0eSA8LSBnZ3Byb3RvKCJTdGF0Q29uZmlkZW5jZURlbnNpdHkiLCBTdGF0LA0KICByZXF1aXJlZF9hZXMgPSBjKCJ4IiwgIm1vZSIpLA0KICBkZWZhdWx0X2FlcyA9IGFlcygNCiAgICBhbHBoYSA9IHN0YXQobmRlbnNpdHkpLA0KICAgIGNvbmZpZGVuY2UgPSAwLjk1DQogICksDQoNCiAgY29tcHV0ZV9ncm91cCA9IGZ1bmN0aW9uKGRhdGEsIHNjYWxlcywgeGxpbSA9IE5VTEwsIG4gPSA1MDEsIGNvbmZpZGVuY2UgPSAwLjk1KSB7DQogICAgIyBhc3N1bWUgY29uZmlkZW5jZSBsZXZlbCBpcyAwLjk1IGlmIG5vdCBwcm92aWRlZA0KICAgIGlmIChpcy5udWxsKGRhdGEkY29uZmlkZW5jZSkpIHsNCiAgICAgIGRhdGEkY29uZmlkZW5jZSA8LSBjb25maWRlbmNlDQogICAgfQ0KDQogICAgIyBDaGVjayB0aGF0IGNvbmZpZGVuY2UgZGVuc2l0eSBwYXJhbWV0ZXJzIGFyZSBjb25zdGFudCB3aXRoaW4gZ3JvdXANCiAgICBwYXJhbXMgPC0gdW5pcXVlKGRhdGFbYygieCIsICJtb2UiLCAiY29uZmlkZW5jZSIpXSkNCiAgICBpZiAobnJvdyhwYXJhbXMpID4gMSkgew0KICAgICAgc3RvcCgiQ29uZmlkZW5jZSBkZW5zaXR5IHBhcmFtZXRlcnMgY2FuIG5vdCB2YXJ5IHdpdGhpbiBkYXRhIGdyb3VwcyIsIGNhbGwuID0gRkFMU0UpDQogICAgfQ0KICAgIHBhcmFtcyA8LSBhcy5saXN0KHBhcmFtcykNCg0KICAgIHJhbmdlIDwtIHhsaW0gJXx8JSBzY2FsZXMkeCRkaW1lbnNpb24oKQ0KICAgIHhzZXEgPC0gc2VxKHJhbmdlWzFdLCByYW5nZVsyXSwgbGVuZ3RoLm91dCA9IG4pDQoNCiAgICBpZiAoc2NhbGVzJHgkaXNfZGlzY3JldGUoKSkgew0KICAgICAgeF90cmFucyA8LSB4c2VxDQogICAgfSBlbHNlIHsNCiAgICAgICMgRm9yIGNvbnRpbnVvdXMgc2NhbGVzLCBuZWVkIHRvIGJhY2sgdHJhbnNmb3JtIGZyb20gdHJhbnNmb3JtZWQgcmFuZ2UNCiAgICAgICMgdG8gb3JpZ2luYWwgdmFsdWVzDQogICAgICB4X3RyYW5zIDwtIHNjYWxlcyR4JHRyYW5zJGludmVyc2UoeHNlcSkNCiAgICAgIHBhcmFtcyR4IDwtIHNjYWxlcyR4JHRyYW5zJGludmVyc2UocGFyYW1zJHgpDQogICAgICBwYXJhbXMkc3RhdGlzdGljIDwtIHNjYWxlcyR4JHRyYW5zJGludmVyc2UocGFyYW1zJHN0YXRpc3RpYykNCiAgICB9DQoNCiAgICBmdW4gPC0gZG8uY2FsbChmaXRfbm9ybWFsLCBwYXJhbXMpDQogICAgZGVuc2l0eSA8LSBmdW4oeF90cmFucykNCg0KICAgIGRhdGEuZnJhbWUoDQogICAgICB4ID0geHNlcSwNCiAgICAgIGRlbnNpdHkgPSBkZW5zaXR5LA0KICAgICAgbmRlbnNpdHkgPSBkZW5zaXR5L21heChkZW5zaXR5KQ0KICAgICkNCiAgfQ0KKQ0KDQoNCmZpdF9ub3JtYWwgPC0gZnVuY3Rpb24oeCwgbW9lLCBjb25maWRlbmNlKSB7DQogICMgY29udmVydCB0byB0d28tdGFpbGVkIHZhbHVlDQogIGNvbmZpZGVuY2UgPC0gMS0oMS1jb25maWRlbmNlKS8yDQogIGZ1bmN0aW9uKHopIHN0YXRzOjpkbm9ybSh6LCBtZWFuID0geCwgc2QgPSBtb2Uvc3RhdHM6OnFub3JtKGNvbmZpZGVuY2UpKQ0KfQ0KYGBgDQoNCg0KDQoNCmBgYHtyIGNvbmZpZGVuY2UtZGlzdHMsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAxLzR9DQpwMSA8LSBnZ3Bsb3QoZGZfdW5jZXJ0YWluLCBhZXMoeSwgdHlwZSkpICsNCiAgc3RhdF9jb25maWRlbmNlX2RlbnNpdHkoYWVzKG1vZSA9IGR5KSwgZmlsbCA9IHBhbGV0dGVbM10sIGhlaWdodCA9IDAuNiwgY29uZmlkZW5jZSA9IDAuNjgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMS42LCA2LjQpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gYygwLCAxKSkgKw0KICBsYWJzKHRpdGxlID0gIkNvbmZpZGVuY2UgU3RyaXBzIikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkgKw0KICB0aGVtZSgNCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KcDIgPC0gZ2dwbG90KGRmX3VuY2VydGFpbiwgYWVzKHksIHR5cGUpKSArDQogIGdlb21fcmliYm9uKA0KICAgIGRhdGEgPSBmaWx0ZXIoZGZfdW5jZXJ0YWluLCB0eXBlID09ICJBIiksDQogICAgYWVzKG1vZSA9IGR5LCB5bWluID0gMSAtIC41KnN0YXQoZGVuc2l0eSksIHltYXggPSAxICsgLjUqc3RhdChkZW5zaXR5KSksDQogICAgc3RhdCA9ICJjb25maWRlbmNlX2RlbnNpdHkiLA0KICAgIGZpbGwgPSBwYWxldHRlWzNdLCBjb2xvciA9IE5BLCBhbHBoYSA9IE5BLCBjb25maWRlbmNlID0gMC42OA0KICApICsNCiAgZ2VvbV9yaWJib24oDQogICAgZGF0YSA9IGZpbHRlcihkZl91bmNlcnRhaW4sIHR5cGUgPT0gIkIiKSwNCiAgICBhZXMobW9lID0gZHksIHltaW4gPSAyIC0gLjUqc3RhdChkZW5zaXR5KSwgeW1heCA9IDIgKyAuNSpzdGF0KGRlbnNpdHkpKSwNCiAgICBzdGF0ID0gImNvbmZpZGVuY2VfZGVuc2l0eSIsDQogICAgZmlsbCA9IHBhbGV0dGVbM10sIGNvbG9yID0gTkEsIGFscGhhID0gTkEsIGNvbmZpZGVuY2UgPSAwLjY4DQogICkgKw0KICBnZW9tX3JpYmJvbigNCiAgICBkYXRhID0gZmlsdGVyKGRmX3VuY2VydGFpbiwgdHlwZSA9PSAiQyIpLA0KICAgIGFlcyhtb2UgPSBkeSwgeW1pbiA9IDMgLSAuNSpzdGF0KGRlbnNpdHkpLCB5bWF4ID0gMyArIC41KnN0YXQoZGVuc2l0eSkpLA0KICAgIHN0YXQgPSAiY29uZmlkZW5jZV9kZW5zaXR5IiwNCiAgICBmaWxsID0gcGFsZXR0ZVszXSwgY29sb3IgPSBOQSwgYWxwaGEgPSBOQSwgY29uZmlkZW5jZSA9IDAuNjgNCiAgKSArDQogIGdlb21fZXJyb3JiYXJoKA0KICAgIGFlcyh4bWluID0geS0xLjI4KmR5LCB4bWF4ID0geSsxLjI4KmR5KSwgDQogICAgY29sb3IgPSBwYWxldHRlWzFdLCBoZWlnaHQgPSAwLCBzaXplID0gMC41DQogICkgKw0KICBnZW9tX3BvaW50KA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBzaXplID0gMg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMS42LCA2LjQpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gZXhwYW5kX3NjYWxlKGFkZCA9IGMoMC44LCAwLjgpKSkgKw0KICBsYWJzKHRpdGxlID0gIkV5ZXMiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKSArDQogIHRoZW1lKA0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQpwMyA8LSBnZ3Bsb3QoZGZfdW5jZXJ0YWluLCBhZXMoeSwgdHlwZSkpICsNCiAgc3RhdF9jb25maWRlbmNlX2RlbnNpdHkoDQogICAgYWVzKG1vZSA9IGR5LCBoZWlnaHQgPSAuOSpzdGF0KGRlbnNpdHkpKSwNCiAgICBnZW9tID0gInJpZGdlbGluZSIsDQogICAgZmlsbCA9IHBhbGV0dGVbM10sIGNvbG9yID0gTkEsIGFscGhhID0gTkEsIGNvbmZpZGVuY2UgPSAwLjY4DQogICkgKw0KICBnZW9tX2Vycm9yYmFyaCgNCiAgICBhZXMoeG1pbiA9IHktMS4yOCpkeSwgeG1heCA9IHkrMS4yOCpkeSksDQogICAgY29sb3IgPSBwYWxldHRlWzFdLCBoZWlnaHQgPSAwLCBzaXplID0gMC41DQogICkgKw0KICBnZW9tX3BvaW50KA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBzaXplID0gMg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMS42LCA2LjQpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gZXhwYW5kX3NjYWxlKGFkZCA9IGMoMC4yLCAwLjgpKSkgKw0KICBsYWJzKHRpdGxlID0gIkhhbGYtRXllcyIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pICsNCiAgdGhlbWUoDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpDQogICkNCmRmX25vcm0gPC0gZGF0YS5mcmFtZSgNCiAgeCA9IHNlcSgtMywgMywgbGVuZ3RoLm91dCA9IDEwMCksDQogIHkgPSBkbm9ybShzZXEoLTMsIDMsIGxlbmd0aC5vdXQgPSAxMDApKQ0KKQ0KZGZfcSA8LSBkYXRhLmZyYW1lKHggPSBxbm9ybShwcG9pbnRzKDIwKSkpDQpwNCA8LSBnZ3Bsb3QoZGZfcSwgYWVzKHgpKSArDQogIGdlb21fbGluZShkYXRhID0gZGZfbm9ybSwgYWVzKHgsIC4zNip5KSwgY29sb3IgPSBwYWxldHRlWzFdLCBuYS5ybSA9IEZBTFNFLCBzaXplID0gMC4yNSkgKyAjIGZhY3RvciAuMzYgbWFudWFsbHkgZGV0ZXJtaW5lZA0KICBnZW9tX2RvdHBsb3QoYmlud2lkdGggPSAuNCwgZmlsbCA9IHBhbGV0dGVbM10sIGNvbG9yID0gcGFsZXR0ZVsxXSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYygtMi44LCAyLjgpLA0KICAgIGV4cGFuZCA9IGMoMCwgMCkNCiAgKSArDQogIHNjYWxlX3lfY29udGludW91cygNCiAgICBleHBhbmQgPSBjKDAuMDIsIDApLA0KICAgIGxpbWl0cyA9IGMoMCwgMC40KQ0KICApICsNCiAgbGFicyh0aXRsZSA9ICJRdWFudGlsZSBEb3QgUGxvdCIpICsNCiAgdGhlbWVfcGxvdF9pY29uKHBhbGV0dGVbbnBhbF0sIHBhbGV0dGVbMV0pICsNCiAgdGhlbWUoDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpDQogICkNCnBsb3RfZ3JpZChwMSwgcDIsIHAzLCBwNCwgbmNvbCA9IDQsIHNjYWxlID0gLjkpDQogIA0KYGBgDQoNClRvIGFjaGlldmUgYSBtb3JlIGRldGFpbGVkIHZpc3VhbGl6YXRpb24gdGhhbiBpcyBwb3NzaWJsZSB3aXRoIGVycm9yIGJhcnMgb3IgZ3JhZGVkIGVycm9yIGJhcnMsIHdlIGNhbiB2aXN1YWxpemUgdGhlIGFjdHVhbCBjb25maWRlbmNlIG9yIHBvc3RlcmlvciBkaXN0cmlidXRpb25zLiBDb25maWRlbmNlIHN0cmlwcyBwcm92aWRlIGEgY2xlYXIgdmlzdWFsIHNlbnNlIG9mIHVuY2VydGFpbnR5IGJ1dCBhcmUgZGlmZmljdWx0IHRvIHJlYWQgYWNjdXJhdGVseS4gRXllcyBhbmQgaGFsZi1leWVzIGNvbWJpbmUgZXJyb3IgYmFycyB3aXRoIGFwcHJvYWNoZXMgdG8gdmlzdWFsaXplIGRpc3RyaWJ1dGlvbnMgKHZpb2xpbnMgYW5kIHJpZGdlbGluZXMsIHJlc3BlY3RpdmVseSksIGFuZCB0aHVzIHNob3cgYm90aCBwcmVjaXNlIHJhbmdlcyBmb3Igc29tZSBjb25maWRlbmNlIGxldmVscyBhbmQgdGhlIG92ZXJhbGwgdW5jZXJ0YWludHkgZGlzdHJpYnV0aW9uLiBBIHF1YW50aWxlIGRvdCBwbG90IGNhbiBzZXJ2ZSBhcyBhbiBhbHRlcm5hdGl2ZSB2aXN1YWxpemF0aW9uIG9mIGFuIHVuY2VydGFpbnR5IGRpc3RyaWJ1dGlvbi4gQnkgc2hvd2luZyB0aGUgZGlzdHJpYnV0aW9uIGluIGRpc2NyZXRlIHVuaXRzLCB0aGUgcXVhbnRpbGUgZG90IHBsb3QgaXMgbm90IGFzIHByZWNpc2UgYnV0IGNhbiBiZSBlYXNpZXIgdG8gcmVhZCB0aGFuIHRoZSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBzaG93biBieSBhIHZpb2xpbiBvciByaWRnZWxpbmUgcGxvdC4NCg0KDQpgYGB7cn0NCiMgZmlsZSBiYXNlZCBvbiBzdGF0LXNtb290aC5SIGZyb20gZ2dwbG90Mg0KDQojJyBHZW5lcmF0ZSBvdXRjb21lIGRyYXdzIGZyb20gYSBzbW9vdGggZml0DQojJw0KIycgR2VuZXJhdGUgb3V0Y29tZSBkcmF3cyBmcm9tIGEgc21vb3RoIGZpdC4gVGhpcyBzdGF0IGlzIHNpbWlsYXIgdG8gW2BzdGF0X3Ntb290aCgpYF0sDQojJyBidXQgdGhlcmUgYXJlIGEgZmV3IGltcG9ydGFudCBkaWZmZXJlbmNlcy4gRmlyc3QsIHRoZXJlIGlzIG5vIGBtZXRob2RgIGFyZ3VtZW50Lg0KIycgT25seSBzbW9vdGggZml0cyBmaXR0ZWQgdmlhIFtgbWdjdjo6Z2FtKClgXSBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4gSWYgeW91IHdhbnQgYQ0KIycgbGluZWFyIGZpdCwgc2V0IGEgbGluZWFyIGZvcm11bGEgdmlhIGBmb3JtdWxhID0geSB+IHhgLiBTZWNvbmQsIHRoZXJlIGlzIG5vIGBzZWANCiMnIGFyZ3VtZW50LiBUaGlzIHN0YXQgY2Fubm90IGRyYXcgY29uZmlkZW5jZSBiYW5kcy4gU2VlIFtgY29uZmlkZW5jZV9iYW5kKClgXSBmb3IgYQ0KIycgd29ya2Fyb3VuZCBpZiB5b3Ugd2FudCB0byBhZGQgY29uZmlkZW5jZSBiYW5kcy4gSW50ZXJuYWxseSwgdGhlIHN0YXQgdXNlcyB0aGUNCiMnIGZ1bmN0aW9uIFtgc2FtcGxlX291dGNvbWVzKClgXSB0byBjYWxjdWxhdGUgb3V0Y29tZXMuDQojJw0KIycgVGhpcyBzdGF0IGZpdHMgdGhlIGdhbSB3aXRoIFJlc3RyaWN0ZWQgTWF4aW11bSBMaWtlbGlob29kIChSRU1MKSBhbmQgdXNlcyB0aGUNCiMnIHNtb290aGluZyBwYXJhbWV0ZXIgdW5jZXJ0YWludHkgY29ycmVjdGVkIGNvdmFyaWFuY2UgbWF0cml4IHRvIGdlbmVyYXRlIG91dGNvbWVzDQojJyAoYHVuY29uZGl0aW9uYWwgPSBUUlVFYCBpbiBbYHNhbXBsZV9vdXRjb21lcygpYF0pLiBJZiB5b3UgY2hvb3NlIGEgZGlmZmVyZW50IGdhbQ0KIycgZml0dGluZyBtZXRob2QgdGhlIHN0YXQgc2V0cyBgdW5jb25kaXRpb25hbCA9IEZBTFNFYC4NCiMnDQojJyBOb3RlIHRoYXQgZm9yIHN0YXRpYyBwbG90cywgeW91IHdpbGwgZ2VuZXJhbGx5IGhhdmUgdG8gc2V0IHRoZSBgZ3JvdXBgDQojJyBhZXN0aGV0aWMgYXBwcm9wcmlhdGVseSAoZS5nLiwgYGFlcyhncm91cCA9IHN0YXQoLmRyYXcpKWApLiBIb3dldmVyLCBmb3INCiMnIGFuaW1hdGVkIHBsb3RzIHlvdSB3aWxsIG5vcm1hbGx5IG5vdCB3YW50IHRvIHNldCB0aGUgZ3JvdXAgYWVzdGhldGljIGluDQojJyB0aGlzIHdheS4gVG8gZW5hYmxlIGFuaW1hdGlvbnMgYnkgZGVmYXVsdCwgYHN0YXRfc21vb3RoX2RyYXdzKClgIGRvZXMgbm90DQojJyBzZXQgYSBncm91cCBhZXN0aGV0aWMuIFNlZSBleGFtcGxlcyBmb3IgZnVydGhlciBkZXRhaWxzLg0KIycNCiMnIEBpbmhlcml0UGFyYW1zIGdncGxvdDI6OnN0YXRfc21vb3RoDQojJyBAcGFyYW0gdGltZXMgTnVtYmVyIG9mIG91dGNvbWVzIHRvIGRyYXcuDQojJyBAcGFyYW0gZm9ybXVsYSBGb3JtdWxhIHRvIHVzZSBpbiBzbW9vdGhpbmcgZnVuY3Rpb24uIERlZmF1bHQgaXMNCiMnICAgYSBjdWJpYyBzcGxpbmUsIGB5IH4gcyh4LCBicyA9ICJjcyIpYC4gVG8gZ2VuZXJhdGUgYSBsaW5lYXIgZml0LA0KIycgICBzZXQgYGZvcm11bGEgPSB5IH4geGAuDQojJyBAcGFyYW0gZ2FtLmFyZ3MgTGlzdCBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwYXNzZWQgb24gdG8gdGhlDQojJyAgIEdBTSBjYWxsLg0KIycgQGV4YW1wbGVzDQojJyBsaWJyYXJ5KGdncGxvdDIpDQojJw0KIycgIyBzdGF0aWMgcGxvdHMsIG5lZWQgdG8gc2V0IGdyb3VwIGFlc3RoZXRpYyBtYW51YWxseQ0KIycgZ2dwbG90KG10Y2FycywgYWVzKGhwLCBtcGcpKSArDQojJyAgIGdlb21fcG9pbnQoKSArDQojJyAgIHN0YXRfc21vb3RoX2RyYXdzKGFlcyhncm91cCA9IHN0YXQoLmRyYXcpKSwgc2l6ZSA9IDAuNSkgKw0KIycgICB0aGVtZV9idygpDQojJw0KIycgIyBpZiB3ZSB3YW50IHRvIGdyb3VwIGJ5IG11bHRpcGxlIHZhcmlhYmxlcywgd2UgaGF2ZSB0byB1c2UgdGhlaXINCiMnICMgbWFwcGVkIG5hbWUgKGhlcmUsIGBjb2xvdXJgIGluc3RlYWQgb2YgYFNwZWNpZXNgKSBiZWNhdXNlIHdlJ3JlDQojJyAjIGNyZWF0aW5nIHRoZSBncm91cHMgYWZ0ZXIgYWZ0ZXIgaW5pdGlhbCBkYXRhIG1hcHBpbmcNCiMnIGdncGxvdChpcmlzLCBhZXMoU2VwYWwuTGVuZ3RoLCBTZXBhbC5XaWR0aCwgY29sb3VyID0gU3BlY2llcykpICsNCiMnICAgZ2VvbV9wb2ludCgpICsNCiMnICAgc3RhdF9zbW9vdGhfZHJhd3MoDQojJyAgICAgZm9ybXVsYSA9IHkgfiB4LA0KIycgICAgIGFlcyhncm91cCA9IGludGVyYWN0aW9uKHN0YXQoLmRyYXcpLCBjb2xvdXIpKSwNCiMnICAgICBzaXplID0gMC41DQojJyAgICkgKw0KIycgICB0aGVtZV9idygpDQojJw0KIycgXGRvbnRydW57DQojJw0KIycgIyBhbmltYXRlZCBwbG90cw0KIycgbGlicmFyeShnZ2FuaW1hdGUpDQojJw0KIycgZ2dwbG90KG10Y2FycywgYWVzKGhwLCBtcGcpKSArDQojJyAgIGdlb21fcG9pbnQoKSArDQojJyAgIHN0YXRfc21vb3RoX2RyYXdzKHNpemUgPSAwLjUpICsNCiMnICAgdHJhbnNpdGlvbl9zdGF0ZXMoc3RhdCguZHJhdyksIDEsIDIpDQojJw0KIycgZ2dwbG90KGlyaXMsIGFlcyhTZXBhbC5MZW5ndGgsIFNlcGFsLldpZHRoLCBjb2xvdXIgPSBTcGVjaWVzKSkgKw0KIycgICBnZW9tX3BvaW50KCkgKw0KIycgICBzdGF0X3Ntb290aF9kcmF3cyhmb3JtdWxhID0geSB+IHgsIHRpbWVzID0gMjAsIHNpemUgPSAwLjUpICsNCiMnICAgdHJhbnNpdGlvbl9zdGF0ZXMoc3RhdCguZHJhdyksIDEsIDIpDQojJyB9DQojJyBAZXhwb3J0DQpzdGF0X3Ntb290aF9kcmF3cyA8LSBmdW5jdGlvbihtYXBwaW5nID0gTlVMTCwgdGltZXMgPSAxMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBOVUxMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbSA9ICJzbW9vdGgiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtdWxhID0geSB+IHMoeCwgYnMgPSAiY3MiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSA4MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxyYW5nZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtLmFyZ3MgPSBsaXN0KG1ldGhvZCA9ICJSRU1MIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gVFJVRSkgew0KICBsYXllcigNCiAgICBkYXRhID0gZGF0YSwNCiAgICBtYXBwaW5nID0gbWFwcGluZywNCiAgICBzdGF0ID0gU3RhdFNtb290aGRyYXdzLA0KICAgIGdlb20gPSBnZW9tLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb24sDQogICAgc2hvdy5sZWdlbmQgPSBzaG93LmxlZ2VuZCwNCiAgICBpbmhlcml0LmFlcyA9IGluaGVyaXQuYWVzLA0KICAgIHBhcmFtcyA9IGxpc3QoDQogICAgICB0aW1lcyA9IHRpbWVzLA0KICAgICAgZm9ybXVsYSA9IGZvcm11bGEsDQogICAgICBuID0gbiwNCiAgICAgIGZ1bGxyYW5nZSA9IGZ1bGxyYW5nZSwNCiAgICAgIG5hLnJtID0gbmEucm0sDQogICAgICBnYW0uYXJncyA9IGdhbS5hcmdzLA0KICAgICAgLi4uDQogICAgKQ0KICApDQp9DQoNCiMnIEByZG5hbWUgc3RhdF9zbW9vdGhfZHJhd3MNCiMnIEBmb3JtYXQgTlVMTA0KIycgQHVzYWdlIE5VTEwNCiMnIEBleHBvcnQNClN0YXRTbW9vdGhkcmF3cyA8LSBnZ3Byb3RvKCJTdGF0U21vb3RoZHJhd3MiLCBTdGF0LA0KICAjIFNldHRpbmcgdGhlIGdyb3VwIGFlc3RoZXRpYyBieSBkZWZhdWx0IGlzIGdvb2QgZm9yIHN0YXRpYyBwbG90cyBidXQNCiAgIyBiYWQgZm9yIGFuaW1hdGlvbnMuIFdlIGtlZXAgaXQgdW5zZXQgYnkgZGVmYXVsdCB0byBtYWtlIGFuaW1hdGlvbnMNCiAgIyBlYXNpZXIuDQogICNkZWZhdWx0X2FlcyA9IGFlcyhncm91cCA9IHN0YXQoLmRyYXcpKSwNCg0KICBjb21wdXRlX2dyb3VwID0gZnVuY3Rpb24oZGF0YSwgc2NhbGVzLCB0aW1lcyA9IDEwLCBmb3JtdWxhID0geSB+IHMoeCwgYnMgPSAiY3MiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gRkFMU0UsIG4gPSA4MCwgZnVsbHJhbmdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB4c2VxID0gTlVMTCwgbGV2ZWwgPSAwLjk1LCBnYW0uYXJncyA9IGxpc3QobWV0aG9kID0gIlJFTUwiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gRkFMU0UpIHsNCiAgICBpZiAobGVuZ3RoKHVuaXF1ZShkYXRhJHgpKSA8IDIpIHsNCiAgICAgICMgTm90IGVub3VnaCBkYXRhIHRvIHBlcmZvcm0gZml0DQogICAgICByZXR1cm4obmV3X2RhdGFfZnJhbWUoKSkNCiAgICB9DQoNCiAgICBpZiAoaXMubnVsbChkYXRhJHdlaWdodCkpIGRhdGEkd2VpZ2h0IDwtIDENCg0KICAgIGlmIChpcy5udWxsKHhzZXEpKSB7DQogICAgICBpZiAoaXMuaW50ZWdlcihkYXRhJHgpKSB7DQogICAgICAgIGlmIChmdWxscmFuZ2UpIHsNCiAgICAgICAgICB4c2VxIDwtIHNjYWxlcyR4JGRpbWVuc2lvbigpDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgeHNlcSA8LSBzb3J0KHVuaXF1ZShkYXRhJHgpKQ0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBpZiAoZnVsbHJhbmdlKSB7DQogICAgICAgICAgcmFuZ2UgPC0gc2NhbGVzJHgkZGltZW5zaW9uKCkNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICByYW5nZSA8LSByYW5nZShkYXRhJHgsIG5hLnJtID0gVFJVRSkNCiAgICAgICAgfQ0KICAgICAgICB4c2VxIDwtIHNlcShyYW5nZVsxXSwgcmFuZ2VbMl0sIGxlbmd0aC5vdXQgPSBuKQ0KICAgICAgfQ0KICAgIH0NCg0KDQogICAgI2Jhc2UuYXJncyA8LSBsaXN0KHF1b3RlKGZvcm11bGEpLCBkYXRhID0gcXVvdGUoZGF0YSksIHdlaWdodHMgPSBxdW90ZSh3ZWlnaHQpKQ0KICAgIGJhc2UuYXJncyA8LSBsaXN0KHF1b3RlKGZvcm11bGEpLCBkYXRhID0gcXVvdGUoZGF0YSkpDQogICAgbW9kZWwgPC0gZG8uY2FsbChtZ2N2OjpnYW0sIGMoYmFzZS5hcmdzLCBnYW0uYXJncykpDQoNCiAgICB1bmNvbmRpdGlvbmFsIDwtIEZBTFNFDQogICAgaWYgKGdhbS5hcmdzJG1ldGhvZCA9PSAiUkVNTCIpIHsNCiAgICAgIHVuY29uZGl0aW9uYWwgPC0gVFJVRQ0KICAgIH0NCg0KICAgIHNhbXBsZV9vdXRjb21lcyhtb2RlbCwgZGF0YS5mcmFtZSh4ID0geHNlcSksIHRpbWVzID0gdGltZXMsIHVuY29uZGl0aW9uYWwgPSB1bmNvbmRpdGlvbmFsKQ0KICB9LA0KDQogIHJlcXVpcmVkX2FlcyA9IGMoIngiLCAieSIpDQopDQpgYGANCg0KDQoNCg0KYGBge3IgY29uZmlkZW5jZS1iYW5kcywgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDEvNH0NCnAxIDwtIGdncGxvdChkZl9kZW5zZV9zY2F0dGVyX3NhbXBsZSwgYWVzKHgsIHkpKSArDQogIGdlb21fc21vb3RoKA0KICAgIGNvbG9yID0gcGFsZXR0ZVsxXSwNCiAgICBmaWxsID0gcGFsZXR0ZVtucGFsLTJdLA0KICAgIHNpemUgPSAwLjUsDQogICAgbGV2ZWwgPSAwLjk1DQogICkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwgNSkpICsNCiAgbGFicyh0aXRsZSA9ICJDb25maWRlbmNlIEJhbmQiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcDIgPC0gZ2dwbG90KGRmX2RlbnNlX3NjYXR0ZXJfc2FtcGxlLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV9zbW9vdGgoY29sb3IgPSBOQSwgZmlsbCA9IHBhbGV0dGVbbnBhbC0xXSwgbGV2ZWwgPSAwLjk5KSArDQogIGdlb21fc21vb3RoKGNvbG9yID0gTkEsIGZpbGwgPSBwYWxldHRlW25wYWwtMl0sIGxldmVsID0gMC45NSkgKw0KICBnZW9tX3Ntb290aCgNCiAgICBjb2xvciA9IHBhbGV0dGVbMV0sDQogICAgZmlsbCA9IHBhbGV0dGVbbnBhbC0zXSwNCiAgICBzaXplID0gMC41LA0KICAgIGxldmVsID0gMC44DQogICkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwgNSkpICsNCiAgbGFicyh0aXRsZSA9ICJHcmFkZWQgQ29uZmlkZW5jZSBCYW5kIikgKw0KICB0aGVtZV9wbG90X2ljb24ocGFsZXR0ZVtucGFsXSwgcGFsZXR0ZVsxXSkNCnAzIDwtIGdncGxvdChkZl9kZW5zZV9zY2F0dGVyX3NhbXBsZSwgYWVzKHgsIHkpKSArDQogIHN0YXRfc21vb3RoX2RyYXdzKA0KICAgIHRpbWVzID0gOCwNCiAgICBhZXMoZ3JvdXAgPSBzdGF0KC5kcmF3KSksDQogICAgY29sb3IgPSBwYWxldHRlWzFdLA0KICAgIHNpemUgPSAwLjE1DQogICkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwgNSkpICsNCiAgbGFicyh0aXRsZSA9ICJGaXR0ZWQgRHJhd3MiKSArDQogIHRoZW1lX3Bsb3RfaWNvbihwYWxldHRlW25wYWxdLCBwYWxldHRlWzFdKQ0KcGxvdF9ncmlkKHAxLCBwMiwgcDMsIG5jb2wgPSAzLCBzY2FsZSA9IC45KQ0KYGBgDQoNCkZvciBzbW9vdGggbGluZSBncmFwaHMsIHRoZSBlcXVpdmFsZW50IG9mIGFuIGVycm9yIGJhciBpcyBhIGNvbmZpZGVuY2UgYmFuZC4gSXQgc2hvd3MgYSByYW5nZSBvZiB2YWx1ZXMgdGhlIGxpbmUgbWlnaHQgcGFzcyB0aHJvdWdoIGF0IGEgZ2l2ZW4gY29uZmlkZW5jZSBsZXZlbC4gQXMgaW4gdGhlIGNhc2Ugb2YgZXJyb3IgYmFycywgd2UgY2FuIGRyYXcgZ3JhZGVkIGNvbmZpZGVuY2UgYmFuZHMgdGhhdCBzaG93IG11bHRpcGxlIGNvbmZpZGVuY2UgbGV2ZWxzIGF0IG9uY2UuIFdlIGNhbiBhbHNvIHNob3cgaW5kaXZpZHVhbCBmaXR0ZWQgZHJhd3MgaW4gbGlldSBvZiBvciBpbiBhZGRpdGlvbiB0byB0aGUgY29uZmlkZW5jZSBiYW5kcy4NCg==