Li4gTWFjcm9zL0Fzc2VydHMvL0JPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04KCkJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2RlZmluZSBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCB4LCByZWxhdGlvbiwgeSApIFxcCiAgICAgICAgfHVuc3BlY2lmaWVkLXRva2VuLXNlcXwgXFwKICAgIC9cKlwqLwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKQSBzcGVjaWFsaXplZCBhc3NlcnRpb24gbWFjcm8gZm9yIGNoZWNraW5nIG51bWVyaWNhbCBjb25kaXRpb25zLiBHZW5lcmF0ZXMgCmEgY29tcGlsYXRpb24gZXJyb3Igd2hlbiB0aGUgY29uZGl0aW9uIGBgKCB4IHJlbGF0aW9uIHkgKWBgIApkb2Vzbid0IGhvbGQuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2Fzc2VydC5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgeGBgICAgICAgICAgfCBBbiBpbnRlZ3JhbCBjb25zdGFudCAgICAgICAgICAgICAgfCBMZWZ0IG9wZXJhbmQgb2YgdGhlIGNoZWNrZWQgcmVsYXRpb24uICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgeWBgICAgICAgICAgfCBBbiBpbnRlZ3JhbCBjb25zdGFudCAgICAgICAgICAgICAgfCBSaWdodCBvcGVyYW5kIG9mIHRoZSBjaGVja2VkIHJlbGF0aW9uLiAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgcmVsYXRpb25gYCAgfCBBIEMrKyBvcGVyYXRvciB0b2tlbiAgICAgICAgICAgICAgfCBBbiBvcGVyYXRvciB0b2tlbiBmb3IgdGhlIHJlbGF0aW9uIGJlaW5nICAgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjaGVja2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IGludGVncmFsIGNvbnN0YW50cyBgYHhgYCwgYGB5YGAgYW5kIGEgbGVnYWwgQysrIG9wZXJhdG9yIHRva2VuIGBgb3BgYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggeCwgb3AsIHkgKTsKCjpSZXR1cm4gdHlwZToKICAgIE5vbmUuCgo6U2VtYW50aWNzOgogICAgR2VuZXJhdGVzIGEgY29tcGlsYXRpb24gZXJyb3IgaWYgYGAoIHggb3AgeSApICE9IHRydWVgYCwgb3RoZXJ3aXNlCiAgICBoYXMgbm8gZWZmZWN0LiAKICAgIAogICAgV2hlbiBwb3NzaWJsZSB3aXRoaW4gdGhlIGNvbXBpbGVyJ3MgZGlhZ25vc3RpYyBjYXBhYmlsaXRpZXMsCiAgICB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIGluY2x1ZGUgYSBuYW1lIG9mIHRoZSByZWxhdGlvbiBiZWluZyBjaGVja2VkLAogICAgdGhlIGFjdHVhbCB2YWx1ZXMgb2YgYm90aCBvcGVyYW5kcywgYW5kIGhhdmUgYSBnZW5lcmFsIGZvcm0gb2Y6CgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgfC4uLnwgXCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqXCB8Li4ufFwgYXNzZXJ0X3JlbGF0aW9uPG9wLCB4LCB5Pjo6XCpcKlwqXCpcKlwqXCpcKlwqXCpcKlwqKSB8Li4ufAoKCkV4YW1wbGUKLS0tLS0tLQoKOjoKICAgIAogICAgdGVtcGxhdGU8IHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUgPiBzdHJ1Y3QgbXkKICAgIHsKICAgICAgICAvLyAuLi4KICAgICAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCBzaXplb2YoVCksIDwsIHNpemVvZihVKSApOwogICAgfTsKICAgIAogICAgbXk8Y2hhcls1MF0sY2hhclsxMF0+IHRlc3Q7CgogICAgLy8gSW4gaW5zdGFudGlhdGlvbiBvZiBgbXk8Y2hhcls1MF0sIGNoYXJbMTBdPic6CiAgICAvLyAgIGluc3RhbnRpYXRlZCBmcm9tIGhlcmUKICAgIC8vIGNvbnZlcnNpb24gZnJvbSBgCiAgICAvLyAgIG1wbF86OmZhaWxlZCoqKioqKioqKioqKm1wbF86OmFzc2VydF9yZWxhdGlvbjxsZXNzLCA1MCwgMTA+OjoqKioqKioqKioqKionIAogICAgLy8gICB0byBub24tc2NhbGFyIHR5cGUgYG1wbF86OmFzc2VydDxmYWxzZT4nIHJlcXVlc3RlZAoKClNlZSBhbHNvCi0tLS0tLS0tCgp8QXNzZXJ0c3wsIHxCT09TVF9NUExfQVNTRVJUfCwgfEJPT1NUX01QTF9BU1NFUlRfTk9UfCwgfEJPT1NUX01QTF9BU1NFUlRfTVNHfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK