Li4gTWV0YWZ1bmN0aW9ucy9CaXR3aXNlIE9wZXJhdGlvbnMvL2JpdGFuZF8KCmJpdGFuZFxfCj09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFQxCiAgICAgICAgLCB0eXBlbmFtZSBUMgogICAgICAgICwgdHlwZW5hbWUgVDMgPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgfC4uLnwKICAgICAgICAsIHR5cGVuYW1lIFRcICpuKiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgYml0YW5kXF8KICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIHRoZSByZXN1bHQgb2YgKmJpdHdpc2UgYW5kKiAoYGAmYGApIG9wZXJhdGlvbiBvZiBpdHMgYXJndW1lbnRzLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9iaXRhbmQuaHBwPgogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9iaXR3aXNlLmhwcD4KCgpNb2RlbCBvZgotLS0tLS0tLQoKfE51bWVyaWMgTWV0YWZ1bmN0aW9ufAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCB8VDEuLi5UbnwgICAgIHwgfEludGVncmFsIENvbnN0YW50fCAgICAgICB8IE9wZXJhdGlvbidzIGFyZ3VtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKfE5vdGU6fCB8bnVtZXJpYyBtZXRhZnVuY3Rpb24gbm90ZXwgfC0tIGVuZCBub3RlfAoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IHxJbnRlZ3JhbCBDb25zdGFudHxcIHMgfGMxLi4uY258OgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGJpdGFuZF88YzEsXCB8Li4ufFwgY1wgKm4qXD46OnR5cGUgcjsgCgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCiAgICAgICAgCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICB0eXBlZGVmIGludGVncmFsX2M8CiAgICAgICAgICAgICAgdHlwZW9mKGMxOjp2YWx1ZSAmIGMyOjp2YWx1ZSkKICAgICAgICAgICAgLCAoIGMxOjp2YWx1ZSAmIGMyOjp2YWx1ZSApCiAgICAgICAgICAgID4gYzsKICAgICAgICAgICAgCiAgICAgICAgdHlwZWRlZiBiaXRhbmRfPGMsYzMsXCB8Li4ufFxjXCAqbipcPjo6dHlwZSByOyAKCi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBiaXRhbmRfPGMxLFwgfC4uLnxcIGNcICpuKlw+IHI7Cgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8KICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICBzdHJ1Y3QgciA6IGJpdGFuZF88YzEsXCB8Li4ufFwgY1wgKm4qXD46OnR5cGUge307CgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpBbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGludGVncmFsX2M8dW5zaWduZWQsMD4gdTA7CiAgICB0eXBlZGVmIGludGVncmFsX2M8dW5zaWduZWQsMT4gdTE7CiAgICB0eXBlZGVmIGludGVncmFsX2M8dW5zaWduZWQsMj4gdTI7CiAgICB0eXBlZGVmIGludGVncmFsX2M8dW5zaWduZWQsOD4gdTg7CiAgICB0eXBlZGVmIGludGVncmFsX2M8dW5zaWduZWQsMHhmZmZmZmZmZj4gdWZmZmZmZmZmOwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCAoYml0YW5kXzx1MCx1MD46OnZhbHVlKSwgPT0sIDAgKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIChiaXRhbmRfPHUxLHUwPjo6dmFsdWUpLCA9PSwgMCApOwogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggKGJpdGFuZF88dTAsdTE+Ojp2YWx1ZSksID09LCAwICk7CiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCAoYml0YW5kXzx1MCx1ZmZmZmZmZmY+Ojp2YWx1ZSksID09LCAwICk7CiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCAoYml0YW5kXzx1MSx1ZmZmZmZmZmY+Ojp2YWx1ZSksID09LCAxICk7CiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCAoYml0YW5kXzx1OCx1ZmZmZmZmZmY+Ojp2YWx1ZSksID09LCA4ICk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxCaXR3aXNlIE9wZXJhdGlvbnN8LCB8TnVtZXJpYyBNZXRhZnVuY3Rpb258LCB8bnVtZXJpY19jYXN0fCwgfGJpdG9yX3wsIHxiaXR4b3JffCwgfHNoaWZ0X2xlZnR8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=