Introduction
The following document shows an analysis of the data associated with the coronavirus pandemic (Covid19).
The analysis is divided into two parts, the first comprises general graphs of the data and then a numerical simulation is performed using the logistic growth model (LGM) in order to forecast the possible total number of cases by country.
The data used for this analysis are updated daily and are stored in Data Repository by Johns Hopkins CSSE
Terms used
Recovery ratio (RR)
The proportion of people recovered from a specified disease among all individuals diagnosed with the disease over a certain period of time.
\[RecoveryRatio (RR) = \frac{Recovered}{Confirmed}\]
Case Fatality ratio (CFR)
Case fatality rate, also called case fatality ratio, in epidemiology, the proportion of people who die from a specified disease among all individuals diagnosed with the disease over a certain period of time.
https://www.britannica.com/science/case-fatality-rate
\[Case Fatality Ratio (CFR) = \frac{Deaths}{Confirmed}\]
Logistic Growth Model (LGM)
Clark (2011) propose a new empirical model based on logistic growth models.
A nonlinear model formula including variables and parameters.
\[ProjectedCases = \frac{(K * t ^ n)}{(a + t ^ n)}\]
Where:
Cases = Projected Case
K = Carrying capacity
n = Hyperbolic exponent
a = Constant
t = Time
The best-fit nonlineal model is obtained by an iterative least-squared method.
The logistic growth model was used to project the progression of the disease in certain countries.
The most relevant result of the model corresponds to the projected cases, this term is associated with the maximum number of cases estimated by the model for each country, where the model is executed.
Projected - Confirmed Cases Ratio
Assuming that the total number of projected cases corresponds to the maximum number of cases that would occur in a given country, the projected - confirmed cases ratio is calculated using the following expression.
\[ProjectedConfirmedCases Ratio = 100 - (100 * \frac{(max(Projected Case) - max(Confirmed))}{
max(Projected Case)}\]
Global Case
Average Cases (Last Three Days)


Global Case Summary

China


Korea, South


The Americas
Confirmed Case

Confirmed Case - Average Last Three Days

Confirmed Case - Cases Last Days

Mexico


Dominican Republic


United State (US)


Argentina


Brazil


Canada


Colombia


Ecuador


Chile


Panama


Peru


Venezuela


Europe
Confirmed Case

Confirmed Case - Average Last Three Days



Belgium


Czechia


Greece


Italy


Spain


United Kingdom


France


Germany


Netherlands


Switzerland


Norway


Portugal


Other Countries



Taiwan*


Japan


Iran


Russia


Singapore


Israel


References
Source data: https://github.com/CSSEGISandData/COVID-19.git
Clark, A.J. (2011). “Decline Curve Analysis in Unconventional Resource Plays Using Logistic Growth Models.” M.S. Thesis, The University of Texas at Austin, August 2011.
LS0tCnRpdGxlOiAiQ292aWQxOSBQcm9qZWN0ZWQgQ2FzZXMgYnkgQ291bnRyaWVzIgphdXRob3I6ICJBbmRyZXMgUEVOQSBhbmRyZXNwZW5hQGdtYWlsLmNvbSIKZGF0ZTogIkFwcmlsLzEzLzIwMjAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzICAgIAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCgllY2hvID0gVFJVRSwKCW1lc3NhZ2UgPSBGQUxTRSwKCXdhcm5pbmcgPSBGQUxTRQopCmBgYAoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCmJvZHl7IC8qIE5vcm1hbCAgKi8KICAgICAgZm9udC1zaXplOiAxNnB4OwogIH0KdGQgeyAgLyogVGFibGUgICovCiAgZm9udC1zaXplOiAxNHB4Owp9CmgxLnRpdGxlIHsKICBmb250LXNpemU6IDM4cHg7CiAgY29sb3I6IERhcmtSZWQ7Cn0KaDEgeyAvKiBIZWFkZXIgMSAqLwogIGZvbnQtc2l6ZTogMjhweDsKICBjb2xvcjogQmx1ZTsKfQpoMiB7IC8qIEhlYWRlciAyICovCiAgICBmb250LXNpemU6IDI0cHg7CiAgY29sb3I6IERhcmtCbHVlOwp9CmgzIHsgLyogSGVhZGVyIDMgKi8KICBmb250LXNpemU6IDIwcHg7CiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgY29sb3I6IERhcmtCbHVlOwp9CmNvZGUucnsgLyogQ29kZSBibG9jayAqLwogICAgZm9udC1zaXplOiAxMnB4Owp9CnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovCiAgICBmb250LXNpemU6IDE0cHg7Cn0KPC9zdHlsZT4KCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJtKGxpc3QgPSBscygpKQpsaWJyYXJ5KCJ0aWR5dmVyc2UiLCB3YXJuLmNvbmZsaWN0cyA9IEYpCmxpYnJhcnkoImNvd3Bsb3QiKQpsaWJyYXJ5KCJtaW5wYWNrLmxtIikKbGlicmFyeSgiYnJvb20iKQpsaWJyYXJ5KCJzaW9wIikKbGlicmFyeSgia2FibGVFeHRyYSIpCmxpYnJhcnkoInBsb3RseSIpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgdXBkYXRlIGRhdGEgd2l0aCBzb21lIGNoYXJnZWQgY29sdW1uIG5hbWVzCgpjb3ZpZDE5IDwtIHJlYWRfY3N2KCJ+L1IvQ09WSUQtMTktbWFzdGVyL2RhdGEvQ09WSUQtMTktbWFzdGVyIDIwMjAtMDQtMTMvY3NzZV9jb3ZpZF8xOV9kYXRhL2Nzc2VfY292aWRfMTlfZGFpbHlfcmVwb3J0cy8wNC0xMi0yMDIwLmNzdiIpCgpzZXR3ZCgifi9SL0NPVklELTE5LW1hc3Rlci9kYXRhL0NPVklELTE5LW1hc3RlciAyMDIwLTA0LTEzL2Nzc2VfY292aWRfMTlfZGF0YS9jc3NlX2NvdmlkXzE5X3RpbWVfc2VyaWVzIikKCnRzciA8LSByZWFkX2NzdigidGltZV9zZXJpZXNfY292aWQxOV9yZWNvdmVyZWRfZ2xvYmFsLmNzdiIpCgp0c2MgPC0gcmVhZF9jc3YoInRpbWVfc2VyaWVzX2NvdmlkMTlfY29uZmlybWVkX2dsb2JhbC5jc3YiKQoKdHNkIDwtIHJlYWRfY3N2KCJ0aW1lX3Nlcmllc19jb3ZpZDE5X2RlYXRoc19nbG9iYWwuY3N2IikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojJyBAdGl0bGUgQSB3cmFuZ2xfY292aWQxOSBmdW5jdGlvbgojJyBAcGFyYW0gY292aWQxOSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gd3JhbmdsX2NvdmlkMTkKIycgQGV4cG9ydCB3cmFuZ2xfY292aWQxOQojJyBAa2V5d29yZHMgd3JhbmdsX2NvdmlkMTkKIycKd3JhbmdsX2NvdmlkMTkgPC0gZnVuY3Rpb24oY292aWQxOSkgewpjb3ZpZDE5ICU+JSAKICByZW5hbWUoc3RhdGUgPSAiUHJvdmluY2VfU3RhdGUiLCAKICAgICAgICAgY291bnRyeSA9ICJDb3VudHJ5X1JlZ2lvbiIsCiAgICAgICAgIGxhc3RfdXBkID0gIkxhc3RfVXBkYXRlIikgJT4lCiAgc3VtbWFyaXNlKGNvbmZpcm1lZCA9IHN1bShDb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IHN1bShSZWNvdmVyZWQsIG5hLnJtID0gVCksICAgICAgICAgICAgICAgIAogICAgICAgICAgICBkZWF0aHMgPSBzdW0oRGVhdGhzLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBSUiA9IHJvdW5kKDEwMCAqIHJlY292ZXJlZC9jb25maXJtZWQsIDApLAogICAgICAgICAgICBDRlIgPSByb3VuZCgxMDAgKiBkZWF0aHMvY29uZmlybWVkLCAwKSkgICAgCn0KCiMnIEB0aXRsZSBBIHdyYW5nbF90c2MgZnVuY3Rpb24KIycgQHBhcmFtIHRzYyAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gd3JhbmdsX3RzYwojJyBAZXhwb3J0IHdyYW5nbF90c2MKIycgQGtleXdvcmRzIHdyYW5nbF90c2MKIycKd3JhbmdsX3RzYyA8LSBmdW5jdGlvbih0c2MpIHsKdHNjICU+JSByZW5hbWUoc3RhdGUgPSAiUHJvdmluY2UvU3RhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnkgPSAiQ291bnRyeS9SZWdpb24iLAogICAgICAgICAgICAgICAgICAgICAgbGF0ID0gTGF0LCBsb25nID0gTG9uZykgIAp9CgojJyBAdGl0bGUgQSB3cmFuZ2xfdHNjIGZ1bmN0aW9uCiMnIEBwYXJhbSB0c2QgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF90c2QKIycgQGV4cG9ydCB3cmFuZ2xfdHNkCiMnIEBrZXl3b3JkcyB3cmFuZ2xfdHNkCiMnCndyYW5nbF90c2QgPC0gZnVuY3Rpb24odHNkKSB7CnRzZCAlPiUgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlL1N0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gIkNvdW50cnkvUmVnaW9uIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IExhdCwgbG9uZyA9IExvbmcpCn0KCiMnIEB0aXRsZSBBIHdyYW5nbF90c3IgZnVuY3Rpb24KIycgQHBhcmFtIHRzciAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gd3JhbmdsX3RzcgojJyBAZXhwb3J0IHdyYW5nbF90c3IKIycgQGtleXdvcmRzIHdyYW5nbF90c3IKIycKd3JhbmdsX3RzciA8LSBmdW5jdGlvbih0c3IpIHsKdHNyICU+JSByZW5hbWUoc3RhdGUgPSAiUHJvdmluY2UvU3RhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnkgPSAiQ291bnRyeS9SZWdpb24iLAogICAgICAgICAgICAgICAgICAgICAgbGF0ID0gTGF0LCBsb25nID0gTG9uZykKfQoKIycgQHRpdGxlIEEgdGlkeV9qb2luX2Z1bl9tYXggYnkgY291bnRyeSBmdW5jdGlvbgojJyBAcGFyYW0gdGlkeV9qb2luIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHJldHVybiB0aWR5X2pvaW5fZnVuX21heAojJyBAZXhwb3J0IHRpZHlfam9pbl9mdW5fbWF4CiMnIEBrZXl3b3JkcyB0aWR5X2pvaW5fZnVuX21heAojJwp0aWR5X2pvaW5fZnVuX21heCA8LSBmdW5jdGlvbih0aWR5X2pvaW4pIHsKdGlkeV9qb2luICU+JSBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UoY29uZmlybWVkID0gbWF4KGNvbmZpcm1lZCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgcmVjb3ZlcmVkID0gbWF4KHJlY292ZXJlZCwgbmEucm0gPSBUKSwgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGRlYXRocyA9IG1heChkZWF0aCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgUlIgPSByb3VuZCgxMDAgKiByZWNvdmVyZWQvY29uZmlybWVkLCAxKSwKICAgICAgICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGhzL2NvbmZpcm1lZCwgMSkpICU+JQogIGFycmFuZ2UoLWNvbmZpcm1lZCkgIAp9CgojJyBAdGl0bGUgQSBnYXRoZXIgZnVuY3Rpb24KIycgQHBhcmFtIGRhdGEgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcGFyYW0gdmFyIC0gIHggaW5wdXQgZGF0YQojJyBAcmV0dXJuIGdhdGhlcl9mdW4KIycgQGV4cG9ydCBnYXRoZXJfZnVuCiMnIEBrZXl3b3JkcyBnYXRoZXJfZnVuCiMnIApnYXRoZXJfZnVuIDwtIGZ1bmN0aW9uKGRhdGEsIHZhcikgewogIHZhciA8LSBlbnF1byh2YXIpCiAgZGF0YSAlPiUgZ2F0aGVyKGRhdGUsICEhdmFyLCAtbGF0LCAtbG9uZywgLXN0YXRlLCAtY291bnRyeSkgJT4lICAKICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGF0ZSwgIiVtLyVkLyV5IikpCn0KCiMnIEB0aXRsZSB0aWR5X2pvaW5fZnVuCiMnIEByZXR1cm4gdGlkeV9qb2luCiMnIEBleHBvcnQgdGlkeV9qb2luCiMnIEBrZXl3b3JkcyB0aWR5X2pvaW5fZnVuCiMnIAp0aWR5X2pvaW5fZnVuIDwtIGZ1bmN0aW9uKCkgewogIAojIFJ1biBnYXRoZXIgZnVuY3Rpb24KdHNjX3RpZHkgPC0gZ2F0aGVyX2Z1bih0c2MsIGNvbmZpcm1lZCkKdHNkX3RpZHkgPC0gZ2F0aGVyX2Z1bih0c2QsIGRlYXRoKQp0c3JfdGlkeSA8LSBnYXRoZXJfZnVuKHRzciwgcmVjb3ZlcmVkKQoKIyBKb2luIGRhdGEgZnJhbWVzCnRpZHlfam9pbiA8LSBmdWxsX2pvaW4odHNjX3RpZHksIHRzZF90aWR5LCAKICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoInN0YXRlIiwgImNvdW50cnkiLCAibGF0IiwgImxvbmciLCAiZGF0ZSIpKSAKdGlkeV9qb2luIDwtIGZ1bGxfam9pbih0aWR5X2pvaW4sIHRzcl90aWR5LCAKICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoInN0YXRlIiwgImNvdW50cnkiLCAibGF0IiwgImxvbmciLCAiZGF0ZSIpKSAKCiMgQ29udmVydCB0byBudW1lcmljCnRpZHlfam9pbiRjb25maXJtZWQgPC0gYXMubnVtZXJpYyh0aWR5X2pvaW4kY29uZmlybWVkKQp0aWR5X2pvaW4kZGVhdGggPC0gYXMubnVtZXJpYyh0aWR5X2pvaW4kZGVhdGgpCnRpZHlfam9pbiRyZWNvdmVyZWQgPC0gYXMubnVtZXJpYyh0aWR5X2pvaW4kcmVjb3ZlcmVkKQoKIyBDYWxjdWxhdGUgYWRkaXRpb25hbCB2YXJpYWJsZXMKdGlkeV9qb2luIDwtIHRpZHlfam9pbiAlPiUgCiMgUmVjb3ZlcnkgUmF0aW8gKCUpICYgQ2FzZSBGYXRhbGl0eSBSYXRpbyAoJSkgICAgICAgICAKICBtdXRhdGUoUlIgPSByb3VuZCgxMDAgKiByZWNvdmVyZWQvY29uZmlybWVkLCAwKSwKICAgICAgIENGUiA9IHJvdW5kKDEwMCAqIGRlYXRoL2NvbmZpcm1lZCwgMSkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JSAKIyBtZWFuIGNvbmZpcm1lZCBjYXNlIGxhc3QgMyBkYXlzICAgICAgICAKICBtdXRhdGUoYzNkID0gbWVhbih0YWlsKGNvbmZpcm1lZCwgM0wpKSwKICAgICAgICAgZDNkID0gbWVhbih0YWlsKGRlYXRoLCAzTCkpLAogICAgICAgICByM2QgID0gbWVhbih0YWlsKHJlY292ZXJlZCwgM0wpKSwKICAgICAgICAgc3RhdGUgPSBpZmVsc2UoaXMubmEoc3RhdGUpLCAiYWxscyIsIHN0YXRlKSwKICAgICAgICAgY2FzZXNfYnlfZGF5ID0gKGNvbmZpcm1lZCAtIGxhZyhjb25maXJtZWQsIDFMKSkpICU+JQogIHVuZ3JvdXAoKQp9CgojJyBAdGl0bGUgcGxvdF9lbnF1byBmdW5jdGlvbgojJyBAcGFyYW0gZGF0YSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSB4IC0gIHggaW5wdXQgZGF0YQojJyBAcGFyYW0geSAtICB5IGlucHV0IGRhdGEKIycgQHBhcmFtIFRpdGxlIC0gIHRpdGxlCiMnIEByZXR1cm4gcGxvdAojJyBAZXhwb3J0IHBsb3QgcGxvdCBncmFwaAojJyBAa2V5d29yZHMgcGxvdAojJyAKcGxvdF9lbnF1byA8LSBmdW5jdGlvbiguZGF0YSwgeCwgeSwgVGl0bGUpCnsKICB4IDwtIGVucXVvKHgpCiAgeSA8LSBlbnF1byh5KQogIGdncGxvdCguZGF0YSwgYWVzKCEheCwgISF5KSkgKwogICAgZ2VvbV9wb2ludChhZXMoYWxwaGEgPSAwLjYsIGNvbG9yID0gISF5KSkgKyAKICAgIGdlb21fbGluZShhZXMoYWxwaGEgPSAwLjYsIGNvbG9yID0gISF5KSkgKwogICAgbGFicyh0aXRsZSA9IFRpdGxlLCB4ID0gIiIsIHkgPSAiIikgICsKICAgIHRoZW1lX21pbmltYWxfZ3JpZCgxMikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQp9CgojJyBAdGl0bGUgZ2xvYmFsX2Nhc2UgZnVuY3Rpb24KIycgQHBhcmFtIGRhdGEgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcGFyYW0gY29uZmlybWVkIC0gIGNvbmZpcm1lZCBpbnB1dCBkYXRhCiMnIEBwYXJhbSByZWNvdmVyZWQgLSAgcmVjb3ZlcmVkIGlucHV0IGRhdGEKIycgQHBhcmFtIGRlYXRoIC0gIGRlYXRocyBpbnB1dCBkYXRhCiMnIEByZXR1cm4gZ2xvYmFsX2Nhc2UKIycgQGV4cG9ydCBnbG9iYWxfY2FzZSBwbG90IGdyYXBoCiMnIEBrZXl3b3JkcyBnbG9iYWxfY2FzZQojJyAKZ2xvYmFsX2Nhc2UgPC0gZnVuY3Rpb24oZGF0YSwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKSB7CiAgY29uZmlybWVkIDwtIGVucXVvKGNvbmZpcm1lZCkKICByZWNvdmVyZWQgPC0gZW5xdW8ocmVjb3ZlcmVkKQogIGRlYXRoIDwtIGVucXVvKGRlYXRoKSAgICAKICAKZGF0YSAlPiUgCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lCiAgc3VtbWFyaXNlKGNvbmZpcm1lZCA9IHN1bSghIWNvbmZpcm1lZCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgcmVjb3ZlcmVkID0gc3VtKCEhcmVjb3ZlcmVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBkZWF0aCA9IHN1bSghIWRlYXRoLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgUlIgPSByb3VuZCgxMDAgKiByZWNvdmVyZWQgLyBjb25maXJtZWQsIDEpLAogICAgICAgICAgICBDRlIgPSByb3VuZCgxMDAgKiBkZWF0aCAvIGNvbmZpcm1lZCwgMSkpIAp9CgojJyBAdGl0bGUgcGxvdF9ncmlkX2dsb2JhbAojJyBAcGFyYW0gdGlkeV9qb2luIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHJldHVybiBwbG90X2dyaWRfZ2xvYmFsCiMnIEBleHBvcnQgcGxvdF9ncmlkX2dsb2JhbAojJyBAa2V5d29yZHMgcGxvdF9ncmlkX2dsb2JhbAojJyAKcGxvdF9ncmlkX2dsb2JhbCA8LSBmdW5jdGlvbih0aWR5X2pvaW4pewogIGRhdGEgPC0gZ2xvYmFsX2Nhc2UodGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpIAogIHAxIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgY29uZmlybWVkLCAiQ29uZmlybWVkIikKICBwMiA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIHJlY292ZXJlZCwgIlJlY292ZXJlZCIpCiAgcDMgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBkZWF0aCwgIkRlYXRocyIpCiAgcDQgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBSUiwgIlJlY292ZXJ5IFJhdGlvICglKSIpCiAgcDUgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBDRlIsICJDYXNlIEZhdGFsaXR5IFJhdGlvICglKSIpCiAgCnRpdGxlX2dnIDwtIGdncGxvdCgpICsgCiAgbGFicyh0aXRsZSA9ICJHbG9iYWwgQ2FzZXMiLCAKICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIlJlcG9ydCBkYXRlOiIsIFN5cy5EYXRlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbihkYXRhJGRhdGVbZGF0YSRjb25maXJtZWQgPj0gMV0sIG5hLnJtID0gVCkpKSArCiAgdGhlbWVfbWluaW1hbF9ncmlkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgCgogIHBsb3RfZ3JpZCh0aXRsZV9nZywgcDEsIHAyLCBwMywgcDQsIHA1LCBuY29sID0gMykgICAKfQoKIycgQHRpdGxlIHBsb3RfZ3JpZF9jb3VudHJ5CiMnIEBwYXJhbSBjb3VudHJ5IC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIHRpZHlfam9pbiAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gcGxvdF9ncmlkX2NvdW50cnkKIycgQGV4cG9ydCBwbG90X2dyaWRfY291bnRyeQojJyBAa2V5d29yZHMgcGxvdF9ncmlkX2NvdW50cnkKIycgICAKcGxvdF9ncmlkX2NvdW50cnkgPC0gZnVuY3Rpb24oY291bnRyeSwgdGlkeV9qb2luKXsKICBjb3VudHJ5IDwtIGVucXVvKGNvdW50cnkpICAKICBkYXRhIDwtIGNvdW50cnlfY2FsYyghIWNvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKSAKICBwMSA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIGNvbmZpcm1lZCwgIkNvbmZpcm1lZCIpCiAgcDIgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBjYXNlc19ieV9kYXksICJjYXNlc19ieV9kYXkiKSAgCiAgcDMgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBkZWF0aCwgIkRlYXRocyIpCiAgcDQgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBkZWF0aF9ieV9kYXksICJkZWF0aF9ieV9kYXkiKQogIHA1IDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgQ0ZSLCAiQ2FzZSBGYXRhbGl0eSBSYXRpbyAoJSkiKQogIAojIEZpcnN0IGNhc2UgZGF0ZQp0aXRsZV9nZyA8LSBnZ3Bsb3QoKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZSgiQ291bnRyeToiLCBDb3VudHJ5KSwKICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIlJlcG9ydCBkYXRlOiIsIFN5cy5EYXRlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJcbkZpcnN0IGNhc2UgZGF0ZToiLCAKICAgICAgICAgICAgICAgICAgICAgICAgbWluKGRhdGEkZGF0ZVtkYXRhJGNvbmZpcm1lZCA+PSAxXSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgIlxuQ29uZmlybWVkLmxhc3QuMy5kYXlzOiIsIAogICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtZWFuKGhlYWQoZGF0YSRjYXNlc19ieV9kYXksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBULCAzKSksIDApKSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiIiwgeSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbF9ncmlkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgCgogIHBsb3RfZ3JpZCh0aXRsZV9nZywgcDEsIHAyLCBwMywgcDQsIHA1LCBuY29sID0gMykgICAgIAp9CgojJyBAdGl0bGUgQ291bnRyeSBDYXNlIENhbGN1bGF0aW9ucwojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIGNvbmZpcm1lZCAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSByZWNvdmVyZWQgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gZGVhdGggLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGNvdW50cnlfY2FsYwojJyBAZXhwb3J0IGNvdW50cnlfY2FsYwojJyBAa2V5d29yZHMgY291bnRyeV9jYWxjCiMnIApjb3VudHJ5X2NhbGMgPC0gZnVuY3Rpb24oY291bnRyeSwgZGF0YSwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKSB7CiAgY291bnRyeSA8LSBlbnF1byhjb3VudHJ5KQogIGNvbmZpcm1lZCA8LSBlbnF1byhjb25maXJtZWQpCiAgcmVjb3ZlcmVkIDwtIGVucXVvKHJlY292ZXJlZCkKICBkZWF0aCA8LSBlbnF1byhkZWF0aCkgICAgCiAgCmRhdGEgJT4lIGZpbHRlcihjb3VudHJ5ID09ICEhY291bnRyeSkgJT4lCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lCiAgZmlsdGVyKCEhY29uZmlybWVkID49IDEpICU+JQogIHN1bW1hcmlzZShjb25maXJtZWQgPSBzdW0oISFjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IHN1bSghIXJlY292ZXJlZCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgZGVhdGggPSBzdW0oISFkZWF0aCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkIC8gY29uZmlybWVkLCAxKSwKICAgICAgICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGggLyBjb25maXJtZWQsIDEpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGNhc2VzX2J5X2RheSA9IChjb25maXJtZWQgLSBsYWcoY29uZmlybWVkLCAxTCkpLAogICAgICAgICBkZWF0aF9ieV9kYXkgPSAoZGVhdGggLSBsYWcoZGVhdGgsIDFMKSksCiAgICAgICAgIGRheXMgPSAxOm4oKSkgJT4lCiAgYXJyYW5nZShkZXNjKGRhdGUpKSAlPiUKICBzZWxlY3QoZGF0ZSwgZGF5cywgY29uZmlybWVkLCBjYXNlc19ieV9kYXksIAogICAgICAgICBkZWF0aCwgZGVhdGhfYnlfZGF5LCBDRlIsIHJlY292ZXJlZCwgUlIpCn0gICAgCgojJyBAdGl0bGUgcmVzdW1lIENhbGN1bGF0aW9ucwojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gcmVzdW1lCiMnIEBleHBvcnQgcmVzdW1lCiMnIEBrZXl3b3JkcyByZXN1bWUKIycgCnJlc3VtZSA8LSBmdW5jdGlvbihDb3VudHJ5KSB7CiAgCnRpZHlfam9pbiAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gQ291bnRyeSAmIGRhdGUgPT0gbWF4KGRhdGUpKSAlPiUgCiAgc3VtbWFyaXNlKGRhdGUgPSBtYXgoZGF0ZSksCiAgICAgICAgICAgIENvbmZpcm1lZCA9IHN1bShjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIFJlY292ZXJlZCA9IHN1bShyZWNvdmVyZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIERlYXRoID0gc3VtKGRlYXRoLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgQ0ZSID0gaGVhZChDRlIsIDEpKQp9CgojJyBAdGl0bGUgbG9naXN0aWNfZ3Jvd3RoX2RhdGFfcHJlcCBjYWxjdWxhdGlvbnMKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGxvZ2lzdGljX2dyb3d0aF9kYXRhX3ByZXAKIycgQGV4cG9ydCBsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwCiMnIEBrZXl3b3JkcyBsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwCiMnIApsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwIDwtIGZ1bmN0aW9uKENvdW50cnksIGN1dG9mZikgewogIAojIFByZXBhcmUgZGF0YSAgCnRpZHlfam9pbiAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gQ291bnRyeSkgJT4lIAogIGdyb3VwX2J5KGNvdW50cnksIGRhdGUpICU+JSAKICBzdW1tYXJpc2UoY29uZmlybWVkID0gc3VtKGNvbmZpcm1lZCwgbmEucm0gPSBUKSkgJT4lCiAgZHBseXI6OmZpbHRlcihjb25maXJtZWQgPiBjdXRvZmYpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6bXV0YXRlKHQgPSAxOm4oKSkKfQoKIycgQHRpdGxlIGxvZ2lzdGljX2dyb3d0aF9tb2RlbCBDYWxjdWxhdGlvbnMKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gZGF0YSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSBjdXRvZmYgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gdHJhY2UgLSAgaW5wdXQgZGF0YSB0cmFjZSBtb2RlbAojJyBAcGFyYW0gdG1heCAtICBpbnB1dCBkYXRhCiMnIEByZXR1cm4gbG9naXN0aWNfZ3Jvd3RoX21vZGVsCiMnIEBleHBvcnQgbG9naXN0aWNfZ3Jvd3RoX21vZGVsCiMnIEBrZXl3b3JkcyBsb2dpc3RpY19ncm93dGhfbW9kZWwKIycgCmxvZ2lzdGljX2dyb3d0aF9tb2RlbCA8LSBmdW5jdGlvbihDb3VudHJ5LCBjdXRvZmYsIHRyYWNlLCB0bWF4KSB7CgojIFByZXBhcmUgZGF0YQpkYXRhIDwtIGxvZ2lzdGljX2dyb3d0aF9kYXRhX3ByZXAoQ291bnRyeSwgY3V0b2ZmKSAgCiAgCiMgU2V0IGlucHV0IG1vZGVsIHBhcmFtZXRlcnMgICAgICAKc2V0LnNlZWQoMTcpCm1heGl0ZXIgPC0gMTAyNApwYXJtcyA8LSBjKEsgPSBtYXgoZGF0YSRjb25maXJtZWQsIG5hLnJtID0gVCksIAogICAgICAgICAgIGEgPSBtYXgoZGF0YSRjb25maXJtZWQsIG5hLnJtID0gVCksIAogICAgICAgICAgIG4gPSAxKQpjb250cm9sIDwtIGMobmxzLmNvbnRyb2wobWF4aXRlciA9IG1heGl0ZXIpKSAgICAKICAgIAojIFJ1biBMb2dpc3RpYyBtb2RlbCAgIAp0cnlDYXRjaCh7Cm1vZGVsIDwtIG1pbnBhY2subG06Om5sc0xNKGNvbmZpcm1lZCB+IChLICogdCBeIG4pIC8gKGEgKyB0IF4gbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHBhcm1zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2wsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZSA9IHRyYWNlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEpCgojIFN0b3JlIGxvZ2lzdGljIHBhcmFtZXRlciByZXN1bHRzCm1vZGVsX3Bhcm0gPC0gZGF0YS5mcmFtZShjb3VudHJ5ID0gQ291bnRyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBLID0gY29lZihtb2RlbClbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBhID0gY29lZihtb2RlbClbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICBuID0gY29lZihtb2RlbClbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgojIENyZWF0ZSB0aW1lIHZlY3RvciBhIHNsaWdodGx5IGxhcmdlciB0byByZWFsIGRhdGEgCnQgPC0gMTp0bWF4CgojIENhbGN1bGF0ZSBjb25maXJtZWRfTEdNIGZyb20gbW9kZWwKUHJvamVjdGVkX0xHTSA9IChtb2RlbF9wYXJtJEsgKiB0IF4gbW9kZWxfcGFybSRuKSAvIAogICAgICAgICAgICAgICAgICAobW9kZWxfcGFybSRhICsgdCBeIG1vZGVsX3Bhcm0kbikKCiMgQ3JlYXRlIGRhdGEgdG8gc3RvcmUgTEdNIGNhbGN1bGF0aW9uCmZvbyA8LSBkYXRhX2ZyYW1lKHQgPSB0LCAKICAgICAgICAgICAgICAgICAgUHJvamVjdGVkX0xHTSA9IFByb2plY3RlZF9MR00gICAgICAgICAgICAgICAgIAopCgojIEpvaW4gY2FsY3VsYXRlIGRhdGEgd2l0aCByZWFsIGRhdGEKZGF0YSA8LSBsZWZ0X2pvaW4oZm9vLCBkYXRhLCBieSA9ICJ0IikKCiMgQ29tcGxldGUgZGF0ZSBjb2x1bW4KZGF0YSRkYXRlIDwtIHNlcShhcy5EYXRlKG1pbihkYXRhJGRhdGUsIG5hLnJtID0gVCkpLCAKICAgIGFzLkRhdGUobWluKGRhdGEkZGF0ZSwgbmEucm0gPSBUKSArIHRtYXggLSAxKSwgImRheXMiKQoKIyBDb21wbGV0ZSBjb3VudHJ5IGNvbHVtbgpkYXRhJGNvdW50cnkgPC0gQ291bnRyeQoKIyBDcmVhdGUgbGFiZWwgZGF0YSBmcmFtZQphbm5vdGF0aW9uIDwtIGRhdGEuZnJhbWUoCiAgeCA9IHRtYXggKyA1LAogIHkgPSBtYXgoZGF0YSRQcm9qZWN0ZWRfTEdNLCBuYS5ybSA9IFQpLAogIGxhYmVsID0gcGFzdGUoIlByb2plY3RlZCBjYXNlcyA9IiwgCiAgICAgICAgICAgICAgICByb3VuZChtb2RlbF9wYXJtJEssIDApKSwKIyBQcm9qZWN0ZWQgLSBDb25maXJtZWQgQ2FzZXMgUmF0aW8gY2FsY3VsYXRpb24gIAogIHJhdGlvID0gcm91bmQoMTAwIC0gKDEwMCAqIAogICAgICAgICAgICAgICAgICAobWF4KG1vZGVsX3Bhcm0kSywgbmEucm0gPSBUKSAtIAogICAgICAgICAgICAgICAgICBtYXgoZGF0YSRjb25maXJtZWQsIG5hLnJtID0gVCkpIC8gCiAgICAgICAgICAgICAgICAgIHJvdW5kKG1heChtb2RlbF9wYXJtJEssIDApKSkpKQoKIyBQcmVwYXJlIG91dHB1dCBkYXRhIGZyYW1lCm91dHB1dCA8LSBsaXN0KCJtb2RlbCIgPSBtb2RlbCwgCiAgICAgICAgICAgICAgICJkYXRhIiA9IGRhdGEsIAogICAgICAgICAgICAgICAiYW5ub3RhdGlvbiIgPSBhbm5vdGF0aW9uKQojIE91dHB1dCByZXN1bHRzCnJldHVybihvdXRwdXQpCn0sIGVycm9yID0gZnVuY3Rpb24oZSl7Y2F0KCJFUlJPUiA6Iixjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0KCiMnIEB0aXRsZSBsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdAojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSBkYXRhMSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSB0IC0gIGlucHV0IGRhdGEgdGltZQojJyBAcGFyYW0geV9wcm95IC0gIGlucHV0IHkgcHJveWVjdGVkCiMnIEBwYXJhbSB5X3Byb2YgLSAgaW5wdXQgZGF0YSAKIycgQHBhcmFtIGRhdGEyIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHggLSAgaW5wdXQgZGF0YSB4CiMnIEBwYXJhbSB5IC0gIGlucHV0IGRhdGEgeQojJyBAcGFyYW0gbGFiZWwgLSAgaW5wdXQgZGF0YSBsYWJlbAojJyBAcmV0dXJuIGxvZ2lzdGljX2dyb3d0aF9tb2RlbAojJyBAZXhwb3J0IGxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90CiMnIEBrZXl3b3JkcyBsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdAojJwpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdCA8LSBmdW5jdGlvbiguZGF0YTEsIHQsIHlfcHJveSwgeV9jb25mLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEyLCB4LCB5LCBsYWJlbCkgewp0IDwtIGVucXVvKHQpICAKeV9wcm95IDwtIGVucXVvKHlfcHJveSkKeV9jb25mIDwtIGVucXVvKHlfY29uZikKeCA8LSBlbnF1byh4KQp5IDwtIGVucXVvKHkpCmxhYmVsIDwtIGVucXVvKGxhYmVsKQoKZ2dwbG90KGRhdGEgPSAuZGF0YTEpICsKICBnZW9tX2xpbmUoYWVzKCEhdCwgISF5X3Byb3ksIGNvbG91ciA9ICJQcm9qZWN0ZWQiKSkgKyAgCiAgZ2VvbV9wb2ludChhZXMoISF0LCAhIXlfcHJveSwgY29sb3VyID0gIlByb2plY3RlZCIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gLmRhdGExLCAKICAgICAgICAgICAgIGFlcyghIXQsICEheV9jb25mLCBjb2xvdXIgPSAiQ29uZmlybWVkIikpICsKICBnZW9tX2xhYmVsKGRhdGEgPSAuZGF0YTIsIAogICAgICAgICAgICBhZXMoIHggPSAhIXgsIHkgPSAhIXksIGxhYmVsID0gISFsYWJlbCksIAogICAgICAgICAgICBmaWxsID0gImxpZ2h0Ymx1ZSIsCiAgICAgICAgICAgIG51ZGdlX3ggPSAtMjUsIAogICAgICAgICAgICBzaXplID0gNS4wLAogICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKwogIGxhYnModGl0bGUgPSBwYXN0ZShDb3VudHJ5LCAiLSBDb3ZpZC0xOSAtIExvZ2lzdGljIEdyb3d0aCBNb2RlbCAoTEdNKSIpLAogICAgICAgc3VidGl0bGUgPSBwYXN0ZSgiQ29uZmlybWVkIC8gUHJvamVjdGVkIENhc2VzIFJhdGlvIDoiLAogICAgICAgICAgICAgICAgICAgICAgICAuZGF0YTIkcmF0aW8sICIlIiksCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCAKICAgICAgIHkgPSAiTnVtYmVyIG9mIENvbmZpcm1lZCBDYXNlcyIpICsKICB0aGVtZV9taW5pbWFsX2dyaWQoMTQpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgICAgCn0gCgojJyBAdGl0bGUgYmFyX2dyYXBoCiMnIEBwYXJhbSB0aWR5X2pvaW4gLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0geSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSB0aXRsZSAtICBpbnB1dCBkYXRhCiMnIEByZXR1cm4gYmFyX2dyYXBoCiMnIEBleHBvcnQgYmFyX2dyYXBoCiMnIEBrZXl3b3JkcyBiYXJfZ3JhcGgKIycgCmJhcl9ncmFwaCA8LSBmdW5jdGlvbih0aWR5X2pvaW4sIHksIHRpdGxlLCBzdWJ0aXRsZSkgewp5IDwtIGVucXVvKHkpICAKdGlkeV9qb2luICU+JSBncm91cF9ieShjb3VudHJ5KSAlPiUgCiAgc3VtbWFyaXNlKHkgPSBtYXgoISF5KSkgJT4lIAogIHRvcF9uKDEwKSAlPiUgYXJyYW5nZSh5KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhc19mYWN0b3IoY291bnRyeSksIHkgPSB5KSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCAKICAgICAgICAgICBmaWxsID0gImxpZ2h0Ymx1ZSIsIAogICAgICAgICAgIGFscGhhID0gMC42KSArIAogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZCh5LCAwKSksIAogICAgICAgICAgICBoanVzdCA9ICJyaWd0aCIsCiAgICAgICAgICAgIHNpemUgPSA0LjUsCiAgICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiIiwgeSA9ICIiKSArCiAgY29vcmRfZmxpcCgpICsgdGhlbWVfbWluaW1hbF9ncmlkKDE0KSAgCn0KCiMnIEB0aXRsZSBwbG90bHkKIycgQHBhcmFtIHRpZHlfam9pbiAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSB5IC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHRpdGxlIC0gIGlucHV0IGRhdGEKIycgQHJldHVybiBwbG90bHkKIycgQGV4cG9ydCBwbG90bHkKIycgQGtleXdvcmRzIHBsb3RseQojJyAKcGxvdGx5IDwtIGZ1bmN0aW9uKGRhdGEsIHQsIGNvbmZpcm1lZCwgUHJvamVjdGVkX0xHTSwgdGl0bGUpIHsKZmlnIDwtIHBsb3RfbHkoZGF0YSwgeCA9IHQpCmZpZyA8LSBmaWcgJT4lIGFkZF90cmFjZSh5ID0gY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAnY29uZmlybWVkJywKICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAnbGluZXMrbWFya2VycycpCmZpZyAlPiUgYWRkX3RyYWNlKHkgPSBQcm9qZWN0ZWRfTEdNLCAKICAgICAgICAgICAgICAgICAgbmFtZSA9ICdQcm9qZWN0ZWRfTEdNJywgCiAgICAgICAgICAgICAgICAgIG1vZGUgPSAnbGluZXMrbWFya2VycycpICU+JSAKICBsYXlvdXQodGl0bGUgPSB0aXRsZSkKfQoKcGxvdF9jb21wYXJpc29uIDwtIGZ1bmN0aW9uKCl7CmxpbV95IDwtIG1heChtbyRkYXRhJFByb2plY3RlZF9MR00sIG5hLnJtID0gVCkKIyBzdW0gb2Ygc3F1YXJlcwpzdW0oKG1vJGRhdGEkUHJvamVjdGVkX0xHTSAtIG1vJGRhdGEkY29uZmlybWVkKV4yKQojIHRoZSBvYnNlcnZlZCBwcmV2YWxlbmNlczoKd2l0aChtbyRkYXRhLCBwbG90KHQsIGNvbmZpcm1lZCwgcGNoID0gMTksIGNvbCA9ICJncmVlbiIsIHlsaW0gPSBjKDAsIGxpbV95KSkpCiMgdGhlIG1vZGVsLXByZWRpY3RlZCBwcmV2YWxlbmNlczoKd2l0aChtbyRkYXRhLCBsaW5lcyh0LCBQcm9qZWN0ZWRfTEdNLCBjb2wgPSAicmVkIiwgdHlwZSA9ICJvIikpCiMgdGhlICJlcnJvcnMiOgpzZWdtZW50cyhtbyRkYXRhJHQsIG1vJGRhdGEkY29uZmlybWVkLCBtbyRkYXRhJHQsIG1vJGRhdGEkUHJvamVjdGVkX0xHTSkKZ3JpZChjb2wgPSAiYmx1ZSIpICAKfQoKIycgQHRpdGxlIGNvdW50cnlfcmVzdW1lCiMnIEBwYXJhbSBDb3VubnRyeSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSBjdXRvZmYgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gdHJhY2UgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gdG1heCAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSBjb21wIC0gIGlucHV0IGRhdGEKIycgQHJldHVybiBjb3VudHJ5X3Jlc3VtZQojJyBAZXhwb3J0IGNvdW50cnlfcmVzdW1lCiMnIEBrZXl3b3JkcyBjb3VudHJ5X3Jlc3VtZQojJwpjb3VudHJ5X3Jlc3VtZSA8LSBmdW5jdGlvbihDb3VudHJ5LCBjdXRvZmYsIHRyYWNlLCB0bWF4KSB7CiMgUHJpbnQgcmVzdW1lIGRhdGEgYnkgY291bnRyeSAKcHJpbnQocmVzdW1lKENvdW50cnkpKQojIENhbGN1bGF0ZSBhZGRpdGlvbmFsIGNvdW50cnkgZGF0YQpkYXRhIDwtIGNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcHJpbnQoZGF0YSkKIyBQbG90IGNvdW50cnkgZGF0YQpwbG90MSA8LSBwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCnByaW50KHBsb3QxKQojIENhbGN1bGF0ZSBMR00gYnkgY291dW50cnkKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IGN1dG9mZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZSA9IHRyYWNlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtYXggPSB0bWF4KQojIFByaW50IG1vZGVsIHJlc3VsdHMKZm9vIDwtIHRpZHkobW8kbW9kZWwpCnByaW50KGZvbykKIyBQcmludCBtb2RlbCByZXN1bHRzCmJhciA8LSBnbGFuY2UobW8kbW9kZWwpCnByaW50KGJhcikKIyBDcmVhdGUgImNvdW50cnlfcmVzdW1lIiBkYXRhIGZyYW1lCmNvdW50cnlfcmVzdW1lIDwtIGRhdGEuZnJhbWUoY291bnRyeSA9IENvdW50cnksIAogICAgICAgICAgICAgICAgIGFjdHVhbCA9IGhlYWQoZGF0YSRkYXRlLCAxKSwKICAgICAgICAgICAgICAgICBzdGFydCA9IG1pbihkYXRhJGRhdGVbZGF0YSRjb25maXJtZWQgPj0gMV0sIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgY2FzZSA9IGhlYWQoZGF0YSRjb25maXJtZWQsIDEpLAogICAgICAgICAgICAgICAgIGRlYXRoID0gaGVhZChkYXRhJGRlYXRoLCAxKSwKICAgICAgICAgICAgICAgICBDRlIgPSBoZWFkKGRhdGEkQ0ZSLDEpLCAKICAgICAgICAgICAgICAgICBkYXlzID0gMSArIGhlYWQoZGF0YSRkYXRlLCAxKSAtIAogICAgICAgICAgICAgICAgICAgbWluKGRhdGEkZGF0ZVtkYXRhJGNvbmZpcm1lZCA+PSAxXSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICBpc0NvbnYgPSBiYXIkaXNDb252LAogICAgICAgICAgICAgICAgIEsgPSByb3VuZChmb28kZXN0aW1hdGVbMV0sIDApLAogICAgICAgICAgICAgICAgIEsyID0gcm91bmQoZm9vJGVzdGltYXRlWzFdLzIsIDApLCAgCiAgICAgICAgICAgICAgICAgSzIuciA9IG1pbihtbyRkYXRhJGRhdGVbbW8kZGF0YSRjb25maXJtZWQgPj0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb28kZXN0aW1hdGVbMV0vMl0sIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgSzIuZSA9IG1pbihtbyRkYXRhJGRhdGVbbW8kZGF0YSRQcm9qZWN0ZWRfTEdNID49IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vJGVzdGltYXRlWzFdLzJdLCBuYS5ybSA9IFQpLCAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgYSA9IHJvdW5kKGZvbyRlc3RpbWF0ZVsyXSwgMCksCiAgICAgICAgICAgICAgICAgbiA9IHJvdW5kKGZvbyRlc3RpbWF0ZVszXSwgMiksCiAgICAgICAgICAgICAgICAgcHJvZyA9IHJvdW5kKDEwMCAtIDEwMCAqIChmb28kZXN0aW1hdGVbMV0gLSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZChkYXRhJGNvbmZpcm1lZCwgMSkpIC8KICAgICAgICAgICAgICAgICAgICBmb28kZXN0aW1hdGVbMV0sIDApLAogICAgICAgICAgICAgICAgIHNpZ21hID0gcm91bmQoYmFyJHNpZ21hLCAwKSwKICAgICAgICAgICAgICAgICBkZXZpYW5jZSA9IHJvdW5kKGJhciRkZXZpYW5jZSwgMCksCiAgICAgICAgICAgICAgICAgbG9nTGlrID0gcm91bmQoYmFyJGxvZ0xpaywgMCksCiAgICAgICAgICAgICAgICAgZGYucmVzaWR1YWwgPSByb3VuZChiYXIkZGYucmVzaWR1YWwsIDApLAogICAgICAgICAgICAgICAgIEFJQyA9IHJvdW5kKGJhciRBSUMsIDApLAogICAgICAgICAgICAgICAgIEJJQyA9IHJvdW5kKGJhciRCSUMsIDApLAogICAgICAgICAgICAgICAgIEsucC52YWx1ZSAgPSBmb28kcC52YWx1ZVsxXSwKICAgICAgICAgICAgICAgICBhLnAudmFsdWUgID0gZm9vJHAudmFsdWVbMl0sCiAgICAgICAgICAgICAgICAgbi5wLnZhbHVlICA9IGZvbyRwLnZhbHVlWzNdLAogICAgICAgICAgICAgICAgIEsuc3RkLmVycm9yICA9IGZvbyRzdGQuZXJyb3JbMV0sCiAgICAgICAgICAgICAgICAgYS5zdGQuZXJyb3IgID0gZm9vJHN0ZC5lcnJvclsyXSwKICAgICAgICAgICAgICAgICBuLnN0ZC5lcnJvciAgPSBmb28kc3RkLmVycm9yWzNdKQojIFBsb3QgTEdNIHJlc3VsdHMKcHJpbnQobG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpKQpwcmludChwbG90bHkobW8kZGF0YSwgfmRhdGUsIH5jb25maXJtZWQsIH5Qcm9qZWN0ZWRfTEdNLCAKICAgICAgIHBhc3RlKENvdW50cnksICItIE1vZGVsIFJlc3VsdHMgLSIsIG1vJGFubm90YXRpb24kbGFiZWwpKSkKIyBQcmludCAiY291bnRyeV9yZXN1bWUiIGRhdGEgZnJhbWUKcHJpbnQoY291bnRyeV9yZXN1bWUpCnJldHVybihjb3VudHJ5X3Jlc3VtZSkKfQpgYGAKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIFJ1biB0aWR5X2pvaW5fZnVuIGZ1bmN0aW9uCmNvdmlkMTkgPC0gd3JhbmdsX2NvdmlkMTkoY292aWQxOSkKdHNjIDwtIHdyYW5nbF90c2ModHNjKQp0c2QgPC0gd3JhbmdsX3RzYyh0c2QpCnRzciA8LSB3cmFuZ2xfdHNjKHRzcikKdGlkeV9qb2luIDwtIHRpZHlfam9pbl9mdW4oKQpgYGAKCiMgSW50cm9kdWN0aW9uICAKClRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgc2hvd3MgYW4gYW5hbHlzaXMgb2YgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JvbmF2aXJ1cyBwYW5kZW1pYyAoQ292aWQxOSkuCgpUaGUgYW5hbHlzaXMgaXMgZGl2aWRlZCBpbnRvIHR3byBwYXJ0cywgdGhlIGZpcnN0IGNvbXByaXNlcyBnZW5lcmFsIGdyYXBocyBvZiB0aGUgZGF0YSBhbmQgdGhlbiBhIG51bWVyaWNhbCBzaW11bGF0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUgbG9naXN0aWMgZ3Jvd3RoIG1vZGVsIChMR00pIGluIG9yZGVyIHRvIGZvcmVjYXN0IHRoZSBwb3NzaWJsZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgYnkgY291bnRyeS4gIAoKVGhlIGRhdGEgdXNlZCBmb3IgdGhpcyBhbmFseXNpcyBhcmUgdXBkYXRlZCBkYWlseSBhbmQgYXJlIHN0b3JlZCBpbiAqKkRhdGEgUmVwb3NpdG9yeSBieSBKb2hucyBIb3BraW5zIENTU0UqKgoKIyBUZXJtcyB1c2VkICAgIAoKIyMjIFJlY292ZXJ5IHJhdGlvIChSUikgICAgIAoKVGhlIHByb3BvcnRpb24gb2YgcGVvcGxlIHJlY292ZXJlZCBmcm9tIGEgc3BlY2lmaWVkIGRpc2Vhc2UgYW1vbmcgYWxsIGluZGl2aWR1YWxzIGRpYWdub3NlZCB3aXRoIHRoZSBkaXNlYXNlIG92ZXIgYSBjZXJ0YWluIHBlcmlvZCBvZiB0aW1lLiAgICAKCiQkUmVjb3ZlcnlSYXRpbyAoUlIpID0gXGZyYWN7UmVjb3ZlcmVkfXtDb25maXJtZWR9JCQgIAoKIyMjIENhc2UgRmF0YWxpdHkgcmF0aW8gKENGUikgICAgCgpDYXNlIGZhdGFsaXR5IHJhdGUsIGFsc28gY2FsbGVkIGNhc2UgZmF0YWxpdHkgcmF0aW8sIGluIGVwaWRlbWlvbG9neSwgdGhlIHByb3BvcnRpb24gb2YgcGVvcGxlIHdobyBkaWUgZnJvbSBhIHNwZWNpZmllZCBkaXNlYXNlIGFtb25nIGFsbCBpbmRpdmlkdWFscyBkaWFnbm9zZWQgd2l0aCB0aGUgZGlzZWFzZSBvdmVyIGEgY2VydGFpbiBwZXJpb2Qgb2YgdGltZS4gIAoKaHR0cHM6Ly93d3cuYnJpdGFubmljYS5jb20vc2NpZW5jZS9jYXNlLWZhdGFsaXR5LXJhdGUKCiQkQ2FzZSBGYXRhbGl0eSBSYXRpbyAoQ0ZSKSA9IFxmcmFje0RlYXRoc317Q29uZmlybWVkfSQkICAKCiMjIyBMb2dpc3RpYyBHcm93dGggTW9kZWwgKExHTSkgICAgICAKCkNsYXJrICgyMDExKSBwcm9wb3NlIGEgbmV3IGVtcGlyaWNhbCBtb2RlbCBiYXNlZCBvbiBsb2dpc3RpYyBncm93dGggbW9kZWxzLiAgCgpBIG5vbmxpbmVhciBtb2RlbCBmb3JtdWxhIGluY2x1ZGluZyB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMuICAKCiQkUHJvamVjdGVkQ2FzZXMgPSBcZnJhY3soSyAqIHQgXiBuKX17KGEgKyB0IF4gbil9JCQgICAgCgpXaGVyZTogIAoKQ2FzZXMgPSBQcm9qZWN0ZWQgQ2FzZSAgIApLID0gQ2FycnlpbmcgY2FwYWNpdHkgIApuID0gSHlwZXJib2xpYyBleHBvbmVudCAgCmEgPSBDb25zdGFudCAgCnQgID0gVGltZSAgCgpUaGUgYmVzdC1maXQgbm9ubGluZWFsIG1vZGVsIGlzIG9idGFpbmVkIGJ5IGFuIGl0ZXJhdGl2ZSBsZWFzdC1zcXVhcmVkIG1ldGhvZC4KClRoZSBsb2dpc3RpYyBncm93dGggbW9kZWwgd2FzIHVzZWQgdG8gcHJvamVjdCB0aGUgcHJvZ3Jlc3Npb24gb2YgdGhlIGRpc2Vhc2UgaW4gY2VydGFpbiBjb3VudHJpZXMuCgpUaGUgbW9zdCByZWxldmFudCByZXN1bHQgb2YgdGhlIG1vZGVsIGNvcnJlc3BvbmRzIHRvIHRoZSAqKnByb2plY3RlZCBjYXNlcyoqLCB0aGlzIHRlcm0gaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjYXNlcyBlc3RpbWF0ZWQgYnkgdGhlIG1vZGVsIGZvciBlYWNoIGNvdW50cnksIHdoZXJlIHRoZSBtb2RlbCBpcyBleGVjdXRlZC4gIAoKIyMjIFByb2plY3RlZCAtIENvbmZpcm1lZCBDYXNlcyBSYXRpbyAgCgpBc3N1bWluZyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgKipwcm9qZWN0ZWQgY2FzZXMqKiBjb3JyZXNwb25kcyB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2FzZXMgdGhhdCB3b3VsZCBvY2N1ciBpbiBhIGdpdmVuIGNvdW50cnksIHRoZSBwcm9qZWN0ZWQgLSBjb25maXJtZWQgY2FzZXMgcmF0aW8gaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24uCgokJFByb2plY3RlZENvbmZpcm1lZENhc2VzIFJhdGlvID0gMTAwIC0gKDEwMCAqIFxmcmFjeyhtYXgoUHJvamVjdGVkIENhc2UpIC0gbWF4KENvbmZpcm1lZCkpfXsgCiAgICAgICAgICAgICAgICAgIG1heChQcm9qZWN0ZWQgQ2FzZSl9JCQKICAgICAgICAgICAgICAgICAgCiMgR2xvYmFsIENhc2UgIAoKIyMgQXZlcmFnZSBDYXNlcyAoTGFzdCBUaHJlZSBEYXlzKQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgQmFyIGdyYXBoIEF2ZXJhZ2UgQ29uZmlybWVkIENhc2VzIChMYXN0IHRocmVlIGRheXMpCmJhcl9ncmFwaCh0aWR5X2pvaW4sIGMzZCwgCiAgICAgICAgICAgICAgICAgICJHbG9iYWwgQ2FzZXMgLSBDb25maXJtZWQgQ2FzZSIsIAogICAgICAgICAgICAgICAgICAiQXZlcmFnZSBMYXN0IFRocmVlIERheXMiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpiYXJfZ3JhcGgodGlkeV9qb2luLCBkM2QsIAogICAgICAgICAgICAgICAgICAiR2xvYmFsIENhc2VzIC0gRGVhdGhzIiwgCiAgICAgICAgICAgICAgICAgICJBdmVyYWdlIExhc3QgVGhyZWUgRGF5cyIpCmBgYAoKIyMgR2xvYmFsIENhc2UgU3VtbWFyeSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3ZpZDE5CmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X2dyaWRfZ2xvYmFsKHRpZHlfam9pbikKYGBgCgojIyBDb3VudHJ5IENhc2VzCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0aWR5X2pvaW5fZnVuX21heCh0aWR5X2pvaW4pCmBgYAoKIyMgQ2hpbmEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNoaW5hIgpjaGluYSA8LSBjb3VudHJ5X3Jlc3VtZSgiQ2hpbmEiLCBjdXRvZmYgPSA1MDAsIHRyYWNlID0gRiwgdG1heCA9IDgwKQpgYGAKCiMjIEtvcmVhLCBTb3V0aCAgICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJLb3JlYSwgU291dGgiCnNrIDwtIGNvdW50cnlfcmVzdW1lKCJLb3JlYSwgU291dGgiLCBjdXRvZmYgPSA1MCwgdHJhY2UgPSBGLCB0bWF4ID0gODApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNoaW5hLCBzaykKYGBgCgojIFRoZSBBbWVyaWNhcyAgCgojIyBDb25maXJtZWQgQ2FzZQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkVjdWFkb3J8Q2hpbGV8UGVydXxQYW5hbWF8QXJnZW50aW5hfENvbG9tYmlhfEJyYXppbHxNZXhpY298VmVuZXp1ZWxhIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjb25maXJtZWQsICAKICAgICAgICAgICAgICAgICAgIlRoZSBBbWVyaWNhcyAtIENvbmZpcm1lZCBDYXNlcyIsIAogICAgICAgICAgICAgICAgICBwYXN0ZSgiTnVtYmVyIG9mIENhc2VzIiwgU3lzLkRhdGUoKSkpCmBgYAoKIyMgQ29uZmlybWVkIENhc2UgLSBBdmVyYWdlIExhc3QgVGhyZWUgRGF5cwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkVjdWFkb3J8Q2hpbGV8UGVydXxQYW5hbWF8QXJnZW50aW5hfENvbG9tYmlhfEJyYXppbHxNZXhpY298VmVuZXp1ZWxhIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjM2QsICAKICAgICAgICAgICAgICAgICAgIlRoZSBBbWVyaWNhcyAtIENvbmZpcm1lZCBDYXNlIiwgCiAgICAgICAgICAgICAgICAgIHBhc3RlKCJBdmVyYWdlIExhc3QgVGhyZWUgRGF5cyIsIFN5cy5EYXRlKCkpKQpgYGAKCiMjIENvbmZpcm1lZCBDYXNlIC0gQ2FzZXMgTGFzdCBEYXlzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiRWN1YWRvcnxDaGlsZXxQZXJ1fFBhbmFtYXxBcmdlbnRpbmF8Q29sb21iaWF8QnJhemlsfE1leGljb3xWZW5lenVlbGEiKQpmb28gPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGFycmFuZ2UoZGVzYyhkYXRlKSkKYmFyX2dyYXBoKGZvbywgaGVhZChjYXNlc19ieV9kYXksIDEpLCAgCiAgICAgICAgICAgICAgICAgICJUaGUgQW1lcmljYXMgLSBDb25maXJtZWQgQ2FzZSIsIAogICAgICAgICAgICAgICAgICBwYXN0ZSgiQ2FzZXMgTGFzdCBEYXlzIiwgU3lzLkRhdGUoKSkpCmBgYAoKIyMgTWV4aWNvICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJNZXhpY28iCm1leGljbyA8LSBjb3VudHJ5X3Jlc3VtZSgiTWV4aWNvIiwgY3V0b2ZmID0gMjUsIHRyYWNlID0gRiwgdG1heCA9IDcwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBtZXhpY28pCmBgYAoKIyMgTWV4aWNvICYgT3RoZXIgQ291bnRyaWVzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfEtvcmVhLCBTb3V0aHxQZXJ1fEFyZ2VudGluYXxDaGlsZXxDb2xvbWJpYXxFY3VhZG9yIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fbGluZShhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAgIAogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgICAgCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEzKSArICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpgYGAKCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yfFVTIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKCmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSBsb2codmFsdWUpKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGKSArCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgxMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gImxvZyhOdW1iZXIgb2YgQ2FzZXMpIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ29uZmlybWVkIENhc2VzIGJ5IERheXMiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNhc2VzX2J5X2RheSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnksIGFscGhhID0gMC4xNSkpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gRikgKwogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgIAogIHRoZW1lX21pbmltYWxfZ3JpZCgxMykgKyAgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAiTnVtYmVyIG9mIENhc2VzIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yfFVTIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ29uZmlybWVkIENhc2VzIGJ5IERheXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNhc2VzX2J5X2RheSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IGxvZyh2YWx1ZSkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gRikgKwogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgIAogIHRoZW1lX21pbmltYWxfZ3JpZCgxMykgKyAgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAibG9nKE51bWJlciBvZiBDYXNlcykiKQpgYGAKCiMjIERvbWluaWNhbiBSZXB1YmxpYwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkRvbWluaWNhbiBSZXB1YmxpYyIKZHIgPC0gY291bnRyeV9yZXN1bWUoIkRvbWluaWNhbiBSZXB1YmxpYyIsIGN1dG9mZiA9IDEwLCAKICAgICAgICAgICAgICAgICAgICAgdHJhY2UgPSBGLCB0bWF4ID0gNzApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGRyKQpgYGAKCiMjIFVuaXRlZCBTdGF0ZSAoVVMpCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBodHRwczovL2NvdmlkMTkuaGVhbHRoZGF0YS5vcmcKCiMgaHR0cDovL3d3dy5oZWFsdGhkYXRhLm9yZy9zaXRlcy9kZWZhdWx0L2ZpbGVzL2ZpbGVzL3Jlc2VhcmNoX2FydGljbGVzLzIwMjAvY292aWRfcGFwZXJfTUVEUlhJVi0yMDIwLTA0Mzc1MnYxLU11cnJheS5wZGYKCkNvdW50cnkgPC0gIlVTIgp1cyA8LSBjb3VudHJ5X3Jlc3VtZSgiVVMiLCBjdXRvZmYgPSAyMDAwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHVzKQpgYGAKCiMjIEFyZ2VudGluYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQXJnZW50aW5hIgphcmcgPC0gY291bnRyeV9yZXN1bWUoIkFyZ2VudGluYSIsIGN1dG9mZiA9IDUwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGFyZykKYGBgCgojIyBCcmF6aWwgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkJyYXppbCIKYnJhIDwtIGNvdW50cnlfcmVzdW1lKCJCcmF6aWwiLCBjdXRvZmYgPSAyMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBicmEpCmBgYAoKIyMgQ2FuYWRhIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNhbmFkYSIKY2FuIDwtIGNvdW50cnlfcmVzdW1lKCJDYW5hZGEiLCBjdXRvZmYgPSA4MCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBjYW4pCmBgYAoKIyMgQ29sb21iaWEgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQ29sb21iaWEiCmNvbCA8LSBjb3VudHJ5X3Jlc3VtZSgiQ29sb21iaWEiLCBjdXRvZmYgPSA1LCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGNvbCkKYGBgCgojIyBFY3VhZG9yICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJFY3VhZG9yIgplY3UgPC0gY291bnRyeV9yZXN1bWUoIkVjdWFkb3IiLCBjdXRvZmYgPSAxLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGVjdSkKYGBgCgojIyBDaGlsZQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNoaWxlIgpjaGkgPC0gY291bnRyeV9yZXN1bWUoIkNoaWxlIiwgY3V0b2ZmID0gMTAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgY2hpKQpgYGAKCiMjIFBhbmFtYQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlBhbmFtYSIKcGFuIDwtIGNvdW50cnlfcmVzdW1lKCJQYW5hbWEiLCBjdXRvZmYgPSAxMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBwYW4pCmBgYAoKIyMgUGVydSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiUGVydSIKcGVyIDwtIGNvdW50cnlfcmVzdW1lKCJQZXJ1IiwgY3V0b2ZmID0gMTAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgcGVyKQpgYGAKCiMjIFZlbmV6dWVsYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiVmVuZXp1ZWxhIgp2ZW4gPC0gY291bnRyeV9yZXN1bWUoIlZlbmV6dWVsYSIsIGN1dG9mZiA9IDEsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgdmVuKQpgYGAKCiMgRXVyb3BlICAKCiMjIENvbmZpcm1lZCBDYXNlICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJJdGFseXxTcGFpbnxGcmFuY2V8R2VybWFueXxOb3J3YXl8VW5pdGVkIEtpbmdkb218TmV0aGVybGFuZHN8U3dpdHplcmxhbmR8UG9ydHVnYWwiKQpmb28gPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpCmJhcl9ncmFwaChmb28sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICJFdXJvcGUgLSBDb25maXJtZWQgQ2FzZSIsIAogICAgICAgICAgICAgICAgICBwYXN0ZSgiTnVtYmVyIG9mIENhc2VzIiwgU3lzLkRhdGUoKSkpCmBgYAoKIyMgQ29uZmlybWVkIENhc2UgLSBBdmVyYWdlIExhc3QgVGhyZWUgRGF5cwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkl0YWx5fFNwYWlufEZyYW5jZXxHZXJtYW55fE5vcndheXxVbml0ZWQgS2luZ2RvbXxOZXRoZXJsYW5kc3xTd2l0emVybGFuZHxQb3J0dWdhbCIpCmZvbyA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikKYmFyX2dyYXBoKGZvbywgYzNkLCAgCiAgICAgICAgICAgICAgICAgICJFdXJvcGUgLSBDb25maXJtZWQgQ2FzZSIsIAogICAgICAgICAgICAgICAgICBwYXN0ZSgiQXZlcmFnZSBMYXN0IFRocmVlIERheXMiLCBTeXMuRGF0ZSgpKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiSXRhbHl8U3BhaW58S29yZWEsIFNvdXRofEdlcm1hbnl8VW5pdGVkIEtpbmdkb218RnJhbmNlIikKdGl0bGUgPC0gIkV1cm9wYSIKc3VidGl0bGUgPC0gIkN1bXVsYXRpdmUgQ29uZmlybWVkIENhc2VzIgojIFNlbGVjdCBkYXRhCmRmIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKSAlPiUKICBmaWx0ZXIoY2FzZXNfYnlfZGF5ID49IDEpICU+JQogIHNlbGVjdChjb3VudHJ5LCBkYXRlLCBjb25maXJtZWQpICU+JQogIGdhdGhlcihrZXkgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJ2YWx1ZSIsIC1kYXRlLCAtY291bnRyeSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKGRheSA9IDE6bigpKQoKIyBQbG90CmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSB2YWx1ZSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gY291bnRyeSkpICsgICAKICBnZW9tX3Ntb290aChhZXMoY29sID0gY291bnRyeSksIG1ldGhvZCA9ICJhdXRvIiwgc2UgPSBUKSArICAKICBmYWNldF9ncmlkKC5+Y291bnRyeSwgc2NhbGVzID0gImZyZWUiKSArICAgIAogIHRoZW1lX21pbmltYWxfZ3JpZCgxMykgKyAgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAiTnVtYmVyIG9mIENhc2VzIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJJdGFseXxTcGFpbnxLb3JlYSwgU291dGh8R2VybWFueXxVbml0ZWQgS2luZ2RvbXxGcmFuY2V8U3dpdHplcmxhbmR8Q3plY2hpYSIpCnRpdGxlIDwtICJFdXJvcGUiCnN1YnRpdGxlIDwtICJDdW11bGF0aXZlIENvbmZpcm1lZCBDYXNlcyAtIExvZyBzY2FsZSIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKGNhc2VzX2J5X2RheSA+PSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZGF0ZSwgY29uZmlybWVkKSAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCAtZGF0ZSwgLWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShkYXkgPSAxOm4oKSkKCiMgUGxvdAoKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IGxvZyh2YWx1ZSkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEYpICsKICBmYWNldF9ncmlkKC5+Y291bnRyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAibG9nKE51bWJlciBvZiBDYXNlcykiKQpgYGAKCiMjIEJlbGdpdW0gCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQmVsZ2l1bSIKY3plIDwtIGNvdW50cnlfcmVzdW1lKCJCZWxnaXVtIiwgY3V0b2ZmID0gNTAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgY3plKQpgYGAKCiMjIEN6ZWNoaWEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkN6ZWNoaWEiCmN6ZSA8LSBjb3VudHJ5X3Jlc3VtZSgiQ3plY2hpYSIsIGN1dG9mZiA9IDEwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGN6ZSkKYGBgCgojIyBHcmVlY2UgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkdyZWVjZSIKY3plIDwtIGNvdW50cnlfcmVzdW1lKCJHcmVlY2UiLCBjdXRvZmYgPSAzMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBjemUpCmBgYAoKIyMgSXRhbHkgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkl0YWx5IgppdGEgPC0gY291bnRyeV9yZXN1bWUoIkl0YWx5IiwgY3V0b2ZmID0gMTAwLCB0cmFjZSA9IEYsIHRtYXggPSA4MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgaXRhKQpgYGAKCiMjIFNwYWluICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJTcGFpbiIKc3BhIDwtIGNvdW50cnlfcmVzdW1lKCJTcGFpbiIsIGN1dG9mZiA9IDEwMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBzcGEpCmBgYAoKIyMgVW5pdGVkIEtpbmdkb20gIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlVuaXRlZCBLaW5nZG9tIgp1ayA8LSBjb3VudHJ5X3Jlc3VtZSgiVW5pdGVkIEtpbmdkb20iLCBjdXRvZmYgPSAzMDAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgdWspCmBgYAoKIyMgRnJhbmNlICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJGcmFuY2UiCmZyYSA8LSBjb3VudHJ5X3Jlc3VtZSgiRnJhbmNlIiwgY3V0b2ZmID0gMTAwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGZyYSkKYGBgCgojIyBHZXJtYW55ICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJHZXJtYW55IgpnZXIgPC0gY291bnRyeV9yZXN1bWUoIkdlcm1hbnkiLCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgZ2VyKQpgYGAKCiMjIE5ldGhlcmxhbmRzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiTmV0aGVybGFuZHMiCm5ldCA8LSBjb3VudHJ5X3Jlc3VtZSgiTmV0aGVybGFuZHMiLCBjdXRvZmYgPSAyMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBuZXQpCmBgYAoKIyMgU3dpdHplcmxhbmQgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlN3aXR6ZXJsYW5kIgpzd2kgPC0gY291bnRyeV9yZXN1bWUoIlN3aXR6ZXJsYW5kIiwgY3V0b2ZmID0gNTAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgc3dpKQpgYGAKCiMjIE5vcndheSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiTm9yd2F5Igpub3IgPC0gY291bnRyeV9yZXN1bWUoIk5vcndheSIsIGN1dG9mZiA9IDE1LCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIG5vcikKYGBgCgojIyBQb3J0dWdhbCAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiUG9ydHVnYWwiCnBvciA8LSBjb3VudHJ5X3Jlc3VtZSgiUG9ydHVnYWwiLCBjdXRvZmYgPSAzNSwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBwb3IpCmBgYAoKIyBPdGhlciBDb3VudHJpZXMKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkphcGFufEtvcmVhLCBTb3V0aHxJcmFufFJ1c3NpYXxJc3JhZWx8SW5kaWF8VHVya2V5fFNhdWRpIEFyYWJpYXxQYWtpc3RhbiIpCmZvbyA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikKYmFyX2dyYXBoKGZvbywgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgIk90aGVyIENvdW50cmllcyAtIENvbmZpcm1lZCBDYXNlIiwgCiAgICAgICAgICAgICAgICAgIHBhc3RlKCJOdW1iZXIgb2YgQ2FzZXMiLCBTeXMuRGF0ZSgpKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIklyYW58VHVya2V5fEtvcmVhLCBTb3V0aHxJc3JhZWx8SmFwYW58UnVzc2lhfFNhdWRpIEFyYWJpYSIpCnRpdGxlIDwtICJPdGhlciBDb3VudHJpZXMiCnN1YnRpdGxlIDwtICJDdW11bGF0aXZlIENvbmZpcm1lZCBDYXNlcyIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKGNhc2VzX2J5X2RheSA+PSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZGF0ZSwgY29uZmlybWVkKSAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCAtZGF0ZSwgLWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShkYXkgPSAxOm4oKSkKCiMgUGxvdApnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF5LCB5ID0gdmFsdWUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGNvdW50cnkpKSArICAgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gVCkgKyAgCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKyAgICAKICB0aGVtZV9taW5pbWFsX2dyaWQoMTMpICsgIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gIk51bWJlciBvZiBDYXNlcyIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiSXJhbnxUdXJrZXl8S29yZWEsIFNvdXRofElzcmFlbHxKYXBhbnxSdXNzaWF8U2F1ZGkgQXJhYmlhIikKdGl0bGUgPC0gIk90aGVyIENvdW50cmllcyIKc3VidGl0bGUgPC0gIkN1bXVsYXRpdmUgQ29uZmlybWVkIENhc2VzIC0gTG9nIHNjYWxlIgojIFNlbGVjdCBkYXRhCmRmIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKSAlPiUKICBmaWx0ZXIoY2FzZXNfYnlfZGF5ID49IDEpICU+JQogIHNlbGVjdChjb3VudHJ5LCBkYXRlLCBjb25maXJtZWQpICU+JQogIGdhdGhlcihrZXkgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJ2YWx1ZSIsIC1kYXRlLCAtY291bnRyeSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKGRheSA9IDE6bigpKQoKIyBQbG90CgpnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF5LCB5ID0gbG9nKHZhbHVlKSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAKICBnZW9tX3Ntb290aChhZXMoY29sID0gY291bnRyeSksIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRikgKwogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9taW5pbWFsX2dyaWQoMTIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJsb2coTnVtYmVyIG9mIENhc2VzKSIpCmBgYAoKVGFpd2FuKgoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlRhaXdhbioiCmphcCA8LSBjb3VudHJ5X3Jlc3VtZSgiVGFpd2FuKiIsIGN1dG9mZiA9IDMwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGphcCkKYGBgCgojIyBKYXBhbiAgICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJKYXBhbiIKamFwIDwtIGNvdW50cnlfcmVzdW1lKCJKYXBhbiIsIGN1dG9mZiA9IDIwMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBqYXApCmBgYAoKIyMgSXJhbiAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiSXJhbiIKaXJhIDwtIGNvdW50cnlfcmVzdW1lKCJJcmFuIiwgY3V0b2ZmID0gMCwgdHJhY2UgPSBGLCB0bWF4ID0gODApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGlyYSkKYGBgCgojIyBSdXNzaWEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlJ1c3NpYSIKcnVzIDwtIGNvdW50cnlfcmVzdW1lKCJSdXNzaWEiLCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgcnVzKQpgYGAKCiMjIFNpbmdhcG9yZQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlNpbmdhcG9yZSIKaXNyIDwtIGNvdW50cnlfcmVzdW1lKCJTaW5nYXBvcmUiLCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRiwgdG1heCA9IDgwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBpc3IpCmBgYAoKIyMgSXNyYWVsICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJJc3JhZWwiCmlzciA8LSBjb3VudHJ5X3Jlc3VtZSgiSXNyYWVsIiwgY3V0b2ZmID0gMTAwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGlzcikKYGBgCgoKCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMgQ291bnRyaWVzIEFuYWx5c2lzCmNvdW50cmllc19yZXN1bWUgJT4lIGFycmFuZ2UoY291bnRyeSkKY291bnRyaWVzX3Jlc3VtZSAlPiUgCnN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpCgpnZ3Bsb3QoY291bnRyaWVzX3Jlc3VtZSkgKwogIGdlb21fcG9pbnQoYWVzKGNhc2UsIENGUiwgY29sID0gaXNDb252KSkgKwogIGdlb21fc21vb3RoKGFlcyhjYXNlLCBDRlIpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gVCkgKwogIHRoZW1lX2J3KCkKCmNvdW50cmllc19yZXN1bWUgJT4lIGZpbHRlcihLIDwgMjAwMDAwKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoYWVzKGNhc2UsIEssIGNvbCA9IGlzQ29udikpICsKICBnZW9tX3Ntb290aChhZXMoY2FzZSwgSyksIG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKyAgCiAgdGhlbWVfYncoKQoKY291bnRyaWVzX3Jlc3VtZSAlPiUgZmlsdGVyKEsgPCAyMDAwMDApICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChhZXMoYSwgSywgY29sID0gaXNDb252KSkgKwogIGdlb21fc21vb3RoKGFlcyhhLCBLKSwgbWV0aG9kID0gImxtIiwgc2UgPSBGKSArICAKICB0aGVtZV9idygpCgpjb3VudHJpZXNfcmVzdW1lICU+JSBmaWx0ZXIoSyA8IDIwMDAwMCkgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyhBSUMsIEJJQywgY29sID0gaXNDb252KSkgKwogIHRoZW1lX2J3KCkKCmNvdW50cmllc19yZXN1bWUgJT4lIAogIGZpbHRlcihLIDwgMjAwMDAwICYgc2lnbWEgPCA1MDApICU+JSAKICBzZWxlY3QoY291bnRyeSwgcHJvZywgc2lnbWEpICU+JQogIHBsb3RfbHkoeCA9IH5wcm9nLCB5ID0gfnNpZ21hLCBjb2xvciA9IH5jb3VudHJ5KQoKY291bnRyaWVzX3Jlc3VtZSAlPiUgCiAgc2VsZWN0KGNvdW50cnksIGRheXMsIGNhc2UpICU+JQogIHBsb3RfbHkoeCA9IH5kYXlzLCB5ID0gfmNhc2UsIGNvbG9yID0gfmNvdW50cnkpCgpjb3VudHJpZXNfcmVzdW1lICU+JSAKICBzZWxlY3QoY291bnRyeSwgZGVhdGgsIGNhc2UpICU+JQogIHBsb3RfbHkoeCA9IH5jYXNlLCB5ID0gfmRlYXRoLCBjb2xvciA9IH5jb3VudHJ5KQoKIyBCYXIgZ3JhcGggQXZlcmFnZSBDb25maXJtZWQgQ2FzZXMgKExhc3QgdGhyZWUgZGF5cykKZm9vIDwtIHRpZHlfam9pbl9mdW5fbWF4KHRpZHlfam9pbikgJT4lCiAgZmlsdGVyKGNvbmZpcm1lZCA+IDIwMDApICU+JQogIGFycmFuZ2UoZGVzYyhDRlIpKSAlPiUgIAogIGdncGxvdChhZXMoeCA9IGFzX2ZhY3Rvcihjb3VudHJ5KSwgeSA9IENGUikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgCiAgICAgICAgICAgZmlsbCA9ICJsaWdodGJsdWUiLCAKICAgICAgICAgICBhbHBoYSA9IDAuNikgKyAKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoQ0ZSLCAxKSksIAogICAgICAgICAgICBoanVzdCA9ICJyaWd0aCIsCiAgICAgICAgICAgIHNpemUgPSA0LjUsCiAgICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiKSArCiAgbGFicyh0aXRsZSA9ICJDYXNlIEZhdGFsaXR5IFJhdGlvIiwKICAgICAgIHN1YnRpdGxlID0gIkNvdW50cmllcyB3aXRoIG1vcmUgdGhhbiAyMDAwIGNvbmZpcm1lZCBjYXNlcyIsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIiIsIHkgPSAiIikgKwogIGNvb3JkX2ZsaXAoKSArIHRoZW1lX21pbmltYWxfZ3JpZCgxMikgCmZvbwpgYGAKCiMgUmVmZXJlbmNlcyAgCgpTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCAgCgpDbGFyaywgQS5KLiAoMjAxMSkuICJEZWNsaW5lIEN1cnZlIEFuYWx5c2lzIGluIFVuY29udmVudGlvbmFsIFJlc291cmNlIFBsYXlzCiAgICBVc2luZyBMb2dpc3RpYyBHcm93dGggTW9kZWxzLiIgTS5TLiAKICAgIFRoZXNpcywgVGhlIFVuaXZlcnNpdHkgb2YgVGV4YXMgYXQgQXVzdGluLCBBdWd1c3QgMjAxMS4gCgoK