LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCiogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIEZpbGUgY29sZWl0ci5oCi8vCi8vIAovLwovLyBDcmVhdGVkIGJ5OiBIZWxlbmEgU2hpaAovLwovLyBNb2RpZmljYXRpb24gSGlzdG9yeToKLy8KLy8gIERhdGUgICAgICAgICBOYW1lICAgICAgICAgIERlc2NyaXB0aW9uCi8vCi8vICA4LzE4Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBpbnRlcm5hbCBBUEkgZG9jdW1lbnRhdGlvbi4KLy8gMDgvMDMvOTggICAgICAgIGVybSAgICAgICAgICAgIFN5bmNoZWQgd2l0aCAxLjIgdmVyc2lvbiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IuamF2YQovLyAxMi8xMC85OSAgICAgIGFsaXUgICAgICAgICAgUG9ydGVkIFRoYWkgY29sbGF0aW9uIHN1cHBvcnQgZnJvbSBKYXZhLgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgQ09MRUlUUl9ICiNkZWZpbmUgQ09MRUlUUl9ICgoKI2luY2x1ZGUgInVuaWNvZGUvdW5pc3RyLmgiCiNpbmNsdWRlICJ1bmljb2RlL3RibGNvbGwuaCIKI2luY2x1ZGUgInVuaWNvZGUvY2hhcml0ZXIuaCIKCmNsYXNzIE5vcm1hbGl6ZXI7CmNsYXNzIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50OwpjbGFzcyBSdWxlQmFzZWRDb2xsYXRvcjsKCi8qKgogKiBUaGUgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGNsYXNzIGlzIHVzZWQgYXMgYW4gaXRlcmF0b3IgdG8gd2FsayB0aHJvdWdoCiAqIGVhY2ggY2hhcmFjdGVyIG9mIGFuIGludGVybmF0aW9uYWwgc3RyaW5nLiBVc2UgdGhlIGl0ZXJhdG9yIHRvIHJldHVybiB0aGUKICogb3JkZXJpbmcgcHJpb3JpdHkgb2YgdGhlIHBvc2l0aW9uZWQgY2hhcmFjdGVyLiBUaGUgb3JkZXJpbmcgcHJpb3JpdHkgb2YKICogYSBjaGFyYWN0ZXIsIHdoaWNoIHdlIHJlZmVyIHRvIGFzIGEga2V5LCBkZWZpbmVzIGhvdyBhIGNoYXJhY3RlciBpcwogKiBjb2xsYXRlZCBpbiB0aGUgZ2l2ZW4gY29sbGF0aW9uIG9iamVjdC4KICogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgaW4gU3BhbmlzaDoKICogPHByZT4KICogLiAgICAgICAiY2EiIC0+IHRoZSBmaXJzdCBrZXkgaXMga2V5KCdjJykgYW5kIHNlY29uZCBrZXkgaXMga2V5KCdhJykuCiAqIC4gICAgICAgImNoYSIgLT4gdGhlIGZpcnN0IGtleSBpcyBrZXkoJ2NoJykgYW5kIHNlY29uZCBrZXkgaXMga2V5KCdhJykuCiAqIDwvcHJlPgogKiBBbmQgaW4gR2VybWFuLAogKiA8cHJlPgogKiAuICAgICAgICLmYiItPiB0aGUgZmlyc3Qga2V5IGlzIGtleSgnYScpLCB0aGUgc2Vjb25kIGtleSBpcyBrZXkoJ2UnKSwgYW5kCiAqIC4gICAgICAgdGhlIHRoaXJkIGtleSBpcyBrZXkoJ2InKS4KICogPC9wcmU+CiAqIFRoZSBrZXkgb2YgYSBjaGFyYWN0ZXIsIGlzIGFuIGludGVnZXIgY29tcG9zZWQgb2YgcHJpbWFyeSBvcmRlcihzaG9ydCksCiAqIHNlY29uZGFyeSBvcmRlcihjaGFyKSwgYW5kIHRlcnRpYXJ5IG9yZGVyKGNoYXIpLiAgSmF2YSBzdHJpY3RseSBkZWZpbmVzCiAqIHRoZSBzaXplIGFuZCBzaWduZWRuZXNzIG9mIGl0cyBwcmltaXRpdmUgZGF0YSB0eXBlcy4gIFRoZXJlZm9yZSwgdGhlIHN0YXRpYwogKiBmdW5jdGlvbnMgcHJpbWFyeU9yZGVyKCksIHNlY29uZGFyeU9yZGVyKCksIGFuZCB0ZXJ0aWFyeU9yZGVyKCkgcmV0dXJuIGludDMyX3QKICogdG8gZW5zdXJlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUga2V5IHZhbHVlLgogKiA8cD5FeGFtcGxlIG9mIHRoZSBpdGVyYXRvciB1c2FnZTogKHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcpCiAqIDxwcmU+CiAqIC4gIHZvaWQgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yX0V4YW1wbGUoKQogKiAuICB7CiAqIC4gICAgICBVbmljb2RlU3RyaW5nIHN0ciA9ICJUaGlzIGlzIGEgdGVzdCI7CiAqIC4gICAgICBVRXJyb3JDb2RlIHN1Y2Nlc3MgPSBVX1pFUk9fRVJST1I7CiAqIC4gICAgICBSdWxlQmFzZWRDb2xsYXRvciogcmJjID0KICogLiAgICAgICAgICAoUnVsZUJhc2VkQ29sbGF0b3IqKSBSdWxlQmFzZWRDb2xsYXRvcjo6Y3JlYXRlSW5zdGFuY2Uoc3VjY2Vzcyk7CiAqIC4gICAgICBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IqIGMgPQogKiAuICAgICAgICAgIHJiYy0+Y3JlYXRlQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKCBzdHIgKTsKICogLiAgICAgIGludDMyX3Qgb3JkZXIgPSBjLT5uZXh0KHN1Y2Nlc3MpOwogKiAuICAgICAgaW50MzJfdCBwcmltYXJ5T3JkZXIgPSBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnByaW1hcnlPcmRlciggb3JkZXIgKTsKICogLiAgICAgIGRlbGV0ZSBjOwogKiAuICAgICAgZGVsZXRlIHJiYzsKICogLiAgfQogKiA8L3ByZT4KICogPHA+CiAqIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6bmV4dCByZXR1cm5zIHRoZSBjb2xsYXRpb24gb3JkZXIgb2YgdGhlIG5leHQKICogY2hhcmFjdGVyIGJhc2VkIG9uIHRoZSBjb21wYXJpc29uIGxldmVsIG9mIHRoZSBjb2xsYXRvci4gIEEgY29sbGF0aW9uIG9yZGVyIAogKiBjb25zaXN0cyBvZiBwcmltYXJ5IG9yZGVyLCBzZWNvbmRhcnkgb3JkZXIgYW5kIHRlcnRpYXJ5IG9yZGVyLiAgVGhlIGRhdGEgCiAqIHR5cGUgb2YgdGhlIGNvbGxhdGlvbiBvcmRlciBpcyA8c3Ryb25nPmludDMyX3Q8L3N0cm9uZz4uICBUaGUgZmlyc3QgMTYgYml0cyBvZiAKICogYSBjb2xsYXRpb24gb3JkZXIgaXMgaXRzIHByaW1hcnkgb3JkZXI7IHRoZSBuZXh0IDggYml0cyBpcyB0aGUgc2Vjb25kYXJ5IAogKiBvcmRlciBhbmQgdGhlIGxhc3QgOCBiaXRzIGlzIHRoZSB0ZXJ0aWFyeSBvcmRlci4KICoKICogQHNlZSAgICAgICAgICAgICAgICBDb2xsYXRvcgogKiBAc2VlICAgICAgICAgICAgICAgIFJ1bGVCYXNlZENvbGxhdG9yCiAqIEB2ZXJzaW9uICAgICAgICAgICAgMS45IDEvMzAvOTcKICogQGF1dGhvciAgICAgICAgICAgICBIZWxlbmEgU2hpaAogKi8KY2xhc3MgVV9JMThOX0FQSSBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IKewpwdWJsaWM6IAogICAgLyoqCiAgICAgKiBOVUxMT1JERVIgaW5kaWNhdGVzIHRoZSBpdGVyYXRvciBoYXMgY29uc3VtZWQgdGhlIGxhc3QgZWxlbWVudC4KICAgICAqLwogICAgc3RhdGljICBpbnQzMl90IGNvbnN0ICAgTlVMTE9SREVSOwoKICAgIC8qKiBEZXN0cnVjdG9yCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+Q29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKCk7CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiAib3RoZXIiIGlzIHRoZSBzYW1lIGFzICJ0aGlzIgogICAgICogQHN0YWJsZQogICAgICovCiAgICBVQm9vbCAgICAgICAgICBvcGVyYXRvcj09KGNvbnN0IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciYgb3RoZXIpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmICJvdGhlciIgaXMgbm90IHRoZSBzYW1lIGFzICJ0aGlzIi4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgVUJvb2wgICAgICAgICAgb3BlcmF0b3IhPShjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKSBjb25zdDsKCiAgICAvKioKICAgICAqIFJlc2V0cyB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlc2V0KHZvaWQpOwogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBvcmRlcmluZyBwcmlvcml0eSBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgICogQHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIncyBvcmRlcmluZy4gIFJldHVybnMgTlVMTE9SREVSIGlmCiAgICAgKiB0aGUgZW5kIG9mIHN0cmluZyBpcyByZWFjaGVkLgogICAgICogQHN0YWJsZQogICAgICovCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgbmV4dChVRXJyb3JDb2RlJiBzdGF0dXMpOwogICAgIC8qKgogICAgICAqIEdldCB0aGUgb3JkZXJpbmcgcHJpb3JpdHkgb2YgdGhlIHByZXZpb3VzIGNvbGxhdGlvbiBlbGVtZW50IGluIHRoZSBzdHJpbmcuCiAgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMuCiAgICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgZWxlbWVudCdzIG9yZGVyaW5nLiAgUmV0dXJucyBOVUxMT1JERVIgaWYKICAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIHN0cmluZyBpcyByZWFjaGVkLgogICAgICogQHN0YWJsZQogICAgICAqLwogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBwcmV2aW91cyhVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgcHJpbWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICAgICAqIEBwYXJhbSBvcmRlciB0aGUgY29sbGF0aW9uIG9yZGVyCiAgICAgKiBAcmV0dXJuIHRoZSBwcmltYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBzdGF0aWMgIGludDMyX3QgICAgICAgICAgICAgcHJpbWFyeU9yZGVyKGludDMyX3Qgb3JkZXIpOwogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBzZWNvbmRhcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiAgICAgKiBAcGFyYW0gb3JkZXIgdGhlIGNvbGxhdGlvbiBvcmRlcgogICAgICogQHJldHVybiB0aGUgc2Vjb25kYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBzdGF0aWMgIGludDMyX3QgICAgICAgICAgICAgc2Vjb25kYXJ5T3JkZXIoaW50MzJfdCBvcmRlcik7CiAgICAvKioKICAgICAqIEdldHMgdGhlIHRlcnRpYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogICAgICogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIKICAgICAqIEByZXR1cm4gdGhlIHRlcnRpYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBzdGF0aWMgIGludDMyX3QgICAgICAgICAgICAgdGVydGlhcnlPcmRlcihpbnQzMl90IG9yZGVyKTsKICAgIC8qKgogICAgICogIFJldHVybiB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW55IGV4cGFuc2lvbiBzZXF1ZW5jZXMgdGhhdCBlbmQKICAgICAqICB3aXRoIHRoZSBzcGVjaWZpZWQgY29tcGFyaXNvbiBvcmRlci4KICAgICAqICBAcGFyYW0gb3JkZXIgYSBjb2xsYXRpb24gb3JkZXIgcmV0dXJuZWQgYnkgcHJldmlvdXMgb3IgbmV4dC4KICAgICAqICBAcmV0dXJuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbnkgZXhwYW5zaW9uIHNlcXVlbmNlcyBlbmRpbmcKICAgICAqICAgICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBvcmRlci4KICAgICAqICBAc3RhYmxlCiAgICAgKi8KICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBnZXRNYXhFeHBhbnNpb24oaW50MzJfdCBvcmRlcikgY29uc3Q7CgpwdWJsaWM6CiAgICAvKioKICAgICAqICBHZXRzIHRoZSBjb21wYXJpc29uIG9yZGVyIGluIHRoZSBkZXNpcmVkIHN0cmVuZ3RoLiAgSWdub3JlIHRoZSBvdGhlcgogICAgICogIGRpZmZlcmVuY2VzLgogICAgICogIEBwYXJhbSBvcmRlciBUaGUgb3JkZXIgdmFsdWUKICAgICAqICBAc3RhYmxlIAogICAgICovCiAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgc3RyZW5ndGhPcmRlcihpbnQzMl90IG9yZGVyKSBjb25zdDsKICAgIC8qKgogICAgICogU2V0cyB0aGUgc291cmNlIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdHIgdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNldFRleHQoY29uc3QgICBVbmljb2RlU3RyaW5nJiAgc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiAgICAgIHN0YXR1cyk7CiAgICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgICogQHBhcmFtIHN0ciB0aGUgc291cmNlIGNoYXJhY3RlciBpdGVyYXRvci4KICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgICogQHN0YWJsZQogICAgICovCiAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0VGV4dChDaGFyYWN0ZXJJdGVyYXRvciYgIHN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmICAgICAgICAgICAgc3RhdHVzKTsKICAgLyoqCiAgICAgKiAgQ2hlY2tzIGlmIGEgY29tcGFyaXNvbiBvcmRlciBpcyBpZ25vcmFibGUuCiAgICAgKiAgQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIuCiAgICAgKiAgQHJldHVybiBUUlVFIGlmIGEgY2hhcmFjdGVyIGlzIGlnbm9yYWJsZSwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICogIEBzdGFibGUKICAgICAqLwogICAgc3RhdGljICAgIFVCb29sICAgICAgICAgICAgICBpc0lnbm9yYWJsZShpbnQzMl90IG9yZGVyKTsKICAgIC8qKgogICAgICogIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCBjaGFyYWN0ZXIgaW4gdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiAgQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBjaGFyYWN0ZXIuCiAgICAgKiAgQHN0YWJsZQogICAgICovCiAgICAgICAgICAgIFVUZXh0T2Zmc2V0ICAgICAgICAgIGdldE9mZnNldCh2b2lkKSBjb25zdDsKICAgIC8qKgogICAgICogIFNldHMgdGhlIG9mZnNldCBvZiB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCBjaGFyYWN0ZXIgaW4gdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiAgQHBhcmFtIG5ld09mZnNldCB0aGUgbmV3IG9mZnNldC4KICAgICAqICBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAgICAqICBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGNoYXJhY3Rlci4KICAgICAqICBAc3RhYmxlCiAgICAgKi8KICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRPZmZzZXQoVVRleHRPZmZzZXQgbmV3T2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpOwogICAgLyogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIHNob3VsZCBub3QgYmUgc3ViY2xhc3NlZC4gKi8KcHJvdGVjdGVkOgogICAgLyoqCiAgICAgKiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgY29uc3RydWN0b3IuICBUaGlzIHRha2VzIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZAogICAgICogdGhlIGNvbGxhdGlvbiBvYmplY3QuICBUaGUgY3Vyc29yIHdpbGwgd2FsayB0aHJ1IHRoZSBzb3VyY2Ugc3RyaW5nIGJhc2VkCiAgICAgKiBvbiB0aGUgcHJlZGVmaW5lZCBjb2xsYXRpb24gcnVsZXMuICBJZiB0aGUgc291cmNlIHN0cmluZyBpcyBlbXB0eSwKICAgICAqIE5VTExPUkRFUiB3aWxsIGJlIHJldHVybmVkIG9uIHRoZSBjYWxscyB0byBuZXh0KCkuCiAgICAgKiBAcGFyYW0gc291cmNlVGV4dCB0aGUgc291cmNlIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdGFydE9mZnNldCB0aGUgYmVnaW5uaW5nIG9mZnNldCBvZiB0aGUgc3RyaW5nIHdoZXJlIHRoZSBjdXJzb3IKICAgICAqIHN0YXJ0cyB0aGUgaXRlcmF0aW5nLgogICAgICogQHBhcmFtIGVuZE9mZnNldCB0aGUgZW5kaW5nIG9mZnNldCBvZiB0aGUgc3RyaW5nIHdoZXJlIHRoZSBjdXJzb3IKICAgICAqIHN0b3BzIHRoZSBpdGVyYXRpbmcuCiAgICAgKiBAcGFyYW0gb3JkZXIgdGhlIGNvbGxhdGlvbiBvYmplY3QuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IoICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgc291cmNlVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBSdWxlQmFzZWRDb2xsYXRvciogIG9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgICogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGNvbnN0cnVjdG9yLiAgVGhpcyB0YWtlcyB0aGUgc291cmNlIHN0cmluZyBhbmQKICAgICAqIHRoZSBjb2xsYXRpb24gb2JqZWN0LiAgVGhlIGN1cnNvciB3aWxsIHdhbGsgdGhydSB0aGUgc291cmNlIHN0cmluZyBiYXNlZAogICAgICogb24gdGhlIHByZWRlZmluZWQgY29sbGF0aW9uIHJ1bGVzLiAgSWYgdGhlIHNvdXJjZSBzdHJpbmcgaXMgZW1wdHksCiAgICAgKiBOVUxMT1JERVIgd2lsbCBiZSByZXR1cm5lZCBvbiB0aGUgY2FsbHMgdG8gbmV4dCgpLgogICAgICogQHBhcmFtIHNvdXJjZVRleHQgdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiBAcGFyYW0gc3RhcnRPZmZzZXQgdGhlIGJlZ2lubmluZyBvZmZzZXQgb2YgdGhlIHN0cmluZyB3aGVyZSB0aGUgY3Vyc29yCiAgICAgKiBzdGFydHMgdGhlIGl0ZXJhdGluZy4KICAgICAqIEBwYXJhbSBlbmRPZmZzZXQgdGhlIGVuZGluZyBvZmZzZXQgb2YgdGhlIHN0cmluZyB3aGVyZSB0aGUgY3Vyc29yCiAgICAgKiBzdG9wcyB0aGUgaXRlcmF0aW5nLgogICAgICogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb2JqZWN0LgogICAgICogQHN0YWJsZQogICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKCAgIGNvbnN0ICAgIENoYXJhY3Rlckl0ZXJhdG9yJiAgc291cmNlVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBSdWxlQmFzZWRDb2xsYXRvciogIG9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpOwogICAgLyoqCiAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9yCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIGNvbnN0ICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKTsKcHVibGljOgogICAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICogQHN0YWJsZQogICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKGNvbnN0ICBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKTsKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBwcml2YXRlcwogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KcHJpdmF0ZToKICAgIC8qKgogICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigpOwogICAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKGNvbnN0IFJ1bGVCYXNlZENvbGxhdG9yKiBvcmRlcik7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBvcmRlcmluZyBwcmlvcml0eSBvZiB0aGUgbmV4dCBjb250cmFjdGluZyBjaGFyYWN0ZXIgaW4gdGhlCiAgICAgKiBzdHJpbmcuCiAgICAgKiBAcGFyYW0gY2ggdGhlIHN0YXJ0aW5nIGNoYXJhY3RlciBvZiBhIGNvbnRyYWN0aW5nIGNoYXJhY3RlciB0b2tlbgogICAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMuCiAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNvbnRyYWN0aW5nIGNoYXJhY3RlcidzIG9yZGVyaW5nLiAgUmV0dXJucyBOVUxMT1JERVIKICAgICAqIGlmIHRoZSBlbmQgb2Ygc3RyaW5nIGlzIHJlYWNoZWQuCiAgICAgKi8KICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBuZXh0Q29udHJhY3RDaGFyKCAgIFVDaGFyMzIgICAgIGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBvcmRlcmluZyBwcmlvcml0eSBvZiB0aGUgcHJldmlvdXMgY29udHJhY3RpbmcgY2hhcmFjdGVyIGluIHRoZQogICAgICogc3RyaW5nLgogICAgICogQHBhcmFtIGNoIHRoZSBzdGFydGluZyBjaGFyYWN0ZXIgb2YgYSBjb250cmFjdGluZyBjaGFyYWN0ZXIgdG9rZW4KICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgY29udHJhY3RpbmcgY2hhcmFjdGVyJ3Mgb3JkZXJpbmcuICBSZXR1cm5zIE5VTExPUkRFUgogICAgICogaWYgdGhlIHN0YXJ0IG9mIHN0cmluZyBpcyByZWFjaGVkLgogICAgICovCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgcHJldkNvbnRyYWN0Q2hhciggICBVQ2hhcjMyICAgICBjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmICBzdGF0dXMpOwogICAgCiAgICBpbmxpbmUgc3RhdGljIFVCb29sIGlzVGhhaVByZVZvd2VsKFVDaGFyMzIgY2gpOwogICAgICAgICAgICAgICAgIAogICAgaW5saW5lIHN0YXRpYyBVQm9vbCBpc1RoYWlCYXNlQ29uc29uYW50KFVDaGFyMzIgY2gpOwogICAgICAgICAgICAgICAgIAogICAgVmVjdG9yT2ZJbnQqIG1ha2VSZW9yZGVyZWRCdWZmZXIoVUNoYXIgY29sRmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxhc3RWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mSW50KiBsYXN0RXhwYW5zaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgZm9yd2FyZCwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICBmcmllbmQgIGNsYXNzICAgUnVsZUJhc2VkQ29sbGF0b3I7CiAgICBzdGF0aWMgIGNvbnN0ICAgaW50MzJfdCAgICAgICAgIFVOTUFQUEVEQ0hBUlZBTFVFOwoKICAgICAgICAgICAgTm9ybWFsaXplciogICAgICAgICAgICB0ZXh0OyAgICAgICAvLyBvd25pbmcgCgogICAgICAgICAgICBWZWN0b3JPZkludCogICAgICAgIGJ1ZmZlckFsaWFzOyAvLyBub3Qgb3duZWQKCiAgICAvKioKICAgICAqIG93bkJ1ZmZlciB3YW50cyB0byBiZSBhIHN1Ym9iamVjdCwgbm90IGEgcG9pbnRlciwgYnV0IHRoYXQKICAgICAqIG1lYW5zIGV4cG9zaW5nIHRoZSBpbnRlcm5hbCBjbGFzcyBWZWN0b3JPZkludCBieSAjaW5jbHVkaW5nIHRoZQogICAgICogaW50ZXJuYWwgaGVhZGVyICJ0YWJsZXMuaCIgLS0gbm90IGFsbG93ZWQhICBvd25CdWZmZXIgaXMgYQogICAgICogZml4ZWQtc2l6ZSAyLWVsZW1lbnQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBoYW5kbGUgVGhhaQogICAgICogY29sbGF0aW9uOyBidWZmZXJBbGlhcyBwb2ludHMgdG8gb3duQnVmZmVyIGluIHNvbWUgc2l0dWF0aW9ucy4KICAgICAqIFtqMTU5IC0gYWxpdV0KICAgICAqLwogICAgICAgICAgICBWZWN0b3JPZkludCogICAgICAgIG93bkJ1ZmZlcjsKCiAgICAvKioKICAgICAqIHJlb3JkZXJCdWZmZXIgaXMgY3JlYXRlZCBvbiBkZW1hbmQsIHNvIGl0IGRvZXNuJ3Qgd2FudCB0byBiZQogICAgICogYSBzdWJvYmplY3QgLS0gcG9pbnRlciBpcyBmaW5lLiAgSXQgaXMgY3JlYXRlZCBhbmQgYnVmZmVyQWxpYXMKICAgICAqIGlzIHNldCB0byBpdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuICBPbmNlIGNyZWF0ZWQsIGl0IGlzCiAgICAgKiByZXVzZWQgZm9yIHRoZSBsaWZlIG9mIHRoaXMgb2JqZWN0LiAgQmVjYXVzZSBvZiB0aGUgaW1wbGVtZW50YXRpb24KICAgICAqIG9mIFZlY3Rvck9mSW50LCBpdCBncm93cyBtb25vdG9uaWNhbGx5LiAgW2oxNTkgLSBhbGl1XQogICAgICovCiAgICAgICAgICAgIFZlY3Rvck9mSW50KiAgICAgICAgcmVvcmRlckJ1ZmZlcjsKCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgZXhwSW5kZXg7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgICAgICAga2V5OwogICAgY29uc3QgICBSdWxlQmFzZWRDb2xsYXRvciogIG9yZGVyQWxpYXM7Cn07CgoKLyoqCiAqIEdldCB0aGUgcHJpbWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIKICogQHJldHVybiB0aGUgcHJpbWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICovCmlubGluZSBpbnQzMl90CkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6cHJpbWFyeU9yZGVyKGludDMyX3Qgb3JkZXIpCnsKICAgIG9yZGVyICY9IFJ1bGVCYXNlZENvbGxhdG9yOjpQUklNQVJZT1JERVJNQVNLOwogICAgcmV0dXJuIChvcmRlciA+PiBSdWxlQmFzZWRDb2xsYXRvcjo6UFJJTUFSWU9SREVSU0hJRlQpOwp9Ci8qKgogKiBHZXQgdGhlIHNlY29uZGFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIKICogQHJldHVybiB0aGUgc2Vjb25kYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogKi8KaW5saW5lIGludDMyX3QKQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpzZWNvbmRhcnlPcmRlcihpbnQzMl90IG9yZGVyKQp7CiAgICBvcmRlciA9IG9yZGVyICYgUnVsZUJhc2VkQ29sbGF0b3I6OlNFQ09OREFSWU9SREVSTUFTSzsKICAgIHJldHVybiAob3JkZXIgPj4gUnVsZUJhc2VkQ29sbGF0b3I6OlNFQ09OREFSWU9SREVSU0hJRlQpOwp9Ci8qKgogKiBHZXQgdGhlIHRlcnRpYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogKiBAcGFyYW0gb3JkZXIgdGhlIGNvbGxhdGlvbiBvcmRlcgogKiBAcmV0dXJuIHRoZSB0ZXJ0aWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICovCmlubGluZSBpbnQzMl90CkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6dGVydGlhcnlPcmRlcihpbnQzMl90IG9yZGVyKQp7CiAgICByZXR1cm4gKG9yZGVyICY9IFJ1bGVCYXNlZENvbGxhdG9yOjpURVJUSUFSWU9SREVSTUFTSyk7Cn0KCmlubGluZSBpbnQzMl90CkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6Z2V0TWF4RXhwYW5zaW9uKGludDMyX3Qgb3JkZXIpIGNvbnN0CnsKICAgIHJldHVybiBvcmRlckFsaWFzLT5nZXRNYXhFeHBhbnNpb24ob3JkZXIpOwp9CgppbmxpbmUgVUJvb2wKQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjppc0lnbm9yYWJsZShpbnQzMl90IG9yZGVyKQp7CiAgICByZXR1cm4gKHByaW1hcnlPcmRlcihvcmRlcikgPT0gMCk7Cn0KCi8qKgogKiBEZXRlcm1pbmUgaWYgYSBjaGFyYWN0ZXIgaXMgYSBUaGFpIHZvd2VsICh3aGljaCBzb3J0cyBhZnRlcgogKiBpdHMgYmFzZSBjb25zb25hbnQpLgogKi8KaW5saW5lIFVCb29sIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6aXNUaGFpUHJlVm93ZWwoVUNoYXIzMiBjaCkgewogICAgcmV0dXJuICgodWludDMyX3QpY2ggLSAweGU0MCkgPD0gKDB4ZTQ0IC0gMHhlNDApOwp9CgovKioKICogRGV0ZXJtaW5lIGlmIGEgY2hhcmFjdGVyIGlzIGEgVGhhaSBiYXNlIGNvbnNvbmFudAogKi8KaW5saW5lIFVCb29sIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6aXNUaGFpQmFzZUNvbnNvbmFudChVQ2hhcjMyIGNoKSB7CiAgICByZXR1cm4gKCh1aW50MzJfdCljaCAtIDB4ZTAxKSA8PSAoMHhlMmUgLSAweGUwMSk7Cn0KCiNlbmRpZgo=