MjAwMy0wMS0yMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYyLjAuMjIuCgogICAgICAgICogQWRkZWQgTGlzdExvY2tzUGx1Z2luIGZvciBhZG1pbnMuCgogICAgICAgICogdjIuMC4yMS4KCiAgICAgICAgKiBBZGRlZCBhIEpESzEuNCAtc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW5wdXQgZW5jb2RpbmcgZGV0ZWN0b3IKICAgICAgICB0byBGaWxlVXRpbC4gIFRoaXMgYWxzbyBtZWFucyB0aGF0IEpTUFdpa2kgY2FuIG5vIGxvbmdlciBiZQogICAgICAgIGNvbXBpbGVkIHVzaW5nIGEgMS4zIGNvbXBpbGVyIGFueW1vcmUuICBJdCB3aWxsIHJ1biBvbiAxLjMgc3lzdGVtcwogICAgICAgIGhvd2V2ZXIsIHVubGVzcyBzb21ldGhpbmcgaXMgYW1pc3MuCgoyMDAzLTAxLTE5ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgoJKiB2Mi4wLjIwLgoJCiAgICAgICAgKiBGaXhlZCBhIGNvdXBsZSBvZiBXaW5kb3dzIHRlc3RzIGZhaWxpbmcuICBUaGlzIHVuZm9ydHVuYXRlbHkKCW1lYW5zIHRoYXQgYWxsIGF0dGFjaG1lbnRzIGFyZSBub3cgcmVuYW1lZCBpbiBhIGJpdCBvZiBhIGRpZmZlcmVudAoJd2F5IChhIC1kaXIpIGlzIGF0dGFjaGVkIHRvIHRoZSBhdHRhY2htZW50IG5hbWUuICBZb3Ugd2lsbCBuZWVkIHRvCgljaGFuZ2UgeW91ciBvbGQgYXR0YWNobWVudCBuYW1lcyAobXYgYXR0YWNobWVudC8KCWF0dGFjaG1lbnQtZGlyLykuICBIb3dldmVyLCB0aGVyZSBpcyBhIGJ1aWx0LWluIG1pZ3JhdGlvbiBjb2RlLAoJYnV0IHlvdSBzdGlsbCBzaG91bGQgdG8gdGhlIGNoYW5nZS4KCiAgICAgICAgKiB2Mi4wLjE5LgoKICAgICAgICAqIEJyb2tlIFdpa2lBdHRhY2htZW50UHJvdmlkZXIgYXMgd2VsbCB3aXRoIGRlbGV0ZVBhZ2UoKSBhbmQKICAgICAgICBkZWxldGVWZXJzaW9uKCkuCgogICAgICAgICogQWRkZWQgQnJlYWRjcnVtYnMgdGFnIGZyb20gS2VuIExpdS4gIFRoZSBkZWZhdWx0IHRlbXBsYXRlIG5vdwogICAgICAgIGFsc28gaW5jbHVkZXMgaXQuCgogICAgICAgICogdjIuMC4xOC4KCiAgICAgICAgKiBCcm9rZSBXaWtpUGFnZVByb3ZpZGVyIGJ5IGFkZGluZyBkZWxldGVQYWdlKCkgYW5kCiAgICAgICAgZGVsZXRlVmVyc2lvbigpIG1ldGhvZHMuCgogICAgICAgICogRml4ZWQgYSBtdWx0aXR1ZGUgb2YgYnVncyBpbiB0aGUgdGVzdHMsIGNvdXJ0ZXN5IG9mIFRvcnN0ZW4KICAgICAgICBIaWxkZWJyYW5kdC4gIEZvciBleGFtcGxlLCAiYW50IGd1aXRlc3RzIiBzaG91bGQgd29yayBub3cuCgo+Pj4+Pj4+IDEuMjcwCjIwMDMtMDEtMTcgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2Mi4wLjE3LgoKICAgICAgICAqIFBsdWdpbiBwYXJzaW5nIGlzIG5vdyBzdG9wcGVkIGF0IH1dIGluc3RlYWQgb2YgXS4gIFN1Z2dlc3RlZCBieQogICAgICAgIEFsYWluIFJhdmV0IGFuZCBzZXZlcmFsIG90aGVyIHBlcnNvbnMuCgoyMDAzLTAxLTE0ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjIuMC4xNi4KCiAgICAgICAgKiBDaGFuZ2VkIHRoZSBXaWtpUGFnZVByb3ZpZGVyIGFuZCBXaWtpQXR0YWNobWVudFByb3ZpZGVyCiAgICAgICAgaW50ZXJmYWNlczogZ2V0VmVyc2lvbkhpc3RvcnkoKSBzaG91bGQgbm93IGFsd2F5cyByZXR1cm4gYSBMaXN0CiAgICAgICAgaW5zdGVhZCBvZiBDb2xsZWN0aW9uLiAgQWxsIHByb3ZpZGVycyBkaWQgdGhpcyBhbnl3YXksIGJ1dCBmb3IKICAgICAgICBzb21lIHN0cmFuZ2UgcmVhc29uIEkgbmV2ZXIgcmVtZW1iZXJlZCB0byB1cGRhdGUgdGhlIHJldHVybiB0eXBlLgogICAgICAgIExvZ2ljYWxseSBhIExpc3QgaXMgY29ycmVjdCwgc2luY2UgdGhlIHJlc3VsdCBuZWVkcyB0byBiZSBvcmRlcmVkLgogICAgICAgIFNvcnJ5IHRvIGV2ZXJ5b25lIHdob3NlIGN1c3RvbSBwcm92aWRlciBicm9rZSEKCiAgICAgICAgKiBDYWNoaW5nUHJvdmlkZXIgbm93IGNoZWNrcyB0aGUgY2FjaGUgZmlyc3Qgd2hlbiBjYWxsZWQgd2l0aAogICAgICAgIHBhZ2VFeGlzdHMoKS4gIFN1Z2dlc3RlZCBieSBTdWxrYSBIYXJvLgoKICAgICAgICAqIFJlbW92ZWQgYSBjb3VwbGUgb2YgZGVwcmVjYXRlZCBtZXRob2RzIGZyb20gV2lraUVuZ2luZS4KCjIwMDMtMDEtMTIgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2Mi4wLjE1LgoKICAgICAgICAqIEFkZGVkIG5ldyB2YXJpYWJsZSAidXB0aW1lIiwgYW5kIFdpa2lFbmdpbmUuZ2V0U3RhcnRUaW1lKCkuCgoyMDAzLTAxLTExICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjIuMC4xNC4KCiAgICAgICAgKiBTZWFyY2hSZXN1bHRJdGVyYXRvclRhZyB3b3VsZCBjcmFzaCBpZiB5b3UgaGl0ICJyZWxvYWQiLiAgVGhpcwogICAgICAgIHdhcyBiZWNhdXNlIHRoZSBjb3VudGVyIHdvdWxkIG5ldmVyIGdldCByZXNldCBiZXR3ZWVuIHR3bwogICAgICAgIGNvbnNlY3V0aXZlIHJlZnJlc2hlcywgYW5kIFRvbWNhdCA0IHBvb2xzIHRhZ3MuCgoyMDAzLTAxLTEwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjIuMC4xMy4KCiAgICAgICAgKiBXZWJsb2dQbHVnaW4gYW5kIENhbGVuZGFyVGFnIGVuaGFuY2VkIHRvIHdvcmsgZXZlbiBiZXR0ZXIKICAgICAgICB0b2dldGhlcjogV2VibG9nUGx1Z2luIHN1cHBvcnRzIG5vdyB0aGUgJ3N0YXJ0RGF0ZScgcGFyYW1ldGVyLAogICAgICAgIHdoZXJlYXMgQ2FsZW5kYXJUYWcgc3VwcG9ydHMgYW4gJ3VybGZvcm1hdCcgcGFyYW1ldGVyLgoKICAgICAgICAqIFdpa2lDb250ZXh0IG5vdyBzdG9yZXMgdGhlIGluY29taW5nIEhUVFAgcmVxdWVzdCBhcyB3ZWxsLiAgVGhpcwogICAgICAgIGFsbG93cyB5b3UgdG8gd3JpdGUgcGx1Z2lucyB0aGF0IGNhbiByZWFkIHRoZSBIVFRQIHBhcmFtZXRlcnMgYXMKICAgICAgICB3ZWxsLCBmb3IgZXhhbXBsZS4gIFBsZWFzZSBzZWUgdGhlIG5vdGUgaW4KICAgICAgICBXaWtpQ29udGV4dC5nZXRIdHRwUGFyYW1ldGVyKCkuIAoKMjAwMy0wMS0wOCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEFkZGVkIENhbGVuZGFyVGFnLiAgSXQncyBzdGlsbCBpbiBpdHMgdmVyeSBpbmZhbmN5LCBzbyBpdCBtaWdodAogICAgICAgIG5vdCBiZSB2ZXJ5IHVzZWZ1bCB0byBvdGhlcnMuCgoyMDAzLTAxLTA1ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjIuMC4xMi4KCiAgICAgICAgKiBEaWZmLmpzcCBkaWQgbm90IHVzZSB0aGUgdGVtcGxhdGVEaXIgcHJvcGVydHkgY29ycmVjdGx5LiAgT29wcy4KICAgICAgICBSZXBvcnRlZCBieSBSb2JlcnQgTWNHb3Zlcm4uCgogICAgICAgICogQWRkZWQgRXhwaXJlcywgTGFzdC1Nb2RpZmllZCwgYW5kIENhY2hlLUNvbnRyb2wgaGVhZGVycyB0bwogICAgICAgIEVkaXQuanNwIHJlc3BvbnNlcyAtIHRoaXMgc2hvdWxkIGFsbG93IGNlcnRhaW4gdmVyc2lvbnMgb2YKICAgICAgICBJbnRlcm5ldCBFeHBsb3JlciB0byB1c2UgUHJldmlldyBjb3JyZWN0bHkuICBTdWdnZXN0ZWQgYnkgUmljaGFyZAogICAgICAgIERvbmtpbi4KCiAgICAgICAgKiBJbXBsZW1lbnRlZCBwYWdlICJsb2NraW5nIi4gIFdoZW4geW91IG5vdyBzdGFydCB0byBlZGl0IGEgcGFnZSwKICAgICAgICB0aGUgcGFnZSBpcyBtYXJrZWQgYXMgYmVpbmcgdW5kZXIgZWRpdGluZywgYW5kIHRoZSBuZXh0IGd1eSB3aWxsCiAgICAgICAgZ2V0IGEgd2FybmluZyBhYm91dCB0aGF0LiAgVG8gZmFjaWxpdGF0ZSB0aGlzLCBFZGl0LmpzcCB3YXMKICAgICAgICBjaGFuZ2VkLiAgQWxzbywgY2hlY2sgb3V0IHRoZSBuZXcgdGFncyBpbiAiRWRpdFRlbXBsYXRlLmpzcCIsIGFuZAogICAgICAgIG5vdGUgYWxzbyB0aGF0IHRoZSAiQ2FuY2VsIiBpcyBub3cgYSBidXR0b24gaW5zdGVhZCBvZiBhIGxpbmsuCiAgICAgICAgU3VnZ2VzdGVkIGJ5IE9sbGkgTG91bmVsYS4KCjIwMDMtMDEtMDMgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBXcm90ZSBzb21lIG5ldyBkb2N1bWVudGF0aW9uIGludG8gc2FtcGxlIHdpa2lwYWdlcy4KCiAgICAgICAgKiB2Mi4wLjExLgoKICAgICAgICAqIEFsbCBib29sZWFuIHR5cGUgcHJvcGVydGllcyBpbiBqc3B3aWtpLnByb3BlcnRpZXMgcmVjb2duaXplIG5vdwogICAgICAgICJvbiIgYW5kICJ5ZXMiIGFzICJ0cnVlIiBhcyB3ZWxsLgoKICAgICAgICAqIEl0IGlzIG5vdyBwb3NzaWJsZSB0byBhbGxvdyByYXcgSFRNTCBvbiBXaWtpUGFnZXMuICBCZXdhcmUsIHRoaXMKICAgICAgICBpcyBhIHZlcnkgZGFuZ2Vyb3VzIG9wdGlvbiwgc2luY2UgaXQgd2lsbCBhbGxvdyBwZW9wbGUgT1RIRVIgVEhBTgogICAgICAgIFRIRSBBRE1JTklTVFJBVE9SIHRvIG1ha2Ugd2lraXMgdGhhdCBjYW4gaHVydCB1c2Vycy4gIFJlcXVlc3RlZAogICAgICAgICh2ZXJ5IGxvdWRseSBhbmQgbWFueSB0aW1lcyA6LSkgYnkgQWxhaW4gUmF2ZXQuCgogICAgICAgICogdjIuMC4xMC4KCiAgICAgICAgKiBXZWJsb2dQbHVnaW4gY2hhbmdlZCBlbnRyeSBmb3JtYXRzLiAgQmV3YXJlLCBpZiB5b3UndmUgYmVlbgogICAgICAgIHVzaW5nIGl0IHNvIGZhci4gCgogICAgICAgICogV2lraVBhZ2Ugbm93IGltcGxlbWVudHMgQ2xvbmVhYmxlLiAgSSBoYXZlIG5vIGlkZWEgd2h5LgoKMjAwMi0xMi0yOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYyLjAuOS4KCiAgICAgICAgKiBBZGRlZCBwZXJtYWxpbmtzIHRvIFdlYmxvZ1BsdWdpbi4KCiAgICAgICAgKiBJbmRleFBsdWdpbiBlbmhhbmNlZCB0byBoYXZlIHBhcmFtZXRlcnMgImluY2x1ZGUiIGFuZCAiZXhjbHVkZSIsCiAgICAgICAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBvciBleGNsdWRlIHBhZ2VzIHVzaW5nIHN0YW5kYXJkIGdsb2IKICAgICAgICB3aWxkIGNhcmQgZXhwcmVzc2lvbnMgKCosID8sIGV0YykuCgoyMDAyLTEyLTI4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjIuMC44LgoKICAgICAgICAqIEJ1ZyBmaXg6IFZlcnNpb25pbmdGaWxlUHJvdmlkZXIgd291bGQgbWFuZ2xlIG9sZCB2ZXJzaW9ucyBvZiBhCiAgICAgICAgcGFnZSBpZiB0aGV5IHdlcmUgaW4gVVRGLTggZm9ybWF0LiAgUmVwb3J0ZWQgYnkgVG9yc3RlbgogICAgICAgIEhpbGRlYnJhbmR0LiAKCjIwMDItMTItMTggIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2Mi4wLjcuCgogICAgICAgICogQWRkZWQgbmV3IHRpdGxlIGJlYXV0aWZpZXIgY29kZSBmcm9tIFRvcnN0ZW4gSGlsZGVicmFuZHQuICBJdCdzCiAgICAgICAgYSBiaXQgZGlmZmVyZW50IGZyb20gd2hhdCB3ZSB1c2VkIHRvIGhhdmUsIGJ1dCBpdCBkb2VzIG5vdyBsZXNzCiAgICAgICAgbWlzdGFrZXMuICA6LSkuCgoyMDAyLTEyLTE2ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjIuMC42IC0gVGhlIEkgU2hvdWxkIFJlYWxseSBCZSBTbGVlcGluZyBCdXQgTGV0J3MgU2VlIElmIEtpbGxlcgogICAgICAgIENhbiBLZWVwIFVwIFdpdGggVGhpcyBQYWNlIFdpdGggSGlzIERlYmlhbiBQYWNrYWdlcyAtcmVsZWFzZS4KCiAgICAgICAgKiBJbnNwaXJhdGlvbiBjb250aW51ZXMuICBOb3cgUmVmZXJlbmNlTWFuYWdlciBhbHNvIHVuZGVyc3RhbmRzCiAgICAgICAgYWJvdXQgYXR0YWNobWVudHMsIHNvIHRoZXkgY2FuIG5vdyBiZSBjcm9zcy1yZWZlcmVuY2VkLCBiZSBvbgogICAgICAgIHVudXNlZCBvciB1bmRlZmluZWQgcGFnZXMsIGV0Yy4KCjIwMDItMTItMTUgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2Mi4wLjUuCgogICAgICAgICogUmVjZW50Q2hhbmdlcyBub3cgZGlzcGxheXMgYWxzbyBjaGFuZ2VkIGF0dGFjaG1lbnRzLiAgVGhpcyBhZGRlZAogICAgICAgIHNvbWUgbmV3IEFQSXMgaW4gV2lraUF0dGFjaG1lbnRQcm92aWRlciBhbmQgQXR0YWNobWVudE1hbmFnZXIuCgogICAgICAgICogdjIuMC40LgoKICAgICAgICAqIEJ1ZyBmaXg6IFJlc3RvcmluZyBwcmV2aW91cyB2ZXJzaW9ucyBmcm9tIGFyY2hpdmUgZGlkIG5vdCB3b3JrLgoKICAgICAgICAqIEJ1ZyBmaXg6IEF0dGVtcHRpbmcgdG8gdXBsb2FkIGEgbm9uLWV4aXN0aW5nIGZpbGUgd291bGQgY2F1c2UgYQogICAgICAgIGNyYXNoLiAgUmVwb3J0ZWQgYnkgQWxhaW4gUmF2ZXQgYW5kIFBhdWwgRG93bmVzLgoKMjAwMi0xMi0xNCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYyLjAuMy4KCiAgICAgICAgKiBCdWcgZml4OiBwcmV2aWV3aW5nIGEgbmV3IHBhZ2Ugd2l0aCBhIGZvb3Rub3RlIHdvdWxkIGNhdXNlIGEKICAgICAgICBjcmFzaC4gCgogICAgICAgICogQWRkZWQgV2lraUF0dGFjaG1lbnRzIHBhZ2UgdG8gdGhlIHNhbXBsZXBhZ2UgZGlzdHJvLgogICAgICAgIAogICAgICAgICogUmVkaXJlY3RlZCBhbGwgcmVmZXJlbmNlcyB0byBXaWtpLmpzcCBvciBFZGl0LmpzcCB0aHJvdWdoCiAgICAgICAgV2lraUVuZ2luZSBmb3IgZnV0dXJlIGNvbmZpZ3VyYWJpbGl0eS4gIFJlcXVlc3RlZCBieSBCYXJ0CiAgICAgICAgU2VsZGVycy4KCiAgICAgICAgKiBSdW5uaW5nIHRlc3RzIG5vdyBwdXRzIHRlc3QgcGFnZXMgaW50byAvdG1wL3Rlc3RyZXBvc2l0b3J5LiAgVG9vCiAgICAgICAgbWFueSBmYWxzZSBhbGVydHMgZHVlIHRvIHdyb25nIGZpbGVzIGluIC90bXAvLi4uCgogICAgICAgICogdjIuMC4yLgoKICAgICAgICAqIEJ1ZyBmaXg6IEpTUFdpa2kgbm8gbG9uZ2VyIGRpZXMgaG9ycmlibHkgd2l0aCBPdXRPZk1lbW9yeUVycm9yCiAgICAgICAgaWYgcHJlZm9ybWF0dGVkIGNvZGUgYmxvY2tzICh7e3sgfX19KSBhcmUgbm90IGNsb3NlZCBwcm9wZXJseS4KICAgICAgICBXZSBzaW1wbHkgZm9yZ290IHRvIGNoZWNrIGZvciBFT0YgOi0pLiAgUmVwb3J0ZWQgYnkgRXJpayBCdW5uLgoKICAgICAgICAqIEJ1ZyBmaXg6IENhbWVsQ2FzZSBpcyBubyBsb25nZXIgcmVjb2duaXplZCBpbnNpZGUge3t7IH19fQogICAgICAgIGJsb2Nrcy4gUmVwb3J0ZWQgYnkgVG9yc3RlbiBIaWxkZWJyYW5kdC4KCjIwMDItMTItMTEgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2Mi4wLjEuCgogICAgICAgICogQXR0YWNobWVudHMgYXJlIG5vdyBzZW50IGJhY2sgdXNpbmcgQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lCiAgICAgICAgaW5zdGVhZCBvZiBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50LiAgVGhpcyBtZWFucyB0aGF0IHRoZXkKICAgICAgICBzaG91bGQgbm93IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5IGJ5IGJyb3dzZXJzLiAgU3VnZ2VzdGVkIGJ5CiAgICAgICAgVG9yc3RlbiBIaWxkZWJyYW5kdC4KCiAgICAgICAgKiBJbnRlcndpa2kgcmVmZXJlbmNlcyB0aGF0IGxlYWQgb3V0IG9mIHRoZSB3aWtpIGFyZSBub3cgYWxzbwogICAgICAgIHRhZ2dlZCB3aXRoIHRoZSBvdXRsaW5rIGltYWdlLiAgUmVwb3J0ZWQgYnkgQWxhaW4gUmF2ZXQuCgogICAgICAgICogT3V0bGluayBpbWFnZXMgYXJlIG5vdyBvbiBieSBkZWZhdWx0LgoKMjAwMi0xMi0wOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYyLjAuMC1hbHBoYS4KCiAgICAgICAgKiBGaXhlZCBXaWtpRW5naW5lLmJlYXV0aWZ5VGl0bGUoKSB0byB3b3JrIGJldHRlciB3aXRoIGFjcm9ueW1zLgoKICAgICAgICAqIE1vdmVkIEdvUmFua0FnZ3JlZ2F0b3IgYW5kIEdvRGlhZ3JhbSBwbHVnaW5zIGludG8gdGhlaXIgb3duLAogICAgICAgIHNlcGFyYXRlIHByb2plY3QuIAoKMjAwMi0xMi0wOSAgRXJpayBCdW5uICA8RXJpay5CdW5uQGJhc2VuLm5ldD4KCiAgICAgICAgKiB2MS45LjUwLgogICAgICAgIAogICAgICAgICogRml4ZWQgbnVsbCByZWZlcmVuY2UgYnVnIGluIEF0dGFjaG1lbnRNYW5hZ2VyIHdoZW4gbm8KICAgICAgICBtYW5hZ2VyIHNwZWNpZmllZCBpbiBqc3B3aWtpLnByb3BlcnRpZXMuCiAgICAgICAgCiAgICAgICAgKiBBZGRlZCBFcnJvci5qc3AsIHdoaWNoIGRpc3BsYXlzIHRoZSBtZXNzYWdlIG9mIGFuIAogICAgICAgIGV4Y2VwdGlvbiB1c2luZyBEaXNwbGF5TWVzc2FnZS5qc3AgKGluIHRlbXBsYXRlcykuCiAgICAgICAgQWRkZWQgRXJyb3IuanNwIGFzIGVycm9yIHBhZ2Ugb2YgYWxsIHRvcCBsZXZlbCBqc3Ancy4KCjIwMDItMTItMDggIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjQ5LgoKICAgICAgICAqIEFsbCByZWZlcnJhbCBwbHVnaW5zIChVbnVzZWRQYWdlcyxVbmRlZmluZWRQYWdlcywgYW5kCiAgICAgICAgUmVmZXJyaW5nUGFnZXNQbHVnaW4pIG5vdyBzdXBwb3J0IGEgcGFyYW1ldGVyICJzZXBhcmF0b3IiLCB3aGljaAogICAgICAgIGJhc2ljYWxseSBjb250YWlucyB0aGUgd2lraSBtYXJrdXAgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzZXBhcmF0ZQogICAgICAgIHRoZSBlbnRpcmVzLiAgU3VnZ2VzdGVkIGJ5IEplcmVteSBDb3dnYXIuCgoyMDAyLTEyLTA4ICBFcmlrIEJ1bm4gIDxFcmlrLkJ1bm5AYmFzZW4ubmV0PgoKICAgICAgICAqIE1vZGlmaWVkIGV4Y2VwdGlvbiBjbGFzc2VzIHRvIGluaGVyaXQgV2lraUV4Y2VwdGlvbgogICAgICAgICh3aXRoIHRoZSBleGNlcHRpb24gb2YgSW50ZXJuYWxXaWtpRXhjZXB0aW9uID0pLgogICAgICAgIAogICAgICAgICogQWRkZWQgU2VjdXJpdHlFeGNlcHRpb24gaW4gcHJlcGFyYXRpb24gZm9yIGF1dGggbWVyZ2UuCgoyMDAyLTEyLTA3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS40OC4KCiAgICAgICAgKiBUaW55IGxpdHRsZSB0d2Vha3MgdG8gYXR0YWNobWVudHMgYWxsIGFyb3VuZC4KCiAgICAgICAgKiBQYWdlSW5mbyBpcyBub3cgYXR0YWNobWVudC1hd2FyZSwgc28geW91IGNhbiB2aWV3IG9sZGVyCiAgICAgICAgdmVyc2lvbnMsIGV0Yy4gdXNpbmcgdGhlIHN0YW5kYXJkIFBhZ2VJbmZvIGxpbmsuCgogICAgICAgICogSWYgYW4gYXR0YWNobWVudCBpcyBhbiBpbWFnZSwgdGhlbiBpdCBpcyBhdXRvbWF0aWNhbGx5IGlubGluZWQuCgogICAgICAgICogSXQgaXMgbm93IHBvc3NpYmxlIHRvIGxpbmsgdG8gYXR0YWNobWVudHMgYXMgaWYgdGhleSB3ZXJlIG5vcm1hbAogICAgICAgIFdpa2kgcGFnZXMuICBGcm9tIHRoZSBwYWdlIGl0c2VsZiwganVzdCB1c2UgW2F0dGFjaG1lbnQgbmFtZV0sCiAgICAgICAgZnJvbSBvdGhlciBwYWdlcywgdXNlIFtQYXJlbnRQYWdlL2F0dGFjaG1lbnQgbmFtZV0uCgogICAgICAgICogdjEuOS40Ny4KCiAgICAgICAgKiBDYW1lbENhc2UgbGlua3Mgbm93IGZpbmFsbHkgd29yayAob3IgYXQgbGVhc3QgYWxsIHRlc3RzIHJ1bikuCiAgICAgICAgVGhhbmtzIHRvIEpvb25hcyBJaXZvbmVuIGZvciBpbnNwaXJhdGlvbiwgYW5kIGxpc3RlbmluZyBteQogICAgICAgIGluY29oZXJlbnQgZXhwbGFuYXRpb24gYWJvdXQgdGhlIHByb2JsZW0uIDotKQoKICAgICAgICAqIExpc3QgaXRlbXMgKCosICMpIGFyZSBub3cgY2xvc2VkIHByb3Blcmx5IGFzIHBlciBYSFRNTCBzcGVjLgogICAgICAgIFdlIHN0aWxsIGhhdmUgcGFyYWdyYXBocyB0byBnbywgYnV0IG90aGVyd2lzZSB3ZSdyZSBuZWFybHkgWEhUTUwKICAgICAgICBjb21wbGlhbnQuIAoKMjAwMi0xMi0wNiAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuNDYuCgogICAgICAgICogTWFqb3IgaW1wb3J0IG9mIGFsbCBhdHRhY2htZW50cyBjb2RlLiAgVGhpcyB2ZXJzaW9uIGlzIGFjdHVhbGx5CiAgICAgICAgYWJsZSB0byB1cGxvYWQvZG93bmxvYWQgYXR0YWNobWVudHMsIGJ1dCBJIHdvdWxkbid0IHVzZSB0aGlzIGZvcgogICAgICAgIGFueSByZWFsIHByb2R1Y3Rpb24uICBUaGUgc3RydWN0dXJlIG1heSBjaGFuZ2UgYW5kIHlvdSBtYXkgZmFjZSBhCiAgICAgICAgZGlmZmljdWx0IHByb2Nlc3MgdG8gbWlncmF0ZSB5b3VyIG9sZCBhdHRhY2htZW50cyB0byBhIG5ldwogICAgICAgIHN5c3RlbS4gIAoKICAgICAgICAqIEFkZGVkIGF0dGFjaG1lbnRfYmlnLnBuZywgdGhhbmtzIHRvIFRlcm8gVGlpdHRhbmVuLgoKICAgICAgICAqIHYxLjkuNDUuCgogICAgICAgICogTWFueSBjaGFuZ2VzIHRvIEdvUmFua0FnZ3JlZ2F0b3IsIHdoaWNoIHlvdSBwcm9iYWJseSB3b24ndCBjYXJlCiAgICAgICAgYWJvdXQuIAoKICAgICAgICAqIEFkZGVkIGZpeCBmb3IgSkJvc3MgYW5kIHB1cmUgV0FSLWZpbGUgZGVwbG95bWVudCBmcm9tIFh5dmluZAogICAgICAgIEx4a2xpbmcuCgoyMDAyLTEyLTA1ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS40NC4KCiAgICAgICAgKiBDYW1lbENhc2UgZGV0ZWN0aW9uIGNoYW5nZWQgeWV0IGFnYWluLiAgSG93ZXZlciwgdGhpcyB3aWxsIHN0aWxsCiAgICAgICAgZmFpbCB3aGVuIHlvdSB3cml0ZSB3aWtpbWFya3VwIHJpZ2h0IG5leHQgdG8gaXQ6IEZvciBleGFtcGxlCiAgICAgICAgX19DYW1lbENhc2VfXyB3aWxsIHJlc3VsdCBpbnRvIHNvbWV0aGluZyB0b3RhbGx5IHN0cmFuZ2UsIG11Y2gKICAgICAgICBsaWtlICpDYW1lbENhc2UgdG8gc3RhcnQgYSBsaW5lLiAgVXNpbmcgd2hpdGVzcGFjZSBzaG91bGQgd29yaywKICAgICAgICB0aG91Z2guLi4gIF9fIENhbWVsQ2FzZSBfXyBzaG91bGQgYmUgcXVpdGUgb2theS4KCjIwMDItMTItMDQgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjQzLgoKICAgICAgICAqIEJ1ZyBmaXg6IFRyYW5zbGF0b3JSZWFkZXIgZGlkIG5vdCBwcm9wZXJseSBjbG9zZWQgZG93biB0aGUgPGltZz4KICAgICAgICAtdGFncywgYXMgcGVyIFhIVE1MIHNwZWNpZmljYXRpb24uICBMZXQncyBzZWUgaG93IG1hbnkgb2xkCiAgICAgICAgYnJvd3NlcnMgYnJlYWsgdGhpcyB0aW1lLi4uIDotKQoKICAgICAgICAqIEJ1ZyBmaXg6IFByZWZvcm1hdHRlZCB0ZXh0IHdhcyBub3QgcHJvcGVybHkgY2xvc2VkIGRvd24gaWYgdGhlCiAgICAgICAgdXNlciBmb3Jnb3QgYWxsIGFib3V0IGl0LiAgUmVwb3J0ZWQgYnkgQm9iIFNjaHVsemUuCgogICAgICAgICogQnVnIGZpeDogUHJlZm9ybWF0dGVkIHRleHQgKHt7eykgbm8gbG9uZ2VyIGFsbG93cyB5b3UgdG8gaW5wdXQKICAgICAgICBIVE1MLiAgUmVwb3J0ZWQgYnkgQm9iIFNjaHVsemUuCgogICAgICAgICogTmV3IG9wdGlvbjoganNwd2lraS50cmFuc2xhdG9yUmVhZGVyLnVzZU91dGxpbmtJbWFnZSBhbGxvd3MgeW91CiAgICAgICAgdG8gbWFyayBhbGwgb3V0Z29pbmcgbGlua3Mgd2l0aCBhIHNtYWxsIHBpY3R1cmUuICBUaGFua3MgdG8gVGVlbXUKPDw8PDw8PCBDaGFuZ2VMb2cKICAgICAgICBIaXJzaW1CjmRraSBmb3IgcHJvdmlkaW5nIHdpdGggdGhlIGlkZWEgYW5kIHRoZSBpbWFnZS4gIExvb2sgZm9yCj09PT09PT0KICAgICAgICBIaXJzaW1Cwo5ka2kgZm9yIHByb3ZpZGluZyB3aXRoIHRoZSBpZGVhIGFuZCB0aGUgaW1hZ2UuICBMb29rIGZvcgo+Pj4+Pj4+IDEuMjcwCiAgICAgICAgaW1hZ2VzL291dC5wbmcsIGlmIHlvdSB3YW50IHRvIGNoYW5nZSBpdC4KCjIwMDItMTItMDEgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBHb1JhbmtBZ2dyZWdhdG9yIG5vdyBhbHNvIHN1cHBvcnRzICdlZ2Z1cmwnIHBhcmFtZXRlciwgd2hpY2gKICAgICAgICBmZXRjaGVzIGNvdW50cnktc3BlY2lmaWMgcmFua2luZyBkYXRhIGZyb20gcGVyc29ucy4gIFF1aXRlCiAgICAgICAga2x1ZGdpc2ggYXQgdGhlIG1vbWVudC4KCiAgICAgICAgKiBIb3BlZnVsbHkgZml4ZWQgR29SYW5rQWdncmVnYXRvciB0byBhbGxvdyBtdWx0aXBsZSBwZXJzb25zIG9mCiAgICAgICAgdGhlIHNhbWUgcmFuay4KCjIwMDItMTEtMjkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBBZGRlZCBHb1JhbmtBZ2dyZWdhdG9yLiAgTW9zdCBvZiB5b3UgZG9uJ3QgcHJvYmFibHkgY2FyZS4gIChJCiAgICAgICAgcHJvYmFibHkgc2hvdWxkIG1ha2UgdGhlc2UgYSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb3Igc29tZXRoaW5nLikKICAgICAgICBJIHdvbid0IGV2ZW4gYm90aGVyIHRvIGJ1bXAgdGhlIHZlcnNpb24gbnVtYmVyIGZvciB0aGlzIG9uZS4KCjIwMDItMTEtMjYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjQyLgoKICAgICAgICAqIEZpeGVkIGEgbmVhci1mYXRhbCBidWcgaW4gVXNlclByZWZlcmVuY2VzLmpzcCAtIHdlIHdyb3RlIHRoZQogICAgICAgIHBhZ2UgY29udGVudHMgaW50byB0aGUgc3RyZWFtIGFuZCB0aGVuIGRpZCBhIHJlZGlyZWN0LiAgT29wcy4KCiAgICAgICAgKiBSYWRpY2FsIGNoYW5nZSB3YXJuaW5nOiBJZiB5b3UgYXJlIHJ1bm5pbmcgYSBXaWtpIHdpdGggdGhhdCBoYXMKICAgICAgICBhdXRoZW50aWNhdGlvbiB0dXJuZWQgb24sIG5vdGUgdGhhdCBmcm9tIG5vdyBvbiB0aGUgdXNlcm5hbWUgc2V0CiAgICAgICAgaW4gVXNlclByZWZlcmVuY2VzIGlzIHRoZSBvbmUgdGhhdCBnZXRzIHB1dCBpbiBwYWdlIGNoYW5nZQogICAgICAgIGhpc3RvcnksIG5vdCB0aGUgbmFtZSB0aGUgdXNlciB1c2VkIHRvIGF1dGhlbnRpY2F0ZSBoaW1zZWxmLiAgVGhpcwogICAgICAgIHdhcyBkb25lIHNvIHRoYXQgaXQgd291bGQgYmUgZWFzaWVyIHRvIG1haW50YWluIGEgd2lraSB0aGF0IGhhcwogICAgICAgIG9ubHkgYSBzaW5nbGUgdXNlcm5hbWUvcGFzc3dvcmQgY29tYmluYXRpb24gYW5kIHN0aWxsIHRyYWNrIHRoZQogICAgICAgIHVzZXJzLiAgIEkgYmVsaWV2ZSB0aGlzIGlzIG1vcmUgaW4gbGluZSB3aXRoIFdpa2lOYXR1cmUuCiAgICAgICAgCiAgICAgICAgWW91IGNhbiBzdGlsbCBzZWUgdGhlIG5hbWUgdGhlIHVzZXIgdXNlZCB0byBhdXRoZW50aWNhdGUgaW4gdGhlCiAgICAgICAgbG9nIGZpbGUgdGhhdCBKU1BXaWtpIGdlbmVyYXRlcy4KCiAgICAgICAgKiB2MS45LjQxLgoKICAgICAgICAqIEZpeGVkIEVkaXRUZW1wbGF0ZS5qc3AgdG8gc2hvdyB0aGUgbGluayB0byBFZGl0UGFnZUhlbHAgaW4gYQogICAgICAgIG1hbm5lciBjb25zaXN0ZW50IHdpdGggb3RoZXIgZWRpdCBsaW5rcy4KCiAgICAgICAgKiBFZGl0TGlua1RhZyB3b3VsZCBjcmFzaCBpZiB0aGUgcGFnZSBpdCB3YXMgcmVmZXJyaW5nIHRvIGRpZCBub3QKICAgICAgICBleGlzdC4gIFJlcG9ydGVkIGJ5IFRvcnN0ZW4gSGlsZGVicmFuZC4KCiAgICAgICAgKiBGaXhlZCBjYW1lbGNhc2UgcGF0Y2ggZnJvbSBKZWZmIFBoaWxsaXBzIC0gdGhhbmtzIEplZmYhCgoyMDAyLTExLTI0ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS40MC4KCiAgICAgICAgKiBJbnN0ZWFkIG9mIGRvaW5nIFNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKCIvIikgd2Ugbm93IHVzZSB0aGUKICAgICAgICBTZXJ2bGV0Q29udGV4dCBpdHNlbGYgYXMgYW4gdW5pcXVlIGtleSB3aGVuIGNyZWF0aW5nIGEKICAgICAgICBXaWtpRW5naW5lLiAgVGhpcyBzaG91bGQgcmVzb2x2ZSBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgSlNQV2lraQogICAgICAgIHN0cmFpZ2h0IGZyb20gYSBXQVIgZmlsZS4gIFJlcG9ydGVkIGJ5IE95dmluZCBMb2VrbGluZy4KCiAgICAgICAgKiBBZGRlZCBwbGVudHkgb2YgY29kZSBmb3IgYXR0YWNobWVudHMuICBTdG9yaW5nIGFuZCByZXRyaWV2aW5nCiAgICAgICAgd29ya3MsIGFzIHdlbGwgYXMgbGlzdGluZy4gIEhvd2V2ZXIsIHVwbG9hZGluZyBzdGlsbCBoYXMgc29tZQogICAgICAgIHByb2JsZW1zLiAKCjIwMDItMTEtMjAgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjM5LgoKICAgICAgICAqIERpZmZMaW5rIG5vdyBmYWlscyBncmFjZWZ1bGx5IGlmIHBhZ2UgZG9lcyBub3QgZXhpc3QuICBSZXBvcnRlZAogICAgICAgIGJ5IEplcmVteSBDLgogICAgICAgIAogICAgICAgICogRml4ZWQgfiAtZXNjYXBpbmcgb2YgQ2FtZWxDYXNlIGxpbmtzLgoKICAgICAgICAqIEFkZGVkIHBhdGNoIGZyb20gS2FiZSBSb2JpY2hhdXggdG8gZml4IGEgcHJvYmxlbSB3aXRoIG9sZGVyIFJDUwogICAgICAgIHByb2dyYW1zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIC16IGZsYWcuCgogICAgICAgICogdjEuOS4zOC4KCiAgICAgICAgKiBUaGUgIiYiIHRyYW5zbGF0aW9uIG5vdyBvY2N1cnMgX2JlZm9yZV8gb3RoZXIgZW50aXRpZXMsIHdoaWNoIG5vCiAgICAgICAgbG9uZ2VyIGNhdXNlcyBhbGwgcXVvdGVzIHRvIGJlIHRyYW5zZm9ybWVkIGJhY2sgaW50byAiJnF1b3Q7IgogICAgICAgIHdoaWxlIHlvdSdyZSBlZGl0aW5nIGEgcGFnZS4KCiAgICAgICAgKiBJbnRlZ3JhdGVkIGNhbWVsY2FzZSBwYXRjaCBmcm9tIEplZmYgUGhpbGxpcHMuICBJdCBpcyBub3cgbmVhcmx5CiAgICAgICAgd29ya2luZyAtIGEgY291cGxlIG1vcmUgdGVzdHMgc2hvdWxkIGdvIHRocm91Z2ggZmlyc3QuCgoyMDAyLTExLTExICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4zNy4KCiAgICAgICAgKiA8QlIvPiBpcyBub3cgPEJSIC8+LCBpbiBvcmRlciBub3QgdG8gY29uZnVzZSBzb21lIG9sZGVyCiAgICAgICAgYnJvd3NlcnMuCgoyMDAyLTExLTA5ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4zNi4KCiAgICAgICAgKiBHb0RpYWdyYW0gbm93IHVzZXMgUE5HIGltYWdlcy4gIEl0IGFsc28gbm93IGhvbm9ycyB0aGUgYmFzZVVSTAogICAgICAgIHNldHRpbmcuCgogICAgICAgICogVGFibGVzIG5vdyBjbG9zZSB0aGUgPFREPiB0YWcgY29ycmVjdGx5IHdpdGggPC9URD4sIHRoYW5rcyB0bwogICAgICAgIHRoZSBuZXcgVHJhbnNsYXRvclJlYWRlciBhcmNoaXRlY3R1cmUuICBSZXBvcnRlZCBieSBBbmRyZWFzCiAgICAgICAgUm96ZWsuCgogICAgICAgICogIiYiIGlzIG5vdyB0cmFuc2xhdGVkIGludG8gIiZhbXA7IiB3aGVuIGVkaXRpbmcsIHNvIHRoYXQgeW91IGNhbgogICAgICAgIGFjdHVhbGx5IGlucHV0IEhUTUwgZW50aXRpZXMgYW5kIHRoZXkgc3RheSBsaWtlIHRoYXQgd2hlbiBnb2luZwogICAgICAgIGludG8gc3RvcmFnZS4gIFJlcG9ydGVkIGJ5IEVyaWsgQnVubiBhbmQgb3RoZXJzLgoKICAgICAgICAqIFRpbGRlICh+KSBub3cgZXNjYXBlcyBiYXJzIGluIHRhYmxlcy4KCiAgICAgICAgKiB2MS45LjM1LgoKICAgICAgICAqIEdvRGlhZ3JhbSBpcyBub3cgYSBiaXQgbW9yZSB0b2xlcmFudCB0b3dhcmRzIHRoZSBraW5kIG9mIG1hcmt1cAogICAgICAgIGl0IGFjY2VwdHMuCgogICAgICAgICogQnVnIGZpeDogZ29kaWFncmFtIHdhcyBvZmYtYnktb25lIHRvd2FyZHMgdGhlIHNpZGUgb2YgdGhlCiAgICAgICAgYm9hcmQuICBSZXBvcnRlZCBieSBQYWF2byBQaWV0YXJpbGEuCgoyMDAyLTExLTA4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogV2Ugbm93IG91dHB1dCA8QlIvPiBpbnN0ZWFkIG9mIDxCUj4uICBTbG93bHkgd29ya2luZyB0b3dhcmRzCiAgICAgICAgZnVsbCBYSFRNTCA6LSkuCgogICAgICAgICogU2V2ZXJhbCBzbWFsbCBidWdmaXhlczogKFtbIG5vdCB3b3JraW5nLCBzaW5nbGUgeydzIGdldHRpbmcKICAgICAgICBkZXN0cm95ZWQsIGV0Yy4pCgogICAgICAgICogUmVtb3ZlZCBjbGVhcj1hbGwgZnJvbSBIUiwgYWRkZWQgXFxcIHRvIGRvIGEgPGJyIGNsZWFyPWFsbD4uICBIUgogICAgICAgIGxvb2tlZCBxdWl0ZSBvZGQuCgogICAgICAgICogIjoiIGFmdGVyIHRoZSBmaXJzdCBubyBsb25nZXIgYnJlYWtzIGRlc2NyaXB0aW9uIGxpc3RzLiAgICAgICAgCgogICAgICAgICogdjEuOS4zNC4KCiAgICAgICAgKiAtLS0tIGFrYSBIUiB0YWcgbm93IGFkZHMgJ2NsZWFyPWFsbCcgYXR0cmlidXRlIHRvIGFjY29tbW9kYXRlCiAgICAgICAgYWxpZ25lZCBpbWFnZXMsIHN1Y2ggYXMgdGhlIG9uZXMgcHJvZHVjZWQgYnkgR29EaWFncmFtLgoKICAgICAgICAqIEdvRGlhZ3JhbSBub3cgd29ya3MuCgoyMDAyLTExLTA3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4zMy4KCiAgICAgICAgKiBOZXcgcGx1Z2luOiBHb0RpYWdyYW0uCgogICAgICAgICogQSBjb3VwbGUgb2YgYnVnZml4ZXM6IHNvbWUgRU9MIGlzc3VlcyBpbiBtdWx0aS1saW5lIHBsdWdpbnMuCgoyMDAyLTExLTA3ICBFcmlrIEJ1bm4gIDxFcmlrLkJ1bm5Abm9zcGFtLm1lbWVjcnkubmV0PgoKICAgICAgICAqIEFkZGVkIHBsdWdpbiBleGVjdXRpb24gZGlzYWJsaW5nLCBhbmQgZGlzYWJsZWQgCiAgICAgICAgdGhlaXIgZXhlY3V0aW9uIGR1cmluZyB0aGUgaW5pdGlhbCByZWZlcmVuY2UgbWFuYWdlciBzY2FuLgogICAgICAgIFRoaXMgaXMgbWFpbmx5IGltcG9ydGFudCBpbiB3aWtpJ3Mgd2l0aCBsb3RzIG9mIGNvbXBsZXggY3VzdG9tCiAgICAgICAgcGx1Z2lucy4KICAgICAgICAKMjAwMi0xMS0wNyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMzIuCgogICAgICAgICogVHJ1ZSBtdWx0aWxpbmUgcGx1Z2lucyB0aGF0IG5vIGxvbmdlciBjb25mbGljdCB3aXRoIFdpa2lNYXJrdXAKICAgICAgICBhcmUgbm93IGF2YWlsYWJsZSEgIFlheSEKCiAgICAgICAgKiBNQUpPUiBicmVha2Rvd24hICBSZXdyb3RlIHByYWN0aWNhbGx5IGV2ZXJ5dGhpbmcgaW4KICAgICAgICBUcmFuc2xhdG9yUmVhZGVyOiBpdCBpcyBub3cgZnVsbHkgc3RyZWFtLWJhc2VkIGluc3RlYWQgb2YKICAgICAgICBsaW5lLWJhc2VkLCB3aGljaCBtYWtlcyBtYW55IHRoaW5ncyBxdWl0ZSBhIGxvdCBlYXNpZXIuICBJdCBzaG91bGQKICAgICAgICBhbHNvIGJlIHF1aXRlIGEgbG90IGZhc3RlciB0aGFuIGJlZm9yZS4gIAogICAgICAgIAogICAgICAgIENhbWVsQ2FzZSBsaW5rcyBhcmUgVE9UQUxMWSBicm9rZW4gaW4gdGhpcyByZXZpc2lvbiwgc2luY2UgdGhlCiAgICAgICAgc3RyZWFtLWJhc2VkIHN5c3RlbSBtYWtlcyBpdCBhIGJpdCBkaWZmaWN1bHQgdG8gcnVuIHRoZSByZWdleHAgb24KICAgICAgICB0aGVtLiAgV2UnbGwgc2VlIGhvdyB0byBnZXQgdGhlbSBiYWNrIHJ1bm5pbmcgYWdhaW4uCiAgICAgICAgCiAgICAgICAgRG8gTk9UIHVzZSB0aGlzIHJldmlzaW9uIGZvciBhbnkgcHJvZHVjdGlvbiB3b3JrLi4uIFdlIGhhdmUgbWFueQogICAgICAgIHRlc3RzIHRoYXQgc3RpbGwgZmFpbCEKCjIwMDItMTEtMDYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjMxLgoKICAgICAgICAqIE1vcmUgYXR0YWNobWVudCBzdXBwb3J0LiAgU3RpbGwgbm90IGZ1bmN0aW9uYWwsIGJ1dCBhdCBsZWFzdCBub3cKICAgICAgICB5b3UgY2FuIHNlZSB3aGVyZSB3ZSdyZSBnb2luZy4KCiAgICAgICAgKiBGaXhlZCBzdXBwb3J0IGZvciBtdWx0aWxpbmUgcGx1Z2lucy4KCjIwMDItMTEtMDEgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjMwLgoKICAgICAgICAqIFRoZSBJTlNFUlQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIHRvIHNpZ25pZnkgcGx1Z2lucy4gIEl0IGlzCiAgICAgICAgcmVjb21tZW5kZWQsIGJ1dCBub3QgcmVxdWlyZWQuICBUaGlzIGF0IHRoZSByZXF1ZXN0IG9mIG1hbnkgcGVvcGxlCiAgICAgICAgd2hvIGFyZSB1c2luZyBhbiBpbnNhbmUgYW1vdW50IG9mIHBsdWdpbnMgOi0pLgoKICAgICAgICAqIE5ldyBwbHVnaW46IENvdW50ZXIuCgogICAgICAgICogQWRkZWQgc3VwcG9ydCB0byBWYXJpYWJsZU1hbmFnZXIgdG8gZGlzcGxheSBDb250ZXh0IFZhcmlhYmxlcy4KCiAgICAgICAgKiBBZGRlZCBXaWtpIENvbnRleHQgVmFyaWFibGVzLiAgVGhlc2UgZXhpc3Qgc29sZWx5IGluIHRoZQogICAgICAgIFdpa2lDb250ZXh0IGNsYXNzLCBhbmQgYWxsb3cgeW91IHRvIGRlZmluZSB0cmFuc2llbnQgdmFyaWFibGVzIG9uCiAgICAgICAgYSBwYWdldmlldyBiYXNpcy4KCiAgICAgICAgKiBBZGRlZCBhIHBhdGNoIHRvIGFsbG93IG11bHRpbGluZSBwbHVnaW5zIGZyb20gZWJ1LgogICAgICAgIFVuZm9ydHVuYXRlbHksIHRoaXMgZG9lcyBub3Qgd29yayBmdWxseSB5ZXQgLSBuZXdsaW5lcyBpbiB0aGUKICAgICAgICBtaWRkbGUgb2YgYXJndW1lbnRzIGJyZWFrIHN0dWZmLgoKMjAwMi0xMC0yOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMjkuCgogICAgICAgICogQWRkZWQgYSBuZXcgcHJvcGVydHk6ICJqc3B3aWtpLmZyb250UGFnZSIuICBUaGlzIGFsbG93cyB5b3UgdG8KICAgICAgICBlYXNpbHkgY2hhbmdlIHRoZSBkZWZhdWx0IHBhZ2UgbmFtZSBmcm9tICJNYWluIiBpbnRvIHNvbWV0aGluZwogICAgICAgIGVsc2UuICBUaGlzIGlzIGltcG9ydGFudCBpZiB5b3UncmUgZG9pbmcgbG9jYWxpemVkIGluc3RhbGxhdGlvbnMsCiAgICAgICAgZm9yIGV4YW1wbGUuCgoyMDAyLTEwLTIzICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4yOC4KCiAgICAgICAgKiBKdXN0IGluY29ycG9yYXRlZCBhIGJpdCBtb3JlIGF0dGFjaG1lbnQgc3R1ZmYuICBBbHNvIGZpeGVkIHRoZQogICAgICAgIHByb2JsZW0gb2YgQXR0YWNobWVudE1hbmFnZXIgY29tcGxhaW5pbmcgYXQgc3RhcnR1cCwgaWYgbm8KICAgICAgICBhdHRhY2htZW50UHJvdmlkZXIgd2FzIGRlZmluZWQuCgoyMDAyLTA5LTMwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4yNy4KCiAgICAgICAgKiBDYW1lbENhc2UgbGlua3MgY2FuIG5vdyBiZSBzdG9wcGVkIGZyb20gb2NjdXJyaW5nIGJ5IHByZXBlbmRpbmcKICAgICAgICBpdCB3aXRoICd+Jy4gIH5DYW1lbENhc2UgcmVzdWx0cyBpbiAiQ2FtZWxDYXNlIiwgbm90IGEgbGluayB0byBhCiAgICAgICAgcGFnZSBjYWxsZWQgQ2FtZWxDYXNlLiAgJ34nIHdpbGwgZnJvbSBub3cgb24gYmUgYSBnZW5lcmljIG5lZ2F0b3IKICAgICAgICB0b29sIGZvciBhbGwgc29ydHMgb2YgcHVycG9zZXMuCgoyMDAyLTA5LTI5ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4yNi4KCiAgICAgICAgKiBBZGRlZCB0aGUgYWJpbGl0eSB0byByZXN0b3JlIG9sZGVyIHZlcnNpb25zIG9mIHBhZ2VzIHJlbGF0aXZlbHkKICAgICAgICB0cml2aWFsbHkuICBUaGlzIGlzIGRvbmUgYnkgZ29pbmcgdmlld2luZyB0aGUgb2xkIHZlcnNpb24gdmlhCiAgICAgICAgUGFnZUluZm8sIHRoZW4gY2xpY2tpbmcgb24gIlJlc3RvcmUgdGhpcyB2ZXJzaW9uIi4gIFlvdSdsbCBiZQogICAgICAgIHByZXNlbnRlZCB3aXRoIGEgZWRpdCB2aWV3IHRvIHRoZSBwYWdlLgogICAgICAgIAogICAgICAgIE5vdGU6IHRoaXMgZmFjaWxpdHkgaGFzIGNoYW5nZWQgdGhlIGRlZmF1bHQgdGVtcGxhdGUsIHRvbywgc28gaWYKICAgICAgICB5b3UgaGF2ZSBtYWRlIHlvdXIgb3duIHRlbXBsYXRlcywgeW91IHByb2JhYmx5IHdhbnQgdG8gbW9kaWZ5IHRoZW0KICAgICAgICB0b28gdG8gYWxsb3cgdGhpcyBmYWNpbGl0eS4KCjIwMDItMDktMTcgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjI1LgoKICAgICAgICAqIFZpZXdpbmcgb2Ygb2xkIHZlcnNpb25zIHdvdWxkIG5vdCBzaG93IHRoZSAidGhpcyBpcyB2ZXJzaW9uIFhYIgogICAgICAgIC1iYW5uZXIgYmVjYXVzZSBvZiBhbiB1bmNsb3NlZCBKU1AgY29tbWVudC4gIE9vcHMuCgogICAgICAgICogUGFnZUluZm8gbm93IHNob3dzICJubyB2ZXJzaW9ucyIgaWYgdGhlcmUgaXMgbm8gdmVyc2lvbiBoaXN0b3J5CiAgICAgICAgYXZhaWxhYmxlIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nLgoKICAgICAgICAqIEhpc3RvcnlJdGVyYXRvclRhZyB3b3VsZCBmYWlsIGlmIHRoZXJlIHdhcyBubyB2ZXJzaW9uIGhpc3RvcnkKICAgICAgICAobGlrZSB3aGVuIHlvdSB3ZXJlIG1vdmluZyBmcm9tIEZpbGVTeXN0ZW1Qcm92aWRlciB0bwogICAgICAgIFJDU0ZpbGVQcm92aWRlcikuICBOb3cgZml4ZWQuCgogICAgICAgICogQ2FjaGluZ1Byb3ZpZGVyIG5vdyBjaGVja3MgaWYgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGlzIGNhY2hlZCwKICAgICAgICBhbmQgbm90IG9ubHkgd2hlbiB0aGUgdmVyc2lvbiBpcyBtYXJrZWQgYXMgbGF0ZXN0LiAgQ29tYmluZWQgd2l0aAogICAgICAgIHRoZSBuZXcgdGVtcGxhdGUgc3lzdGVtLCB0aGlzIGJ1ZyBjYXVzZWQgQ2FjaGluZ1Byb3ZpZGVyIHRvCiAgICAgICAgZWZmZWN0aXZlbHkgaWdub3JlIGl0cyBvd24gY2FjaGUuCgogICAgICAgICogLS0tLSBha2EgSFIgaXMgbm93IDxIUiAvPiBhcyBwZXIgWEhUTUwgc3BlYy4KCjIwMDItMDktMTUgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjI0LgoKICAgICAgICAqIEV4Y2VwdGlvbnMgZnJvbSBwbHVnaW5zIGlzIG5vdyBjbGVhcmx5IHNlcGFyYXRlZCBmcm9tIFdpa2lFbmdpbmUKICAgICAgICBpbnRlcm5hbHMuICBTdWdnZXN0ZWQgYnkgTmlpbG8gTmV1dm8uCgoyMDAyLTA5LTA4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogSlNQV2lraSByZXBvc2l0b3J5IHNob3VsZCBub3cgaGF2ZSBhbm9ueW1vdXMgQ1ZTIGFjY2Vzcy4KICAgICAgICBFdmVyeXRoaW5nIHNob3VsZCBub3cgd29yay4KCiAgICAgICAgKiB2MS45LjIzLgoKICAgICAgICAqIEJ1ZyBmaXg6IG5vIGxvbmdlciBjcmFzaGVzIGlmIGJhc2VVUkwgaXMgbm90IGRlZmluZWQuICBSZXBvcnRlZAogICAgICAgIGJ5IEFsYWluIFJhdmV0LgoKICAgICAgICAqIEZpeGVkIGEgcHJvYmxlbSB3aGVuIHRyeWluZyB0byBlc2NhcGUgJ1snIGNoYXJhY3RlciB1c2luZyAnW1snLgoKMjAwMi0wOS0wNyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMjIuCgogICAgICAgICogU2VhcmNoUmVzdWx0IHVzZXMgbm93ICJXaWtpUGFnZSIgaW5zdGVhZCBvZiBhIFN0cmluZyB0byB0aGUgcGFnZQogICAgICAgIG5hbWUuICBIZWVkIHRoaXMsIGlmIHlvdSBoYXZlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIGEKICAgICAgICBwcm92aWRlci4KCiAgICAgICAgKiBWYXJpYWJsZVRhZyBub3cgaGFzIGEgImRlZmF1bHQiIGF0dHJpYnV0ZSB3aGljaCBnZXRzIGludm9rZWQgaWYKICAgICAgICB0aGUgdmFyaWFibGUgaW4gcXVlc3Rpb24gZG9lcyBub3QgZXhpc3QuCgogICAgICAgICogVGhlIHRvcCByaWdodCBzZWFyY2ggYm94IGRpZG4ndCB3b3JrIC0gbm93IGl0IGRvZXMuCgogICAgICAgICogWW91IGNhbiBub3cgbGltaXQgdGhlIG51bWJlciBvZiBoaXRzIGEgc2VhcmNoIHJldHVybnMgLSBzZWUKICAgICAgICBGaW5kQ29udGVudC5qc3AgYW5kIHRoZSBtYXhJdGVtcyBwYXJhbWV0ZXIgb2YgU2VhcmNoUmVzdWx0SXRlcmF0b3IKICAgICAgICB0YWcuCgogICAgICAgICogU2VhcmNoLmpzcCBhbHNvIHRhZ2lmaWVkLgoKICAgICAgICAqIFVzZXJQcmVmZXJlbmNlcyBub3cgZGlyZWN0cyB5b3UgYmFjayB0byB0aGUgcHJlZnMgcGFnZSBpbnN0ZWFkCiAgICAgICAgb2YgV2lraS5qc3AuCgogICAgICAgICogVXNlclByZWZlcmVuY2VzIG5vdyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGdpdmVuIHVzZXJuYW1lLAogICAgICAgIGFuZCB3aWxsIHR1cm4gaXQgaW50byBhIHZhbGlkIFdpa2lOYW1lLgoKICAgICAgICAqIFVzZXJQcmVmZXJlbmNlcy5qc3AgaXMgbm93IGFsc28gdGFnaWZpZWQgKHRvIHNvbWUgZXh0ZW50CiAgICAgICAgYW55d2F5KSBhbmQgc2hvdWxkIG5vdyB3b3JrLgoKMjAwMi0wOS0wMyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMjEKCiAgICAgICAgKiBCdWcgZml4OiBUd28gcGx1Z2lucyBvbiB0aGUgc2FtZSBsaW5lIHdvdWxkIG5vdCBhbHdheXMgd29yayBhcwogICAgICAgIGV4cGVjdGVkLiAgSSBoYWQgdG8gcmV3cml0ZSB0aGUgZW50aXJlCiAgICAgICAgVHJhbnNsYXRvclJlYWRlci5pbnNlcnRIeXBlckxpbmtzKCkgbWV0aG9kLi4uIEFzIGEgbmljZSBzaWRlCiAgICAgICAgZWZmZWN0LCBpdCdzIG5vdyBsaWtlIGZpdmUgdGltZXMgZmFzdGVyIHRoYW4gYmVmb3JlLiA6LSkKICAgICAgICAKICAgICAgICAqIEFkZGVkIGEgc2ltcGxlIFdlYmxvZ1BsdWdpbiBhbmQgYW4gYWNjb21wYW55aW5nCiAgICAgICAgV2VibG9nRW50cnlQbHVnaW4uCgogICAgICAgICogSXQgaXMgbm93IHBvc3NpYmxlIHRvIGFkZCBqc3B3aWtpLnByb3BlcnRpZXMgcHJvcGVydGllcyBhcwogICAgICAgIFdpa2lWYXJpYWJsZXMuIAoKICAgICAgICAqIERvY3VtZW50ZWQgV2lraVZhcmlhYmxlcy4KCjIwMDItMDktMDIgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBBZGRlZCBuZXcgdGFnICJQbHVnaW4iLCB3aGljaCBhbGxvd3MgeW91IHRvIHJ1biBhbnkgSlNQV2lraQogICAgICAgIHBsdWdpbiBmcm9tIGEgSlNQIHBhZ2UgZGlyZWN0bHkuCgogICAgICAgICogRml4ZWQgdGhlIGxhc3QgZmFpbGluZyBSQ1NGaWxlUHJvdmlkZXIgdGVzdCBjYXNlLgoKMjAwMi0wOS0wMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMjAuCgogICAgICAgICogQWRkZWQgYSBuZXcgdmFyaWFibGUgc3lzdGVtLCBpbmNsdWRpbmcgYW4gYWxsLW5ldwogICAgICAgIFZhcmlhYmxlTWFuYWdlci4gIEZvciBleGFtcGxlLCAiYXBwbGljYXRpb25uYW1lIiB0YWcgd2FzIHJlbW92ZWQKICAgICAgICBhcyBvYnNvbGV0ZS4gIFlvdSBtYXkgYWRkIHZhcmlhYmxlcyB1c2luZyBhIFt7JGZvb2Jhcn1dIC1ub3RhdGlvbgogICAgICAgIG9uIHdpa2kgcGFnZXMsIGFuZCB3aXRoIHRoZSB3aWtpOlZhcmlhYmxlIHRhZyBvbiB0aGUgSlNQIHBhZ2VzLgogICAgICAgIAogICAgICAgICogUGFnZU1vZGlmaWVkLmpzcCBhbmQgUHJldmlldy5qc3AgYXJlIG5vdyBpbmNsdWRlZCBpbiB0aGUgbmV3CiAgICAgICAgdGVtcGxhdGUgc3lzdGVtLgogICAgICAgIAogICAgICAgICogU3lzdGVtSW5mby5qc3AgaXMgbm93IHJlbW92ZWQuICBBIHBhZ2UgY2FsbGVkICJTeXN0ZW1JbmZvIiBpcwogICAgICAgIHRha2luZyBpdHMgcGxhY2UuCgogICAgICAgICogQ3JlYXRpbmcgbmV3IHBhZ2VzIHNob3VsZCB3b3JrIG5vdyBhZ2Fpbi4KICAgICAgICAKICAgICAgICAqIEVkaXQuanNwIHNob3VsZCBubyBsb25nZXIgY3Jhc2guICBJdCdzIGFsc28gYmVlbiBkZWxlZ2F0ZWQKICAgICAgICBwcm9wZXJseSBpbnRvIEVkaXRUZW1wbGF0ZS5qc3AuCgogICAgICAgICogQWRkZWQganNwd2lraS50ZW1wbGF0ZURpciBwcm9wZXJ0eS4KCiAgICAgICAgKiBGaXhlZCBQYWdlSW5mbyBkaXNwbGF5IC0gaXQgbm93IGFjdHVhbGx5IGdlbmVyYXRlcyBjb3JyZWN0CiAgICAgICAgbGlua3MuIAoKICAgICAgICAqIEZpeGVkIERpZmZMaW5rVGFnIHRvIGFjdHVhbGx5IGdlbmVyYXRlIGNvcnJlY3QgbGlua3MuCgoyMDAyLTA4LTI5ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4xOS4KCiAgICAgICAgKiBQbGVudHkgb2YgY2hhbmdlcyB0byB0aGUgSlNQIHBhZ2VzOiBjcmVhdGVkIDggbmV3IHRhZ3MsIHNodWZmbGVkCiAgICAgICAgdGhpbmdzIGFyb3VuZC4gIEV2ZXJ5dGhpbmcgaXMgc3RpbGwgYnJva2VuLCBidXQgZG9jL1RlbXBsYXRlcy50eHQKICAgICAgICBzaG91bGQgZXhwbGFpbiB3aGF0IHdlJ3JlIGFib3V0IHRvIGRvLgoKMjAwMi0wOC0xOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMTguCgogICAgICAgICogTW92ZWQgc3R1ZmYgYXJvdW5kLCBhcyBwbHVyYWwgZm9ybXMgb2YgcGFnZSBuYW1lcyB3ZXJlIG5vdAogICAgICAgIGNvbnNpZGVyZWQgdG8gZXhpc3QgYnkgbWFueSBvZiB0aGUgaW50ZXJuYWwgcm91dGluZXMsIGNvbmZ1c2luZwogICAgICAgIFVuZGVmaW5lZFBhZ2VzIGZvciBleGFtcGxlLiAgRm91bmQgYnkgTGVpZ2ggRG9kZHMuCgoyMDAyLTA4LTE4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4xNy4KCiAgICAgICAgKiBBbGwgb2YgdGhlIHBhZ2VzIHNob3VsZCBub3cgd29yay4KCiAgICAgICAgKiBBZGRlZCBUcmFuc2xhdGUgdGFnIGZvciB3cml0aW5nIFdpa2kgY29udGVudCBkaXJlY3RseSBmcm9tIHRoZQogICAgICAgIHBhZ2UuCgogICAgICAgICogTm9uLWV4aXN0aW5nIHBhZ2VzIHdvdWxkIGNyYXNoIGJvdGggV2lraS5qc3AgYW5kIEVkaXQuanNwLiAgTm93CiAgICAgICAgZml4ZWQuICBSZXBvcnRlZCBieSBBbGFpbiBSYXZldC4KCiAgICAgICAgKiB2MS45LjE2LgoKICAgICAgICAqIFZpZXdUZW1wbGF0ZS5qc3AgaXMgbm93IGRvbmUgdG90YWxseSBpbiB0YWdzLgoKICAgICAgICAqIERpZmYuanNwIGlzIG5vdyBkb25lIHRvdGFsbHkgaW4gdGFncy4KCiAgICAgICAgKiBBZGRlZCBuZXcgdGFnczogQ2hlY2tWZXJzaW9uLCBJbnNlcnREaWZmLCBQYWdlRXhpc3RzLAogICAgICAgIFBhZ2VWZXJzaW9uLCBQYWdlRGF0ZS4KCjIwMDItMDgtMTcgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjE1LgoKICAgICAgICAqIEFkZGVkIGEgY291cGxlIG9mIG5ldyB0YWdzLgoKICAgICAgICAqIE1vdmVkIGFsbCBDU1MgZmlsZXMgYW5kIGNzc2luY2x1ZGUuanMgaW50byB0aGUgdGVtcGxhdGVzL2RlZmF1bHQKICAgICAgICBkaXJlY3RvcnkuCgogICAgICAgICogU3BsaXQgRWRpdC5qc3AgYW5kIFBhZ2VJbmZvLmpzcCBpbnRvIGEgc2NyaXB0bGV0IHBhZ2UsIGFuZCBhCiAgICAgICAgSFRNTCB0ZW1wbGF0ZS4gIFNvbWUgcGFnZXMgc3RpbGwgZG8gbm90IHdvcmsgeWV0LgoKMjAwMi0wOC0xNiAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMTQuCgogICAgICAgICogTW92ZWQgdGhlIGN1cnJlbnQgdmlldyB0ZW1wbGF0ZXMgdG8gdGVtcGxhdGVzL2RlZmF1bHRzLiAgVGhpcwogICAgICAgIHByb2JhYmx5IGJyb2tlIHF1aXRlIGEgbG90IG9mIHN0dWZmLi4uCgoyMDAyLTA4LTA5ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4xMy4KCiAgICAgICAgKiBKU1BXaWtpIG5vdyB3cml0ZXMgYSBiZXR0ZXIgc2VwYXJhdG9yIHRvIGxvZyB3aGVuIGl0IHN0YXJ0cyB0bwogICAgICAgIG1ha2UgaXQgZWFzaWVyIHRvIHNlZSBuZXcgbG9nIGVudGlyZXMuICBTdWdnZXN0ZWQgYnkgTWlrYWVsCiAgICAgICAgSG9ua2FsYS4KCjIwMDItMDgtMDEgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjEyLgoKICAgICAgICAqIEFkZGVkIFBhZ2VJbmZvTGluayB0YWcuCgoyMDAyLTA3LTMxICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4xMS4KCiAgICAgICAgKiBFdmVuIG1vcmUgSlNQIHRhZ3MgYWRkZWQsIGluY2x1ZGluZyBhIG5ldyAiUGVybWlzc2lvbiIgdGFnLgoKMjAwMi0wNy0yNSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMTAuCiAgICAgICAgCiAgICAgICAgKiBGb3Jnb3QgdG8gY2FsbCBsaW5rIG11dGF0b3JzIHdpdGggQ2FtZWxDYXNlIGxpbmtzLiAgVGhpcyBjYXVzZWQKICAgICAgICBDYW1lbENhc2UgbGlua3MgZGlzYXBwZWFyaW5nIGZyb20gdGhpbmdzIGxpa2UgIlJlZmVyZW5jZWQgYnkiCiAgICAgICAgLWxpc3QuICBSZXBvcnRlZCBieSBBbGFpbiBSYXZldC4KCiAgICAgICAgKiBBZGRlZCAnO3Rlcm06ZGVmJyB0byBUZXh0Rm9ybWF0dGluZ1J1bGVzIGZvciBkZWZpbml0aW9uIGxpc3RzLgogICAgICAgIFRoaXMgaW5jaWRlbnRhbGx5IGFsc28gYWxsb3dzIHlvdSB0byBtYWtlIGNvbW1lbnRzIGludG8gc29tZW9uZQogICAgICAgIGVsc2UncyB0ZXh0LCBpZiB5b3UgdXNlIGFuIGVtcHR5ICd0ZXJtJyAoOzo8Q29tbWVudCBoZXJlPikuCgoyMDAyLTA3LTI0ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CiAgICAgICAgCiAgICAgICAgKiB2MS45LjkuCgogICAgICAgICogTW92ZWQgTGVmdE1lbnUsIExlZnRNZW51Rm9vdGVyLCBQYWdlSGVhZGVyIGludG8gdGVtcGxhdGVzLy4KCiAgICAgICAgKiBBZGRlZCBuZXcgV2lraVBhZ2VzOiBQYWdlSW5kZXgsIEVkaXRQYWdlSGVscC4KCiAgICAgICAgKiBNb3ZlZCBFZGl0LmpzcCBlbWJlZGRlZCBoZWxwIGludG8gYSBXaWtpUGFnZSBjYWxsZWQKICAgICAgICAiRWRpdFBhZ2VIZWxwIi4KCiAgICAgICAgKiBCdWcgZml4OiBJbiByYXJlIG9jY2FzaW9ucyBWZXJzaW9uaW5nRmlsZVByb3ZpZGVyIHdvdWxkIG5vdAogICAgICAgIHJldHVybiBjb3JyZWN0IHBhZ2UgaW5mb3JtYXRpb24uCgogICAgICAgICogTW9yZSBKU1AgdGFncyBpbXBsZW1lbnRlZC4KCiAgICAgICAgKiBBZGRlZCBuZXcgcGx1Z2luICJJbmRleFBsdWdpbiIsIGJ5IEFsYWluIFJhdmV0LgoKMjAwMi0wNy0yMyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuOC4gKFRoZSBhZnRlcm5vb24gdmVyc2lvbi4pCgogICAgICAgICogQ2hhbmdlZCB0aGUgZGVmYXVsdCBFZGl0LmpzcCBiYWNrZ3JvdW5kIHRvIHNvbWV0aGluZyBlbHNlLCBzaW5jZQogICAgICAgIHNvIG1hbnkgcGVvcGxlIGFyZSBydW5uaW5nIHdpdGggdGhlIGRlZmF1bHQuICBJIHRvbGQgeW91IGl0IHdhcwogICAgICAgIHVnbHkgLSBJIGFtIG5vdCBzdXJlIHRoZSBuZXcgdmVyc2lvbiBpcyBhbnkgYmV0dGVyIDotKS4KCiAgICAgICAgKiBNb3ZlZCBWaWV3VGVtcGxhdGUuanNwIGludG8gdGVtcGxhdGVzLwoKICAgICAgICAqIEFkZGVkIEF1dGhvclRhZy4KCiAgICAgICAgKiB2MS45LjcuCgogICAgICAgICogTGlua3MgdG8gZXhpc3RpbmcgcGFnZXMgaW5zaWRlIGltYWdlIGxpbmtzIG5vdyBnZW5lcmF0ZSBhbgogICAgICAgIGF1dG9tYXRpYyBsaW5rIHRvIHRoYXQgcGFnZS4gIFN1Z2dlc3RlZCBieSBBbGFpbiBSYXZldC4KCjIwMDItMDctMjIgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjYuCgogICAgICAgICogU3RhcnRlZCB0aGUgKHBhaW5mdWwpIG1vdmUgdG8gSlNQIHRhZ3MuICBTaWdoLiAgSSBjb3VsZG4ndAogICAgICAgIHJlYWxseSBmaWd1cmUgb3V0IGEgYmV0dGVyIHdheSAtIHVuZm9ydHVuYXRlbHkgd2Ugbm93IGhhdmUgdG8KICAgICAgICBzdGFuZCB3aXRoIHRoZSBwZXJmb3JtYW5jZSBwZW5hbHR5IHRoYXQgSlNQIHRhZ3MgZ2l2ZSB1cy4gIFRoaXMKICAgICAgICBpbmNsdWRlcyBuZXcgV2lraVRhZ0Jhc2UgY2xhc3MsIHdoaWNoIGNvbnRhaW5zIHNvbWUgaGVscGVycy4KCiAgICAgICAgKiBTcGxpdCBXaWtpLmpzcCBpbnRvIFdpa2kuanNwIGFuZCBWaWV3VGVtcGxhdGUuanNwLiAgQWxsIEhUTUwKICAgICAgICBjb2RlIHNob3VsZCBnbyB0byB0aGUgbGF0dGVyIG9uZS4KCiAgICAgICAgKiBJbmNvcnBvcmF0ZWQgZml4IGZyb20gMS44LjI6IFVzZXJQcm9maWxlcyBtaWdodCBiZSBicm9rZW4gb24KICAgICAgICBzb21lIGNvbnRhaW5lcnMuICBSZXBvcnRlZCBieSBLYWxsZSBLaXZpbWFhLgoKICAgICAgICAqIEluY29ycG9yYXRlZCBmaXggZnJvbSAxLjguMjogbmV3IHBhZ2UgZGlmZnMgYXJlIG5vdyBzaG93bgogICAgICAgIHByb3Blcmx5LiAgUmVwb3J0ZWQgYnkgTmlpbG8gTmV1dm8uCgoyMDAyLTA3LTExICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS41LgoKICAgICAgICAqIEZpeGVkIHByb2JsZW0gd2l0aCBSU1MgZ2VuZXJhdGluZyBpbGxlZ2FsIFhNTCBpbiBjZXJ0YWluIGNhc2VzCiAgICAgICAgKCYgYW5kIDwgd2VyZSBub3QgdHJhbnNsYXRlZCB0byBlbnRpdGllcyBwcm9wZXJseSkuCgogICAgICAgICogRml4ZWQgcHJvYmxlbSB3aXRoIHBsdWdpbiBvdXRwdXQgZ2V0dGluZyB0cmFuc2xhdGVkIGJ5CiAgICAgICAgcmVvcmRlcmluZyB0aGUgdHJhbnNsYXRvciByb3V0aW5lcy4gIFRoaXMgbWF5IGJyZWFrIG1hbnkgdGhpbmdzLAogICAgICAgIHNvIHBsZWFzZSBiZSBjYXJlZnVsLiAgUmVwb3J0ZWQgYnkgTmlpbG8gTmV1dm8uCgoyMDAyLTA3LTA3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS40LgoKICAgICAgICAqIEZpeGVkIHByb2JsZW0gd2l0aCBWZXJzaW9uaW5nRmlsZVByb3ZpZGVyIGZhaWxpbmcgaWYgdGhlCiAgICAgICAgY29ycmVzcG9uZGluZyBoaXN0b3J5IGZpbGUgd2FzIG5vdCBsb2NhdGVkLiAgVGhpcyBtaWdodCBoYXZlIGJlZW4KICAgICAgICBhbiBpc3N1ZSB3aGlsZSB1cGdyYWRpbmcgZnJvbSBGaWxlU3lzdGVtUHJvdmlkZXIgdG8KICAgICAgICBWZXJzaW9uaW5nRmlsZVByb3ZpZGVyLgoKICAgICAgICAqIE1vdmVkIHNvbWUgaGVhdmllciBzdHVmZiBmcm9tIHRlc3RzIHRvIHBhY2thZ2UgInN0cmVzc3Rlc3RzIiB0bwogICAgICAgIG1ha2UgcnVubmluZyB1bml0IHRlc3RzIGZhc3Rlci4gCgoyMDAyLTA3LTA0ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOS4zCgogICAgICAgICogRml4ZWQgYSBzZXJpb3VzIHByb2JsZW0gd2l0aCBDYW1lbENhc2UgbGlua3Mgc2NyZXdpbmcgdXAgaWYgeW91CiAgICAgICAgaGFkIG1vcmUgdGhhbiB0d28gbGlua3Mgb24gdGhlIHNhbWUgbGluZS4KCjIwMDItMDctMDEgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS45LjIKCiAgICAgICAgKiBKU1BXaWtpIG5vdyBzdXBwb3J0cyB0cmFkaXRpb25hbCwgQ2FtZWxDYXNlIChvciBJbnRlckNhcHBpbmcpCiAgICAgICAgV2lraUxpbmtzIHdpdGhvdXQgc3F1YXJlIGJyYWNrZXRzLiAgSG93ZXZlciwgdGhpcyBmZWF0dXJlIGlzCiAgICAgICAgdHVybmVkIG9mZiBieSBkZWZhdWx0LCBzbyB5b3UnbGwgaGF2ZSB0byBlZGl0IHRoZSBjb3JyZWN0IHByb3BlcnR5CiAgICAgICAgaW4gdGhlIGpzcHdpa2kucHJvcGVydGllcyBmaWxlLgoKMjAwMi0wNi0zMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjkuMQoKICAgICAgICAqIENoYW5nZWQgV2lraUVuZ2luZSBpbml0aWFsaXphdGlvbiBzbyB0aGF0IGl0IHdvdWxkIGJldHRlcgogICAgICAgIGludGVncmF0ZSB3aXRoIHNlcnZsZXRzIGFuZC9vciBzdGFuZGFsb25lIHN5c3RlbXMuICBIb3dldmVyLCB0aGlzCiAgICAgICAgZG9lcyBub3QgeWV0IHdvcmsgYXMtZXhwZWN0ZWQsIGlmIHlvdSdyZSB1c2luZyBpdCwgeW91J2xsIHNlZSBhbGwKICAgICAgICBzb3J0cyBvZiBhbm5veWluZyBOdWxsUG9pbnRlckV4Y2VwdGlvbnMgaWYgdGhpbmdzIGdvIHdyb25nLgoKICAgICAgICAqIE1vdmVkIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgZnJvbSBXaWtpRW5naW5lIGludG8gYSBuZXcKICAgICAgICBQYWdlTWFuYWdlciBjbGFzcy4KCiAgICAgICAgKiBJbnRlZ3JhdGVkIHNvbWUgaW5pdGlhbCBwYXJ0cyBvZiB0aGUgYXR0YWNobWVudCBwYWNrYWdlIGZyb20KICAgICAgICBlYnUuICBEb2VzIG5vdCB3b3JrIHlldCwgdGhvdWdoLgoKICAgICAgICAqIERpZCBzb21lIGNvZGUgY2xlYW51cDogV2Ugbm93IGhhdmUgYSBwcm9wZXIgV2lraUV4Y2VwdGlvbiAod2l0aAogICAgICAgIG91ciBvd24gZXhjZXB0aW9ucyBleHRlbmRpbmcgZnJvbSBpdCkuICBUaGVyZSBpcyBub3cgYWxzbyBhIG5ldwogICAgICAgIFdpa2lQcm92aWRlciBpbnRlcmZhY2UsIHdoaWNoIFdpa2lQYWdlUHJvdmlkZXIgYW5kCiAgICAgICAgQXR0YWNobWVudFByb3ZpZGVyIGV4dGVuZCBmcm9tLgoKICAgICAgICAqIFlvdSBzaG91bGQgbm8gbG9uZ2VyIHNldCBDYWNoaW5nUHJvdmlkZXIgZGlyZWN0bHksIGJ1dCB0byB1c2UKICAgICAgICBqc3B3aWtpLnVzZVBhZ2VDYWNoZSBpbnN0ZWFkLiAgSSBkaWQgdGhpcyBjaGFuZ2Ugc2luY2UgaW4gbWFueSBidWcKICAgICAgICByZXBvcnRzIGl0IHR1cm5lZCBvdXQgdGhhdCBwcmFjdGljYWxseSBub2JvZHkgd2FzIHVzaW5nIHRoZSBwYWdlCiAgICAgICAgY2FjaGUgLSBwcmVzdW1hYmx5IGJlY2F1c2Ugbm9ib2R5IGtuZXcgYWJvdXQgaXQgOi0pLgoKMjAwMi0wNi0yNSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEJyYW5jaGVkIG9mZiAxLjkueCwgd2hpY2ggaXMgdG8gYmUgMi4wLiAgVGhpcyBtZWFucyB0aGF0IGl0J3MKICAgICAgICBxdWl0ZSBsaWtlbHkgdGhhdCBhbnl0aGluZyBmcm9tIENWUyBpcyBubyBsb25nZXIgZnVuY3Rpb25pbmcgPSkuCgogICAgICAgICogWW91IGNhbiBub3cgc3BlY2lmeSB0aGUgdXNlZCBwYWdlIHByb3ZpZGVyIHdpdGhvdXQgdGhlIHBhY2thZ2UKICAgICAgICBuYW1lIGluIHRoZSBqc3B3aWtpLnByb3BlcnRpZXMgZmlsZS4KCiAgICAgICAgKiBNYWpvciBjaGFuZ2U6IEFsbCBXaWtpUGFnZVByb3ZpZGVycyBub3cgbGl2ZSBpbiB0aGVpciBvd24sIG5lYXQKICAgICAgICBsaXR0bGUgcGFja2FnZS4gIFRoaXMgbWVhbnMgdGhhdCBhbGwganNwd2lraSBwcm9wZXJ0eSBmaWxlcyBqdXN0CiAgICAgICAgYnJva2UsIHVuZm9ydHVuYXRlbHkuCgoyMDAyLTA2LTIwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuOC4wLgoKICAgICAgICAqIEEgc2Vjb25kIHByb3BlcnR5OiBqc3B3aWtpLm1hdGNoRW5nbGlzaFBsdXJhbHMgYXV0b21hdGljYWxseQogICAgICAgIGFsbG93cyB5b3UgdG8gY29uc2lkZXIgIlRoaW5nIiBhbmQgIlRoaW5ncyIgdGhlIHNhbWUgd29yZC4KICAgICAgICBVbmZvcnR1bmF0ZWx5LCBpdCdzIG5vdCBwZXJmZWN0IChpdCBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlCiAgICAgICAgYmV0d2VlbiBTYW5kQm94IGFuZCBTYW5kQm94ZXMsIGZvciBleGFtcGxlKS4KCiAgICAgICAgKiBQYWdlSGVhZGVyLmpzcCBub3cgc3BsaXRzIHRoZSB0aXRsZSBpbnRvIHNlcGFyYXRlIHdvcmRzLCBpZiB0aGUKICAgICAgICBjb3JyZWN0IHByb3BlcnR5IGlzIHNldCBpbiBqc3B3aWtpLnByb3BlcnRpZXMuICBTdWdnZXN0ZWQgYnkKICAgICAgICBTdGV2ZW4gT3dlbnMuCgogICAgICAgICogUGFnZU1vZGlmaWVkLmpzcCBub3cgZG9lcyB3b3JkIHdyYXBwaW5nLiAgSXQncyBzdGlsbCBub3QKICAgICAgICBiZWF1dGlmdWwsIGJ1dCBpdCB3b3Jrcy4KCiAgICAgICAgKiBMaW5rcyBzdGFydGluZyB3aXRoICJmaWxlOiIgYXJlIG5vdyByZWNvZ25pemVkIGFzIGV4dGVybmFsCiAgICAgICAgbGlua3MsIG5vdCBpbnRlcndpa2kgbGlua3MgYW55bW9yZS4KCiAgICAgICAgKiBJbnRlcldpa2kgbGlua3Mgbm8gbG9uZ2VyIGdvIHRocm91Z2ggVVJMRW5jb2RlciwgYmVjYXVzZSBVUkwKICAgICAgICBlbmNvZGluZyByZW1vdmVzIHRoaW5ncyBsaWtlIHNsYXNoZXMuICBXaGljaCBpcyBhbm5veWluZywgYW5kCiAgICAgICAgcHJvYmFibHkgbm90IHlvdSB3YW50LiAgWW91J2xsIGp1c3Qgbm93IGhhdmUgdG8gYmUgbW9yZSBjYXJlZnVsCiAgICAgICAgd2hlbiB3cml0aW5nIEludGVyV2lraSBsaW5rcy4gIFJlcG9ydGVkIGJ5IEdhcmV0aFNCLgoKMjAwMi0wNi0wOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjcuMTAuCgogICAgICAgICogQWRkZWQgbmV3IHByb3BlcnR5OiBqc3B3aWtpLnBsdWdpbi5zZWFyY2hQYXRoLCB3aGljaCBhbGxvd3MgeW91CiAgICAgICAgdG8gYWRkIGFueSBwYWNrYWdlIG5hbWUgZm9yIHNlYXJjaGluZyBwbHVnaW5zLiAgU3VnZ2VzdGVkIGJ5IE5paWxvCiAgICAgICAgTmV1dm8uCgogICAgICAgICogUlNTIGZlZWQgd2FzIGZpeGVkIC0gd2Ugbm93IGFsc28gYWRkIHRoZSA8aXRlbXM+IGxpc3QuICBDaGFuZ2VkCiAgICAgICAgYWxzbyB0aGUgZGM6Y29udHJpYnV0b3IgZmllbGQgdG8gdXNlIHRoZSByZGY6RGVzY3JpcHRpb24gZWxlbWVudAogICAgICAgIHJhdGhlciB0aGFuIHRoZSBkaXJlY3QgbmFtZSwgc2luY2UgaXQgd291bGQgbm90IHdvcmsgd2l0aCBhbGwgUlNTCiAgICAgICAgYWdncmVnYXRvcnMuCgogICAgICAgICogV2lraS5qc3Agbm93IGRpc3BsYXlzIHRoZSBYTUwgc2lnbiBmb3IgZWFzeSBzdWJzY3JpcHRpb24gdG8gdGhlCiAgICAgICAgUlNTIGZlZWQuICBXZSBhbHNvIGRpc3BsYXkgdGhlIFJhZGlvIGNvZmZlZSBtdWcgZm9yIGVhc3kKICAgICAgICBzdWJzY3JpcHRpb24gZm9yIFJhZGlvIFVzZXJsYW5kIHVzZXJzICh0aG91Z2ggdGhpcyBpcyB1bnRlc3RlZCwKICAgICAgICBjb3VsZCBhbnkgUmFkaW8gZm9sa3MgdGVzdCBpdCwgcGxlYXNlPykKCiAgICAgICAgKiBXZSBub3cgc3VwcG9ydCBSU1MgYXV0b2Rpc2NvdmVyeSwgYXMgcGVyIHRoZSBwcm9wb3NlZCBzdGFuZGFyZAogICAgICAgIGF0CiAgICAgICAgaHR0cDovL2RpdmVpbnRvbWFyay5vcmcvYXJjaGl2ZXMvMjAwMi8wNi8wMi5odG1sI2ltcG9ydGFudF9jaGFuZ2VfdG9fdGhlX2xpbmtfdGFnLgoKMjAwMi0wNi0wMyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIE9vcHMsIGNvbXBpbGluZyBicm9rZSBvbiBzb21lIHN5c3RlbXMgZHVlIHRvIHVuZGVjbGFyZWQKICAgICAgICBleGNlcHRpb25zLgoKMjAwMi0wNi0wMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEZlYXR1cmU6IFdpa2lFbmdpbmUgbm93IHJlbWVtYmVycyB0aGUgU2VydmxldENvbnRleHQgaXQgd2FzCiAgICAgICAgaW5pdGlhbGl6ZWQgd2l0aCwgYW5kIHlvdSBjYW4gZ2V0IGl0IHZpYQogICAgICAgIFdpa2lFbmdpbmUuZ2V0U2VydmxldENvbnRleHQoKS4gIFJlcXVlc3RlZCBieSBOaWlsbyBOZXV2by4KCjIwMDItMDUtMzEgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBCdWcgZml4OiBpbiBjYXNlIHRoZSBzcGVjaWZpZWQgcGFnZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsCiAgICAgICAgRmlsZVN5c3RlbVByb3ZpZGVyIG5vdyB0aHJvd3MgYW4gRmlsZU5vdEZvdW5kRXhjZXB0aW9uLiAgU3VnZ2VzdGVkCiAgICAgICAgYnkgTmlpbG8gTmV1dm8uCgoyMDAyLTA1LTIyICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNy45LgoKICAgICAgICAqIEhvb3JheSAtIEpTUFdpa2kgaXMgbm8gbG9uZ2VyIGRlcGVuZGFudCBvbiBSQ1MgaW4gYW55IGZvcm0uICBXZQogICAgICAgIG5vdyBoYXZlIGFuIGludGVybmFsIGRpZmYgcm91dGluZSBjb3VydGVzeSBvZiBCTVNJLiAgVGhpcyBtZWFucwogICAgICAgIHRoYXQgb24gV2luZG93cyB5b3UgY2FuIGp1c3QgdXNlIHRoZSBWZXJzaW9uaW5nRmlsZVByb3ZpZGVyIGFuZAogICAgICAgIHlvdSBubyBsb25nZXIgbmVlZCB0byBkbyBhbnl0aGluZyB3aXRoIHRoZSBSQ1MuCgoyMDAyLTA1LTE5ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogVXNlclByZWZlcmVuY2VzIG5vdyBhbGxvd3MgeW91IHRvIGNsZWFyIHRoZSBwcmVmZXJlbmNlcy4KICAgICAgICBTdWdnZXN0ZWQgYnkgUm9iZXJ0IE1jR292ZXJuLCB3aG8ga2luZGx5IHNlbnQgbWUgYSBwYXRjaCBmb3IgaXQuCgoyMDAyLTA1LTExICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNy44LgoKICAgICAgICAqIEFkZGVkIEN1cnJlbnRUaW1lUGx1Z2luLCB3aGljaCBhbGxvd3MgeW91IHRvIHRlbGwgdGhlIHNlcnZlcgogICAgICAgIHRpbWUuICBBZGRlZCBkb2N1bWVudGF0aW9uIHRvIEpTUFdpa2lQbHVnaW5zLCBhbmQgYWxzbyBhIHNhbXBsZSB0bwogICAgICAgIFJlY2VudENoYW5nZXMuCgogICAgICAgICogUGx1Z2luTWFuYWdlciBhbHNvIG5vdyB1bmRlcnN0YW5kcyBxdW90ZWQgcGFyYW1ldGVycywgaS5lLiBpZgogICAgICAgIHlvdSBlbmNsb3NlIGEgcGFyYW1ldGVyIHZhbHVlIGluIHNpbmdsZSBxdW90ZXMgKCcpLCB5b3UgY2FuIHVzZQogICAgICAgIHNwYWNlcyBhbmQgb3RoZXIgYW5ub3lpbmcgY3JlYXR1cmVzIGluc2lkZSB0aGUgcGFyYW1ldGVyCiAgICAgICAgdmFsdWVzLiBUaGlzIGlzIHZlcnkgaGFuZHkgZm9yIHRoZSBDdXJyZW50VGltZVBsdWdpbi4KCiAgICAgICAgKiBQbHVnaW5NYW5hZ2VyIG5vIGxvbmdlciBuZWVkcyB0aGUgZnVsbCBwYWNrYWdlIG5hbWUsIGlmIHRoZQogICAgICAgIHBsdWdpbiBpcyBhIEpTUFdpa2ktc3VwcGxpZWQgcGx1Z2luLiAgV2UgZmlyc3QgdHJ5IHdpdGggdGhlIGNsYXNzCiAgICAgICAgbmFtZSBhcyBnaXZlbiwgdGhlbiBwcmVwZW5kICJjb20uZWN5cmQuanNwd2lraS5wbHVnaW4iIGFuZCB0cnkKICAgICAgICBhZ2Fpbi4gIFRoaXMgc2hvdWxkIG1ha2UgcHV0dGluZyBwbHVnaW5zIG9uIHlvdXIgb3duIHBhZ2UgYSBiaXQKICAgICAgICBzaW1wbGVyLgoKMjAwMi0wNS0wOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEFkZGVkIHRlbXBvcmFyeSBmaXggZm9yIG1pc2JlaGF2aW5nLCBuZXN0ZWQgIydzIGFuZCAqJ3MuCiAgICAgICAgSG93ZXZlciwgdGhpcyBpcyBub3QgYSByZWFsIGZpeCwgaXQganVzdCBwcmV2ZW50cyB0aGUgc3lzdGVtIGZyb20KICAgICAgICBnb2luZyBhbGwgd29ua3kuICBSZXBvcnRlZCBieSBNYWhsZW4gTW9ycmlzLgoKICAgICAgICAqIEZpeGVkIHByb2JsZW0gd2l0aCBYTUwtUlBDIGludGVyZmFjZSBtZXRob2QgbGlzdExpbmtzKCkKICAgICAgICBnZW5lcmF0aW5nIGluY29ycmVjdCBIUkVGIGF0dHJpYnV0ZSBmb3Igbm9uZXhpc3RhbnQgbGlua3MuCiAgICAgICAgUmVwb3J0ZWQgYnkgTWFobGVuIE1vcnJpcy4KCjIwMDItMDUtMDcgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS43LjcuCgogICAgICAgICogQnVnIGZpeDogVVRGLTggdmVyc2lvbiBvZiBYTUwtUlBDIGNsaWVudCBtaXNzZWQKICAgICAgICBnZXRSZWNlbnRDaGFuZ2VzKCkgdG90YWxseS4gIEFwcGFyZW50bHkgbm9ib2R5IHdhcyB1c2luZyBpdCA9KS4KCiAgICAgICAgKiBCdWcgZml4OiBSUEMuZ2V0UmVjZW50Q2hhbmdlcygpIHdvdWxkIGFjY2lkZW50YWxseSB1c2UgbG9jYWwKICAgICAgICB0aW1lIGluc3RlYWQgb2YgVVRDLiAgT29wcy4gIEZvdW5kIGJ5IE1haGxlbiBNb3JyaXMuCgoyMDAyLTA0LTE5ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNy42LgoKICAgICAgICAqIFJTUyBmZWVkIGlzIG5vdyByaWNoZXIuICBJIGFsc28gYWRkZWQgTUFOWSBzZXR0aW5ncyB0bwogICAgICAgIGpzcHdpa2kucHJvcGVydGllcywgYWxsIHN0YXJ0aW5nIHdpdGggImpzcHdpa2kucnNzIi4gIEl0IHNob3VsZAogICAgICAgIGFsbG93IHlvdSB0byBjb25maWd1cmUgcHJldHR5IG11Y2ggZXZlcnl0aGluZyByZWxhdGVkIHRvIHRoZSBSU1MKICAgICAgICBmZWVkLgoKMjAwMi0wNC0xOCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFJTUyBmZWVkIGlzIG5vdyBnZW5lcmF0ZWQgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuICBJZiB5b3UncmUgbm90CiAgICAgICAgcnVubmluZyBXaWtpRW5naW5lIGFzIGEgc2VydmxldCwgdGhlbiB0aGUgdmFsdWUgb2YgdGhlICJ1c2VyLmRpciIKICAgICAgICBzeXN0ZW0gcHJvcGVydHkgKHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5KSBpcyB1c2VkLgoKICAgICAgICAqIHYxLjcuNS4KCiAgICAgICAgKiBBZGRlZCBhbiBpbml0aWFsIHN0YWIgYXQgYW4gUlNTIGZlZWQuICBDdXJyZW50bHkgaXQganVzdCBsaXN0cwogICAgICAgIHRoZSBjaGFuZ2VkIHBhZ2VzLCBidXQgcGVyaGFwcyBpbiB0aGUgbmVhciBmdXR1cmUgaXQgY2FuIGRvIG1vcmUKICAgICAgICBjb21wbGV4IHN0dWZmLgoKMjAwMi0wNC0xNCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjcuNC4KCiAgICAgICAgKiBVc2VyUHJlZmVyZW5jZXMgaXMgbm93IGEgbG90IG1vcmUgdG9sZXJhbnQgdG93YXJkcyBVVEYtOAogICAgICAgIGNoYXJhY3RlcnMuCgogICAgICAgICogRXZlcnl0aGluZyByZWJ1aWx0IHRvIHN1cnZpdmUgYSBudWxsIGF1dGhvciBpbmZvcm1hdGlvbi4KCiAgICAgICAgKiBUaGUgdGV4dCBmb3IgaW5saW5lIGltYWdlcyBpcyBub3cgaW50ZXJwcmV0ZWQgYXMgYSBoeXBlcmxpbmssIGlmCiAgICAgICAgaXQgc3RhcnRzIHdpdGggdGhlIHVzdWFsIGh0dHA6LCBmdHA6LCBtYWlsdG86LCBldGMuICBTdWdnZXN0ZWQgYnkKICAgICAgICBBbGFpbiBSYXZldC4KCjIwMDItMDMtMjcgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS43LjMuCgogICAgICAgICogQWRkZWQgY2FwYWJpbGl0eSB0byBzZXQgeW91ciB1c2VyIG5hbWUgdmlhIFVzZXJQcmVmZXJlbmNlcwogICAgICAgIHBhZ2UuICBUaGlzIGRhdGEgaXMgc3RvcmVkIGFzIGEgY29va2llIGluIHlvdXIgYnJvd3Nlci4KCjIwMDItMDMtMjUgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS43LjIuCgogICAgICAgICogV2hlbiBhIHBhZ2UgaXMgc2F2ZWQsIGl0IGdldHMgbm93IGF1dG9tYXRpY2FsbHkgbm9ybWFsaXplZC4KICAgICAgICBUaGlzIG5vcm1hbGl6aW5nIG1lYW5zIHRoYXQgYWxsIHBhZ2VzIHdpbGwgbm93IGVuZCB3aXRoIGEgbmV3bGluZQogICAgICAgIChzb21lIGJyb3dzZXJzIHNlbmQgYSBuZXdsaW5lIGFuZCBzb21lIGRvbid0KSwgYW5kIGFsc28gdGhhdCBBTEwKICAgICAgICBsaW5lIGJyZWFrcyBhcmUgbm93IG1hcmtlZCB3aXRoIFxyXG4gKENSTEYsIE1TLURPUyBzdHlsZSkuICBXaHkKICAgICAgICB3aXRoIHRoYXQgb2Jzb2xldGUgc3R5bGU/ICBXZWxsLCBIVFRQIHN0YW5kYXJkIHVzZXMgQ1JMRiBhbGwKICAgICAgICBhcm91bmQsIGFuZCBtb3N0IG9mIHRoZSBjdXJyZW50IEpTUFdpa2kgaW5zdGFsbGF0aW9ucyB1c2UgQ1JMRiBpbgogICAgICAgIGFsbCBvZiB0aGUgZmlsZXMuICBBbHNvLCBtb3N0IFVOSVggdG9vbHMgYXJlIHNtYXJ0IGVub3VnaCB0bwogICAgICAgIHVuZGVyc3RhbmQgQ1JMRiwgd2hlcmVhcyBub3QgYWxsIFdpbmRvd3MgdG9vbHMgdW5kZXJzdGFuZCBwbGFpbgogICAgICAgIENSIChNYWMgc3R5bGUpIG9yIHBsYWluIExGLiAgVXNpbmcgQ1JMRiBzaG91bGQgbWFrZSBpbnN0YWxsaW5nCiAgICAgICAgdGhpcyB1cGdyYWRlIHRvdGFsbHkgdmlzaWJsZSB0byBtb3N0IHVzZXJzLgogICAgICAgIAogICAgICAgIEhhdmluZyBzYWlkIHRoYXQsIHRoaXMgaGFzIG5vdCBiZWVuIHRlc3RlZCB2ZXJ5IG1hbnkgdGltZXMsCiAgICAgICAgb2J2aW91c2x5LiAgVXNlIHdpdGggY2FyZSA6LSkuCgoyMDAyLTAzLTIyICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNy4xLgoKICAgICAgICAqIEVkaXQuanNwIGhhZCBhIGphdmFzY3JpcHQgZXJyb3IsIHBvaW50aW5nIGF0IGEgd3JvbmcgZm9ybS4gIEl0CiAgICAgICAgd2FzIG5vdCBmYXRhbCwgaXQgZGlkIG5vdCBhZmZlY3QgdGhlIHVzZXIgaW4gYW55IHJlYWwgd2F5LCBvdGhlcgogICAgICAgIHRoYW4gYmVpbmcgYW4gYW5ub3lhbmNlLgoKICAgICAgICAqIERpZmZlcmVuY2VFbmdpbmUgbm8gbG9uZ2VyIGNyYXNoZXMgaWYgaXQgZ2V0cyBlbXB0eSBsaW5lcyBmcm9tCiAgICAgICAgZGlmZi4gCgoyMDAyLTAzLTIxICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgcHJldmlldyBjYXBhYmlsaXR5IHRvIEVkaXQuanNwLiAgU3VnZ2VzdGVkIGJ5IG1hbnkKICAgICAgICBwZW9wbGUuCgogICAgICAgICogQWRkZWQgUHJldmlldy5qc3AuICBUaGlzIGlzIHN0aWxsIGEgdmVyeSBzaW1wbGUgcHJldmlldywgd2hpY2gKICAgICAgICBkb2VzIG5vdCBhbGxvdyB5b3UgdG8gZG8gYSBkaXJlY3QgcHVibGlzaC4KCjIwMDItMDMtMTYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS43LjAuICBGaW5hbGx5IDotKS4KCjIwMDItMDMtMTAgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBBZGRlZCBWZXJzaW9uaW5nRmlsZVByb3ZpZGVyLiAgVGhlIFZlcnNpb25pbmdGaWxlUHJvdmlkZXIgaXMKICAgICAgICBTVFJJQ1RMWSBBTFBIQS4gIERPIE5PVCBVU0UgSVQgRk9SIEFOWSBSRUFMIFBST0pFQ1QuICBCdXQgcGxlYXNlLAogICAgICAgIGRvIHRlc3QgaXQgOi0pLgoKICAgICAgICAqIHYxLjYuMTMtY3ZzLgoKICAgICAgICAqIGdldFJlY2VudENoYW5nZXMoKSBYTUwtUlBDIG1ldGhvZCBub3cgaG9wZWZ1bGx5IGRvZXMgVVRDCiAgICAgICAgY29udmVyc2lvbiBjb3JyZWN0bHkuCgogICAgICAgICogU2VhcmNoLmpzcCBub3cgb2ZmZXJzIHRvIHNlYXJjaCBvbiBHb29nbGUgYXMgd2VsbCBhZnRlciBnaXZpbmcKICAgICAgICB5b3UgdGhlIHJlc3VsdHMuCgogICAgICAgICogQWRkZWQgcGxlbnR5IG9mIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIFhNTC1SUEMgaW50ZXJmYWNlIHRvIHRoZQogICAgICAgIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgKiBGb290bm90ZXMgYXJlIG5vdyB1bmlxdWUgYWNyb3NzIFdpa2kuICBUaGlzIGlzIGFjY29tcGxpc2hlZCBieQogICAgICAgIGFkZGluZyB0aGUgcGFnZSBuYW1lIHRvIHRoZSBhbmNob3IgbmFtZS4gIFN1Z2dlc3RlZCBieSBNYWhsZW4KICAgICAgICBNb3JyaXMuCgoyMDAyLTAzLTA3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogRWRpdC5qc3AgdGV4dCBlZGl0b3Igbm93IGtub3dzIGhvdyB0byBhZGp1c3QgaXRzIG93biB3aWR0aAogICAgICAgIGFjY29yZGluZyB0byBicm93c2VyIHdpbmRvdyB3aWR0aCwgaWYgeW91ciBicm93c2VyIGtub3dzIENTUy4KICAgICAgICBUaGFua3MgdG8gTWF0dGhldyBTaW1vbmVhdSBmb3IgdGhlIHRpcC4KCiAgICAgICAgKiBJbmNsdWRlZCBhIG5ldyB2ZXJzaW9uIG9mIHhtbHJwYy5qYXI6IHRoaXMgdmVyc2lvbiBqdXN0IGhhcyB0aGUKICAgICAgICBkZWZhdWx0IGNoYXJzZXQgc2V0IHRvICJVVEYtOCIgaW5zdGVhZCBvZiBJU08tTGF0aW4tMS4KCiAgICAgICAgKiBSUENTZXJ2bGV0IG5vdyB0YWtlcyB0d28gaW5pdFBhcmFtczogImhhbmRsZXIiIHRvIHBvaW50IGF0IHRoZQogICAgICAgIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBoYW5kbGUgdGhlIFhNTC1SUEMgY2FsbCwgYW5kICJwcmVmaXgiIHRvCiAgICAgICAgZGV0ZXJtaW5lIHRoZSBYTUwtUlBDIGNvbW1hbmQgcHJlZml4LiAgV2UgdXNlIHRoZXNlIHRvIHN0YXJ0IGJvdGgKICAgICAgICB0aGUgVVRGLTggYW5kIHN0cmljdCBYTUwtUlBDIGhhbmRsZXJzIGZyb20gd2ViLnhtbC4KCiAgICAgICAgKiBBZGRlZCBBYnN0cmFjdFJQQ0hhbmRsZXIgYW5kIFJQQ0hhbmRsZXJVVEY4IGNsYXNzZXMgc28gdGhhdCB3ZQogICAgICAgIGNhbiBub3cgYWxzbyBzZXJ2ZSBYTUwtUlBDIHVzaW5nIFVURi04IDotKS4KCjIwMDItMDItMjUgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBYTUwtUlBDIGxpc3RMaW5rcyBub3cgcmV0dXJucyBhIHRoZSB0eXBlIGFzIGEgc3RyaW5nLiAgU3VnZ2VzdGVkCiAgICAgICAgYnkgTWFobGVuIE1vcnJpcy4KCiAgICAgICAgKiBYTUwtUlBDIGxpc3RMaW5rcyBub3cgcmV0dXJucyBhbiBleHRyYSBwYXJhbWV0ZXI6IGhyZWYuICBUaGlzCiAgICAgICAgY29udGFpbnMgdGhlIGFjdHVhbCBsaW5rIHRleHQgZnJvbSB0aGUgSFRNTCBwYWdlIGl0c2VsZi4KICAgICAgICBTdWdnZXN0ZWQgYnkgTWFobGVuIE1vcnJpcy4KCiAgICAgICAgKiBJbnRlcldpa2kgcmVmZXJlbmNlcyBhcmUgbm93IGFsc28gYWRkZWQgdG8gdGhlIGxpbmsgb2YgZXh0ZXJuYWwKICAgICAgICBsaW5rcyByZXR1cm5lZCBieSBsaXN0TGlua3MoKS4gIFRoZXkgYXJlIHJldHVybmVkIGFzIGVudGlyZSBVUkxzLAogICAgICAgIHJlc3VsdGluZyBmcm9tIHJlc29sdmluZyB0aGUgcmVmZXJlbmNlLgoKMjAwMi0wMi0yNCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjYuMTItYmV0YS4KCiAgICAgICAgKiBBZGRlZCBYTUwtUlBDIGNvbW1hbmQgImxpc3RMaW5rcyIuCgogICAgICAgICogRGlkIHNvbWUgY29kZSByZW9yZ2FuaXphdGlvbjogTmV3IGNsYXNzIERpZmZlcmVuY2VFbmdpbmUgbm93CiAgICAgICAgaGFuZGxlcyBhbGwgZGlmZnMuICBUaGlzIHdhcyBkb25lIGluIHByZXBhcmF0aW9uIGZvciBpbnRlcm5hbCBkaWZmCiAgICAgICAgaGFuZGxpbmcuICBBbHNvLCBMaW5rQ29sbGVjdG9yIGlzIG5vdyBhIGNsYXNzIG9mIGl0cyBvd24uCgogICAgICAgICogWE1MLVJQQyBDb21tYW5kIHByZWZpeCBpcyBub3cgIndpa2kiIGluc3RlYWQgb2YgImpzcHdpa2kiLgoKMjAwMi0wMi0yMyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFhNTC1SUEMgaW50ZXJmYWNlIG5vIGxvbmdlciByZWxpZXMgb24gb3ZlcmxvYWRpbmcgb2YgbWV0aG9kCiAgICAgICAgbmFtZXM6IEFsbCB2ZXJzaW9uZWQgdmVyc2lvbnMgaGF2ZSBub3cgIlZlcnNpb24iIGFwcGVuZGVkLgogICAgICAgIFN1Z2dlc3RlZCBieSBMZXMgT3JjaGFyZC4KCiAgICAgICAgKiBYTUwtUlBDIGludGVyZmFjZSBub3cgcmV0dXJucyBhbiBlcnJvciBjb2RlIG9mIDEsIGlmIHRoZQogICAgICAgIHJlcXVlc3RlZCBwYWdlIGRvZXMgbm90IGV4aXN0LiAgU3VnZ2VzdGVkIGJ5IExlcyBPcmNoYXJkLgoKICAgICAgICAqIEJ1ZyBmaXg6IE5vdyB0YWJsZXMgc2hvdWxkIGZpbmFsbHkgd29yayB3aXRoIE1vemlsbGEuCgogICAgICAgICogQWRkZWQgR29vZ2xlIHNlYXJjaCBhcyBhbiBJbnRlcndpa2kgbGluay4KCiAgICAgICAgKiBEaWZmLmpzcCBub3cgc2hvd3MgaWYgdGhlcmUgaGFzIGJlZW4gbm8gZGlmZmVyZW5jZS4KCiAgICAgICAgKiBCdWcgZml4OiBJbnRlcndpa2kgbGlua3Mgd2VyZSBjbGVhbmVkIGFjY2lkZW50YWxseS4KCjIwMDItMDItMjEgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBFYnUgcmVhcnJhbmdlZCB3ZWIueG1sIHRvIHdvcmsgd2l0aCBUb21jYXQgNC4wLCBidXQgZm9yZ290IHRvCiAgICAgICAgbWVudGlvbiBpdCBoZXJlLgoKICAgICAgICAqIEFkZGVkIHNvbWUgbW9yZSBkZWZhdWx0IEludGVyV2lraSByZWZlcmVuY2VzIChUV2lraSwKICAgICAgICBNZWF0YmFsbFdpa2ksIFdpa2lwZWRpYSkuCgoyMDAyLTAyLTE1ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogUGFnZUluZm8gYW5kIEVkaXQgbm93IGFsc28gaW5jbHVkZSBQYWdlSGVhZGVyLmpzcC4gIFN1Z2dlc3RlZCBieQogICAgICAgIEtpbSBIb2x2aWFsYS4KCiAgICAgICAgKiB2MS42LjExLWJldGEuCgogICAgICAgICogWE1MLVJQQyBpbnRlcmZhY2Ugbm93IHN1cHBvcnRzIGEgbmV3IG1ldGhvZDoKICAgICAgICBnZXRSUENWZXJzaW9uU3VwcG9ydGVkKCksIHdoaWNoIHJldHVybnMgd2hpY2ggdmVyc2lvbiBvZiBBUEkgd2UKICAgICAgICBzdXBwb3J0LiAgVGhpcyBpcyBjdXJyZW50bHkgMS4KCiAgICAgICAgKiBGaXhlZCA8VFQ+IHN1cHBvcnQ6IGl0IGlzIG5vdyBhY3R1YWxseSBwb3NzaWJsZSB0byB3cml0ZQogICAgICAgIG11bHRpcGxlIGxpbmVzIHVzaW5nIHt7IGFuZCB9fSwgbXVjaCBsaWtlIGl0IGlzIHdpdGggJycgYW5kIF9fLgogICAgICAgIFN1Z2dlc3RlZCBieSBTZXNoIEphbGFnYW0uCgogICAgICAgICogUmV3cm90ZSB0YWJsZSBzdXBwb3J0LiAgVGhlIFRyYW5zbGF0b3JSZWFkZXIgZW5naW5lIGlzIG5vdyBhIGxvdAogICAgICAgIHNtYXJ0ZXIgYWJvdXQgdGhpbmdzIHRoYW4gaXQgdXNlZCB0byBiZSwgYW5kIG5vdyBpdCBkb2VzIG5vdAogICAgICAgIG1hdHRlciBob3cgeW91IHVzZSB0aGUgdGFibGUgbWFya2VyLCBhcyBsb25nIGFzIGl0J3MgdGhlIGZpcnN0CiAgICAgICAgY2hhcmFjdGVyIG9uIHRoZSBsaW5lLgoKMjAwMi0wMi0xNCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEJ1ZyBmaXg6IFJDU0ZpbGVQcm92aWRlciBjb3VsZCBoYW5nIGluIGNlcnRhaW4gb3BlcmF0aW9ucywKICAgICAgICBlc3BlY2lhbGx5IHdpdGggbG9uZyByZXZpc2lvbiBoaXN0b3JpZXMuICBBIEpVbml0IHRlc3Qgd2FzIGFkZGVkCiAgICAgICAgZm9yIHRoaXMuCgoyMDAyLTAyLTEwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNi4xMC1jdnMKCiAgICAgICAgKiBYTUwtUlBDIGludGVyZmFjZSBub3cgaG9wZWZ1bGx5IGdpdmVzIG91dCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUKICAgICAgICBpbiBVVEMsIGJlZm9yZSBpdCB1c2VkIHRoZSBsb2NhbCB0aW1lem9uZS4KCjIwMDItMDItMDkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBVbnVzZWQgYW5kIHVuZGVmaW5lZCBwYWdlcyBhcmUgbm93IHNvcnRlZC4gIFN1Z2dlc3RlZCBieSBNaWthZWwKICAgICAgICBIb25rYWxhLgoKICAgICAgICAqIFVzaW5nIHRoZSB0YWJsZSBkaXJlY3RpdmUgbm93IGNhdXNlcyBhbiBleHBsaWNpdCAiQk9SREVSPTEiIHRvCiAgICAgICAgYmUgb3V0cHV0IHRvIHN1cHBvcnQgb2xkZXIgYnJvd3NlcnMuICBBbHNvLCByZXdvcmtlZCBzb21lIG9mIHRoZQogICAgICAgIHN0eWxlc2hlZXRzIHNvIHRoYXQgSUUgYW5kIEtvbnF1ZXJvciBhdCBsZWFzdCBsb29rIHRoZSBzYW1lIG5vdy4KICAgICAgICBNb3ppbGxhIGlzIHN0aWxsIGhhdmluZyBwcm9ibGVtcyB3aXRoIFRIRUFEIHN0eWxlc2hlZXRzLgoKMjAwMi0wMi0wNiAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjYuOS1jdnMKCjw8PDw8PDwgQ2hhbmdlTG9nCiAgICAgICAgKiBBZGRlZCBzdXBwb3J0IGZvciB0YWJsZXMuICBTYW5uYSBWQkKOZEJCjmR0QkKOZGluZW4gZmluYWxseSBtYW5hZ2VkIHRvCj09PT09PT0KICAgICAgICAqIEFkZGVkIHN1cHBvcnQgZm9yIHRhYmxlcy4gIFNhbm5hIFZCQsKOZEJCwo5kdEJCwo5kaW5lbiBmaW5hbGx5IG1hbmFnZWQgdG8KPj4+Pj4+PiAxLjI3MAogICAgICAgIGNvbnZpbmNlIG1lIHRvIGFkZCB0aGVtLCBieSBwb2ludGluZyBvdXQgc29tZSByZWFsIGRlZmljaWVuY2VzIGluCiAgICAgICAgdGhlIHByZWZvcm1hdHRlZC10ZXh0IHN0eWxlIHRhYmxlcyA9KS4KCiAgICAgICAgKiBUZXh0VXRpbC5yZXBsYWNlU3RyaW5nKCkgd291bGQgdHJhc2ggcmVwbGFjZW1lbnRzIG9mIGxlbmd0aHMgb2YKICAgICAgICB0d28gb3IgbW9yZS4gIE9vcHMuCgogICAgICAgICogWE1MLVJQQyBpbnRlcmZhY2Ugbm93IGdvZXMgYXJvdW5kIHRoZSBVVEYtOCBwcm9ibGVtIGJ5IGdpdmluZwogICAgICAgIG91dCBCYXNlNjQtZW5jb2RlZCBVVEYtOCBkYXRhIGFzIHBhZ2UgZGF0YSwgYW5kIGV4cGVjdHMgYWxsIHBhZ2UKICAgICAgICBuYW1lcyB0byBiZSBzdHJpbmdzIGVuY29kZWQgdXNpbmcgVVJMIGVuY29kaW5nIHdpdGggVVRGLTggdGV4dC4KICAgICAgICBUaGlzIGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCBlbmNvZGluZyB1c2VkIGJ5IHRoZSBKU1BXaWtpCiAgICAgICAgZW5naW5lLgoKICAgICAgICAqIFJlZmVycmluZ1BhZ2VzUGx1Z2luIG5vdyBoYXMgZXh0cmEgcGFyYW1ldGVyOiAiZXh0cmFzIiwgd2hpY2gKICAgICAgICBjYW4gYmUgdXNlZCB0byBub3RlIGhvdyBtYW55IHBhZ2VzIGFyZSBzdGlsbCBsZWZ0IHdpdGggcmVmZXJlbmNlcwogICAgICAgIHRvIHRoaXMgcGFydGljdWxhciBwYWdlLgoKICAgICAgICAqIEZpeGVkIGEgc2VyaW91cyBidWcgaW4gQ2FjaGluZ1Byb3ZpZGVyLCB3aGljaCBjYXVzZWQgbnVsbCB2YWx1ZXMKICAgICAgICB0byBiZSBhZGRlZCB0byB0aGUgaW50ZXJuYWwgcGFnZSBjb2xsZWN0aW9uLiAgVGhhbmtzIHRvIE1haGxlbgogICAgICAgIE1vcnJpcyBmb3IgcG9pbnRpbmcgaXQgb3V0LgoKICAgICAgICAqIE5ldyBjbGFzczogSW50ZXJuYWxXaWtpRXhjZXB0aW9uIHdoaWNoIGdldHMgdGhyb3duIGluIGNhc2UKICAgICAgICBzb21ldGhpbmcgcmVhbGx5IGZpc2h5IGFuZCBzZXJpb3VzIGlzIGdvaW5nIG9uIGluc2lkZSBXaWtpLgoKMjAwMi0wMi0wMyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEZpeGVkIGEgc2xvdyByb3V0aW5lIGluIFRyYW5zbGF0b3JSZWFkZXIsIHNoYXZpbmcgb2ZmIHJvdWdobHkKICAgICAgICAxMCUgb2YgdHJhbnNsYXRpb24gdGltZS4gIENvbnN0cnVjdGlvbiBFeGNlcHRpb25zIGlzIHRydWx5IGhlYXZ5LgoKMjAwMi0wMS0zMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjYuOC1jdnMKCiAgICAgICAgKiBDYWNoaW5nUHJvdmlkZXIgd2FzIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSB3cm9uZyBjb2xsZWN0aW9uLgogICAgICAgIFRoaXMgbWlnaHQgZml4IHRoZSBOdWxsUG9pbnRlckV4Y2VwdGlvbnMgdGhhdCBoYXZlIGJlZW4gY29taW5nCiAgICAgICAgYXJvdW5kIGxhdGVseS4KCjIwMDItMDEtMjggIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS42LjctY3ZzCgogICAgICAgICogQWRkZWQgbmV3IFJQQyBBUEk6IGdldFBhZ2VJbmZvKCBzdHJpbmcgcGFnZSApLCBhbmQgZ2V0UGFnZUluZm8oCiAgICAgICAgc3RyaW5nIHBhZ2UsIGludCB2ZXJzaW9uICkuICBBbHNvLCB0aGUgc3RydWN0IHJldHVybmVkIGJ5CiAgICAgICAgZ2V0UmVjZW50Q2hhbmdlcygpIGFuZCBnZXRQYWdlSW5mbygpIGdvdCBlbmhhbmNlZC4KCiAgICAgICAgKiBXaWtpLmpzcCBub3cgc2hvd3MgdGhlIGluZm8gb24gb2xkIHZlcnNpb25zIHByb3Blcmx5OiBiZWZvcmUgaXQKICAgICAgICB3b3VsZCBzaG93IGRhdGEgcGVydGFpbmluZyB0byB0aGUgY3VycmVudCB2ZXJzaW9uLCBldmVuIGlmIHZpZXdpbmcKICAgICAgICBhbiBvbGRlciB2ZXJzaW9uLgoKICAgICAgICAqIFdpa2lQYWdlUHJvdmlkZXIgaW50ZXJmYWNlIHJld29ya2VkIHNsaWdodGx5OiBCb3RoIGdldFBhZ2VJbmZvKCkKICAgICAgICBhbmQgZ2V0UGFnZVRleHQoKSBub3cgbmVlZCB0aGUgdmVyc2lvbiBwYXJhbWV0ZXIuICBWZXJzaW9ubGVzcwogICAgICAgIG1ldGhvZHMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgKHVzZSBMQVRFU1RfVkVSU0lPTiBhcyBhIHNwZWNpYWwKICAgICAgICB0YWcgZm9yIHZlcnNpb24gdG8gZ2V0IHRoZSBsYXRlc3QuKSAgSSBkaWQgdGhpcyB0byBzaW1wbGlmeSB0aGUKICAgICAgICBBUEkgc28gdGhhdCB0aGVyZSB3b3VsZCBiZSBsZXNzIG1ldGhvZHMgdG8gaW1wbGVtZW50LgoKICAgICAgICAqIFJDU0ZpbGVQcm92aWRlciBjYW4gbm93IGZldGNoIGluZm9ybWF0aW9uIG9uIG9sZCBwYWdlcwogICAgICAgIGNvcnJlY3RseS4gCgoyMDAyLTAxLTI3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNi42LWN2cy4KCiAgICAgICAgKiBBZGRlZCBYTUwtUlBDIGNhbGwgc3lzdGVtLiAgU2VlIHRoZSBjb20uZWN5cmQuanNwd2lraS54bWxycGMKICAgICAgICBwYWNrYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKICAgICAgICAqIEVycm9yIG91dHB1dCBmcm9tIFJDUyBjb21tYW5kcyBpcyBub3cgdmlzaWJsZSBpbiB0aGUgbG9nLgoKICAgICAgICAqIERpZmYuanNwIG5vdyBoYXMgbGlua3MgdG8gdGhlIGFjdHVhbCBwYWdlIGFuZCB0aGUgUGFnZSBJbmZvLgoKICAgICAgICAqIFNvbWUgbW9yZSByZWZhY3RvcmluZyBpbnNpZGUgV2lraUVuZ2luZTogcmVtb3ZlZCByZWR1bmRhbnQKICAgICAgICBjb2RlLgoKICAgICAgICAqIFJlZmFjdG9yZWQgVHJhbnNsYXRvclJlYWRlciB0byBiZSBtb3JlIG1vZHVsYXIuICBQcm92aWRlZCBob29rcwogICAgICAgIGludG8gdGhlIGludGVybmFscywgc28gdGhhdCBsaW5rcyBjYW4gbm93IGJlIHJlYWQgb24tdGhlLWZseS4KCiAgICAgICAgKiBXaWtpRW5naW5lLmdldEluc3RhbmNlKCkgaXMgbm93IHByb3RlY3RlZCBhZ2FpbnN0IG11bHRpcGxlCiAgICAgICAgY29uY3VycmVudCBpbnZvY2F0aW9ucy4gIFRoaXMgc2hvdWxkIGhlbHAgd2l0aCBzdGFydHVwIGlzc3Vlcy4KCjIwMDItMDEtMjUgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBDYWNoaW5nUHJvdmlkZXIgbm93IHByb3ZpZGVzIHNvbWUgcHJvdGVjdGlvbiBhZ2FpbnN0CiAgICAgICAgY29uY3VycmVuY3ksIGJ1dCBpdCBpcyBrbm93biB0byBmYWlsIGF0IG9jY2FzaW9uLgoKICAgICAgICAqIEZpeGVkIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gV2lraS5qc3AsIGlmIHRoZSBwYWdlIGRpZCBub3QKICAgICAgICBleGlzdC4KCiAgICAgICAgKiBDaGFuZ2VkIGJvdHRvbSBsaW5lIG9yZGVyaW5nIGluIFdpa2kuanNwIHNvIHRoYXQgaXQgdGFrZXMgbGVzcwogICAgICAgIHZlcnRpY2FsIHNjcmVlbiBzcGFjZS4KCjIwMDItMDEtMjAgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBTeXN0ZW1JbmZvLmpzcCBwYWdlIGVuaGFuY2VkIHdpdGggbmV3IGZlYXR1cmVzLgoKICAgICAgICAqIHYxLjYuNS1jdnMKCiAgICAgICAgKiBUaGUgV2lraVBhZ2VQcm92aWRlciBpbnRlcmZhY2UgaGFzIGJlZW4gZW5oYW5jZWQgd2l0aCBuZXcKICAgICAgICBtZXRob2RzLgoKICAgICAgICAqIENhY2hpbmdQcm92aWRlciByZXdvcmtlZC4gIFRoZSBnZXRBbGxQYWdlcygpIG5vdyBrZWVwcyBpdHMgb3duCiAgICAgICAgY2FjaGUsIHNvIHRoYXQgaXQgY2FuIHJldHVybiB0aGUgcmVxdWlyZWQgcGFnZXMgd2l0aG91dCBnb2luZwogICAgICAgIHRocm91Z2ggdGhlIGFjdHVhbCBwcm92aWRlci4gIFRoaXMgc2hvdWxkIHNwZWVkIHRoaW5ncyB1cCBhIGxvdC4KICAgICAgICBBIHJlYWwgc29sdXRpb24gaXMsIGhvd2V2ZXIgcmVxdWlyZWQuCgoyMDAyLTAxLTEzICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgQ2FjaGluZ1Byb3ZpZGVyLCBpbnNwaXJlZCBieSBDaHJpcyBCcm9va2luZyAodGhvdWdoIGluIGEKICAgICAgICBmYXIgc2ltcGxlciBmb3JtKS4KCiAgICAgICAgKiB2MS42LjQtY3ZzLgoKICAgICAgICAqIFJlY2VudENoYW5nZXMgbGlzdCBub3cgZGlzcGxheXMgYXV0aG9yIGluZm8uCgogICAgICAgICogQWxsIHJlZmVycmFsIHBsdWdpbnMgKFVudXNlZFBhZ2VzLCBVbmRlZmluZWRQYWdlcywKICAgICAgICBSZWZlcnJpbmdQYWdlcykgbm93IHJlY29nbml6ZSBhICJtYXh3aWR0aCIgcGFyYW1ldGVyLCB3aGljaCBjYW4gYmUKICAgICAgICB1c2VkIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSB3cml0dGVuIGxpbmtzLiAgVGhpcyBpcyB2ZXJ5IHVzZWZ1bAogICAgICAgIGluIHRoZSBjb250ZXh0IG9mIHB1dHRpbmcgYW4gYXV0b21hdGljIHJlZmVycmFsIGxpc3QgdG8gdGhlCiAgICAgICAgTGVmdE1lbnUsIHdoaWNoIG1pZ2h0IG90aGVyd2lzZSBncm93IHRvbyB3aWRlLiAgVGhlIGRlZmF1bHQKICAgICAgICBMZWZ0TWVudUZvb3RlciBub3cgcmVmbGVjdHMgdGhpcy4KCiAgICAgICAgKiBBZGRlZCB0aGUgYWJpbGl0eSB0byBtb2RpZnkgdGhlIHdyaXR0ZW4gbGluayB0byB0aGUKICAgICAgICBUcmFuc2xhdG9yUmVhZGVyIGJ5IGhvb2tpbmcgaW4gYSBTdHJpbmdUcmFuc211dGF0b3IgY2FsbGJhY2suCgoyMDAyLTAxLTEwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogUGFnZU1vZGlmaWVkLmpzcCB3b3VsZG4ndCBjb21waWxlIC0gSSBmb3Jnb3QgdG8gdXBkYXRlIHRoZSBuZXcKICAgICAgICBsb2NhdGlvbiBmb3IgVGV4dFV0aWwucmVwbGFjZVN0cmluZygpLiAgT29wcy4KCjIwMDItMDEtMDkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBTeXN0ZW1JbmZvLmpzcCBub3cgc2hvd3MgdGhlIHVzZWQgY2hhcmFjdGVyIGVuY29kaW5nIGFzIHdlbGwuCgoyMDAyLTAxLTA3ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNi4zLWJldGEuCiAgICAgICAgCiAgICAgICAgKiBDaGFuZ2VkIG15IGVtYWlsIGFkZHJlc3MuCgogICAgICAgICogU2xpZ2h0bHkgY2hhbmdlZCBlYnUncyBoYWNrIHRvIGNvbG9yaXplIGRpZmZzIHRvIHdvcmsgb24gYWxsCiAgICAgICAgYnJvd3NlcnMsIGV2ZW4gdGhvc2UgdGhhdCBhcmUgQ1NTLWNoYWxsZW5nZWQuICBJbnN0ZWFkIG9mCiAgICAgICAgRElWLXRhZ3MgYW5kIENTUy1maWxlcywgd2Ugbm93IHJlbHkgb24gdGFibGVzLgoKICAgICAgICAqIFBvc3NpYmx5IGZpeGVkIGEgcHJvYmxlbSB3aXRoIFdpbjJrIGFuZCBSQ1MgYnkgcmV3cml0aW5nIHRoZQogICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIGZldGNoIHRoZSBhdXRob3IgbmFtZS4gIFRoYW5rcyB0byBTZXNoCiAgICAgICAgSmFsYWdhbSBmb3IgdGhlIHRpcC4KCjIwMDItMDEtMDYgIEVyaWsgQnVubiAgPEVyaWsuQnVubkBub3NwYW0ubWVtZWNyeS5uZXQ+CgogICAgICAgICogRml4ZWQgYnVnIGluIHJlZmVycmFsczsgd2hlbiByZW1vdmluZyBsaW5rcyB0byBub24tZXhpc3RhbnQKICAgICAgICBwYWdlcywgdW51c2VkIHBhZ2VzIG5vIGxvbmdlciBzaG93cyB0aGUgcmVtb3ZlZCBsaW5rLgoKMjAwMS0xMi0xMyAgRXJpayBCdW5uICA8RXJpay5CdW5uQG5vc3BhbS5tZW1lY3J5Lm5ldD4KCiAgICAgICAgKiBJbml0aWFsIGhhY2sgdG8gbWFrZSBkaWZmcyBwcmV0dGllciBpbXBsZW1lbnRlZC4gUmVsaWVzCiAgICAgICAgb24gQ1NTLCB1c2VzIGxvdHMgb2YgRElWIHRhZ3MsIGFuZCB0aGUgbWFjL2llIGNzcydlcyBoYXZlbid0CiAgICAgICAgYmVlbiB0ZXN0ZWQuIAoKMjAwMS0xMi0wNCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIGNzc2luY2x1ZGUuanMgbm93IGFsc28gc2V0cyBzb21lIGJhc2ljIExJTksgZWxlbWVudHM6ICJzdGFydCIKICAgICAgICByZWZlcnMgdG8gYSBwYWdlIGNhbGxlZCAiTWFpbiIsICJoZWxwIiBkaXJlY3RzIHlvdSB0bwogICAgICAgIFRleHRGb3JtYXR0aW5nUnVsZXMsIGFuZCAic2VhcmNoIiB0YWtlcyB5b3UgdG8gU2VhcmNoLmpzcC4gIFRoZQogICAgICAgIGJhZCB0aGluZyBpcyB0aGF0IG5vdyB0aGUgcGFnZSBuYW1lcyBhcmUgcHJldHR5IG11Y2ggZml4ZWQuCgoyMDAxLTEyLTAzICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNi4yLWN2cy4KCiAgICAgICAgKiBXaWtpLmpzcCBub3cgaGFzIGEgZGlyZWN0IGxpbmsgZnJvbSB0aGUgbGFzdCBjaGFuZ2UgZGF0ZSB0byB0aGUKICAgICAgICBsYXRlc3QgY2hhbmdlLgoKICAgICAgICAqIFBhZ2VJbmZvLmpzcCBjYW4gbm93IGRpc3BsYXkgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIHByZXZpb3VzCiAgICAgICAgdmVyc2lvbiBhbmQgdGhlIGN1cnJlbnQgdmVyc2lvbi4KCiAgICAgICAgKiBEaWZmLmpzcCBub3cgaGFuZGxlcyByZXF1ZXN0cyBmb3IgY3VycmVudCB2ZXJzaW9uIGFzIHdlbGwuCgoyMDAxLTEyLTAxICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNi4xLWN2cy4KCiAgICAgICAgKiBSZW1vdmVkIGxhc3QgdHJhY2VzIG9mIEpTUCB0YWdzLgoKICAgICAgICAqIENoYW5nZWQgcGx1Z2luIHBhcmFtZXRlciBtYXJrZXIgdG8gV0hFUkUgaW5zdGVhZCBvZiBXSVRILgoKMjAwMS0xMS0yNSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEFkZGVkIG5ldyBwcm9wZXJ0eToganNwd2lraS5iYXNlVVJMIHRvIGRlZmluZSBwcm90ZWN0aW9uIGFnYWluc3QKICAgICAgICBVUkwgcmV3cml0aW5nIGdhdGV3YXlzLiAgUmVxdWVzdGVkIGJ5IEtpbSBIb2x2aWFsYS4KCiAgICAgICAgKiBBZGRlZCB0aGUgZW50aXJlIHBsdWdpbiBzeXN0ZW0sIG1ha2luZyBtYW55IEpTUCBwYWdlcyBvYnNvbGV0ZS4KICAgICAgICBOZXcgY2xhc3NlcyBpbmNsdWRlIFBsdWdpbk1hbmFnZXIsIHRha2luZyBjYXJlIG9mIHRoZSBwbHVnaW5zLgoKICAgICAgICAqIEFkZGVkIGNvbS5lY3lyZC5qc3B3aWtpLnBsdWdpbiBwYWNrYWdlIHdpdGggbmV3IHBsdWdpbiBjbGFzc2VzOgogICAgICAgIFJlY2VudENoYW5nZXNQbHVnaW4sIFVudXNlZFBhZ2VzUGx1Z2luLCBVbmRlZmluZWRQYWdlc1BsdWdpbiwKICAgICAgICBSZWZlcnJpbmdQYWdlc1BsdWdpbi4KCjIwMDEtMTEtMjMgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBNb3ZlZCBUcmFuc2xhdG9yUmVhZGVyLnJlcGxhY2VTdHJpbmcoKSB0byBUZXh0VXRpbCwgc2luY2UgaXQgaXMKICAgICAgICBhIG1vcmUgbG9naWNhbCBwbGFjZS4KCjIwMDEtMTEtMjMgIEVyaWsgQnVubiAgPEVyaWsuQnVubkBub3NwYW0ubWVtZWNyeS5uZXQ+CgogICAgICAgICogQWRkZWQgUmVmZXJlbmNlTWFuYWdlciBhbmQgdXRpbGl6aW5nIGZlYXR1cmVzLiBKU1BXaWtpIGNhbgogICAgICAgIG5vdyBrZWVwIHRyYWNrIG9mIHVudXNlZCBhbmQgdW5kZWZpbmVkIHBhZ2VzLCBhbmQgb2YgcGFnZXMgCiAgICAgICAgcmVmZXJyaW5nIHRvIGEgZ2l2ZW4gcGFnZS4gSW5pdGlhbCB2ZXJzaW9uLCB2ZXJ5IHVub3B0aW1pemVkLgogICAgICAgIFNlZSBSZWZlcmVuY2VNYW5hZ2VyLmphdmEgYW5kIFVudXNlZFBhZ2VzLmpzcC4KCjIwMDEtMTEtMjAgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBOb3cgcmVwbGFjZXMgSFRNTCBlbnRpdGllcyBjb3JyZWN0bHkgYWxzbyBpbiBnZXRUZXh0KCkuICBUaGFua3MKICAgICAgICB0byBLaW0gSG9sdmlhbGEgZm9yIHBvaW50aW5nIHRoaXMgb25lIG91dC4KCiAgICAgICAgKiBUaGlzIGlzIHJlbGVhc2UgdjEuNi4wLgoKICAgICAgICAqIFF1b3RlcyBpbiBIVE1MIHRleHQgaXMgbm93IGVzY2FwZWQgdXNpbmcgJnF1b3Q7CgoyMDAxLTExLTE4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNS44LgoKICAgICAgICAqIEZpeGVkIHByb2JsZW0gd2l0aCBVVEYtOCBkZWNvZGluZyB0cmFzaGluZyBhIHZhcmlhYmxlLiAgVGhhbmtzCiAgICAgICAgdG8gQ2hyaXMgQnJvb2tpbmcuCgogICAgICAgICogU2VhcmNoaW5nIGluIFVURi04IGZpbGVzIG5vdyB3b3Jrcy4KCjIwMDEtMTEtMTQgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBUcmFuc2xhdG9yUmVhZGVyIG5vdyB0YWtlcyBhIFJlYWRlciBpbnN0ZWFkIG9mIEJ1ZmZlcmVkUmVhZGVyLgoKICAgICAgICAqIFJld29ya2VkIHNvbWUgb2YgdGhlIGludGVybmFscyBvZiBXaWtpRW5naW5lIGFuZAogICAgICAgIFRyYW5zbGF0b3JSZWFkZXIsIG1ha2luZyB0aGVtIGVhc2llciB0byByZWFkLgoKICAgICAgICAqIHYxLjUuNy1iZXRhLgoKICAgICAgICAqIEluY29ycG9yYXRlZCBmaXggZnJvbSBDaHJpcyBCcm9va2luZyBmb3IgdGhlIFVSTCBlbmNvZGluZywgYQogICAgICAgIHdvcmthcm91bmQgZm9yIEpESyBidWcgIzQyNTcxMTUuCgoyMDAxLTExLTExICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNS42CgogICAgICAgICogQWRkZWQgTkRDIGZvciBhbGwgbWFqb3IgSlNQIHBhZ2VzIHRvIG1ha2UgdGhlbSBzaW1wbGVyIHRvCiAgICAgICAgZGVidWcuIAoKICAgICAgICAqIEFsbCBwYWdlcyBub3cgYWxzbyBleHBvcnQgdGhlIE1FVEEgQ29udGVudC1UeXBlIGluZm9ybWF0aW9uIHRvCiAgICAgICAgc3VwcG9ydCBvbGRlciBicm93c2Vycy4KCiAgICAgICAgKiBQb3NzaWJseSBmaXhlZCBhIHByb2JsZW0gd2l0aCByZWFkQ29udGVudHMoKSB0aHJvd2luZyBhbgogICAgICAgIElPRXhjZXB0aW9uOiAiaW52YWxpZCBtYXJrIiBieSBpbmNyZWFzaW5nIGJ1ZmZlciBzaXplLgoKICAgICAgICAqIFJDUyBjb21tYW5kcyBub3cgaW5oZXJpdCB0aGUgcGFyZW50IGVudmlyb25tZW50LiAgVGhpcyBtaWdodAogICAgICAgIGhlbHAgd2l0aCBzb21lIFdpbmRvd3MtcmVsYXRlZCBpc3N1ZXMuCgoyMDAxLTExLTA4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogUHJldmVudCByb2JvdHMgZnJvbSBjYWNoaW5nIEVkaXQsIERpZmYsIFBhZ2VJbmZvIGFuZAogICAgICAgIFBhZ2VNb2RpZmllZCAtIG5vdCBtdWNoIHBvaW50IGluIGNhY2hpbmcgdGhvc2UsIHJlYWxseS4KCiAgICAgICAgKiB2MS41LjUtYmV0YS4KCiAgICAgICAgKiBCdWcgZml4OiBTdGFydGluZyBhIG5ldyBwYWdlIG5vIGxvbmdlciByZXN1bHRzIGFzICdudWxsJyBhcyB0aGUKICAgICAgICBpbml0aWFsIHRleHQuICBPb3BzLgoKMjAwMS0xMS0wNyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjUuNAoKICAgICAgICAqIE5vdyBGaWxlU3lzdGVtUHJvdmlkZXIgYW5kIFJDU0ZpbGVQcm92aWRlciBkZWZhdWx0IGJhY2sgdG8KICAgICAgICBJU08tODg1OS0xIGlmIHRoZSBkYXRhIGlzIG9idmlvdXNseSBub3QgVVRGLTguICBUaGlzIG1ha2VzCiAgICAgICAgdXBncmFkaW5nIG11Y2ggZWFzaWVyLgoKICAgICAgICAqIE9vcHMsIGRpZmYgZm9yZ290IHRvIHVzZSB0aGUgY2hvc2VuIGNoYXJhY3RlciBlbmNvZGluZywgYW5kCiAgICAgICAgd291bGQgYXNzdW1lIElTTy04ODU5LTEuCgoyMDAxLTExLTA2ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuNS4zCgogICAgICAgICogQnVnIGZpeDogdGhlIFJDU0ZpbGVQcm92aWRlciB1c2VkIFVUQyBpbnN0ZWFkIG9mIGxvY2FsIHRpbWUuCiAgICAgICAgTm93IGZpeGVkLiAgSWYgeW91J3ZlIGNoYW5nZWQgdGhlIGxvZ2NvbW1hbmRzIGluCiAgICAgICAganNwd2lraS5wcm9wZXJ0aWVzLCBjaGVjayB0aGUgbmV3IGZvcm1hdCwgb3IgeW91J2xsIGJlIGJ1cm5lZC4KCiAgICAgICAgKiBKU1BXaWtpIGNhbiBub3cgaGFuZGxlIGFsc28gbm9uLUlTTy04ODU5LTEgY2hhcnNldHMuICBDaGVjawogICAgICAgIFJFQURNRSBmb3IgbW9yZSBpbmZvLiAgVGhhbmtzIHRvICBDaHJpcyBCcm9va2luZyBmb3IgdGhlIGluaXRpYWwKICAgICAgICBjb2RlLiAgVGhpcyBpcyBhIGhlYXZ5LWR1dHkgY2hhbmdlIC0gbW9zdCBvZiB0aGUgSlNQIHBhZ2VzIHdlcmUKICAgICAgICBhZmZlY3RlZCwgc2luY2UgdGhleSBuZWVkIHRvIGRlY29kZSB0aGUgcGFnZSBuYW1lcyBpbiBhIG5ldyB3YXkuCgogICAgICAgICogdjEuNS4yCgogICAgICAgICogRm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgQ1NTLCBXaWtpLmpzcCBub3cgYWxzbyB1c2VzCiAgICAgICAgZXhwbGljaXQgRk9OVCB3aGVuIGRpc3BsYXlpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCiAgICAgICAgKiBFbXB0eSBsaXN0IGl0ZW1zIGNvdWxkIGNhdXNlIGNyYXNoZXMgaW4gcGFyc2luZy4gIE5vdyBmaXhlZCwKICAgICAgICB0aGFua3MgdG8gTWlrYWVsIEhvbmthbGEgZm9yIHJlcG9ydGluZyB0aGlzLgoKICAgICAgICAqIE9vcHMsIGl0IHdhcyBwb3NzaWJsZSB0byBwdXQgSmF2YXNjcmlwdCBpbnNpZGUgZXh0ZXJuYWwgb3IgaW1hZ2UKICAgICAgICBsaW5rcy4gIE5vdyBmaXhlZCAtIGFsbCBxdW90ZXMgaW5zaWRlIGxpbmsgbmFtZXMgYXJlIFVSTEVuY29kZWQuCgoyMDAxLTExLTA0ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CiAgICAgICAgCiAgICAgICAgKiB2MS41LjEKICAgICAgICAKICAgICAgICAqIEFkZGVkIFdpa2lFbmdpbmUuc2F2ZVRleHQoIFN0cmluZywgU3RyaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgKQogICAgICAgIHNvIHRoYXQgaXQgY2FuIGdldCB0aGUgYXV0aG9yIGluZm9ybWF0aW9uIGZyb20gdGhlIHJlcXVlc3QuICBUaGUKICAgICAgICBvbGQgQVBJIGlzIHN0aWxsIHN1cHBvcnRlZC4KCiAgICAgICAgKiBXaWtpUGFnZVByb3ZpZGVyIGludGVyZmFjZSBjaGFuZ2VkOiBwdXRQYWdlVGV4dCgpIG5vdyB0YWtlcyBhCiAgICAgICAgV2lraVBhZ2UgYXMgYW4gZXh0cmEgYXJndW1lbnQuCgogICAgICAgICogUkNTRmlsZVByb3ZpZGVyIGNhbiBub3cgc2F2ZSBhbmQgcmV0cmlldmUgYXV0aG9yIGluZm8gYXMgd2VsbC4KCiAgICAgICAgKiBBbmNob3IgdHlwZXMgKGkuZS4gaHlwZXJsaW5rcykgbm93IGhhdmUgY2xhc3NlcyBzbyB0aGF0IHlvdSBjYW4KICAgICAgICByZWRlY29yYXRlIHRoZW0gaW4gdGhlIENTUyBmaWxlcy4gIFNlZSB0aGUgQ1NTIGZpbGVzIGZvciBtb3JlCiAgICAgICAgaW5mby4KCiAgICAgICAgKiBEVEQgY2F1c2VkIE1vemlsbGEgdG8gc2xpcCBpbnRvIHN0YW5kYXJkcy1jb21wbGlhbnQgbW9kZS4gIEZpeGVkCiAgICAgICAgdG9wLW1hcmdpbnMgaW4ganNwd2lraV9pZS5jc3MuCgogICAgICAgICogQWRkZWQgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbnMgdG8gYWxsIEpTUCBmaWxlcy4KCjIwMDEtMTEtMDIgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBUaGlzIGlzIFIzLCB2MS41LjAKCiAgICAgICAgKiBSZXdyb3RlIFJFQURNRS4KCiAgICAgICAgKiBUaGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUgbm93IGNvbnRhaW5zIGEgc2VwYXJhdGUgYXJjaGl2ZSBmb3IgYWxsCiAgICAgICAgc2FtcGxlIHdpa2kgcGFnZXMgdG8gaGVscCB5b3UgYm9vdHN0cmFwIHlvdXIgb3duIFdpa2kuCgogICAgICAgICogQWRkZWQgSlNQV2lraVRpcHMgcGFnZSB0byB0aGUgc2FtcGxlIHdpa2kgcGFnZXMgY29sbGVjdGlvbi4KCiAgICAgICAgKiBSZW1vdmVkIHRoZSBhdXRoZW50aWNhdGlvbiBzY2hlbWUgZnJvbSB3ZWIueG1sIC0gb3V0LW9mLWJveAogICAgICAgIEpTUFdpa2kgbm93IGFsbG93cyBhY2Nlc3MgdG8gYW55b25lLgoKICAgICAgICAqIERlZmF1bHQsIG91dC1vZi10aGUtYm94IFBhZ2UgUHJvdmlkZXIgaXMgbm93CiAgICAgICAgRmlsZVN5c3RlbVByb3ZpZGVyLiAgVGhpcyBzaG91bGQgbWFrZSBidWlsZGluZyB5b3VyIGZpcnN0IFdpa2kgYQogICAgICAgIGJpdCBzaW1wbGVyLgoKICAgICAgICAqIEFkZGVkIGZpbGUgY29tbWFuZHMgdG8ganNwd2lraS5wcm9wZXJ0aWVzLiAgQWxzbywgcmVtb3ZlZAogICAgICAgIHJlZmVyZW5jZXMgdG8gbXkgb3duIGVtYWlsIGFkZHJlc3MgLSBJIGtlcHQgZ2V0dGluZyBwbGVudHkgb2YKICAgICAgICBhdXRvbWF0aWMgZW1haWwgZnJvbSBwZW9wbGUgdHJ5aW5nIHRvIHNldCB1cCB0aGVpciBvd24gV2lraSA6LSkuCgogICAgICAgICogUmVtb3ZlZCBpbmRleC5odG1sIGFuZCByZXdyb3RlIHdlYi54bWwgdG8gYXV0b21hdGljYWxseSBncmFiIGFsbAogICAgICAgIGRpcmVjdG9yeSBhY2Nlc3NlcyB0byBXaWtpLmpzcC4KCiAgICAgICAgKiBXZSBub3cgdXNlIHBhZ2VDb250ZXh0LmZvcndhcmQoKSB0byBnbyB0byB0aGUgUGFnZU1vZGlmaWVkLmpzcAogICAgICAgIHdoZW4gYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvY2N1cnMsIGluc3RlYWQgb2YgdXNpbmcgcmVkaXJlY3QuCiAgICAgICAgVGhhbmtzIHRvIENocmlzIEJyb29raW5nIGZvciB0aGlzIGhpbnQuCgogICAgICAgICogU2xpZ2h0IGNvc21ldGljYWwgY2hhbmdlcyBpbiBqc3B3aWtpX25zLmNzcwoKICAgICAgICAqIEFkZGVkIGNvbW1lbnRzIGFyb3VuZCBKYXZhc2NyaXB0IGNvZGUgaW4gY3NzaW5jbHVkZS5qcyB0byBiZXR0ZXIKICAgICAgICBsaXZlIHdpdGggb2xkIGJyb3dzZXJzLgoKMjAwMS0xMS0wMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEJ1bXBlZCB2ZXJzaW9uIHRvIDEuNC4zLWN2cy4KCiAgICAgICAgKiBUaGVyZSBpcyBub3cgYSBzYW1wbGUgZW50cnkgaW4ganNwd2lraS5wcm9wZXJ0aWVzIGRlbW9uc3RyYXRpbmcKICAgICAgICBob3cgdG8gbWFrZSBhIGRpcmVjdCBsaW5rIHRvIHRoZSBwYWdlIGVkaXRvciBieSB1c2luZyBJbnRlcldpa2kKICAgICAgICBsaW5raW5nLiAgW0VkaXQ6TWFpbl0gcmVkaXJlY3RzIHlvdSB0byB0aGUgcGFnZSB3aGVyZSB5b3UgY2FuIGVkaXQKICAgICAgICB0aGUgTWFpbiBwYWdlLgoKICAgICAgICAqIExlZnRNZW51LmpzcCBub3cgcmVhZHMgaXRzIGNvbnRlbnRzIGR5bmFtaWNhbGx5IGZyb20gYSBXaWtpIHBhZ2UKICAgICAgICBjYWxsZWQgIkxlZnRNZW51Ii4gIFRoYW5rcyB0byBNaWthZWwgSG9ua2FsYSBmb3IgdGhpcyBpZGVhLgoKMjAwMS0xMC0zMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEJ1bXBlZCB2ZXJzaW9uIHRvIDEuNC4yLWN2cy4KCiAgICAgICAgKiBXaWtpLmpzcCBjaGFuZ2VkIHdpdGggcmVzcGVjdCB0byBoYW5kbGluZyBvZiBvbGQgcGFnZSB2ZXJzaW9ucy4KICAgICAgICBJdCBubyBsb25nZXIgZGlzcGxheXMgdGhlICJlZGl0IGN1cnJlbnQgdmVyc2lvbiIuCgogICAgICAgICogVGV4dEZvcm1hdHRpbmdSdWxlcyBub3cgaGFzIHBsZW50eSBvZiBtb3JlIGV4cGxhbmF0aW9ucy4KCiAgICAgICAgKiBBZGRlZCBzdXBwb3J0IGZvciBhcmJpdHJhcnkgbGV0dGVycyBpbiBXaWtpTmFtZXMuICBOb3cgaXQncwogICAgICAgIHBvc3NpYmxlIHRvIHVzZSBhbnkgY2hhcmFjdGVyIHNldC4KCiAgICAgICAgKiBBZGRlZCBzdXBwb3J0IGZvciBsaW5rcyB3aXRoaW4gYSBkb2N1bWVudCAoImZvb3Rub3RlcyIpLiAgVXNlCiAgICAgICAgWyMxXSB0byBjcmVhdGUgYSBmb290bm90ZSBhbmQgWzFdIHRvIGxpbmsgdG8gaXQuCgogICAgICAgICogRW1wdHkgbGlua3Mgbm8gbG9uZ2VyIGdlbmVyYXRlIGEgaHlwZXJsaW5rLgoKICAgICAgICAqIEZpbGVTeXN0ZW1Qcm92aWRlciBhbmQgUkNTRmlsZVByb3ZpZGVyIG5vdyBrbm93IGhvdyB0byBoYW5kbGUKICAgICAgICBXaWtpTmFtZXMgdGhhdCBjb250YWluIGlsbGVnYWwgY2hhcmFjdGVycy4gIEF0IHRoZSBtb21lbnQgdGhleSB1c2UKICAgICAgICBzaW1wbHkgdGhlIGphdmEubmV0LlVSTEVuY29kZXIgY2xhc3MgdG8gbWFrZSB0aGUgY29udmVyc2lvbi4KCiAgICAgICAgKiBBZGRlZCB3cmFwPSJ2aXJ0dWFsIiB0byBFZGl0LmpzcCB0ZXh0YXJlYSBlbGVtZW50IHRvIG1ha2UgaXQKICAgICAgICBhbHNvIHdyYXAgb24gTlM0LgoKMjAwMS0xMC0yNSAgRXJpayBCdW5uICA8RXJpay5CdW5uQG5vc3BhbS5tZW1lY3J5Lm5ldD4KCiAgICAgICAgKiBBZGRlZCB0aGUgY2FwYWJpbGl0eSB0byB2aWV3IG9sZGVyIHZlcnNpb25zIG9mIGEgV2lraVBhZ2UuIAogICAgICAgIFRoZSBmdW5jdGlvbmFsaXR5IGlzIGFjY2Vzc2VkIGZyb20gUGFnZUluZm8uanNwLiBXaWtpLmpzcAogICAgICAgIGlzIGFmZmVjdGVkLCBhcyB3ZWxsLCBhbmQgV2lraUVuZ2luZS5qYXZhIGhhcyBuZXcgbWV0aG9kcwogICAgICAgIChidXQgbm8gYWN0dWFsIG5ldyBmdW5jdGlvbmFsaXR5KS4gICAgICAgIAoKMjAwMS0xMC0yMSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFRoaXMgaXMgUjIgLSB2MS40LjAuCgogICAgICAgICogUmV3cm90ZSB0aGUgaW5jbHVkZWQgc2FtcGxlIHBhZ2VzLgoKMjAwMS0xMC0yMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIGJ1aWxkLnhtbCBjYW4gbm93IGdlbmVyYXRlIGphdmFkb2NzIHRvIGRvY3MvamF2YWRvYy4KCiAgICAgICAgKiBFZGl0LmpzcCBub3cgaGFzIGV4cGxhaW5zIGhlYWRpbmdzLCB0b28gKHRoYW5rcyBNYXR0aSkuCgogICAgICAgICogQ2hhbmdlZCB0aGUgdmVyc2lvbmluZyBzbyB0aGF0IHdoZW5ldmVyIHlvdSBjaGVjayBvdXQgYSBDVlMKICAgICAgICBjb3B5LCB5b3UgZ2V0IHZYLlkuWi1jdnMgYXMgdGhlIHZlcnNpb24gc3RyaW5nLiAgVGhpcyB3YXMgZG9uZSB0bwogICAgICAgIHNlcGFyYXRlIHRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uIGZyb20gdGhlIGFjdHVhbCByZWxlYXNlIHZlcnNpb24uCgogICAgICAgICogQWRkZWQgdGhlIGxpc3Qgb2YgaW1hZ2UgaW5saW5lIGxpbmsgcGF0dGVybnMgdG8gU3lzdGVtSW5mby5qc3AuCgoyMDAxLTEwLTE4ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogdjEuMy4zIC0gbm90IHJlbGVhc2VkLgoKICAgICAgICAqIFlvdSBjYW4gbm93IGhhdmUgbXVsdGlsaW5lIGxpc3QgaXRlbXMgaWYgeW91IHByZXBlbmQgZWFjaAogICAgICAgIGFkZGl0aW9uYWwgbGluZSB3aXRoIGEgc3BhY2UuCgogICAgICAgICogQWRkZWQgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBtdWx0aXBsZSBwYXR0ZXJucyBkZXRlcm1pbmluZyB3aGljaAogICAgICAgIGltYWdlcyBhcmUgaW5saW5lZCBhbmQgd2hpY2ggYXJlIG5vdC4gIFNlZSBqc3B3aWtpLnByb3BlcnRpZXMgZm9yCiAgICAgICAgbW9yZSBpbmZvcm1hdGlvbi4KCjIwMDEtMTAtMTYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBBbGwgZXh0ZXJuYWwgbGlua3MgZW5kaW5nIHdpdGggLnBuZyBhcmUgbm93IGlubGluZWQgYXMgaW1hZ2VzLgogICAgICAgIFRoaXMgaXMgYW4gZXhwZXJpbWVudCB0byBzZWUgaWYgaXQgYWN0dWFsbHkgd29ya3MuICBEb24ndCBleHBlY3QKICAgICAgICBpdCB0byBsYXN0LgoKICAgICAgICAqIFBhZ2UgbmFtZXMgY2FuIG5vdyBjb250YWluIF8gYW5kIC4gYXMgd2VsbC4KCiAgICAgICAgKiBBZGRlZCBzb21lIGNvc21ldGljYWwgY2hhbmdlcyB0byB0aGUgSlNQIHBhZ2VzLgoKMjAwMS0xMC0wNiAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFJlbGVhc2UgdjEuMy4xIC0gZmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZS4KCiAgICAgICAgKiBDbGFyaWZpZWQgYnVpbGQgc3lzdGVtLgoKICAgICAgICAqIEFsbCBmaWxlcyBzaG91bGQgbm93IGNvbnRhaW4gY29weXJpZ2h0LgoKICAgICAgICAqIEFkZGVkIHBsZW50eSBvZiBqYXZhZG9jIGNvbW1lbnRhcnkuCgoyMDAxLTEwLTAyICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQm9sZCBhbmQgaXRhbGljIGluZm9ybWF0aW9uIGlzIG5vdyBjYXJyaWVkIGFjcm9zcyBsaW5lIGFuZAogICAgICAgIHBhcmFncmFwaCBicmVha3MuCgoyMDAxLTA5LTMwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgY3NzaW5jbHVkZS5qcyBhbmQgdGhyZWUgYnJvd3Nlci1kZXBlbmRlbnQgc3R5bGVzaGVldAogICAgICAgIGZpbGVzLiAgQWxzbywgYWxsIGpzcCBmaWxlcyBub3cgaW5jbHVkZSB0aGUgY3NzaW5jbHVkZS5qcy4KCjIwMDEtMDgtMjUgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBSZW1vdmVkIGEgZGVidWcgc3RhdGVtZW50LCBzb21lIGNvc21ldGljYWwgY2hhbmdlcy4KCiAgICAgICAgKiB2MS4zLjAKCiAgICAgICAgKiBBZGRlZCBqc3B3aWtpLmFwcGxpY2F0aW9uTmFtZSBwcm9wZXJ0eSwgYW5kIHN1cHBvcnQgaW50bwogICAgICAgIFdpa2lFbmdpbmUuCgogICAgICAgICogQWRkZWQgU3lzdGVtSW5mby5qc3AKCiAgICAgICAgKiBBZGRlZCBpbnRlcldpa2kgZnVuY3Rpb25hbGl0eS4gIE5vdyB5b3UgY2FuIGRlZmluZSBsaW5rcyBpbgogICAgICAgICdqc3B3aWtpLnByb3BlcnRpZXMnIHdoZXJlIGEgbGluayBvZiB0aGUgZm9ybSBbV2lraVhYOlBhZ2VOYW1lXQogICAgICAgIHNob3VsZCBwb2ludCB0by4KCjIwMDEtMDgtMTMgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiB2MS4yLjAKCiAgICAgICAgKiBXaWtpRW5naW5lIG5vdyBiZWhhdmVzIG11Y2ggYmV0dGVyIGlmIGEgcHJvdmlkZXIgY2Fubm90IGJlCiAgICAgICAgaW5zdGFudGlhdGVkLgoKICAgICAgICAqIEFkZGVkIHJ1ZGltZW50YXJ5IHN1cHBvcnQgZm9yIHZlcnNpb24gaGlzdG9yeSBpbiBhIG11bHRpdHVkZSBvZgogICAgICAgIHBsYWNlcy4KCjIwMDEtMDgtMTMgIEphbm5lIEphbGthbmVuICA8amFsa2FuZW5Abm9zcGFtLmtvc2guZWN5cmQuY29tPgoKICAgICAgICAqIFdpa2kuanNwIGRpc3BsYXllZCBudWxsIGRhdGUgaWYgcGFnZSBkaWQgbm90IGV4aXN0LgoKMjAwMS0wNy0yMyAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIHYxLjEuMgoKICAgICAgICAqIFNlYXJjaCBlbmdpbmUgaW50ZXJmYWNlIGlzIG5vdyBjbGVhbmVyLgoKICAgICAgICAqIFNlcGFyYXRlZCBhY3R1YWwgV2lraSBwYWdlIHNlcnZpbmcgZnJvbSB0aGUgV2lraUVuZ2luZSBhbmQgaGlkCiAgICAgICAgaXQgdW5kZXIgdGhlIFdpa2lQYWdlUHJvdmlkZXIgaW50ZXJmYWNlLgoKMjAwMS0wNy0yMCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIFJlYWxtIG5hbWUgaXMgbm93ICJKU1BXaWtpIGVkaXRvciIgaW5zdGVhZCBvZiAiQmFzaWMKICAgICAgICBBdXRoZW50aWNhdGlvbiBBcmVhIiBvciB3aGF0ZXZlciBzdHVwaWQgaXQgd2FzLgoKMjAwMS0wNy0xOSAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIENvbnZlcnNpb24gb2Yge3sgaXMgbm93IGZpeGVkIC0gaXQgbm8gbG9uZ2VyIHRyYW5zZm9ybXMge3t7IGludG8KICAgICAgICB7PFRUPiBpbiBjZXJ0YWluIGNhc2VzLiAgQWxzbywgbXVsdGlwbGUge3t7cyBhcmUgbm93IGhhbmRsZWQKICAgICAgICBncmFjZWZ1bGx5LgoKICAgICAgICAqIHYxLjEuMQoKMjAwMS0wNy0xOCAgSmFubmUgSmFsa2FuZW4gIDxKYW5uZS5KYWxrYW5lbkBub3NwYW0uZWN5cmQuY29tPgoKICAgICAgICAqIEFkZGVkIGEgU2VhcmNoIGJveCB0byB0aGUgaGVhZGVyIG9mIGVhY2ggcGFnZS4KCiAgICAgICAgKiBIVE1MIGVudGl0aWVzIGFyZSBub3cgcmVwbGFjZWQgY29ycmVjdGx5IGluIFBhZ2VNb2RpZmllZC5qc3AgdG8KICAgICAgICBwcmV2ZW50IGFyYml0cmFyeSBIVE1MIHRhZ3MuCgogICAgICAgICogQWRkZWQgc3VwcG9ydCBmb3IgPFRUPiB0YWcgd2l0aCB7e3RleHR9fS4KCjIwMDEtMDctMTYgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBDb3VsZG4ndCBlZGl0IG5ldyBwYWdlcywgb29wcy4KCjIwMDEtMDctMTUgICAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5yZWdleC5maT4KCiAgICAgICAgKiBBZGRlZCBydWRpbWVudGFyeSBwYWdlIGxvY2tpbmcuCgoyMDAxLTA3LTE0ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQXBwZWFyYW5jZSBvZiB0aGUganNwIHBhZ2VzIGlzIG5vdyBzbGlnaHRseSBtb3JlIGNvbnZlcmdlbnQuCgogICAgICAgICogSW1wcm92ZWQgc2VhcmNoIGVuZ2luZSB0byBhY2NlcHQgZXhjbHVzaW9uL2luY2x1c2lvbiBhIGxhCiAgICAgICAgR29vZ2xlLiAgU2NvcmluZyBub3cgd29ya3MsIHRvby4KCiAgICAgICAgKiBBZGRlZCBvcmRlcmVkIGxpc3RzICgjKS4KCiAgICAgICAgKiBIb3Jpem9udGFsIHJ1bGVyIGlzIG5vdyBmb3VyIGRhc2hlcyBpbnN0ZWFkIG9mIHRocmVlIHRvIGNvbXBseQogICAgICAgIHdpdGggdGhlIFdpa2kgc3RhbmRhcmQuCgoyMDAxLTA3LTEzICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQganNwd2lraS5zcGVjaWFsUGFnZS5YWFggcmVkaXJlY3Rpb24uICBZb3UgY2FuIG5vdyBuYW1lCiAgICAgICAgc3BlY2lhbCBwYWdlcyB0aGF0IGdldCByZWZlcnJlZCB0byB3aGljaGV2ZXIgSlNQIHBhZ2UgeW91IHdhbnQuCiAgICAgICAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gYWx3YXlzIHJlZmVyIHRvIFJlY2VudENoYW5nZXMuanNwIGluIHlvdXIKICAgICAgICBXaWtpIGNvZGUgYnkgdXNpbmcgW1JlY2VudENoYW5nZXNdLCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKICAgICAgICBzZXQ6IAogICAgICAgIAogICAgICAgIGpzcHdpa2kuc3BlY2lhbFBhZ2UuUmVjZW50Q2hhbmdlcyA9IFJlY2VudENoYW5nZXMuanNwCgogICAgICAgICogdjEuMC41CgoyMDAxLTA3LTEwICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogUmVtb3ZlZCBTa2lwSFRNTEl0ZXJhdG9yIGJlY2F1c2UgaXQgd2FzIGEgYmFkIGlkZWEuICBObwogICAgICAgIEludGVyQ2FwcGVkIGh5cGVybGlua3MgYXJlIGF2YWlsYWJsZS4KCiAgICAgICAgKiBGaXhlZCB0ZXN0cyBzbyB0aGF0IHRoZXkgbm93IGFjdHVhbGx5IHJ1bi4gIFRoaXMgcmVxdWlyZWQgYSBuZXcKICAgICAgICBjb25zdHJ1Y3RvciBmb3IgV2lraUVuZ2luZS4KCjIwMDEtMDctMDkgIEphbm5lIEphbGthbmVuICA8SmFubmUuSmFsa2FuZW5Abm9zcGFtLmVjeXJkLmNvbT4KCiAgICAgICAgKiBUcmFuc2xhdG9yV3JpdGVyLmNsZWFuTGluaygpIG5vdyByZW1vdmVzIGFsbCBub24tbGV0dGVycyBhbmQKICAgICAgICBub24tbnVtYmVycyBmcm9tIHRoZSBsaW5rIG5hbWUgc28gdGhhdCB5b3UgY2FuIHVzZSBhbGwgc29ydHMgb2YKICAgICAgICBwdW5jdHVhdGlvbiBpbnNpZGUgYSBsaW5rIG5hbWUuCgogICAgICAgICogSW1wbGVtZW50ZWQgUmVjZW50Q2hhbmdlcyBsaXN0IGJ5IHdyaXRpbmcgUmVjZW50Q2hhbmdlcy5qc3AuCiAgICAgICAgV2lraS5qc3AgYWxzbyByZWRpcmVjdHMgYWxsIHJlcXVlc3RzIHRvIGEgcGFnZSBjYWxsZWQKICAgICAgICAnUmVjZW50Q2hhbmdlcycgdG8gUmVjZW50Q2hhbmdlcy5qc3AuCgoyMDAxLTA3LTA2ICBKYW5uZSBKYWxrYW5lbiAgPEphbm5lLkphbGthbmVuQG5vc3BhbS5lY3lyZC5jb20+CgogICAgICAgICogQWRkZWQgY29uZmlndXJhdGlvbiBhdCBldGMvanNwd2lraS5wcm9wZXJ0aWVzLgoKICAgICAgICAqIEFkZGVkIHRoaXMgZmlsZS4KCg==