Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9wYXJ0aXRpb24gfDg1CgpwYXJ0aXRpb24KPT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcQogICAgICAgICwgdHlwZW5hbWUgUHJlZAogICAgICAgICwgdHlwZW5hbWUgSW4xID0gfHVuc3BlY2lmaWVkfAogICAgICAgICwgdHlwZW5hbWUgSW4yID0gfHVuc3BlY2lmaWVkfAogICAgICAgID4KICAgIHN0cnVjdCBwYXJ0aXRpb24KICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgYSBwYWlyIG9mIHNlcXVlbmNlcyB0b2dldGhlciBjb250YWluaW5nIGFsbCBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgCnxiZWdpbi9lbmQ8U2VxPnwgc3BsaXQgaW50byB0d28gZ3JvdXBzIGJhc2VkIG9uIHRoZSBwcmVkaWNhdGUgYGBQcmVkYGAuCmBgcGFydGl0aW9uYGAgaXMgYSBzeW5vbnltIGZvciB8c3RhYmxlX3BhcnRpdGlvbnwuCgp8dHJhbnNmb3JtYXRpb24gYWxnb3JpdGhtIGRpc2NsYWltZXJ8CgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL3BhcnRpdGlvbi5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxSZXZlcnNpYmxlIEFsZ29yaXRobXwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXFgYCAgICAgICAgICAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICAgICAgfCBBbiBvcmlnaW5hbCBzZXF1ZW5jZS4gICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBQcmVkYGAgICAgICAgICAgfCBVbmFyeSB8TGFtYmRhIEV4cHJlc3Npb258ICAgICAgICAgfCBBIHBhcnRpdGlvbmluZyBwcmVkaWNhdGUuICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBJbjFgYCwgYGBJbjJgYCAgfCB8SW5zZXJ0ZXJ8ICAgICAgICAgICAgICAgICAgICAgICAgfCBPdXRwdXQgaW5zZXJ0ZXJzLiAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnxTZW1hbnRpY3MgZGlzY2xhaW1lci4uLnwgfFJldmVyc2libGUgQWxnb3JpdGhtfC4KCkZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgc2BgLCBhbiB1bmFyeSB8TGFtYmRhIEV4cHJlc3Npb258IGBgcHJlZGBgLCBhbmQgfEluc2VydGVyfFwgcyAKYGBpbjFgYCBhbmQgYGBpbjJgYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBwYXJ0aXRpb248cyxwcmVkLGluMSxpbjI+Ojp0eXBlIHI7Cgo6UmV0dXJuIHR5cGU6CiAgICBBIHxwYWlyfC4KICAgIAo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgc3RhYmxlX3BhcnRpdGlvbjxzLHByZWQsaW4xLGluMj46OnR5cGUgcjsKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkxpbmVhci4gRXhhY3RseSBgYHNpemU8cz46OnZhbHVlYGAgYXBwbGljYXRpb25zIG9mIGBgcHJlZGBgLCBhbmQgYGBzaXplPHM+Ojp2YWx1ZWBgIApvZiBzdW1tYXJpemVkIGBgaW4xOjpvcGVyYXRpb25gYCAvIGBgaW4yOjpvcGVyYXRpb25gYCBhcHBsaWNhdGlvbnMuIAoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgTiA+IHN0cnVjdCBpc19vZGQgOiBib29sXzwoTjo6dmFsdWUgJSAyKT4ge307CgogICAgdHlwZWRlZiBwYXJ0aXRpb248CiAgICAgICAgICByYW5nZV9jPGludCwwLDEwPiAKICAgICAgICAsIGlzX29kZDxfMT4KICAgICAgICAsIGJhY2tfaW5zZXJ0ZXI8IHZlY3Rvcjw+ID4KICAgICAgICAsIGJhY2tfaW5zZXJ0ZXI8IHZlY3Rvcjw+ID4KICAgICAgICA+Ojp0eXBlIHI7CgogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGVxdWFsPCByOjpmaXJzdCwgdmVjdG9yX2M8aW50LDEsMyw1LDcsOT4gPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBlcXVhbDwgcjo6c2Vjb25kLCB2ZWN0b3JfYzxpbnQsMCwyLDQsNiw4PiA+ICkpOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8VHJhbnNmb3JtYXRpb24gQWxnb3JpdGhtc3wsIHxSZXZlcnNpYmxlIEFsZ29yaXRobXwsIHxyZXZlcnNlX3BhcnRpdGlvbnwsIHxzdGFibGVfcGFydGl0aW9ufCwgfHNvcnR8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=