Li4gTWV0YWZ1bmN0aW9ucy9CaXR3aXNlIE9wZXJhdGlvbnMvL3NoaWZ0X2xlZnQKCnNoaWZ0X2xlZnQKPT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8IAogICAgICAgICAgdHlwZW5hbWUgVAogICAgICAgICwgdHlwZW5hbWUgU2hpZnQKICAgICAgICA+CiAgICBzdHJ1Y3Qgc2hpZnRfbGVmdAogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlICpzaGlmdCBsZWZ0KiAoYGA8PGBgKSBvcGVyYXRpb24gb24gYGBUYGAuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL3NoaWZ0X2xlZnQuaHBwPgogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9iaXR3aXNlLmhwcD4KCgpNb2RlbCBvZgotLS0tLS0tLQoKfE51bWVyaWMgTWV0YWZ1bmN0aW9ufAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYFRgYCAgICAgICAgIHwgfEludGVncmFsIENvbnN0YW50fCAgICAgICAgICAgfCBBIHZhbHVlIHRvIHNoaWZ0LiAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYFNoaWZ0YGAgICAgIHwgVW5zaWduZWQgfEludGVncmFsIENvbnN0YW50fCAgfCBBIHNoaWZ0IGRpc3RhbmNlLiAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCnxOb3RlOnwgfG51bWVyaWMgbWV0YWZ1bmN0aW9uIG5vdGV8IHwtLSBlbmQgbm90ZXwKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFyYml0cmFyeSB8SW50ZWdyYWwgQ29uc3RhbnR8IGBgY2BgIGFuZCB1bnNpZ25lZCB8SW50ZWdyYWwgQ29uc3RhbnR8IGBgc2hpZnRgYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBzaGlmdF9sZWZ0PGMsc2hpZnQ+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgfEludGVncmFsIENvbnN0YW50fC4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIAogICAgICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgdHlwZWRlZiBpbnRlZ3JhbF9jPAogICAgICAgICAgICAgIGM6OnZhbHVlX3R5cGUKICAgICAgICAgICAgLCAoIGM6OnZhbHVlIDw8IHNoaWZ0Ojp2YWx1ZSApCiAgICAgICAgICAgID4gcjsKCi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBzaGlmdF9sZWZ0PGMsc2hpZnQ+IHI7IAoKOlJldHVybiB0eXBlOgogICAgfEludGVncmFsIENvbnN0YW50fC4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvCiAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgc3RydWN0IHIgOiBzaGlmdF9sZWZ0PGMsc2hpZnQ+Ojp0eXBlIHt9OwoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKQW1vcnRpemVkIGNvbnN0YW50IHRpbWUuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBpbnRlZ3JhbF9jPHVuc2lnbmVkLDA+IHUwOwogICAgdHlwZWRlZiBpbnRlZ3JhbF9jPHVuc2lnbmVkLDE+IHUxOwogICAgdHlwZWRlZiBpbnRlZ3JhbF9jPHVuc2lnbmVkLDI+IHUyOwogICAgdHlwZWRlZiBpbnRlZ3JhbF9jPHVuc2lnbmVkLDg+IHU4OwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCAoc2hpZnRfbGVmdDx1MCx1MD46OnZhbHVlKSwgPT0sIDAgKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIChzaGlmdF9sZWZ0PHUxLHUwPjo6dmFsdWUpLCA9PSwgMSApOwogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggKHNoaWZ0X2xlZnQ8dTEsdTE+Ojp2YWx1ZSksID09LCAyICk7CiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCAoc2hpZnRfbGVmdDx1Mix1MT46OnZhbHVlKSwgPT0sIDQgKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIChzaGlmdF9sZWZ0PHU4LHUxPjo6dmFsdWUpLCA9PSwgMTYgKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfEJpdHdpc2UgT3BlcmF0aW9uc3wsIHxOdW1lcmljIE1ldGFmdW5jdGlvbnwsIHxudW1lcmljX2Nhc3R8LCB8c2hpZnRfcmlnaHR8LCB8Yml0YW5kX3wKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==