Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9yZXZlcnNlIHwxMDAKCnJldmVyc2UKPT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZQogICAgICAgICwgdHlwZW5hbWUgSW4gPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgPgogICAgc3RydWN0IHJldmVyc2UKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIGEgcmV2ZXJzZWQgY29weSBvZiB0aGUgb3JpZ2luYWwgc2VxdWVuY2UuIGBgcmV2ZXJzZWBgIGlzIGEgc3lub255bSBmb3IKfHJldmVyc2VfY29weXwuCgp8dHJhbnNmb3JtYXRpb24gYWxnb3JpdGhtIGRpc2NsYWltZXJ8CgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvcmV2ZXJzZS5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICAgICAgfCBBIHNlcXVlbmNlIHRvIHJldmVyc2UuICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYEluYGAgICAgICAgIHwgfEluc2VydGVyfCAgICAgICAgICAgICAgICAgICAgICAgIHwgQW4gaW5zZXJ0ZXIuICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgc2BgLCBhbmQgYW4gfEluc2VydGVyfCBgYGluYGA6CgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiByZXZlcnNlPHMsaW4+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgQSB0eXBlLgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgdHlwZWRlZiByZXZlcnNlX2NvcHk8cyxpbj46OnR5cGUgcjsgCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpMaW5lYXIuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgdmVjdG9yX2M8aW50LDksOCw3LDYsNSw0LDMsMiwxLDA+IG51bWJlcnM7CiAgICB0eXBlZGVmIHJldmVyc2U8IG51bWJlcnMgPjo6dHlwZSByZXN1bHQ7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBlcXVhbDwgcmVzdWx0LCByYW5nZV9jPGludCwwLDEwPiA+ICkpOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8VHJhbnNmb3JtYXRpb24gQWxnb3JpdGhtc3wsIHxSZXZlcnNpYmxlIEFsZ29yaXRobXwsIHxyZXZlcnNlX2NvcHl8LCB8Y29weXwsIHxjb3B5X2lmfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK