Li4gQWxnb3JpdGhtcy9RdWVyeWluZyBBbGdvcml0aG1zLy9maW5kX2lmIHwyMAoKZmluZF9pZgo9PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlCiAgICAgICAgLCB0eXBlbmFtZSBQcmVkCiAgICAgICAgPgogICAgc3RydWN0IGZpbmRfaWYKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIGBgU2VxdWVuY2VgYCB0aGF0IHNhdGlzZmllcyAKdGhlIHByZWRpY2F0ZSBgYFByZWRgYC4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvZmluZF9pZi5ocHA+CgoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYFNlcXVlbmNlYGAgIHwgfEZvcndhcmQgU2VxdWVuY2V8ICAgICAgICAgICAgfCBBIHNlcXVlbmNlIHRvIHNlYXJjaCBpbi4gICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBQcmVkYGAgICAgICB8IFVuYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgIHwgQSBzZWFyY2ggY29uZGl0aW9uLiAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IHxGb3J3YXJkIFNlcXVlbmNlfCBgYHNgYCBhbmQgdW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCBgYHByZWRgYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBmaW5kX2lmPHMscHJlZD46OnR5cGUgaTsgCgo6UmV0dXJuIHR5cGU6CiAgICB8Rm9yd2FyZCBJdGVyYXRvcnwuCgo6U2VtYW50aWNzOgogICAgYGBpYGAgaXMgdGhlIGZpcnN0IGl0ZXJhdG9yIGluIHRoZSByYW5nZSB8YmVnaW4vZW5kPHM+fCBzdWNoIHRoYXQgCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgICAgIAogICAgICAgIGFwcGx5PCBwcmVkLGRlcmVmPGk+Ojp0eXBlID46OnR5cGU6OnZhbHVlID09IHRydWUKICAgICAgICAKICAgIElmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLCBgYGlgYCBpcyBpZGVudGljYWwgdG8gYGBlbmQ8cz46OnR5cGVgYC4KCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkxpbmVhci4gQXQgbW9zdCBgYHNpemU8cz46OnZhbHVlYGAgYXBwbGljYXRpb25zIG9mIGBgcHJlZGBgLiAKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiB2ZWN0b3I8Y2hhcixpbnQsdW5zaWduZWQsbG9uZyx1bnNpZ25lZCBsb25nPiB0eXBlczsKICAgIHR5cGVkZWYgZmluZF9pZjx0eXBlcywgaXNfc2FtZTxfMSx1bnNpZ25lZD4gPjo6dHlwZSBpdGVyOwoKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPCBkZXJlZjxpdGVyPjo6dHlwZSwgdW5zaWduZWQgPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIGl0ZXI6OnBvczo6dmFsdWUsID09LCAyICk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxRdWVyeWluZyBBbGdvcml0aG1zfCwgfGZpbmR8LCB8Y291bnRfaWZ8LCB8bG93ZXJfYm91bmR8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=