LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRmlsZSB0Y29sZGF0YS5oCi8vCi8vIEludGVybmFsIGZpbGUuICBEZWZpbmVzIFRhYmxlQ29sbGF0aW9uRGF0YSwgYW4gaW50ZXJuYWwgY2xhc3Mgd2hpY2ggaXMgc2hhcmVkCi8vIGJ5IFRhYmxlQ29sbGF0aW9uIG9iamVjdHMsIGFuZCB3aGljaCBjb250YWlucyBhbGwgdGhlIGludmFyaWFudCAoYW5kIGxhcmdlKQovLyBwaWVjZXMgb2YgZGF0YS4gIE9uY2UgY3JlYXRlZCwgVGFibGVDb2xsYXRpb25EYXRhIG9iamVjdHMgZG8gbm90IGNoYW5nZS4KLy8KLy8gQ3JlYXRlZCBieTogQWxhbiBMaXUKLy8KLy8gTW9kaWZpY2F0aW9uIEhpc3Rvcnk6Ci8vCi8vICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgovLyAgMi81Lzk3ICAgICAgYWxpdSAgICAgICAgQ3JlYXRpb24uCi8vICAzLzUvOTcgICAgICBhbGl1ICAgICAgICBEb24ndCBzdHJlYW0gcnVsZSB0YWJsZSBpbiBvciBvdXQuICBBZGRlZCBkYXRhIG1lbWJlcnMKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGlzUnVsZVRhYmxlTG9hZGVkLCBkZXNpcmVkTG9jYWxlLCBhbmQgcmVhbExvY2FsZU5hbWUsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBhcmUgcmVxdWlyZWQgZm9yIGR5bmFtaWMgcmVsb2FkaW5nIG9mIHRoZSBydWxlCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuICBXZSBzdGlsbCBrZWVwIHJ1bGVzIGluIHRoaXMgb2JqZWN0IHNvIHRoYXQKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY2FuIGJlIGhlbGQgaW4gdGhlIGluLW1lbW9yeSBjYWNoZS4KLy8gIDMvMjYvOTcgICAgIGhlbGVuYSAgICAgIFVwZGF0ZWQgd2l0aCBwbGF0Zm9ybSBpbmRlcGVuZGVudCBkYXRhIHR5cGVzLgovLyAgNi8yMC85NyAgICAgaGVsZW5hICAgICAgSmF2YSBjbGFzcyBuYW1lIGNoYW5nZS4KLy8gIDgvMTgvOTcgICAgIGhlbGVuYSAgICAgIEFkZGVkIGludGVybmFsIEFQSSBkb2N1bWVudGF0aW9uLgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgVENPTERBVEFfSAojZGVmaW5lIFRDT0xEQVRBX0gKCiNpbmNsdWRlICJ1Y21wMzIuaCIKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCiNpbmNsdWRlICJjb2xjYWNoZS5oIgojaW5jbHVkZSAidW5pY29kZS91bmlzdHIuaCIKI2luY2x1ZGUgInVuaWNvZGUvbG9jaWQuaCIKI2luY2x1ZGUgImZpbGVzdHJtLmgiCiNpbmNsdWRlICJ1bWVtc3RybS5oIgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlOwpjbGFzcyBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlOwpjbGFzcyBSdWxlQmFzZWRDb2xsYXRvcjsKY2xhc3MgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLyoqCiAqIFRhYmxlQ29sbGF0aW9uRGF0YSBpcyBhbiBpbnRlcm5hbCBjbGFzcyB1c2VkIGJ5IFRhYmxlQ29sbGF0aW9uLiAgSXQKICogZW5jYXBzdWxhdGVzIG1vc3Qgb2YgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgVGFibGVDb2xsYXRpb24uCiAqIFRoaXMgaW5jbHVkZXMgdGhlIGxhcmdlIGNvbGxhdGlvbiB0YWJsZXMsIGluY2x1ZGluZyB0aGUgY29udHJhY3QKICogb3JkZXIgYW5kIGV4cGFuZCBvcmRlciB0YWJsZXMsIGFuZCBzb21lIHNtYWxsIHBpZWNlcyBvZiBkYXRhIHRoYXQKICogZG9uJ3QgY2hhbmdlLCBzdWNoIGFzIHRoZSBtYXhpbXVtIHNlY29uZGFyeSBvcmRlci4gIFRoZSBnZW5lcmFsCiAqIGlkZWEgaXMgdGhhdCB0aGUgVGFibGVDb2xsYXRpb24gb2JqZWN0IHNob3VsZCBiZSBhIGxpZ2h0d2VpZ2h0CiAqIG9iamVjdC4gIElmIHRoZXJlIGFyZSB0d28gVGFibGVDb2xsYXRpb24gb2JqZWN0cywgdGhleSB3aWxsIGVhY2ggYmUKICogdmVyeSBzbWFsbCwgYW5kIHVzZXJzIGNhbiBhbHRlciB0aGUgc3RyZW5ndGggb2YgZWFjaCBvYmplY3QKICogaW5kZXBlbmRlbnRseS4gIEhvd2V2ZXIsIGJvdGggb2JqZWN0cywgaWYgdGhleSBhcmUgcmVmZXJpbmcgdG8gdGhlCiAqIHNhbWUgdW5kZXJseWluZyBjb2xsYXRpb24sIHdpbGwgc2hhcmUgcG9pbnRlcnMgdG8gdGhlIHNhbWUKICogVGFibGVDb2xsYXRpb25EYXRhIG9iamVjdCwgd2hpY2ggZG9lc24ndCBjaGFuZ2UuICA8UD4KICogVGFibGVDb2xsYXRpb25EYXRhIG9iamVjdHMgYXJlIHRoZXJlZm9yZSBnb29kIGNhbmRpZGF0ZXMgZm9yCiAqIGNhY2hpbmcgaW4gbWVtb3J5IGFuZCBwb3RlbnRpYWxseSBmb3IgcmVmZXJlbmNlIGNvdW50aW5nLiAgKi8KY2xhc3MgVGFibGVDb2xsYXRpb25EYXRhCnsKcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlQ29sbGF0aW9uRGF0YSgpOwogICAgdmlydHVhbCAgICAgICAgICAgICAgICAgICAgIH5UYWJsZUNvbGxhdGlvbkRhdGEoKTsKCiAgICAvKioKICAgICAqIENhY2hlIGludGVyZmFjZS4gIFRoZSBjYWNoZSB1c2VzIFVuaWNvZGVTdHJpbmcgb2JqZWN0cyBhcyBrZXlzLiAgVGhlc2UKICAgICAqIGFyZSBjb21wbGV0ZWx5IGFyYml0cmFyeSwgYnV0IGFyZSB1c3VhbGx5IHNvbWV0aGluZyB1bmlxdWVseSBhc3NvY2lhdGVkCiAgICAgKiB3aXRoIGVhY2ggY29sbGF0aW9uLCB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIGZhaXJseSBzbWFsbCwgc3VjaCBhcyBhCiAgICAgKiBsb2NhbGUgaWRlbnRpZmllciBzdHJpbmcuCiAgICAgKiA8UD4gQWRkcyB0aGUgY29sbGF0aW9uIGRhdGEgb2JqZWN0IHRvIHRoZSBjYWNoZSBsaXN0LgogICAgICogQHBhcmFtIGtleSB0aGUgdW5pcXVlIGtleSBvZiB0aGUgYXNzb2NpYXRlZCBjb2xsYXRpb24gZGF0YSBvYmplY3QuCiAgICAgKiBAcGFyYW0gZGF0YSB0aGUgY29sbGF0aW9uIGRhdGEgb2JqZWN0LgogICAgICovCiAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICAgICAgYWRkVG9DYWNoZShjb25zdCBVbmljb2RlU3RyaW5nJiBrZXksIFRhYmxlQ29sbGF0aW9uRGF0YSogZGF0YSk7CiAgICAvKioKICAgICAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBjYWNoZWQgY29sbGF0aW9uIGRhdGEuCiAgICAgKiBAcGFyYW0ga2V5IHRoZSB1bmlxdWUga2V5IG9mIHRoZSBhc3NvY2lhdGVkIGNvbGxhdGlvbiBkYXRhIG9iamVjdC4KICAgICAqIEByZXR1cm5zIHRoZSBmb3VuZCBjb2xsYXRpb24gZGF0YSBvYmplY3QuCiAgICAgKi8KICAgIHN0YXRpYyAgVGFibGVDb2xsYXRpb25EYXRhKiBmaW5kSW5DYWNoZShjb25zdCBVbmljb2RlU3RyaW5nJiBrZXkpOwoKICAgIC8qKgogICAgICogVGhlIHN0cmVhbUluIGFuZCBzdHJlYW1PdXQgbWV0aG9kcyByZWFkIGFuZCB3cml0ZSBvYmplY3RzIG9mIHRoaXMKICAgICAqIGNsYXNzIGFzIGJpbmFyeSwgcGxhdGZvcm0tZGVwZW5kZW50IGRhdGEgaW4gdGhlIGlvc3RyZWFtLiAgVGhlIHN0cmVhbQogICAgICogbXVzdCBiZSBpbiBpb3M6OmJpbmFyeSBtb2RlIGZvciB0aGlzIHRvIHdvcmsuICBUaGVzZSBtZXRob2RzIGFyZSBub3QKICAgICAqIGludGVuZGVkIGZvciBnZW5lcmFsIHB1YmxpYyB1c2U7IHRoZXkgYXJlIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbXByb3ZlCiAgICAgKiBwZXJmb3JtYW5jZSBieSBzdG9yaW5nIGNlcnRhaW4gb2JqZWN0cyBpbiBiaW5hcnkgZmlsZXMuCiAgICAgKi8KICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdHJlYW1JbihGaWxlU3RyZWFtKiBpcyk7CiAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3RyZWFtT3V0KEZpbGVTdHJlYW0qIG9zKSBjb25zdDsKCiAgICAvKioKICAgICAqIEZvciBpbnRlcm5hbCB1c2Ugb25seSAtIHN0cmVhbWluZyB0byBtZW1vcnkKICAgICAqLwogICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0cmVhbUluKFVNZW1vcnlTdHJlYW0qIGlzKTsKICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdHJlYW1PdXQoVU1lbW9yeVN0cmVhbSogb3MpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyBvYmplY3QgaXMgdmFsaWQuCiAgICAgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBvYmplY3QgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICAgICAgVUJvb2wgICAgICAgICAgICAgIGlzQm9ndXMoKSBjb25zdDsKcHJpdmF0ZToKICAgIC8qKgogICAgICogVGhlIGZvbGxvd2luZyBhcmUgZGlzYWxsb3dlZCBvcGVyYXRpb25zOiBub3QgaW1wbGVtZW50ZWQuCiAgICAgKi8KICAgIFRhYmxlQ29sbGF0aW9uRGF0YShjb25zdCBUYWJsZUNvbGxhdGlvbkRhdGEmKTsKICAgIFRhYmxlQ29sbGF0aW9uRGF0YSYgb3BlcmF0b3I9KGNvbnN0IFRhYmxlQ29sbGF0aW9uRGF0YSYpOwoKcHJpdmF0ZToKICAgIC8vIERvIG5vdCBhY2Nlc3MgdGhlIGZnQ2FjaGUgb2JqZWN0IGRpcmVjdGx5OyB1c2UgYWRkVG9DYWNoZSBhbmQgZmluZEluQ2FjaGUuCiAgICBzdGF0aWMgIENvbGxhdGlvbkNhY2hlICAgICAgZmdDYWNoZTsKCnByaXZhdGU6CiAgICAvKioKICAgICAqIFRoZSBUYWJsZUNvbGxhdGlvbiBjbGFzcyBmcmVlbHkgbWFuaXB1bGF0ZXMgdGhlIGRhdGEgbWVtYmVycyB3aXRoaW4gYQogICAgICogVGFibGVDb2xsYXRpb25EYXRhIG9iamVjdC4gIFRoaXMgaXMgYmVjYXVzZSBUYWJsZUNvbGxhdGlvbkRhdGEgaXMKICAgICAqIGludGVuZGVkIHRvIGJlIGFuIGludGVybmFsLCBpbnZpc2libGUgaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgSWYKICAgICAqIFRhYmxlQ29sbGF0aW9uRGF0YSBldmVyeSBiZWNvbWVzIGEgbW9yZSBwdWJsaWMgQVBJLCB0aGVuIHRoaXMgd2lsbCBoYXZlCiAgICAgKiB0byBjaGFuZ2UsIGFsdGhvdWdoIHRoaXMgaXMgbm90IHJlYWxseSBhZHZpc2VkLgogICAgICovCiAgICBmcmllbmQgY2xhc3MgUnVsZUJhc2VkQ29sbGF0b3I7CiAgICBmcmllbmQgY2xhc3MgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOwoKICAgIFVCb29sICAgICAgICAgICAgICAgICAgICAgIGlzRnJlbmNoU2VjOwogICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgIG1heFNlY09yZGVyOwogICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgIG1heFRlck9yZGVyOwogICAgQ29tcGFjdEludEFycmF5KiAgICAgICAgICAgIG1hcHBpbmc7CiAgICBWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGUqICAgY29udHJhY3RUYWJsZTsKICAgIFZlY3Rvck9mUFRvRXhwYW5kVGFibGUqICAgICBleHBhbmRUYWJsZTsKICAgIFVCb29sICAgICAgICAgICAgICAgICAgICAgIGZCb2d1czsKCiAgICAvKioKICAgICAqIFJ1bGUgc3RyaW5nIGRhdGEgaXMgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IHdoZW4gcmVxdWlyZWQgYnkgdGhlIFRhYmxlQ29sbGF0aW9uCiAgICAgKiBvYmplY3QuICBJbiBwYXJ0aWN1bGFyLCB3aGVuIGEgYmluYXJ5IGZpbGUgaXMgY3JlYXRlZCwgdGhlIHJ1bGUgZGF0YSBpcwogICAgICogbm90IHN0cmVhbWVkIG91dCAtLSB0aGlzIGtlZXBzIHRoZSBiaW5hcnkgZmlsZSBzbWFsbC4gIEhvd2V2ZXIsIHR3byBwaWVjZXMKICAgICAqIG9mIGRhdGEgYXJlIGtlcHQgYXJvdW5kICh0aGUgZGVzaXJlZExvY2FsZSBhbmQgdGhlIHJlYWxMb2NhbGVOYW1lKSB3aGljaAogICAgICogYWxsb3cgbGF0ZXIgbG9hZGluZyBvZiB0aGUgcnVsZSBzdHJpbmcgZWZmaWNpZW50bHkuICBCeSBlZmZpY2llbnRseSwgd2UgbWVhbgogICAgICogdGhhdCB0aGUgdXN1YWwgc2VhcmNoIHByb2NlZHVyZSBpcyBzaG9ydGVuZWQsIGFuZCB0aGUgZmluYWwgZmlsZSB3aGljaAogICAgICogYWN0dWFsbHkgbGVkIHRvIHRoZSBzdWNjZXNzZnVsIGxvYWRpbmcgb2YgdGhlIGNvbGxhdGlvbiBlbGVtZW50cyBpcyBhY2Nlc3NlZAogICAgICogZGlyZWN0bHkuICBUaGUgYm9vbGVhbiBpc1J1bGVUYWJsZUxvYWRlZCBhbGxvd3MgdGhlIGNvbGxhdGlvbiBvYmplY3QgdG8KICAgICAqIGtub3cgd2hldGhlciBydWxlcyBoYXZlIGJlZW4gbG9hZGVkIChhbiBhbHRlcm5hdGl2ZSBpcyB0byB1c2UgYW4gZW1wdHkKICAgICAqIHJ1bGVUYWJsZSB0byBpbmRpY2F0ZSB0aGlzLCBidXQgdGhpcyB0aGVuIGRpc2FsbG93cyB0aGUgZW1wdHkgc3RyaW5nIGFzCiAgICAgKiBhIHZhbGlkIHJ1bGUgc3RyaW5nKS4gIE5vdGUgdGhhdCB3aGVuIGEgY29sbGF0aW9uIGlzIGNvbnN0cnVjdGVkICJmcm9tCiAgICAgKiBzY3JhdGNoIiAobm90IGxvYWRlZCBmcm9tIGEgYmluYXJ5IGZpbGUpLCB0aGUgcnVsZSB0YWJsZSBpcyBhbHJlYWR5IGluIHBsYWNlLAogICAgICogYW5kIGlzUnVsZVRhYmxlTG9hZGVkIGlzIHNldCB0byB0cnVlLgogICAgICoKICAgICAqIFNlZSBSdWxlQmFzZWRDb2xsYXRvcjo6Z2V0UnVsZXMoKS4KICAgICAqLwogICAgVW5pY29kZVN0cmluZyAgICAgICAgICAgICAgIHJ1bGVUYWJsZTsKICAgIFVCb29sICAgICAgICAgICAgICAgICAgICAgIGlzUnVsZVRhYmxlTG9hZGVkOwogICAgTG9jYWxlICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRMb2NhbGU7CiAgICBVbmljb2RlU3RyaW5nICAgICAgICAgICAgICAgcmVhbExvY2FsZU5hbWU7Cn07CgojZW5kaWYgLy9fVENPTERBVEEKLy9lb2YK