Li4gU2VxdWVuY2VzL0ludHJpbnNpYyBNZXRhZnVuY3Rpb25zLy9pbnNlcnRfcmFuZ2UKCmluc2VydF9yYW5nZQo9PT09PT09PT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgU2VxdWVuY2UKICAgICAgICAsIHR5cGVuYW1lIFBvcwogICAgICAgICwgdHlwZW5hbWUgUmFuZ2UKICAgICAgICA+CiAgICBzdHJ1Y3QgaW5zZXJ0X3JhbmdlCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKYGBpbnNlcnRfcmFuZ2VgYCBwZXJmb3JtcyBhbiBpbnNlcnRpb24gb2YgYSByYW5nZSBvZiBlbGVtZW50cyBhdCBhbiBhcmJpdHJhcnkgcG9zaXRpb24gaW4gCnRoZSBzZXF1ZW5jZS4KCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9pbnNlcnRfcmFuZ2UuaHBwPgoKCk1vZGVsIG9mCi0tLS0tLS0tCgp8VGFnIERpc3BhdGNoZWQgTWV0YWZ1bmN0aW9ufAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYFNlcXVlbmNlYGAgIHwgfEV4dGVuc2libGUgU2VxdWVuY2V8IG9yICAgICAgICAgIHwgQSBzZXF1ZW5jZSB0byBpbnNlcnQgaW50by4gICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgIHwgfEV4dGVuc2libGUgQXNzb2NpYXRpdmUgU2VxdWVuY2V8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYFBvc2BgICAgICAgIHwgfEZvcndhcmQgSXRlcmF0b3J8ICAgICAgICAgICAgICAgIHwgQW4gaXRlcmF0b3IgaW4gYGBTZXF1ZW5jZWBgIHNwZWNpZnlpbmcgdGhlICAgIHwKfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5zZXJ0aW9uIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYFJhbmdlYGAgICAgIHwgfEZvcndhcmQgU2VxdWVuY2V8ICAgICAgICAgICAgICAgIHwgVGhlIHJhbmdlIG9mIGVsZW1lbnRzIHRvIGJlIGluc2VydGVkLiAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFueSB8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwgYGBzYGAsIGl0ZXJhdG9yIGBgcG9zYGAgaW4gYGBzYGAsIGFuZCB8Rm9yd2FyZCBTZXF1ZW5jZXwgYGByYW5nZWBgOgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgaW5zZXJ0PHMscG9zLHJhbmdlPjo6dHlwZSByOyAKCjpSZXR1cm4gdHlwZToKICAgIHxFeHRlbnNpYmxlIFNlcXVlbmNlfC4KCjpQcmVjb25kaXRpb246CiAgICBgYHBvc2BgIGlzIGFuIGl0ZXJhdG9yIGludG8gYGBzYGAuIAoKOlNlbWFudGljczoKICAgIGBgcmBgIGlzIGEgc2VxdWVuY2UsIHxjb25jZXB0LWlkZW50aWNhbHwgdG8gYGBzYGAsIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6IAogICAgW2BgYmVnaW48cz46OnR5cGVgYCwgYGBwb3NgYCksIFtgYGJlZ2luPHI+Ojp0eXBlYGAsIGBgZW5kPHI+Ojp0eXBlYGApLAogICAgW2BgcG9zYGAsIGBgZW5kPHM+Ojp0eXBlYGApLgoKOlBvc3Rjb25kaXRpb246CiAgICBUaGUgcmVsYXRpdmUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIGBgcmBgIGlzIHRoZSBzYW1lIGFzIGluIGBgc2BgOwoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHNpemU8cj46OnZhbHVlID09IHNpemU8cz46OnZhbHVlICsgc2l6ZTxyYW5nZT46OnZhbHVlIAoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKU2VxdWVuY2UgZGVwZW5kZW50LiBRdWFkcmF0aWMgaW4gdGhlIHdvcnN0IGNhc2UsIGxpbmVhciBhdCBiZXN0OyBzZWUgdGhlIHBhcnRpY3VsYXIgCnNlcXVlbmNlIGNsYXNzJyBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIHZlY3Rvcl9jPGludCwwLDEsNyw4LDk+IG51bWJlcnM7CiAgICB0eXBlZGVmIGZpbmQ8IG51bWJlcnMsaW50ZWdyYWxfYzxpbnQsNz4gPjo6dHlwZSBwb3M7CiAgICB0eXBlZGVmIGluc2VydF9yYW5nZTwgbnVtYmVycyxwb3MscmFuZ2VfYzxpbnQsMiw3PiA+Ojp0eXBlIHJhbmdlOwoKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIHNpemU8cmFuZ2U+Ojp2YWx1ZSwgPT0sIDEwICk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggZXF1YWw8IHJhbmdlLHJhbmdlX2M8aW50LDAsMTA+ID4gKSk7CgogICAgdHlwZWRlZiBpbnNlcnRfcmFuZ2U8IAogICAgICAgICAgbGlzdFwgYGAwYGBcIDw+CiAgICAgICAgLCBlbmQ8IGxpc3RcIGBgMGBgXCA8PiA+Ojp0eXBlCiAgICAgICAgLCBsaXN0PGludD4KICAgICAgICA+Ojp0eXBlIHJlc3VsdDI7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIHNpemU8cmVzdWx0Mj46OnZhbHVlLCA9PSwgMSApOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwsIHxpbnNlcnR8LCB8cHVzaF9mcm9udHwsIHxwdXNoX2JhY2t8LCB8ZXJhc2V8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=