Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9yZXZlcnNlX3N0YWJsZV9wYXJ0aXRpb24gfDE5MAoKcmV2ZXJzZV9zdGFibGVfcGFydGl0aW9uCj09PT09PT09PT09PT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXEKICAgICAgICAsIHR5cGVuYW1lIFByZWQKICAgICAgICAsIHR5cGVuYW1lIEluMSA9IHx1bnNwZWNpZmllZHwKICAgICAgICAsIHR5cGVuYW1lIEluMiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgcmV2ZXJzZV9zdGFibGVfcGFydGl0aW9uCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIGEgcGFpciBvZiBzZXF1ZW5jZXMgdG9nZXRoZXIgY29udGFpbmluZyBhbGwgZWxlbWVudHMgaW4gdGhlIHJhbmdlIAp8YmVnaW4vZW5kPFNlcT58IHNwbGl0IGludG8gdHdvIGdyb3VwcyBiYXNlZCBvbiB0aGUgcHJlZGljYXRlIGBgUHJlZGBgLgpgYHJldmVyc2Vfc3RhYmxlX3BhcnRpdGlvbmBgIGlzIGd1YXJhbnRlZWQgdG8gcHJlc2VydmUgdGhlIHJldmVyc2VkIApyZWxhdGl2ZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyBzZXF1ZW5jZXMuCgoKfHRyYW5zZm9ybWF0aW9uIGFsZ29yaXRobSBkaXNjbGFpbWVyfAoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9zdGFibGVfcGFydGl0aW9uLmhwcD4KCgpNb2RlbCBvZgotLS0tLS0tLQoKfFJldmVyc2libGUgQWxnb3JpdGhtfAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYFNlcWBgICAgICAgICAgICB8IHxGb3J3YXJkIFNlcXVlbmNlfCAgICAgICAgICAgICAgICB8IEFuIG9yaWdpbmFsIHNlcXVlbmNlLiAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYFByZWRgYCAgICAgICAgICB8IFVuYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgICAgICB8IEEgcGFydGl0aW9uaW5nIHByZWRpY2F0ZS4gICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYEluMWBgLCBgYEluMmBgICB8IHxJbnNlcnRlcnwgICAgICAgICAgICAgICAgICAgICAgICB8IE91dHB1dCBpbnNlcnRlcnMuICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKfFNlbWFudGljcyBkaXNjbGFpbWVyLi4ufCB8UmV2ZXJzaWJsZSBBbGdvcml0aG18LgoKRm9yIGFueSB8Rm9yd2FyZCBTZXF1ZW5jZXwgYGBzYGAsIGFuIHVuYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgYGBwcmVkYGAsIGFuZCB8SW5zZXJ0ZXJ8XCBzIApgYGluMWBgIGFuZCBgYGluMmBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHJldmVyc2Vfc3RhYmxlX3BhcnRpdGlvbjxzLHByZWQsaW4xLGluMj46OnR5cGUgcjsKCjpSZXR1cm4gdHlwZToKICAgIEEgfHBhaXJ8LgogICAgCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIAoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgbGFtYmRhPHByZWQ+Ojp0eXBlIHA7CiAgICAgICAgdHlwZWRlZiBsYW1iZGE8aW4xOjpvcGVyYXRpb24+Ojp0eXBlIGluMV9vcDsKICAgICAgICB0eXBlZGVmIGxhbWJkYTxpbjI6Om9wZXJhdGlvbj46OnR5cGUgaW4yX29wOwogICAgICAgIAogICAgICAgIHR5cGVkZWYgcmV2ZXJzZV9mb2xkPAogICAgICAgICAgICAgIHMKICAgICAgICAgICAgLCBwYWlyPCBpbjE6OnN0YXRlLCBpbjI6OnN0YXRlID4KICAgICAgICAgICAgLCBpZl88IAogICAgICAgICAgICAgICAgICBhcHBseV93cmFwXCBgYDFgYFw8cCxfMj4KICAgICAgICAgICAgICAgICwgcGFpcjwgYXBwbHlfd3JhcFwgYGAyYGBcPGluMV9vcCxmaXJzdDxfMT4sXzI+LCBzZWNvbmQ8XzE+ID4KICAgICAgICAgICAgICAgICwgcGFpcjwgZmlyc3Q8XzE+LCBhcHBseV93cmFwXCBgYDJgYFw8aW4yX29wLHNlY29uZDxfMT4sXzI+ID4KICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgPjo6dHlwZSByOwoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKTGluZWFyLiBFeGFjdGx5IGBgc2l6ZTxzPjo6dmFsdWVgYCBhcHBsaWNhdGlvbnMgb2YgYGBwcmVkYGAsIGFuZCBgYHNpemU8cz46OnZhbHVlYGAgCm9mIHN1bW1hcml6ZWQgYGBpbjE6Om9wZXJhdGlvbmBgIC8gYGBpbjI6Om9wZXJhdGlvbmBgIGFwcGxpY2F0aW9ucy4gCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBOID4gc3RydWN0IGlzX29kZCA6IGJvb2xfPChOOjp2YWx1ZSAlIDIpPiB7fTsKCiAgICB0eXBlZGVmIHJldmVyc2Vfc3RhYmxlX3BhcnRpdGlvbjwKICAgICAgICAgIHJhbmdlX2M8aW50LDAsMTA+IAogICAgICAgICwgaXNfb2RkPF8xPgogICAgICAgICwgYmFja19pbnNlcnRlcjwgdmVjdG9yPD4gPgogICAgICAgICwgYmFja19pbnNlcnRlcjwgdmVjdG9yPD4gPgogICAgICAgID46OnR5cGUgcjsKCiAgICBCT09TVF9NUExfQVNTRVJUKCggZXF1YWw8IHI6OmZpcnN0LCB2ZWN0b3JfYzxpbnQsOSw3LDUsMywxPiA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGVxdWFsPCByOjpzZWNvbmQsIHZlY3Rvcl9jPGludCw4LDYsNCwyLDA+ID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxUcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zfCwgfFJldmVyc2libGUgQWxnb3JpdGhtfCwgfHN0YWJsZV9wYXJ0aXRpb258LCB8cmV2ZXJzZV9wYXJ0aXRpb258LCB8c29ydHwsIHx0cmFuc2Zvcm18CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=