Li4gU2VxdWVuY2VzL0NvbmNlcHRzLy9JbnRlZ3JhbCBTZXF1ZW5jZSBXcmFwcGVyIHw5MAoKSW50ZWdyYWwgU2VxdWVuY2UgV3JhcHBlcgo9PT09PT09PT09PT09PT09PT09PT09PT09CgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKQW4gfEludGVncmFsIFNlcXVlbmNlIFdyYXBwZXJ8IGlzIGEgY2xhc3MgdGVtcGxhdGUgdGhhdCBwcm92aWRlcyBhIGNvbmNpc2UKaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhIGNvcnJlc3BvbmRpbmcgc2VxdWVuY2Ugb2YgfEludGVncmFsIENvbnN0YW50fFwgcy4gSW4KcGFydGljdWxhciwgYXNzdW1pbmcgdGhhdCBgYHNlcWBgIGlzIGEgbmFtZSBvZiB0aGUgd3JhcHBlcidzIHVuZGVybHlpbmcgCnNlcXVlbmNlIGFuZCB8YzEuLi5jbnwgYXJlIGludGVncmFsIGNvbnN0YW50cyBvZiBhbiBpbnRlZ3JhbCB0eXBlIGBgVGBgIHRvIApiZSBzdG9yZWQgaW4gdGhlIHNlcXVlbmNlLCB0aGUgd3JhcHBlciBwcm92aWRlcyB1cyB3aXRoIHRoZSBmb2xsb3dpbmcgCm5vdGF0aW9uOgoKICAgIC4uIGxpbmUtYmxvY2s6OgoKICAgICAgICBgYHNlcV9jPFRgYCxcIHxjMS4uLmNufFwgYGA+YGAKCklmIGBgc2VxYGAgaXMgYSB8VmFyaWFkaWMgU2VxdWVuY2V8LCAqbnVtYmVyZWQqIHdyYXBwZXIgZm9ybXMgYXJlCmFsc28gYXZhaWFsYWJsZToKCiAgICAuLiBsaW5lLWJsb2NrOjoKCiAgICAgICAgYGBzZXFgYFwgKm4qXCBgYF9jPFRgYCxcIHxjMS4uLmNufFwgYGA+YGAKCgoKRXhwcmVzc2lvbiByZXF1aXJlbWVudHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnxJbiB0aGUgZm9sbG93aW5nIHRhYmxlLi4ufCBgYHNlcWBgIGlzIGEgcGxhY2Vob2xkZXIgdG9rZW4gZm9yIHRoZSAKfEludGVncmFsIFNlcXVlbmNlIFdyYXBwZXJ8J3MgdW5kZXJseWluZyBzZXF1ZW5jZSdzIG5hbWUuCgoKLi4gfHNlcV9jfCByZXBsYWNlOjogYGBzZXFfYzxUYGAsXCB8YzEuLi5jbnwKLi4gfHNlcW5fY3wgcmVwbGFjZTo6IGBgc2VxYGBcICpuKlwgYGBfYzxUYGAsXCB8YzEuLi5jbnwKCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgRXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgfCBUeXBlICAgICAgICAgICAgICAgICAgfCBDb21wbGV4aXR5ICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IHxzZXFfY3xcIGBgPmBgICAgICAgICAgICAgICAgIHwgfEZvcndhcmQgU2VxdWVuY2V8ICAgIHwgQW1vcnRpemVkIGNvbnN0YW50IHRpbWUuICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB8c2VxX2N8XCBgYD46OnR5cGVgYCAgICAgICAgICB8IHxGb3J3YXJkIFNlcXVlbmNlfCAgICB8IEFtb3J0aXplZCBjb25zdGFudCB0aW1lLiAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgfHNlcV9jfFwgYGA+Ojp2YWx1ZV90eXBlYGAgICAgfCBBbiBpbnRlZ3JhbCB0eXBlICAgICAgfCBBbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4gIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IHxzZXFuX2N8XCBgYD5gYCAgICAgICAgICAgICAgIHwgfEZvcndhcmQgU2VxdWVuY2V8ICAgIHwgQW1vcnRpemVkIGNvbnN0YW50IHRpbWUuICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB8c2Vxbl9jfFwgYGA+Ojp0eXBlYGAgICAgICAgICB8IHxGb3J3YXJkIFNlcXVlbmNlfCAgICB8IEFtb3J0aXplZCBjb25zdGFudCB0aW1lLiAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgfHNlcW5fY3xcIGBgPjo6dmFsdWVfdHlwZWBgICAgfCBBbiBpbnRlZ3JhbCB0eXBlICAgICAgfCBBbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4gIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgc2VxX2M8VCxcIHxjMS4uLmNufD4gczsKICAgIHR5cGVkZWYgc2VxXCAqbipcIF9jPFQsXCB8YzEuLi5jbnw+IHM7Cgo6U2VtYW50aWNzOgogICAgYGBzYGAgaXMgYSBzZXF1ZW5jZSBgYHNlcWBgIG9mIGludGVncmFsIGNvbnN0YW50IHdyYXBwZXJzIGBgaW50ZWdyYWxfYzxULGBgXCB8YzF8XCBgYD5gYCwKICAgIGBgaW50ZWdyYWxfYzxULGBgXCB8YzJ8XCBgYD5gYCwgLi4uIGBgaW50ZWdyYWxfYzxULGBgXCB8Y258XCBgYD5gYC4KCjpQb3N0Y29uZGl0aW9uOgogICAgYGBzaXplPHM+Ojp2YWx1ZSA9PSBuYGAuCgogICAgLi4gLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTigoIGF0X2M8diwwPjo6dHlwZTo6dmFsdWUsPT0sXCB8YzF8ICkpOwogICAgICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oKCBhdF9jPHYsMT46OnR5cGU6OnZhbHVlLD09LFwgfGMyfCApKTsKICAgICAgICAuLi4KICAgICAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCggYXRfYzx2LFwgKm4qPjo6dHlwZTo6dmFsdWUsPT0sXCB8Y258ICkpOwoKCi4uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBzZXFfYzxULFwgfGMxLi4uY258Pjo6dHlwZSBzOwogICAgdHlwZWRlZiBzZXFcICpuKlwgX2M8VCxcIHxjMS4uLmNufD46OnR5cGUgczsKCjpTZW1hbnRpY3M6CiAgICBgYHNgYCBpcyBpZGVudGljYWwgdG8gCiAgICBgYHNlcWBgXCAqbipcIGBgPGBgXCBgYGludGVncmFsX2M8VCxgYFwgfGMxfFwgYGA+YGAsXCBgYGludGVncmFsX2M8VCxgYFwgfGMyfFwgYGA+YGAsIAogICAgLi4uIGBgaW50ZWdyYWxfYzxULGBgXCB8Y258XCBgYD5gYCBgYD5gYC4KCgouLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgc2VxX2M8VCxcIHxjMS4uLmNufD46OnZhbHVlX3R5cGUgdDsKICAgIHR5cGVkZWYgc2VxXCAqbipcIF9jPFQsXCB8YzEuLi5jbnw+Ojp2YWx1ZV90eXBlIHQ7Cgo6U2VtYW50aWNzOgogICAgYGBpc19zYW1lPHQsVD46OnZhbHVlID09IHRydWVgYC4KCgpNb2RlbHMKLS0tLS0tCgoqIHx2ZWN0b3JfY3wKKiB8bGlzdF9jfAoqIHxzZXRfY3wKClNlZSBhbHNvCi0tLS0tLS0tCgp8U2VxdWVuY2VzfCwgfFZhcmlhZGljIFNlcXVlbmNlfCwgfEludGVncmFsIENvbnN0YW50fAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK