Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9jb3B5X2lmIHwyMAoKY29weV9pZgo9PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlCiAgICAgICAgLCB0eXBlbmFtZSBQcmVkCiAgICAgICAgLCB0eXBlbmFtZSBJbiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgY29weV9pZgogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgYSBmaWx0ZXJlZCBjb3B5IG9mIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZSBjb250YWluaW5nIHRoZSBlbGVtZW50cyB0aGF0IHNhdGlzZnkgCnRoZSBwcmVkaWNhdGUgYGBQcmVkYGAuCgp8dHJhbnNmb3JtYXRpb24gYWxnb3JpdGhtIGRpc2NsYWltZXJ8CgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvY29weV9pZi5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxSZXZlcnNpYmxlIEFsZ29yaXRobXwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXF1ZW5jZWBgICB8IHxGb3J3YXJkIFNlcXVlbmNlfCAgICAgICAgICAgIHwgQSBzZXF1ZW5jZSB0byBjb3B5LiAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYFByZWRgYCAgICAgIHwgVW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCAgICAgfCBBIGNvcHlpbmcgY29uZGl0aW9uLiAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgSW5gYCAgICAgICAgfCB8SW5zZXJ0ZXJ8ICAgICAgICAgICAgICAgICAgICB8IEFuIGluc2VydGVyLiAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnxTZW1hbnRpY3MgZGlzY2xhaW1lci4uLnwgfFJldmVyc2libGUgQWxnb3JpdGhtfC4KCkZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgc2BgLCBhbiB1bmFyeSB8TGFtYmRhIEV4cHJlc3Npb258IGBgcHJlZGBgLCBhbmQgCmFuIHxJbnNlcnRlcnwgYGBpbmBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGNvcHlfaWY8cyxwcmVkLGluPjo6dHlwZSByOyAKCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKICAgICAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgICAgICAKICAgICAgICB0eXBlZGVmIGxhbWJkYTxwcmVkPjo6dHlwZSBwOwogICAgICAgIHR5cGVkZWYgbGFtYmRhPGluOjpvcGVyYXRpb24+Ojp0eXBlIG9wOwogICAgICAgIAogICAgICAgIHR5cGVkZWYgZm9sZDwKICAgICAgICAgICAgICBzCiAgICAgICAgICAgICwgaW46OnN0YXRlCiAgICAgICAgICAgICwgZXZhbF9pZjwKICAgICAgICAgICAgICAgICAgYXBwbHlfd3JhcFwgYGAxYGBcPHAsXzI+CiAgICAgICAgICAgICAgICAsIGFwcGx5X3dyYXBcIGBgMmBgXDxvcCxfMSxfMj4KICAgICAgICAgICAgICAgICwgaWRlbnRpdHk8XzE+CiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgID46OnR5cGUgcjsKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkxpbmVhci4gRXhhY3RseSBgYHNpemU8cz46OnZhbHVlYGAgYXBwbGljYXRpb25zIG9mIGBgcHJlZGBgLCBhbmQgYXQgCm1vc3QgYGBzaXplPHM+Ojp2YWx1ZWBgIGFwcGxpY2F0aW9ucyBvZiBgYGluOjpvcGVyYXRpb25gYC4gCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgY29weV9pZjwKICAgICAgICAgIHJhbmdlX2M8aW50LDAsMTA+CiAgICAgICAgLCBsZXNzPCBfMSwgaW50Xzw1PiA+CiAgICAgICAgLCBiYWNrX2luc2VydGVyPCB2ZWN0b3I8PiA+CiAgICAgICAgPjo6dHlwZSByZXN1bHQ7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIHNpemU8cmVzdWx0Pjo6dmFsdWUsID09LCA1ICk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggZXF1YWw8cmVzdWx0LHJhbmdlX2M8aW50LDAsNT4gPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfFRyYW5zZm9ybWF0aW9uIEFsZ29yaXRobXN8LCB8UmV2ZXJzaWJsZSBBbGdvcml0aG18LCB8cmV2ZXJzZV9jb3B5X2lmfCwgfGNvcHl8LCB8cmVtb3ZlX2lmfCwgfHJlcGxhY2VfaWZ8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=