Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgX19fXyAgICAgICAgICAgICAgICAgICAgICAgIF8gICAgICBfCi8vICAgICAvIF9fX3xfX19fIF8gICBfIF9fX18gICBfX19ffCB8X18gIHwgfAovLyAgICB8IHwgICAvIF9fX3wgfCB8IHwgIF8gIFwvIF9fX3wgIF8gIFx8IHwKLy8gICAgfCB8X19ffCB8ICB8IHxffCB8IHwgfCB8IHxfX198IHwgfCB8fF98Ci8vICAgICBcX19fX3xffCAgXF9fX19ffF98IHxffFxfX19ffF98IHxffChfKSBNZWRpYSBiZW5jaG1hcmtzCi8vICAgICAgICAgICAKLy8JIKkgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24sIGxpY2Vuc2VkIHVuZGVyIEFwYWNoZSAyLjAgCi8vCi8vICBmaWxlIDogCi8vICBhdXRob3IgOiBTY290dCBFdHRpbmdlciAtIHNjb3R0Lm0uZXR0aW5nZXJAaW50ZWwuY29tCi8vCQkJIEplYW4tWXZlcyBCb3VndWV0IC0gamVhbi15dmVzLmJvdWd1ZXRAaW50ZWwuY29tIAovLyAgZGVzY3JpcHRpb24gOiBCb2R5IGdlb21ldHJ5IGRlc2NyaXB0aW9uLgovLyAgbW9kaWZpZWQgOiAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiNpZm5kZWYgQk9EWUdFT01FVFJZX0gKI2RlZmluZSBCT0RZR0VPTUVUUllfSAoKI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkKIyBpbmNsdWRlICJjb25maWcuaCIKI2VuZGlmCgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUgIkJvZHlQb3NlLmgiCiNpbmNsdWRlICJETWF0cml4LmgiCiNpbmNsdWRlICJTbWFsbFZlY3RvcnMuaCIKCiNkZWZpbmUgTl9QQVJUUyAxMAojZGVmaW5lIE5fTEVOR1RIUyAxOAoKLy9QcmVzZXQgcm90YXRpb24gbWF0cmljZXMKY29uc3QgZmxvYXQgWFJvdDkwWzEyXSAgPSB7MS4wMGYsICAwLjAwZiwgMC4wMGYsICAwLjAwZiwgMC4wMGYsIDAuMDBmLCAgMS4wMGYsICAwLjAwZiwgMC4wMGYsIC0xLjAwZiwgMC4wMGYsICAwLjAwZn07CmNvbnN0IGZsb2F0IFhSb3QxODBbMTJdID0gezEuMDBmLCAgMC4wMGYsIDAuMDBmLCAgMC4wMGYsIDAuMDBmLCAtMS4wMGYsIDAuMDBmLCAgMC4wMGYsIDAuMDBmLCAwLjAwZiwgIC0xLjAwZiwgMC4wMGZ9Owpjb25zdCBmbG9hdCBYUm90MjcwWzEyXSA9IHsxLjAwZiwgIDAuMDBmLCAwLjAwZiwgIDAuMDBmLCAwLjAwZiwgMC4wMGYsICAtMS4wMGYsIDAuMDBmLCAwLjAwZiwgMS4wMGYsICAwLjAwZiwgIDAuMDBmfTsKY29uc3QgZmxvYXQgWVJvdDkwWzEyXSAgPSB7MC4wMGYsICAwLjAwZiwgLTEuMDBmLCAwLjAwZiwgMC4wMGYsIDEuMDBmLCAgMC4wMGYsICAwLjAwZiwgMS4wMGYsIDAuMDBmLCAgMC4wMGYsICAwLjAwZn07CmNvbnN0IGZsb2F0IFlSb3QxODBbMTJdID0gey0xLjAwZiwgMC4wMGYsIDAuMDBmLCAgMC4wMGYsIDAuMDBmLCAxLjAwZiwgIDAuMDBmLCAgMC4wMGYsIDAuMDBmLCAwLjAwZiwgIC0xLjAwZiwgMC4wMGZ9Owpjb25zdCBmbG9hdCBaUm90MTgwWzEyXSA9IHstMS4wMGYsIDAuMDBmLCAwLjAwZiwgIDAuMDBmLCAwLjAwZiwgLTEuMDBmLCAwLjAwZiwgIDAuMDBmLCAwLjAwZiwgMC4wMGYsICAxLjAwZiwgIDAuMDBmfTsKCi8vQm9keSBnZW9tZXRyeSBwYXJhbWV0ZXJzOgpjbGFzcyBCb2R5UGFyYW1ldGVyc3sKcHVibGljOgoJZmxvYXQgbGltYnNbTl9QQVJUU11bNF07CQkJCQkJCQkJLy9SYWRpdXMgb2YgZWFjaCBib2R5IHBhcnQKCWZsb2F0IGxlbmd0aHNbTl9MRU5HVEhTXTsJCQkJCQkJCQkvL0xlbmd0aCBvZiBlYWNoIGJvZHkgcGFydHMJCQkJCQkJCQoJCglCb2R5UGFyYW1ldGVycygpe307Cgl+Qm9keVBhcmFtZXRlcnMoKXt9OwoJCgkvL0xvYWQgdGhlIGJvZHkgc2hhcGUgcGFyYW1ldGVycyBmcm9tIGEgZmlsZQoJYm9vbCBJbml0Qm9keVBhcmFtZXRlcnMoY29uc3Qgc3RkOjpzdHJpbmcgZm5hbWUpOwkJCQkJCQp9OwoKLy9wcmltaXRpdmUgY3lsaW5kZXIgb2JqZWN0OgpjbGFzcyBLVEN5bGluZGVyewpwdWJsaWM6CglmbG9hdCBib3R0b20sIHRvcCwgbGVuZ3RoOwkJCQkJCQkJCS8vYm90dG9tLHRvcCByYWRpdXMgYW5kIGxlbmd0aCBvZiB0aGUgY3lsaW5kZXIKCURNYXRyaXg8ZmxvYXQ+IHBvc2U7CQkJCQkJCQkJCS8vM0QgcG9zZSBvZiB0aGUgY3lsaW5kZXIKCQoJS1RDeWxpbmRlcigpe307Cgl+S1RDeWxpbmRlcigpe307CgkKCS8vQ29uc3RydWN0IGEgY3lsaW5kZXIgZ2l2ZW4gdG9wIGFuZCBib3R0b20gcmFkaWksIGFuZCBsZW5ndGgKCUtUQ3lsaW5kZXIoZmxvYXQgYiwgZmxvYXQgdCwgZmxvYXQgbCkge3RvcCA9IHQ7IGJvdHRvbSA9IGI7IGxlbmd0aCA9IGw7IH07CgkKCS8vU2V0IGN5bGluZGVyIHZhbHVlcyBnaXZlbiB0b3AgYW5kIGJvdHRvbSByYWRpaSwgYW5kIGxlbmd0aAoJdm9pZCBTZXQoZmxvYXQgYiwgZmxvYXQgdCwgZmxvYXQgbCkge3RvcCA9IHQ7IGJvdHRvbSA9IGI7IGxlbmd0aCA9IGw7IH07Cn07CgovL3ByaW1pdGl2ZSBib2R5IGdlb21ldHJ5IG9iamVjdDoKY2xhc3MgQm9keUdlb21ldHJ5ewpwcml2YXRlOgoJc3RkOjp2ZWN0b3I8S1RDeWxpbmRlcj4gbUN5bGluZGVyczsJCQkJCQkJLy9FYWNoIGJvZHkgcGFydCBpcyBtb2RlbGVkIGFzIGEgY29uaWMgY3lsaW5kZXIKCUJvZHlQYXJhbWV0ZXJzIG1QYXJhbXM7CQkJCQkJCQkJCS8vQm9keSBzaGFwZSBwYXJhbWV0ZXJzCgoJc3RkOjp2ZWN0b3I8VmVjdG9yM2Y+IG1DZW50ZXJzQSwgbUNlbnRlcnNCOwkJCQkJLy9jZW50ZXJzIG9mIHNwaGVyZXMgdXNlZCB0byBhcHByb3hpbWF0ZSB0aGUgY29uaWMgY3lsaW5kZXJzIGR1cmluZyBpbnRlcnNlY3Rpb24gdGVzdAoJc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1SYWRpaUEsIG1SYWRpaUI7CQkJCQkJLy9yYWRpaSBvZiBzcGhlcmVzCgoJYm9vbCBJbnRlcnNlY3RpbmdDeWxpbmRlcnMoS1RDeWxpbmRlciAmY3lsQSwgS1RDeWxpbmRlciAmY3lsQik7CgpwdWJsaWM6CglCb2R5R2VvbWV0cnkoKSB7IG1DeWxpbmRlcnMucmVzaXplKE5fUEFSVFMpOyB9OwoJfkJvZHlHZW9tZXRyeSgpe307CgoJLy9Mb2FkIEJvZHkgUGFyYW1ldGVycyBmcm9tIGEgZmlsZQoJYm9vbCBJbml0Qm9keVNoYXBlKHN0ZDo6c3RyaW5nIGZuYW1lKSB7cmV0dXJuIG1QYXJhbXMuSW5pdEJvZHlQYXJhbWV0ZXJzKGZuYW1lKTsgfTsKCQoJLy9HZXQvc2V0IHRoZSBpdGggYm9keSBwYXJ0CglLVEN5bGluZGVyICZvcGVyYXRvcigpKGludCBpKSB7cmV0dXJuIG1DeWxpbmRlcnNbaV07IH07CQoJY29uc3QgS1RDeWxpbmRlciAmb3BlcmF0b3IoKShpbnQgaSkgY29uc3Qge3JldHVybiBtQ3lsaW5kZXJzW2ldOyB9OwoKCS8vR2V0IGJvZHkgcGFyYW1ldGVycwoJQm9keVBhcmFtZXRlcnMgJlBhcmFtZXRlcnMoKSB7cmV0dXJuIG1QYXJhbXM7IH07CgkKCS8vR2VuZXJhdGUgYm9keSBnZW9tZXRyeSBmcm9tIGEgZ2l2ZW4gcG9zZQoJdm9pZCBDb21wdXRlR2VvbWV0cnkoQm9keVBvc2UgJmFuZ2xlcywgQm9keVBhcmFtZXRlcnMgJnBhcmFtcyk7CQoKCS8vcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJvZHkgcGFydHMKCWludCBHZXRCb2R5UGFydENvdW50KCkgY29uc3Qge3JldHVybiAoaW50KW1DeWxpbmRlcnMuc2l6ZSgpO307CQkKCgkvL3JldHVybnMgdHJ1ZSBpZiBubyBwYWlyIG9mIGJvZHkgcGFydHMgaW50ZXJzZWN0Cglib29sIFZhbGlkKCk7CQkJCQkJCQkJCQkJCn07CgoKCiNlbmRpZgoK