Li4gSXRlcmF0b3JzL0l0ZXJhdG9yIE1ldGFmdW5jdGlvbnMvL25leHQgfDMwCgpuZXh0Cj09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBJdGVyYXRvcgogICAgICAgID4KICAgIHN0cnVjdCBuZXh0CiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKUmV0dXJucyB0aGUgbmV4dCBpdGVyYXRvciBpbiB0aGUgc2VxdWVuY2UuIHxOb3RlOnwgYGBuZXh0YGAgaGFzIGEgbnVtYmVyIG9mIApvdmVybG9hZGVkIG1lYW5pbmdzLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgaXRzIGFyZ3VtZW50LiBGb3IgaW5zdGFuY2UsCmlmIGBgWGBgIGlzIGFuIHxJbnRlZ3JhbCBDb25zdGFudHwsIGBgbmV4dDxYPmBgIHJldHVybnMgYW4gaW5jcmVtZW50ZWQgCnxJbnRlZ3JhbCBDb25zdGFudHwgb2YgdGhlIHNhbWUgdHlwZS4gVGhlIGZvbGxvd2luZyBzcGVjaWZpY2F0aW9uIGlzIAppdGVyYXRvci1zcGVjaWZpYy4gUGxlYXNlIHJlZmVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbmNlcHQncwpkb2N1bWVudGF0aW9uIGZvciB0aGUgZGV0YWlscyBvZiB0aGUgYWx0ZXJuYXRpdmUgc2VtYW50aWNzIHwtLSBlbmQgbm90ZXwuIAoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9uZXh0X3ByaW9yLmhwcD4KCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBJdGVyYXRvcmBgICB8IHxGb3J3YXJkIEl0ZXJhdG9yfC4gICAgICAgfCBBbiBpdGVyYXRvciB0byBpbmNyZW1lbnQuICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFueSB8Rm9yd2FyZCBJdGVyYXRvcnxcIHMgYGBpdGVyYGA6CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgbmV4dDxpdGVyPjo6dHlwZSBqOyAKCjpSZXR1cm4gdHlwZToKICAgIHxGb3J3YXJkIEl0ZXJhdG9yfC4KCjpQcmVjb25kaXRpb246CiAgICBgYGl0ZXJgYCBpcyBpbmNyZW1lbnRhYmxlLgoKOlNlbWFudGljczoKICAgIGBgamBgIGlzIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLCBvciAKICAgIGlzIHBhc3QtdGhlLWVuZC4gSWYgYGBpdGVyYGAgaXMgYSB1c2VyLWRlZmluZWQgaXRlcmF0b3IsIHRoZSAKICAgIGxpYnJhcnktcHJvdmlkZWQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlcXVpdmFsZW50IHRvCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgdHlwZWRlZiBpdGVyOjpuZXh0IGo7CgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpBbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiB2ZWN0b3JfYzxpbnQsMT4gdjsKICAgIHR5cGVkZWYgYmVnaW48dj46OnR5cGUgZmlyc3Q7CiAgICB0eXBlZGVmIGVuZDx2Pjo6dHlwZSBsYXN0OwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgbmV4dDxmaXJzdD46OnR5cGUsIGxhc3QgPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfEl0ZXJhdG9yc3wsIHxiZWdpbnwgLyB8ZW5kfCwgfHByaW9yfCwgfGRlcmVmfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK